diff --git a/.dockerignore b/.dockerignore
index 6d68aeaf..809ba837 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,24 +1,24 @@
-**/.classpath
-**/.dockerignore
-**/.env
-**/.git
-**/.gitignore
-**/.project
-**/.settings
-**/.toolstarget
-**/.vs
-**/.vscode
-**/*.*proj.user
-**/*.dbmdl
-**/*.jfm
-**/charts
-**/docker-compose*
-**/compose*
-**/Dockerfile*
-**/node_modules
-**/npm-debug.log
-**/obj
-**/secrets.dev.yaml
-**/values.dev.yaml
-LICENSE
-README.md
+**/.classpath
+**/.dockerignore
+**/.env
+**/.git
+**/.gitignore
+**/.project
+**/.settings
+**/.toolstarget
+**/.vs
+**/.vscode
+**/*.*proj.user
+**/*.dbmdl
+**/*.jfm
+**/charts
+**/docker-compose*
+**/compose*
+**/Dockerfile*
+**/node_modules
+**/npm-debug.log
+**/obj
+**/secrets.dev.yaml
+**/values.dev.yaml
+LICENSE
+README.md
diff --git a/.env.example b/.env.example
index 5a9a62a8..2ba4fede 100644
--- a/.env.example
+++ b/.env.example
@@ -1,24 +1,66 @@
-# DATABASE
-DATABASE_URL=
+# --------------- Providers -----------------
-# NEXTAUTH
-NEXTAUTH_URL=
-NEXTAUTH_SECRET=
+## Amazon (not supported so far)
+NEXT_PUBLIC_ACCESS_AWS=
+AWS_ACCESS_KEY=
+AWS_SECRET_KEY=
+AWS_REGION=
-EMAIL_HOST=
-EMAIL_PORT=
-EMAIL_USERNAME=
-EMAIL_PASSWORD=
-EMAIL_FROM=
+## Anthropic
+NEXT_PUBLIC_ACCESS_ANTHROPIC=
+ANTHROPIC_API_KEY=
-GITHUB_CLIENT_ID=
-GITHUB_CLIENT_SECRET=
+## Azure (not supported so far)
+NEXT_PUBLIC_ACCESS_AZURE=
+AZURE_OPENAI_API_KEY=
+AZURE_OPENAI_ENDPOINT=
+AZURE_OPENAI_DEPLOY_INSTANCE_NAME=
-GOOGLE_CLIENT_ID=
-GOOGLE_CLIENT_SECRET=
+## Cohere
+NEXT_PUBLIC_ACCESS_COHERE=
+COHERE_API_KEY=
-# PROVIDERS
+## Fireworks
+NEXT_PUBLIC_ACCESS_FIREWORKS=
+FIREWORKS_API_KEY=
+
+## Google
+NEXT_PUBLIC_ACCESS_GOOGLE=
+GOOGLE_API_KEY=
+
+## Groq
+NEXT_PUBLIC_ACCESS_GROQ=
+GROQ_API_KEY=
+
+## Hugging Face
+NEXT_PUBLIC_ACCESS_HUGGINGFACE=
+HUGGINGFACE_API_KEY=
+
+## Mistral
+NEXT_PUBLIC_ACCESS_MISTRAL=
+MISTRAL_API_KEY=
## OpenAI
+NEXT_PUBLIC_ACCESS_OPENAI=
OPENAI_API_KEY=
OPENAI_API_ENDPOINT=
+
+## Perplexity
+NEXT_PUBLIC_ACCESS_PERPLEXITY=
+PERPLEXITY_API_KEY=
+PERPLEXITY_ENDPOINT=
+
+# -------------- Search Engines --------------
+
+## Google
+NEXT_PUBLIC_ACCESS_GOOGLE_SEARCH=
+GOOGLE_SEARCH_API_KEY=
+GOOGLE_SEARCH_ENGINE_ID=
+
+## Tavily
+NEXT_PUBLIC_ACCESS_TAVILY_SEARCH=
+TAVILY_SEARCH_API_KEY=
+
+## You
+NEXT_PUBLIC_ACCESS_YOU_SEARCH=
+YOU_SEARCH_API_KEY=
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 00000000..48055c95
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1 @@
+components/ui/**.tsx
diff --git a/.eslintrc.json b/.eslintrc.json
index ddb81d15..be48ee06 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,17 +1,82 @@
{
- "root": true,
- "extends": [
- "next/core-web-vitals",
- "plugin:tailwindcss/recommended"
+ "root": true,
+ "extends": [
+ "next",
+ "next/core-web-vitals",
+ "plugin:tailwindcss/recommended"
+ ],
+ "plugins": [
+ "react",
+ "simple-import-sort",
+ "unused-imports"
+ ],
+ "parserOptions": {
+ "sourceType": "module",
+ "ecmaVersion": "latest"
+ },
+ "rules": {
+ "simple-import-sort/imports": "error",
+ "simple-import-sort/exports": "error",
+ "unused-imports/no-unused-imports": "error",
+ "unused-imports/no-unused-vars": [
+ "warn",
+ {
+ "vars": "all",
+ "varsIgnorePattern": "^_",
+ "args": "after-used",
+ "argsIgnorePattern": "^_"
+ }
],
- "overrides": [
- {
- "files": [
- "*.ts",
- "*.tsx",
- "*.js"
- ],
- "parser": "@typescript-eslint/parser"
- }
- ]
+ "no-console": "warn",
+ "react/no-unescaped-entities": "off"
+ },
+ "overrides": [
+ {
+ "files": [
+ "*.ts",
+ "*.tsx",
+ "*.js"
+ ],
+ "parser": "@typescript-eslint/parser"
+ },
+ {
+ "files": [
+ "*.js",
+ "*.jsx",
+ "*.ts",
+ "*.tsx"
+ ],
+ "rules": {
+ "simple-import-sort/imports": [
+ "error",
+ {
+ "groups": [
+ [
+ "^react",
+ "^@?\\w"
+ ],
+ [
+ "^(@|components)(/.*|$)"
+ ],
+ [
+ "^\\u0000"
+ ],
+ [
+ "^\\.\\.(?!/?$)",
+ "^\\.\\./?$"
+ ],
+ [
+ "^\\./(?=.*/)(?!/?$)",
+ "^\\.(?!/?$)",
+ "^\\./?$"
+ ],
+ [
+ "^.+\\.?(css)$"
+ ]
+ ]
+ }
+ ]
+ }
+ }
+ ]
}
\ No newline at end of file
diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index 2ac163e2..979822c0 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -53,4 +53,4 @@ jobs:
tags: |
okisdev/chatchat:${{ steps.extract_tag.outputs.tag }}
okisdev/chatchat:latest
- platforms: linux/amd64,linux/arm64
+ platforms: linux/amd64,linux/arm64
\ No newline at end of file
diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml
deleted file mode 100644
index d45ccdb0..00000000
--- a/.github/workflows/sync.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-name: ChatChat Upstream Sync
-
-permissions:
- contents: write
-
-on:
- schedule:
- - cron: '0 0 * * *' # every day at 00:00 UTC
- workflow_dispatch:
-
-jobs:
- sync_latest_from_chatchat_upstream:
- name: Sync latest commits from ChatChat upstream repo
- runs-on: ubuntu-latest
- if: ${{ github.event.repository.fork }}
-
- steps:
- # Step 1: run a standard checkout action
- - name: Checkout target repo
- uses: actions/checkout@v4
-
- # Step 2: run the sync action
- - name: Sync upstream changes
- id: sync
- uses: aormsby/Fork-Sync-With-Upstream-action@v3.4
- with:
- upstream_sync_repo: okisdev/ChatChat
- upstream_sync_branch: main
- target_sync_branch: main
- target_repo_token: ${{ secrets.GITHUB_TOKEN }} # automatically generated, no need to set
-
- # Set test_mode true to run tests instead of the true action!!
- test_mode: false
-
- - name: Sync check
- if: failure()
- run: |
- echo "::error::由于权限不足,导致同步失败(这是预期的行为),请前往仓库首页手动执行[Sync fork]。"
- echo "::error::Due to insufficient permissions, synchronization failed (as expected). Please go to the repository homepage and manually perform [Sync fork]."
- exit 1
diff --git a/.gitignore b/.gitignore
index 549388c9..a84107af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
/node_modules
/.pnp
.pnp.js
+.yarn/install-state.gz
# testing
/coverage
@@ -34,10 +35,3 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts
-
-# vscode
-.vscode
-
-# next-pwa
-public/sw.js
-public/workbox-*.js
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..e9d872ba
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,27 @@
+{
+ "cSpell.words": [
+ "buildx",
+ "DOCKERHUB",
+ "fastapi",
+ "Groq",
+ "huggingface",
+ "langchain",
+ "langsmith",
+ "Lightbox",
+ "lucide",
+ "markdownit",
+ "mistralai",
+ "mixtral",
+ "onest",
+ "rehype",
+ "sonner",
+ "Tavily",
+ "tippyjs"
+ ],
+ "python.analysis.typeCheckingMode": "basic",
+ "python.analysis.autoImportCompletions": true,
+ "i18n-ally.localesPaths": [
+ "locales",
+ ],
+ "i18n-ally.keystyle": "flat"
+}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index baeeee6a..a91233cc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,36 +1,46 @@
-FROM node:lts-alpine as base
-
-WORKDIR /app
-COPY package*.json pnpm-lock.yaml ./
-RUN npm i -g pnpm
-RUN pnpm i
-
-COPY . .
-
-RUN pnpm prisma generate
-RUN pnpm build
-
-FROM node:lts-alpine as production
-WORKDIR /app
-COPY --from=base /app/package*.json ./
-COPY --from=base /app/.next ./.next
-COPY --from=base /app/public ./public
-COPY --from=base /app/prisma ./prisma
-COPY --from=base /app/node_modules ./node_modules
-COPY --from=base /app/next.config.js ./next.config.js
-
-RUN npm i -g pnpm
-
-EXPOSE 3000
-
-ENV NODE_ENV=production \
- DATABASE_URL="" \
- NEXTAUTH_URL="" \
- NEXTAUTH_SECRET="" \
- EMAIL_HOST="" \
- EMAIL_PORT="" \
- EMAIL_USERNAME="" \
- EMAIL_PASSWORD="" \
- EMAIL_FROM=""
-
-CMD ["pnpm", "start"]
\ No newline at end of file
+FROM node:lts-alpine AS base
+
+WORKDIR /app
+
+COPY package.json pnpm-lock.yaml ./
+
+RUN npm i -g pnpm
+RUN pnpm install
+
+COPY . .
+
+RUN pnpm build
+
+FROM node:lts-alpine AS production
+
+WORKDIR /app
+
+COPY --from=base /app/package*.json ./
+COPY --from=base /app/.next ./.next
+COPY --from=base /app/public ./public
+COPY --from=base /app/node_modules ./node_modules
+COPY --from=base /app/next.config.mjs ./next.config.mjs
+
+RUN npm i -g pnpm
+
+EXPOSE 3000
+
+ENV AWS_ACCESS_KEY="" \
+ AWS_SECRET_KEY="" \
+ AWS_REGION="" \
+ ANTHROPIC_API_KEY="" \
+ AZURE_OPENAI_API_KEY="" \
+ AZURE_OPENAI_ENDPOINT="" \
+ AZURE_OPENAI_DEPLOY_INSTANCE_NAME="" \
+ COHERE_API_KEY="" \
+ FIREWORKS_API_KEY="" \
+ GOOGLE_API_KEY="" \
+ GROQ_API_KEY="" \
+ HUGGINGFACE_API_KEY="" \
+ MISTRAL_API_KEY="" \
+ OPENAI_API_KEY="" \
+ OPENAI_API_ENDPOINT="" \
+ PERPLEXITY_API_KEY="" \
+ PERPLEXITY_ENDPOINT=""
+
+CMD ["pnpm", "start"]
diff --git a/LICENSE b/LICENSE.txt
similarity index 100%
rename from LICENSE
rename to LICENSE.txt
diff --git a/README.ja.md b/README.ja.md
new file mode 100644
index 00000000..255442a3
--- /dev/null
+++ b/README.ja.md
@@ -0,0 +1,48 @@
+# Chat Chat
+
+> シンプルで使いやすいインターフェイスを備えた、統合されたチャットとAIプラットフォーム。
+
+
+ 🇺🇸 | 🇭🇰 | 🇨🇳 | 🇯🇵
+
+
+
+
+ ドキュメント
+
+
+
+## インターフェイス
+
+![検索](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/chat.png)
+
+![チャット](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/search.png)
+
+## 機能
+
+- 主要なAIプロバイダーに対応(Anthropic、OpenAI、Cohere、Google Geminiなど)
+- 自己ホストが容易
+
+## 使用方法
+
+[ドキュメント](https://docs.okis.dev/chat)
+
+## デプロイメント
+
+[![Vercelでデプロイ](https://vercel.com/button)](https://vercel.com/import/project?template=https://github.com/okisdev/ChatChat)
+
+[![Railwayでデプロイ](https://railway.app/button.svg)](https://railway.app/template/-WWW5r)
+
+詳細なデプロイ方法は[ドキュメント](https://docs.okis.dev/chat)にて
+
+## ライセンス
+
+[AGPL-3.0](./LICENSE)
+
+## 技術スタック
+
+nextjs / tailwindcss / shadcn UI
+
+## 注意
+
+- AIは不適切なコンテンツを生成する可能性がありますので、注意してご使用ください。
diff --git a/README.md b/README.md
index 96ab943d..80172dcd 100644
--- a/README.md
+++ b/README.md
@@ -1,128 +1,48 @@
-# [Chat Chat](https://chat.okisdev.com)
+# Chat Chat
-> Chat Chat to unlock your next level AI conversational experience. You can use multiple APIs from OpenAI, Microsoft Azure, Claude, Cohere, Hugging Face, and more to make your AI conversation experience even richer.
-
-[![LICENSE](https://img.shields.io/github/license/okisdev/ChatChat?style=flat-square)](https://github.com/okisdev/ChatChat/blob/master/LICENSE) [![Twitter](https://img.shields.io/twitter/follow/okisdev)](https://twitter.com/okisdev) [![Telegram](https://img.shields.io/badge/Telegram-Chat%20Chat-blue?style=flat-square&logo=telegram)](https://t.me/+uWx9qtafv-BiNGVk)
+> Your own unified chat and search to AI platform, with a simple and easy to use interface.
- English | 繁体中文 | 简体中文 | 日本語
+ 🇺🇸 | 🇭🇰 | 🇨🇳 | 🇯🇵
Documentation
- | Common Issue
-## Important Notes
-
-- Some APIs are paid APIs, please make sure you have read and agreed to the relevant terms of service before use.
-- Some features are still under development, please submit PR or Issue.
-- The demo is for demonstration purposes only, it may retain some user data.
-- AI may generate offensive content, please use it with caution.
-
-## Preview
-
-### Interface
-
-![UI](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/UI-1.png)
-
-![Dashboard](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/Dashboard-1.png)
+## Interface
-### Functions
+![Search](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/chat.png)
-https://user-images.githubusercontent.com/66008528/235539101-562afbc8-cb62-41cc-84d9-1ea8ed83d435.mp4
-
-https://user-images.githubusercontent.com/66008528/235539163-35f7ee91-e357-453a-ae8b-998018e003a7.mp4
+![Chat](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/search.png)
## Features
-- [x] TTS
-- [x] Dark Mode
-- [x] Chat with files
-- [x] Markdown formatting
-- [x] Multi-language support
-- [x] Support for System Prompt
-- [x] Shortcut menu (command + k)
-- [x] Wrapped API (no more proxies)
-- [x] Support for sharing conversations
-- [x] Chat history (local and cloud sync)
-- [x] Support for streaming messages (SSE)
-- [x] Plugin support (`/search`, `/fetch`)
-- [x] Support for message code syntax highlighting
-- [x] Support for OpenAI, Microsoft Azure, Claude, Cohere, Hugging Face
-
-## Roadmap
-
-Please refer to https://github.com/users/okisdev/projects/7
+- Support major AI Providers (Anthropic, OpenAI, Cohere, Google Gemini, etc.)
+- Ease self-hosted
## Usage
-### Prerequisites
-
-- Any API key from OpenAI, Microsoft Azure, Claude, Cohere, Hugging Face
-
-### Environment variables
-
-| variable name | description | default | mandatory | tips |
-| ----------------- | --------------------------- | ------- | --------- | ----------------------------------------------------------------------------------------------------------------- |
-| `DATABASE_URL` | Postgresql database address | | **Yes** | Start with `postgresql://` (if not required, please fill in `postgresql://user:password@example.com:port/dbname`) |
-| `NEXTAUTH_URL` | Your website URL | | **Yes** | (with prefix) |
-| `NEXTAUTH_SECRET` | NextAuth Secret | | **Yes** | Random hash (16 bits is best) |
-| `EMAIL_HOST` | SMTP Host | | No | |
-| `EMAIL_PORT` | SMTP Port | 587 | No | |
-| `EMAIL_USERNAME` | SMTP username | | No | |
-| `EMAIL_PASSWORD` | SMTP password | | No | |
-| `EMAIL_FROM` | SMTP sending address | | No | |
-
-### Deployment
+[docs](https://docs.okis.dev/chat)
-> Please modify the environment variables before deployment, more details can be found in the [documentation](https://docs.okis.dev/chat/deployment/).
-
-#### Local Deployment
-
-```bash
-git clone https://github.com/okisdev/ChatChat.git
-cd ChatChat
-cp .env.example .env
-pnpm i
-pnpm dev
-```
-
-#### Vercel
+## Deployment
[![Deployed in Vercel](https://vercel.com/button)](https://vercel.com/import/project?template=https://github.com/okisdev/ChatChat)
-#### Zeabur
-
-Visit [Zeabur](https://zeabur.com) to deploy
-
-#### Railway
-
[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/-WWW5r)
-#### Docker
-
-```bash
-docker build -t chatchat .
-docker run -p 3000:3000 chatchat -e DATABASE_URL="" -e NEXTAUTH_URL="" -e NEXTAUTH_SECRET="" -e EMAIL_HOST="" -e EMAIL_PORT="" -e EMAIL_USERNAME="" -e EMAIL_PASSWORD="" -e EMAIL_FROM=""
-```
-
-OR
-
-```bash
-docker run -p 3000:3000 -e DATABASE_URL="" -e NEXTAUTH_URL="" -e NEXTAUTH_SECRET="" -e EMAIL_HOST="" -e EMAIL_PORT="" -e EMAIL_USERNAME="" -e EMAIL_PASSWORD="" -e EMAIL_FROM="" ghcr.io/okisdev/chatchat:latest
-```
+more deployment methods in [docs](https://docs.okis.dev/chat)
## LICENSE
[AGPL-3.0](./LICENSE)
-## Support me
+## Stack
-[![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/okisdev)
+nextjs / tailwindcss / shadcn UI
-## Technology Stack
+## Note
-nextjs / tailwindcss / shadcn UI
+- AI may generate inappropriate content, please use it with caution.
diff --git a/README.zh_CN.md b/README.zh_CN.md
new file mode 100644
index 00000000..51567e11
--- /dev/null
+++ b/README.zh_CN.md
@@ -0,0 +1,48 @@
+# Chat Chat
+
+> 您自己的统一聊天和搜索至AI平台,界面简单易用。
+
+
+ 🇺🇸 | 🇭🇰 | 🇨🇳 | 🇯🇵
+
+
+
+
+ 文档
+
+
+
+## 界面
+
+![搜索](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/chat.png)
+
+![聊天](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/search.png)
+
+## 特点
+
+- 支持主要的AI提供商(Anthropic、OpenAI、Cohere、Google Gemini等)
+- 方便自托管
+
+## 使用方式
+
+[文档](https://docs.okis.dev/chat)
+
+## 部署
+
+[![在Vercel中部署](https://vercel.com/button)](https://vercel.com/import/project?template=https://github.com/okisdev/ChatChat)
+
+[![在Railway上部署](https://railway.app/button.svg)](https://railway.app/template/-WWW5r)
+
+更多部署方法见[文档](https://docs.okis.dev/chat)
+
+## 许可证
+
+[AGPL-3.0](./LICENSE)
+
+## 技术栈
+
+nextjs / tailwindcss / shadcn UI
+
+## 注意事项
+
+- AI可能会生成不适当的内容,请谨慎使用。
diff --git a/README.zh_HK.md b/README.zh_HK.md
new file mode 100644
index 00000000..92bae77a
--- /dev/null
+++ b/README.zh_HK.md
@@ -0,0 +1,48 @@
+# Chat Chat
+
+> 你的一體化聊天及搜索人工智能平台,界面簡單易用。
+
+
+ 🇺🇸 | 🇭🇰 | 🇨🇳 | 🇯🇵
+
+
+
+
+ 文件
+
+
+
+## 介面
+
+![搜索](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/chat.png)
+
+![聊天](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/search.png)
+
+## 功能
+
+- 支援主要人工智能供應商(Anthropic、OpenAI、Cohere、Google Gemini 等)
+- 方便自行託管
+
+## 使用方式
+
+[文件](https://docs.okis.dev/chat)
+
+## 部署
+
+[![在 Vercel 中部署](https://vercel.com/button)](https://vercel.com/import/project?template=https://github.com/okisdev/ChatChat)
+
+[![在 Railway 上部署](https://railway.app/button.svg)](https://railway.app/template/-WWW5r)
+
+更多部署方法在[文件](https://docs.okis.dev/chat)
+
+## 許可證
+
+[AGPL-3.0](./LICENSE)
+
+## 技術棧
+
+nextjs / tailwindcss / shadcn UI
+
+## 注意事項
+
+- 人工智能可能會生成不當內容,請小心使用。
diff --git a/app/[locale]/(auth)/layout.tsx b/app/[locale]/(auth)/layout.tsx
deleted file mode 100644
index 7b92e5e6..00000000
--- a/app/[locale]/(auth)/layout.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import Image from 'next/image';
-
-import { redirect } from 'next/navigation';
-
-import { getCurrentUser } from '@/lib/auth/session';
-
-import { siteConfig } from '@/config/site.config';
-
-export default async function AuthLayout({ children }: { children: React.ReactNode }) {
- const user = await getCurrentUser();
-
- if (user) {
- redirect('/dashboard/profile');
- }
-
- return (
-
- );
-}
diff --git a/app/[locale]/(auth)/login/page.tsx b/app/[locale]/(auth)/login/page.tsx
deleted file mode 100644
index f34918ff..00000000
--- a/app/[locale]/(auth)/login/page.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import AuthForm from '@/components/auth/form';
-import AuthHeader from '@/components/auth/header';
-import AuthFooter from '@/components/auth/footer';
-
-export default function LoginPage() {
- return (
-
- );
-}
diff --git a/app/[locale]/(auth)/register/page.tsx b/app/[locale]/(auth)/register/page.tsx
deleted file mode 100644
index 51569300..00000000
--- a/app/[locale]/(auth)/register/page.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import AuthForm from '@/components/auth/form';
-import AuthHeader from '@/components/auth/header';
-import AuthFooter from '@/components/auth/footer';
-
-export default function RegisterPage() {
- return (
-
- );
-}
diff --git a/app/[locale]/(dashboard)/dashboard/layout.tsx b/app/[locale]/(dashboard)/dashboard/layout.tsx
deleted file mode 100644
index c211aef1..00000000
--- a/app/[locale]/(dashboard)/dashboard/layout.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { redirect } from 'next/navigation';
-
-import { getCurrentUser } from '@/lib/auth/session';
-
-import DashboardNav from '@/components/dashboard/nav';
-import DashboardSide from '@/components/dashboard/side';
-
-export default async function DashboardLayout({ children }: { children: React.ReactNode }) {
- const user = await getCurrentUser();
-
- if (!user) {
- redirect('/login');
- }
-
- return (
-
- );
-}
diff --git a/app/[locale]/(dashboard)/dashboard/profile/info/page.tsx b/app/[locale]/(dashboard)/dashboard/profile/info/page.tsx
deleted file mode 100644
index 5f34e9c7..00000000
--- a/app/[locale]/(dashboard)/dashboard/profile/info/page.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { getCurrentUser } from '@/lib/auth/session';
-
-import ProfileInfoForm from '@/components/dashboard/profile-info-form';
-
-const ProfilePage = async () => {
- const user = await getCurrentUser();
-
- if (!user) {
- return null;
- }
-
- return (
-
- );
-};
-
-export default ProfilePage;
diff --git a/app/[locale]/(dashboard)/dashboard/profile/record/page.tsx b/app/[locale]/(dashboard)/dashboard/profile/record/page.tsx
deleted file mode 100644
index a3f1923c..00000000
--- a/app/[locale]/(dashboard)/dashboard/profile/record/page.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { redirect } from 'next/navigation';
-
-import { User } from '@prisma/client';
-
-import { database } from '@/lib/database';
-import { getCurrentUser } from '@/lib/auth/session';
-
-import RecordCard from '@/components/dashboard/record/card';
-import RecordButton from '@/components/dashboard/record/button';
-
-const getRecordsByUser = async (id: User['id']) => {
- return await database.record.findMany({
- where: {
- authorId: id,
- },
- orderBy: {
- createdAt: 'desc',
- },
- });
-};
-
-const ProfileRecordPage = async () => {
- const user = await getCurrentUser();
-
- if (!user) {
- redirect('/login');
- }
-
- const records = await getRecordsByUser(user.id);
-
- return (
-
-
-
- {records.length > 0 ? (
- records.map((record, index) => {
- return
;
- })
- ) : (
-
No conversation records found
- )}
-
-
- );
-};
-
-export default ProfileRecordPage;
diff --git a/app/[locale]/(dashboard)/dashboard/profile/settings/page.tsx b/app/[locale]/(dashboard)/dashboard/profile/settings/page.tsx
deleted file mode 100644
index a5f3cdde..00000000
--- a/app/[locale]/(dashboard)/dashboard/profile/settings/page.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { getCurrentUser, getCurrentUserProfile } from '@/lib/auth/session';
-
-import ProfileSettingsForm from '@/components/dashboard/profile-settings-form';
-
-const ProfileSettingsPage = async () => {
- const userProfile = await getCurrentUserProfile();
-
- if (!userProfile) {
- return null;
- }
-
- return (
-
- );
-};
-
-export default ProfileSettingsPage;
diff --git a/app/[locale]/(dashboard)/dashboard/team/info/page.tsx b/app/[locale]/(dashboard)/dashboard/team/info/page.tsx
deleted file mode 100644
index d86cc0a0..00000000
--- a/app/[locale]/(dashboard)/dashboard/team/info/page.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { database } from '@/lib/database';
-import { getCurrentUser } from '@/lib/auth/session';
-
-import { Team } from '@prisma/client';
-
-import TeamCard from '@/components/dashboard/team/card';
-import JoinButton from '@/components/dashboard/team/join-button';
-import CreateButton from '@/components/dashboard/team/create-button';
-
-const getTeamsByAuthorId = async (authorId: string) => {
- return await database.team.findMany({
- where: {
- authorId: authorId,
- },
- });
-};
-
-const getTeamsByMemberId = async (memberId: string) => {
- return await database.team.findMany({
- where: {
- members: {
- some: {
- userId: memberId,
- },
- },
- },
- });
-};
-
-const ProfileTeamInfoPage = async () => {
- const currentUser = await getCurrentUser();
-
- if (!currentUser) {
- return null;
- }
-
- const teamsByAuthor = await getTeamsByAuthorId(currentUser.id);
-
- const teamsByMember = await getTeamsByMemberId(currentUser.id);
-
- const allTeams = Array.from(new Set([...teamsByAuthor, ...teamsByMember].map((team) => team.id))).map((id) => {
- const team = teamsByAuthor.find((team) => team.id === id) || teamsByMember.find((team) => team.id === id);
- const isAuthor = (team && team.authorId === currentUser.id) || false;
- return { ...team, isAuthor };
- }) as (Team & { isAuthor: boolean })[];
-
- return (
-
-
-
-
-
-
- {allTeams.length > 0 ? allTeams.map((team, index) =>
) :
No teams found
}
-
-
- );
-};
-
-export default ProfileTeamInfoPage;
diff --git a/app/[locale]/(home)/(chat)/page.tsx b/app/[locale]/(home)/(chat)/page.tsx
new file mode 100644
index 00000000..5ea990d0
--- /dev/null
+++ b/app/[locale]/(home)/(chat)/page.tsx
@@ -0,0 +1,161 @@
+'use client';
+
+import { useEffect, useRef, useState } from 'react';
+import { useChat } from 'ai/react';
+import { useAtom } from 'jotai';
+import { useRouter, useSearchParams } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+
+import { AddButton } from '@/components/layout/add-button';
+import { ConversationWindow } from '@/components/layout/chat/conversation-window';
+import { InputBox } from '@/components/layout/chat/input-box';
+import { ModelSelect } from '@/components/layout/model-select';
+import { ShareButton } from '@/components/layout/share-button';
+import { getLocalStorage } from '@/hooks/storage';
+import store from '@/hooks/store';
+import { ApiConfig } from '@/types/app';
+import { Conversation } from '@/types/conversation';
+import { ProviderSetting, SpecifiedProviderSetting } from '@/types/settings';
+import { whatTimeOfDay } from '@/utils/app/time';
+
+export default function Chat() {
+ const searchParams = useSearchParams();
+
+ const router = useRouter();
+
+ const inputRef = useRef(null);
+
+ const chat = searchParams.get('chat');
+
+ const prevChatRef = useRef();
+
+ useEffect(() => {
+ prevChatRef.current = chat!;
+ });
+
+ const prevChat = prevChatRef.current;
+
+ const t = useTranslations('');
+
+ const [currentConversationUUID, setCurrentConversationUUID] = useState();
+
+ const [currentUseModel] = useAtom(store.currentUseModelAtom);
+ const [advancedSettings] = useAtom(store.advancedSettingsAtom);
+ const [conversationSettings] = useAtom(store.conversationSettingsAtom);
+
+ const [conversations, setConversations] = useAtom(store.conversationsAtom);
+
+ const [currentProviderSettings] = useAtom(store.currentProviderSettingsAtom);
+
+ const { messages, setMessages, isLoading, input, handleInputChange, handleSubmit, stop } = useChat({
+ initialInput: conversationSettings.systemPrompt ?? undefined,
+ api: advancedSettings.unifiedEndpoint ? '/api/chat/messages' : `/api/chat/messages/${currentUseModel.provider.toString().toLowerCase()}`,
+ body: {
+ uuid: currentConversationUUID,
+ config: {
+ provider: currentProviderSettings?.[currentUseModel.provider.toString() as keyof ProviderSetting] as SpecifiedProviderSetting,
+ model: currentUseModel,
+ stream: advancedSettings.streamMessages,
+ numberOfContext: conversationSettings.numOfContext,
+ } satisfies ApiConfig,
+ },
+ });
+
+ const handleSubmitChat = (e: React.FormEvent) => {
+ e.preventDefault();
+
+ handleSubmit(e);
+ };
+
+ const handleStop = (e: React.FormEvent) => {
+ e.preventDefault();
+
+ stop();
+ };
+
+ const checkIfConversationExists = (uuid: string) => conversations?.find((conversation: Conversation) => conversation.id === uuid);
+
+ const updateConversation = (uuid: string) => {
+ const index = conversations?.findIndex((conversation: Conversation) => conversation.id === uuid);
+ if (index !== -1 && conversations) {
+ const updatedConversations = [...conversations];
+ updatedConversations[index!].conversation = messages;
+ updatedConversations[index!].updatedAt = new Date().toISOString();
+
+ setConversations(updatedConversations);
+ }
+ };
+
+ const appendConversation = (conversation: Conversation) => {
+ if (messages.length == 0) {
+ return;
+ }
+
+ const previousConversations = getLocalStorage('conversations');
+
+ const updatedConversations = previousConversations ? [...previousConversations, conversation] : [conversation];
+
+ setConversations(updatedConversations);
+ };
+
+ useEffect(() => {
+ if (chat && chat !== prevChat) {
+ setCurrentConversationUUID(chat);
+
+ const conversation = checkIfConversationExists(chat);
+
+ setMessages(conversation?.conversation || []);
+
+ if (conversation) {
+ updateConversation(chat);
+ }
+ } else {
+ if (!currentConversationUUID) {
+ setCurrentConversationUUID(crypto.randomUUID());
+ }
+
+ if (currentConversationUUID && messages.length > 0) {
+ const conversationExists = checkIfConversationExists(currentConversationUUID);
+
+ if (conversationExists) {
+ updateConversation(currentConversationUUID);
+ } else {
+ appendConversation({
+ id: currentConversationUUID,
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ conversation: messages,
+ });
+ }
+ }
+ }
+ }, [chat, currentConversationUUID, messages, prevChat]);
+
+ useEffect(() => {
+ inputRef.current?.focus();
+ }, []);
+
+ return (
+
+
+ {messages.length > 0 ? (
+
+
+
+ ) : (
+
+ )}
+
+
+ );
+}
diff --git a/app/[locale]/(home)/action.tsx b/app/[locale]/(home)/action.tsx
new file mode 100644
index 00000000..fe47d4a6
--- /dev/null
+++ b/app/[locale]/(home)/action.tsx
@@ -0,0 +1,156 @@
+import { ExperimentalMessage } from 'ai';
+import { createAI, createStreamableUI, createStreamableValue, getMutableAIState, StreamableValue } from 'ai/rsc';
+
+import { AskFollowUpQuestion } from '@/components/layout/search/block/ask-follow-up-question';
+import { BlockError } from '@/components/layout/search/block/error';
+import { Searching } from '@/components/layout/search/block/searching';
+import { Provider } from '@/config/provider';
+import { challenger } from '@/lib/search/challenger';
+import { clarifier } from '@/lib/search/clarifier';
+import { illustrator } from '@/lib/search/illustrator';
+import { searcher } from '@/lib/search/searcher';
+import { SimpleModel } from '@/types/model';
+import { SearchEngineSetting, TChallengerAction } from '@/types/search';
+import { ProviderSetting } from '@/types/settings';
+
+const allowProvider = ['OpenAI'] as Provider[];
+
+const chat = async (model: SimpleModel, messages: ExperimentalMessage[]) => {
+ 'use server';
+};
+
+const search = async (
+ model: SimpleModel,
+ currentProviderSettings: ProviderSetting | null,
+ currentSearchEngineSettings: SearchEngineSetting | null,
+ formData?: FormData,
+ isProSearch: boolean = false,
+ skip?: boolean
+) => {
+ 'use server';
+
+ if (!allowProvider.includes(model?.provider)) {
+ return {
+ id: Date.now(),
+ isGenerating: false,
+ component: ,
+ };
+ }
+
+ const hasOpenAI = process.env['NEXT_PUBLIC_ACCESS_OPENAI'] == 'true';
+ const hasTavily = process.env['NEXT_PUBLIC_ACCESS_TAVILY_SEARCH'] == 'true';
+
+ if (!hasOpenAI && !currentProviderSettings?.OpenAI) {
+ return {
+ id: Date.now(),
+ isGenerating: false,
+ component: ,
+ };
+ }
+
+ if (!hasTavily && !currentSearchEngineSettings?.Tavily) {
+ return {
+ id: Date.now(),
+ isGenerating: false,
+ component: ,
+ };
+ }
+
+ const aiState = getMutableAIState();
+ const uiStream = createStreamableUI();
+ const isGenerating = createStreamableValue(true);
+
+ const messages: ExperimentalMessage[] = aiState.get() as any;
+
+ const question = formData?.get('input') as string;
+
+ const userInput = skip ? `{"action": "skip"}` : question;
+ const content = skip ? userInput : formData ? JSON.stringify(Object.fromEntries(formData)) : null;
+
+ if (content) {
+ const message = { role: 'user', content };
+ messages.push(message as ExperimentalMessage);
+ aiState.update([...(aiState.get() as any), message]);
+ }
+
+ (async () => {
+ uiStream.update( );
+
+ let action = {
+ object: {
+ next: 'proceed',
+ },
+ } as TChallengerAction;
+
+ if (isProSearch) {
+ if (!skip) {
+ const challenge = await challenger(messages, model, currentProviderSettings);
+
+ action = challenge;
+ }
+
+ if (action.object.next === 'challenge') {
+ const clarify = await clarifier(uiStream, messages, model, currentProviderSettings);
+
+ uiStream.done();
+ isGenerating.done();
+
+ aiState.done([
+ ...aiState.get(),
+ {
+ role: 'assistant',
+ content: `clarify: ${clarify?.question}`,
+ },
+ ]);
+ return;
+ }
+ }
+
+ let answer = '';
+
+ const streamText = createStreamableValue();
+
+ while (answer.length === 0) {
+ const { fullResponse } = await searcher(uiStream, streamText, messages, isProSearch, model, currentSearchEngineSettings, currentProviderSettings);
+ answer = fullResponse;
+ }
+
+ streamText.done();
+
+ await illustrator(uiStream, messages, model, currentProviderSettings);
+
+ uiStream.append( );
+
+ isGenerating.done(false);
+
+ uiStream.done();
+
+ aiState.done([...aiState.get(), { role: 'assistant', content: answer }]);
+ })();
+
+ return {
+ id: Date.now(),
+ isGenerating: isGenerating.value,
+ component: uiStream.value,
+ };
+};
+
+const initialAIState: {
+ role: 'user' | 'assistant' | 'system' | 'function' | 'tool';
+ content: string;
+}[] = [];
+
+const initialUIState: {
+ id: number;
+ isGenerating: StreamableValue;
+ component: React.ReactNode;
+}[] = [];
+
+export const AI = createAI({
+ actions: {
+ chat,
+ search,
+ },
+ initialUIState,
+ initialAIState,
+});
diff --git a/app/[locale]/(home)/layout.tsx b/app/[locale]/(home)/layout.tsx
new file mode 100644
index 00000000..e57e4f0c
--- /dev/null
+++ b/app/[locale]/(home)/layout.tsx
@@ -0,0 +1,16 @@
+import HomeProvider from '@/app/[locale]/(home)/provider';
+import AppSidebar from '@/app/[locale]/(home)/sidebar';
+
+export default async function AppLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+
+ {children}
+
+ );
+}
diff --git a/app/[locale]/(home)/provider.tsx b/app/[locale]/(home)/provider.tsx
new file mode 100644
index 00000000..276b4f13
--- /dev/null
+++ b/app/[locale]/(home)/provider.tsx
@@ -0,0 +1,5 @@
+import { AI as AiProvider } from '@/app/[locale]/(home)/action';
+
+export default function HomeProvider({ children }: Readonly<{ children: React.ReactNode }>) {
+ return {children} ;
+}
diff --git a/app/[locale]/(home)/search/page.tsx b/app/[locale]/(home)/search/page.tsx
new file mode 100644
index 00000000..6b44ee56
--- /dev/null
+++ b/app/[locale]/(home)/search/page.tsx
@@ -0,0 +1,31 @@
+'use client';
+
+import { AddButton } from '@/components/layout/add-button';
+import { ModelSelect } from '@/components/layout/model-select';
+import { SearchWindow } from '@/components/layout/search/search-window';
+import {SearchSelect} from '@/components/layout/search-select';
+import { ShareButton } from '@/components/layout/share-button';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export default function Search() {
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/app/[locale]/(home)/sidebar.tsx b/app/[locale]/(home)/sidebar.tsx
new file mode 100644
index 00000000..ae0a578a
--- /dev/null
+++ b/app/[locale]/(home)/sidebar.tsx
@@ -0,0 +1,38 @@
+'use client';
+
+import { Suspense } from 'react';
+import { useAtom } from 'jotai';
+
+import { Brand } from '@/components/layout/brand';
+import { HistoryList } from '@/components/layout/history-list';
+import { LanguageDropdown } from '@/components/layout/language-dropdown';
+import { SettingsDialog } from '@/components/layout/settings-dialog';
+import { SettingsDrawer } from '@/components/layout/settings-drawer';
+import { ThemeDropdown } from '@/components/layout/theme-dropdown';
+import store from '@/hooks/store';
+import { useMediaQuery } from '@/hooks/window';
+
+export default function AppSidebar() {
+ const [conversations, setConversations] = useAtom(store.conversationsAtom);
+
+ const isDesktop = useMediaQuery('(min-width: 768px)');
+
+ return (
+
+
+
+
+
+
+
+
{isDesktop ? : }
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/app/[locale]/(landing)/layout.tsx b/app/[locale]/(landing)/layout.tsx
deleted file mode 100644
index 89b3aed8..00000000
--- a/app/[locale]/(landing)/layout.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import LandingSide from '@/components/landing/side';
-
-import { getCurrentUserProfile } from '@/lib/auth/session';
-
-export default async function LandingLayout({ children }: { children: React.ReactNode }) {
- const userProfile = await getCurrentUserProfile();
-
- return (
-
-
- {children}
-
- );
-}
diff --git a/app/[locale]/(landing)/mode/chat/page.tsx b/app/[locale]/(landing)/mode/chat/page.tsx
deleted file mode 100644
index b4fbf99c..00000000
--- a/app/[locale]/(landing)/mode/chat/page.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-'use client';
-
-import store from '@/hooks/store';
-import { useAtomValue } from 'jotai';
-
-import LandingHeader from '@/components/landing/main/header';
-import ChatMain from '@/components/landing/main/chat-main';
-
-export default function ChatModePage() {
- const isHiddenSide = useAtomValue(store.isHiddenSideAtom);
-
- return (
-
-
-
-
- );
-}
diff --git a/app/[locale]/(landing)/mode/code/page.tsx b/app/[locale]/(landing)/mode/code/page.tsx
deleted file mode 100644
index 3bdfdbe1..00000000
--- a/app/[locale]/(landing)/mode/code/page.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-'use client';
-
-import store from '@/hooks/store';
-import { useAtomValue } from 'jotai';
-
-import LandingHeader from '@/components/landing/main/header';
-import CodeMain from '@/components/landing/main/code-main';
-
-export default function CodeModePage() {
- const isHiddenSide = useAtomValue(store.isHiddenSideAtom);
-
- return (
-
-
-
-
- );
-}
diff --git a/app/[locale]/(landing)/mode/file/page.tsx b/app/[locale]/(landing)/mode/file/page.tsx
deleted file mode 100644
index 92a37835..00000000
--- a/app/[locale]/(landing)/mode/file/page.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-'use client';
-
-import store from '@/hooks/store';
-import { useAtomValue } from 'jotai';
-
-import LandingHeader from '@/components/landing/main/header';
-import FileMain from '@/components/landing/main/file-main';
-
-export default function FileModePage() {
- const isHiddenSide = useAtomValue(store.isHiddenSideAtom);
-
- return (
-
-
-
-
- );
-}
diff --git a/app/[locale]/(landing)/page.tsx b/app/[locale]/(landing)/page.tsx
deleted file mode 100644
index d4f9bde9..00000000
--- a/app/[locale]/(landing)/page.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import dynamic from 'next/dynamic';
-
-const ChatMode = dynamic(() => import('@/app/[locale]/(landing)/mode/chat/page'), {});
-
-export default function LandingPage() {
- return ;
-}
diff --git a/app/[locale]/(share)/s/[shareID]/page.tsx b/app/[locale]/(share)/s/[shareID]/page.tsx
deleted file mode 100644
index 1aa3bf12..00000000
--- a/app/[locale]/(share)/s/[shareID]/page.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { notFound } from 'next/navigation';
-
-import { database } from '@/lib/database';
-
-import { Share } from '@prisma/client';
-
-import SharePost from '@/components/share/post';
-
-const getShareByShareID = async (shareID: Share['id']) => {
- return await database.share.findFirst({
- where: {
- id: shareID,
- },
- });
-};
-
-export default async function SharePage({ params }: { params: { shareID: string } }) {
- const share = await getShareByShareID(params.shareID);
-
- if (!share) {
- notFound();
- }
-
- return (
-
-
-
- );
-}
diff --git a/app/[locale]/(share)/s/layout.tsx b/app/[locale]/(share)/s/layout.tsx
deleted file mode 100644
index 88f42f25..00000000
--- a/app/[locale]/(share)/s/layout.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function ShareLayout({ children }: { children: React.ReactNode }) {
- return {children}
;
-}
diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx
index 22d634d4..9e9553f5 100644
--- a/app/[locale]/layout.tsx
+++ b/app/[locale]/layout.tsx
@@ -1,29 +1,15 @@
-import '@/styles/globals.css';
-import '@/styles/markdown.css';
-import 'tippy.js/dist/tippy.css';
-
-import { NextIntlClientProvider } from 'next-intl';
-
-import { HotToaster } from '@/components/client/toaster';
-import { ClientCommand } from '@/components/client/command';
-
-import { notFound } from 'next/navigation';
+import LocaleProvider from '@/app/[locale]/provider';
-export default async function LocaleLayout({ children, params: { locale } }: { children: React.ReactNode; params: { locale: string } }) {
- let locales;
-
- try {
- locales = (await import(`../../locales/${locale}.json`)).default;
- } catch (error) {
- notFound();
- }
+import '@/styles/globals.css';
+export default function LocaleLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
return (
-
-
-
-
- {children}
-
+
+ {children}
+
);
}
diff --git a/app/[locale]/provider.tsx b/app/[locale]/provider.tsx
new file mode 100644
index 00000000..d792cd27
--- /dev/null
+++ b/app/[locale]/provider.tsx
@@ -0,0 +1,7 @@
+import { NextIntlClientProvider, useMessages } from 'next-intl';
+
+export default function LocaleProvider({ children }: Readonly<{ children: React.ReactNode }>) {
+ const messages = useMessages();
+
+ return {children} ;
+}
diff --git a/app/api/app/latest/route.ts b/app/api/app/latest/route.ts
new file mode 100644
index 00000000..f6e9f02d
--- /dev/null
+++ b/app/api/app/latest/route.ts
@@ -0,0 +1,13 @@
+import { getLatestVersion } from '@/utils/app/version';
+
+export async function GET(request: Request) {
+ const latestVersion = await getLatestVersion({ owner: 'okisdev', repo: 'ChatChat' });
+
+ return Response.json(
+ {
+ short: { version: latestVersion.tag_name, version_name: latestVersion.name },
+ details: latestVersion,
+ },
+ { status: 200 }
+ );
+}
diff --git a/app/api/author/route.ts b/app/api/author/route.ts
deleted file mode 100644
index db093c2e..00000000
--- a/app/api/author/route.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { NextResponse } from 'next/server';
-
-export const runtime = 'edge';
-
-export async function GET(request: Request) {
- return NextResponse.json({ author: 'Harry Yep' }, { status: 200 });
-}
diff --git a/app/api/chat/messages/amazon/route.ts b/app/api/chat/messages/amazon/route.ts
new file mode 100644
index 00000000..9af0dd6b
--- /dev/null
+++ b/app/api/chat/messages/amazon/route.ts
@@ -0,0 +1,51 @@
+// import { BedrockRuntimeClient, InvokeModelWithResponseStreamCommand } from '@aws-sdk/client-bedrock-runtime';
+// import { AWSBedrockAnthropicStream, StreamingTextResponse } from 'ai';
+// import { experimental_buildAnthropicPrompt } from 'ai/prompts';
+
+// import { ApiConfig } from '@/types/app';
+
+// export const runtime = 'edge';
+
+// export const dynamic = 'force-dynamic';
+
+// const amazon = new BedrockRuntimeClient({
+// region: process.env.AWS_REGION ?? 'us-east-1',
+// credentials: {
+// accessKeyId: process.env.AWS_ACCESS_KEY ?? '',
+// secretAccessKey: process.env.AWS_SECRET_KEY ?? '',
+// },
+// });
+
+// export async function POST(req: Request) {
+// const {
+// messages,
+// config,
+// stream,
+// }: {
+// messages: any[];
+// config: ApiConfig;
+// stream: boolean;
+// } = await req.json();
+
+// const response = await amazon.send(
+// new InvokeModelWithResponseStreamCommand({
+// modelId: config.model.model_id,
+// contentType: 'application/json',
+// accept: 'application/json',
+// body: JSON.stringify({
+// prompt: experimental_buildAnthropicPrompt(messages),
+// max_tokens_to_sample: 300,
+// stream: stream,
+// }),
+// })
+// );
+
+// const output = AWSBedrockAnthropicStream(response);
+
+// return new StreamingTextResponse(output);
+// }
+
+
+export async function GET(req: Request) {
+ return Response.json({ error: 'Method Not Allowed' }, { status: 405 });
+}
diff --git a/app/api/chat/messages/anthropic/route.ts b/app/api/chat/messages/anthropic/route.ts
new file mode 100644
index 00000000..2146cde5
--- /dev/null
+++ b/app/api/chat/messages/anthropic/route.ts
@@ -0,0 +1,35 @@
+import Anthropic from '@anthropic-ai/sdk';
+import { AnthropicStream, StreamingTextResponse } from 'ai';
+
+import { ApiConfig } from '@/types/app';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const anthropic = new Anthropic({
+ apiKey: config.provider?.apiKey ?? process.env.ANTHROPIC_API_KEY ?? '',
+ });
+
+ const response = await anthropic.messages.create({
+ messages,
+ model: config.model.model_id,
+ stream: true,
+ max_tokens: 4096,
+ });
+
+ const output = AnthropicStream(response);
+
+ return new StreamingTextResponse(output);
+}
diff --git a/app/api/chat/messages/azure/route.ts b/app/api/chat/messages/azure/route.ts
new file mode 100644
index 00000000..252c9b85
--- /dev/null
+++ b/app/api/chat/messages/azure/route.ts
@@ -0,0 +1,31 @@
+// import { SimpleModel } from '@/types/model';
+// import { OpenAIClient, AzureKeyCredential } from '@azure/openai';
+// import { OpenAIStream, StreamingTextResponse } from 'ai';
+
+// const client = new OpenAIClient(process.env.AZURE_OPENAI_ENDPOINT ?? '', new AzureKeyCredential(process.env.AZURE_OPENAI_API_KEY ?? ''));
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+// export async function POST(req: Request) {
+// const {
+// messages,
+// model,
+// }: { stream
+// }: {
+// messages: any[];
+// model: SimpleModel;
+// stream: boolean;
+// } = await req.json();
+
+// const response = await client.streamChatCompletions(process.env.AZURE_OPENAI_DEPLOY_INSTANCE_NAME || '', messages);
+
+// const stream = OpenAIStream(response);
+
+// return new StreamingTextResponse(stream);
+// }
+
+export async function GET(req: Request) {
+ return Response.json({ error: 'Method Not Allowed' }, { status: 405 });
+}
diff --git a/app/api/chat/messages/cohere/route.ts b/app/api/chat/messages/cohere/route.ts
new file mode 100644
index 00000000..793a15e4
--- /dev/null
+++ b/app/api/chat/messages/cohere/route.ts
@@ -0,0 +1,51 @@
+import { Message } from 'ai';
+import { CohereClient } from 'cohere-ai';
+
+import { ApiConfig } from '@/types/app';
+import { toCohereRole } from '@/utils/provider/cohere';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const chatHistory = messages.map((message: Message) => ({
+ message: message.content,
+ role: toCohereRole(message.role),
+ }));
+
+ const lastMessage = chatHistory.pop()!;
+
+ const cohere = new CohereClient({
+ token: config.provider?.apiKey ?? process.env.COHERE_API_KEY ?? '',
+ });
+
+ const response = await cohere.chatStream({
+ message: lastMessage.message,
+ chatHistory,
+ model: config.model.model_id,
+ });
+
+ const output = new ReadableStream({
+ async start(controller) {
+ for await (const event of response) {
+ if (event.eventType === 'text-generation') {
+ controller.enqueue(event.text);
+ }
+ }
+ controller.close();
+ },
+ });
+
+ return new Response(output);
+}
diff --git a/app/api/chat/messages/fireworks/route.ts b/app/api/chat/messages/fireworks/route.ts
new file mode 100644
index 00000000..5ce9032b
--- /dev/null
+++ b/app/api/chat/messages/fireworks/route.ts
@@ -0,0 +1,36 @@
+import { OpenAIStream, StreamingTextResponse } from 'ai';
+import OpenAI from 'openai';
+
+import { ApiConfig } from '@/types/app';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const fireworks = new OpenAI({
+ apiKey: config.provider.apiKey ?? process.env.FIREWORKS_API_KEY ?? '',
+ baseURL: 'https://api.fireworks.ai/inference/v1',
+ });
+
+ const response = await fireworks.chat.completions.create({
+ model: config.model.model_id,
+ stream: true,
+ max_tokens: 1000,
+ messages,
+ });
+
+ const output = OpenAIStream(response);
+
+ return new StreamingTextResponse(output);
+}
diff --git a/app/api/chat/messages/google/route.ts b/app/api/chat/messages/google/route.ts
new file mode 100644
index 00000000..833dd313
--- /dev/null
+++ b/app/api/chat/messages/google/route.ts
@@ -0,0 +1,29 @@
+import { GoogleGenerativeAI } from '@google/generative-ai';
+import { GoogleGenerativeAIStream, StreamingTextResponse } from 'ai';
+
+import { ApiConfig } from '@/types/app';
+import { toGoogleMessage } from '@/utils/provider/google';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const genAI = new GoogleGenerativeAI(config.provider?.apiKey ?? process.env.GOOGLE_API_KEY ?? '');
+
+ const response = await genAI.getGenerativeModel({ model: config.model.model_id }).generateContentStream(toGoogleMessage(messages));
+
+ const output = GoogleGenerativeAIStream(response);
+
+ return new StreamingTextResponse(output);
+}
diff --git a/app/api/chat/messages/groq/route.ts b/app/api/chat/messages/groq/route.ts
new file mode 100644
index 00000000..462a8427
--- /dev/null
+++ b/app/api/chat/messages/groq/route.ts
@@ -0,0 +1,34 @@
+import { OpenAIStream, StreamingTextResponse } from 'ai';
+import Groq from 'groq-sdk';
+
+import { ApiConfig } from '@/types/app';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const groq = new Groq({
+ apiKey: config.provider?.apiKey ?? process.env.GROQ_API_KEY ?? '',
+ });
+
+ const response = await groq.chat.completions.create({
+ model: config.model.model_id,
+ stream: true,
+ messages,
+ });
+
+ const output = OpenAIStream(response);
+
+ return new StreamingTextResponse(output);
+}
diff --git a/app/api/chat/messages/huggingface/route.ts b/app/api/chat/messages/huggingface/route.ts
new file mode 100644
index 00000000..3528a1a3
--- /dev/null
+++ b/app/api/chat/messages/huggingface/route.ts
@@ -0,0 +1,39 @@
+import { HfInference } from '@huggingface/inference';
+import { HuggingFaceStream, StreamingTextResponse } from 'ai';
+import { experimental_buildOpenAssistantPrompt } from 'ai/prompts';
+
+import { ApiConfig } from '@/types/app';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const huggingface = new HfInference(config.provider?.apiKey ?? process.env.HUGGINGFACE_API_KEY ?? '');
+
+ const response = huggingface.textGenerationStream({
+ model: config.model.model_id,
+ inputs: experimental_buildOpenAssistantPrompt(messages),
+ parameters: {
+ max_new_tokens: 200,
+ typical_p: 0.2,
+ repetition_penalty: 1,
+ truncate: 1000,
+ return_full_text: false,
+ },
+ });
+
+ const output = HuggingFaceStream(response);
+
+ return new StreamingTextResponse(output);
+}
diff --git a/app/api/chat/messages/mistral/route.ts b/app/api/chat/messages/mistral/route.ts
new file mode 100644
index 00000000..a684040a
--- /dev/null
+++ b/app/api/chat/messages/mistral/route.ts
@@ -0,0 +1,32 @@
+import MistralClient from '@mistralai/mistralai';
+import { MistralStream, StreamingTextResponse } from 'ai';
+
+import { ApiConfig } from '@/types/app';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const mistral = new MistralClient(config.provider?.apiKey ?? process.env.MISTRAL_API_KEY ?? '');
+
+ const response = mistral.chatStream({
+ model: config.model.model_id,
+ maxTokens: 1000,
+ messages,
+ });
+
+ const output = MistralStream(response);
+
+ return new StreamingTextResponse(output);
+}
diff --git a/app/api/chat/messages/openai/route.ts b/app/api/chat/messages/openai/route.ts
new file mode 100644
index 00000000..4a4d0569
--- /dev/null
+++ b/app/api/chat/messages/openai/route.ts
@@ -0,0 +1,35 @@
+import { OpenAIStream, StreamingTextResponse } from 'ai';
+import OpenAI from 'openai';
+
+import { ApiConfig } from '@/types/app';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const openai = new OpenAI({
+ apiKey: config.provider?.apiKey ?? process.env.OPENAI_API_KEY ?? '',
+ baseURL: config.provider?.endpoint ?? process.env.OPENAI_API_ENDPOINT ?? 'https://api.openai.com/v1',
+ });
+
+ const response = await openai.chat.completions.create({
+ model: config.model.model_id,
+ stream: true,
+ messages,
+ });
+
+ const output = OpenAIStream(response);
+
+ return new StreamingTextResponse(output);
+}
diff --git a/app/api/chat/messages/perplexity/route.ts b/app/api/chat/messages/perplexity/route.ts
new file mode 100644
index 00000000..567ee82f
--- /dev/null
+++ b/app/api/chat/messages/perplexity/route.ts
@@ -0,0 +1,36 @@
+import { OpenAIStream, StreamingTextResponse } from 'ai';
+import OpenAI from 'openai';
+
+import { ApiConfig } from '@/types/app';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ const perplexity = new OpenAI({
+ apiKey: config.provider?.apiKey ?? process.env.PERPLEXITY_API_KEY ?? '',
+ baseURL: config.provider?.endpoint ?? process.env.PERPLEXITY_ENDPOINT ?? 'https://api.perplexity.ai/',
+ });
+
+ const response = await perplexity.chat.completions.create({
+ model: config.model.model_id,
+ stream: true,
+ max_tokens: 4096,
+ messages,
+ });
+
+ const output = OpenAIStream(response);
+
+ return new StreamingTextResponse(output);
+}
diff --git a/app/api/chat/messages/route.ts b/app/api/chat/messages/route.ts
new file mode 100644
index 00000000..0090f6b4
--- /dev/null
+++ b/app/api/chat/messages/route.ts
@@ -0,0 +1,191 @@
+import Anthropic from '@anthropic-ai/sdk';
+// import { BedrockRuntimeClient, InvokeModelWithResponseStreamCommand } from '@aws-sdk/client-bedrock-runtime';
+import { GoogleGenerativeAI } from '@google/generative-ai';
+import { HfInference } from '@huggingface/inference';
+import MistralClient from '@mistralai/mistralai';
+import { AnthropicStream, GoogleGenerativeAIStream, HuggingFaceStream, Message, MistralStream, OpenAIStream, StreamingTextResponse } from 'ai';
+import { experimental_buildOpenAssistantPrompt } from 'ai/prompts';
+import { CohereClient } from 'cohere-ai';
+import Groq from 'groq-sdk';
+import OpenAI from 'openai';
+
+import { Provider } from '@/config/provider';
+import { ApiConfig } from '@/types/app';
+import { toCohereRole } from '@/utils/provider/cohere';
+import { toGoogleMessage } from '@/utils/provider/google';
+
+// const amazon = new BedrockRuntimeClient({
+// region: process.env.AWS_REGION ?? 'us-east-1',
+// credentials: {
+// accessKeyId: process.env.AWS_ACCESS_KEY ?? '',
+// secretAccessKey: process.env.AWS_SECRET_KEY ?? '',
+// },
+// });
+
+const anthropic = new Anthropic({
+ apiKey: process.env.ANTHROPIC_API_KEY ?? '',
+});
+
+const cohere = new CohereClient({
+ token: process.env.COHERE_API_KEY ?? '',
+});
+
+const fireworks = new OpenAI({
+ apiKey: process.env.FIREWORKS_API_KEY ?? '',
+ baseURL: 'https://api.fireworks.ai/inference/v1',
+});
+
+const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY ?? '');
+
+const groq = new Groq({
+ apiKey: process.env.GROQ_API_KEY ?? '',
+});
+
+const huggingface = new HfInference(process.env.HUGGINGFACE_API_KEY);
+
+const mistral = new MistralClient(process.env.MISTRAL_API_KEY ?? '');
+
+const openai = new OpenAI({
+ apiKey: process.env.OPENAI_API_KEY ?? '',
+});
+
+const perplexity = new OpenAI({
+ apiKey: process.env.PERPLEXITY_API_KEY ?? '',
+ baseURL: process.env.PERPLEXITY_ENDPOINT ?? 'https://api.perplexity.ai/',
+});
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: any[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ switch (config.model.provider) {
+ // case Provider.Amazon: {
+ // const response = await amazon.send(
+ // new InvokeModelWithResponseStreamCommand({
+ // modelId: model.model_id,
+ // contentType: 'application/json',
+ // accept: 'application/json',
+ // body: JSON.stringify({
+ // prompt: experimental_buildAnthropicPrompt(messages),
+ // max_tokens_to_sample: 300,
+ // }),
+ // })
+ // );
+ // const output = AWSBedrockAnthropicStream(response);
+ // return new StreamingTextResponse(output);
+ // }
+ case Provider.Anthropic: {
+ const response = await anthropic.messages.create({
+ messages,
+ model: config.model.model_id,
+ stream: true,
+ max_tokens: 4096,
+ });
+ const output = AnthropicStream(response);
+ return new StreamingTextResponse(output);
+ }
+ case Provider.Cohere: {
+ const cohereChatHistory = messages.map((message: Message) => ({
+ message: message.content,
+ role: toCohereRole(message.role),
+ }));
+ const lastMessage = cohereChatHistory.pop()!;
+ const response = await cohere.chatStream({
+ message: lastMessage.message,
+ chatHistory: cohereChatHistory,
+ model: config.model.model_id,
+ });
+ const output = new ReadableStream({
+ async start(controller) {
+ for await (const event of response) {
+ if (event.eventType === 'text-generation') {
+ controller.enqueue(event.text);
+ }
+ }
+ controller.close();
+ },
+ });
+ return new StreamingTextResponse(output);
+ }
+ case Provider.Fireworks: {
+ const response = await fireworks.chat.completions.create({
+ model: config.model.model_id,
+ stream: true,
+ max_tokens: 1000,
+ messages,
+ });
+ const output = OpenAIStream(response);
+ return new StreamingTextResponse(output);
+ }
+ case Provider.Google: {
+ const geminiStream = await genAI.getGenerativeModel({ model: config.model.model_id }).generateContentStream(toGoogleMessage(messages));
+ const output = GoogleGenerativeAIStream(geminiStream);
+ return new StreamingTextResponse(output);
+ }
+ case Provider.Groq: {
+ const response = await groq.chat.completions.create({
+ model: config.model.model_id,
+ stream: true,
+ messages,
+ });
+ const output = OpenAIStream(response);
+ return new StreamingTextResponse(output);
+ }
+ case Provider.HuggingFace: {
+ const response = huggingface.textGenerationStream({
+ model: config.model.model_id,
+ inputs: experimental_buildOpenAssistantPrompt(messages),
+ parameters: {
+ max_new_tokens: 200,
+ typical_p: 0.2,
+ repetition_penalty: 1,
+ truncate: 1000,
+ return_full_text: false,
+ },
+ });
+ const output = HuggingFaceStream(response);
+ return new StreamingTextResponse(output);
+ }
+ case Provider.Mistral: {
+ const response = mistral.chatStream({
+ model: config.model.model_id,
+ maxTokens: 1000,
+ messages,
+ });
+ const output = MistralStream(response);
+ return new StreamingTextResponse(output);
+ }
+ case Provider.OpenAI: {
+ const response = await openai.chat.completions.create({
+ model: config.model.model_id,
+ stream: true,
+ messages,
+ });
+ const output = OpenAIStream(response);
+ return new StreamingTextResponse(output);
+ }
+ case Provider.Perplexity: {
+ const response = await perplexity.chat.completions.create({
+ model: config.model.model_id,
+ stream: true,
+ max_tokens: 4096,
+ messages,
+ });
+ const output = OpenAIStream(response);
+ return new StreamingTextResponse(output);
+ }
+ default:
+ return new Response('Invalid Provider', { status: 400 });
+ }
+}
diff --git a/app/api/messages/route.ts b/app/api/messages/route.ts
deleted file mode 100644
index 1e1e68e3..00000000
--- a/app/api/messages/route.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { sendClaudeMessages } from '@/utils/provider/claude/messages';
-import { sendCohereMessages } from '@/utils/provider/cohere/messages';
-import { sendTeamStreamMessages } from '@/utils/provider/team/messages';
-import { sendHuggingFaceMessages } from '@/utils/provider/huggingface/messages';
-import { sendAzureMessages, sendAzureStreamMessages } from '@/utils/provider/azure/messages';
-import { sendOpenAIMessages, sendOpenAIStreamMessages } from '@/utils/provider/openai/messages';
-
-export const runtime = 'edge';
-
-export async function POST(req: Request): Promise {
- const { stream, serviceProvider, config, messages } = await req.json();
-
- switch (serviceProvider) {
- default:
- case 'OpenAI':
- const openAIAPIKey = (config?.apiKey || process.env.OPENAI_API_KEY) as string;
- const openAIAPIEndpoint = (config?.apiEndpoint || process.env.OPENAI_API_ENDPOINT) as string;
- const openAIAPIModel = (config?.apiModel as OpenAIModel) || 'gpt-3.5-turbo';
- const openAIAPITemperature = (config?.apiTemperature as number) || 0.3;
-
- if (!messages) {
- return new Response('No messages in the request', { status: 400 });
- }
-
- const openAIPayload: OpenAIChatPayload = {
- model: openAIAPIModel as OpenAIModel,
- messages: messages as OpenAIMessage[],
- temperature: openAIAPITemperature as number,
- stream: stream as boolean,
- };
-
- if (stream) {
- const openAIStreamMessagesResponse = await sendOpenAIStreamMessages(openAIPayload, openAIAPIKey, openAIAPIEndpoint);
-
- return new Response(openAIStreamMessagesResponse);
- } else {
- const openAIMessagesResponse = await sendOpenAIMessages(openAIPayload, openAIAPIKey, openAIAPIEndpoint);
-
- return new Response(openAIMessagesResponse);
- }
- case 'Azure':
- const azureAPIKey = config?.apiKey as string;
- const azureAPIEndpoint = config?.apiEndpoint as string;
- const azureAPIModel = (config?.apiModel as OpenAIModel) || 'gpt-3.5-turbo';
- const azureAPITemperature = (config?.apiTemperature as number) || 0.3;
- const azureAPIDeploymentName = config?.apiDeploymentName as string;
-
- if (!messages) {
- return new Response('No messages in the request', { status: 400 });
- }
-
- const azurePayload: OpenAIChatPayload = {
- model: azureAPIModel as OpenAIModel,
- messages: messages as OpenAIMessage[],
- temperature: azureAPITemperature as number,
- stream: stream as boolean,
- };
-
- if (stream) {
- const azureStreamMessagesResponse = await sendAzureStreamMessages(azurePayload, azureAPIKey, azureAPIEndpoint, azureAPIDeploymentName);
-
- return new Response(azureStreamMessagesResponse);
- } else {
- const azureMessagesResponse = await sendAzureMessages(azurePayload, azureAPIKey, azureAPIEndpoint, azureAPIDeploymentName);
-
- return new Response(JSON.stringify(azureMessagesResponse));
- }
- case 'Team':
- const teamAccessCode = config?.accessCode as string;
-
- const teamPayload = {
- messages: messages as OpenAIMessage[],
- };
-
- const teamStreamMessagesResponse = await sendTeamStreamMessages(teamPayload, teamAccessCode);
-
- return new Response(teamStreamMessagesResponse);
- case 'Hugging Face':
- const huggingfaceModel = config?.model as string;
- const huggingfaceAccessToken = config?.accessToken as string;
- const huggingfaceMessage = messages[messages.length - 1]?.content;
-
- const huggingFaceMessagesResponse = await sendHuggingFaceMessages(huggingfaceModel, huggingfaceMessage, huggingfaceAccessToken);
-
- return new Response(JSON.stringify(huggingFaceMessagesResponse));
- case 'Cohere':
- const cohereModel = config?.model as string;
- const cohereMessage = messages[messages.length - 1]?.content;
- const cohereAPIKey = config?.apiKey as string;
-
- const cohereMessagesResponse = await sendCohereMessages(cohereModel, cohereMessage, cohereAPIKey);
-
- return new Response(JSON.stringify(cohereMessagesResponse));
- case 'Claude':
- const claudeModel = config?.model as string;
- const claudeMessage = messages[messages.length - 1]?.content;
- const claudeAPIKey = config?.apiKey as string;
- const claudeAPITemperature = config?.apiTemperature as number;
-
- const claudeMessagesResponse = await sendClaudeMessages(claudeModel, claudeMessage, claudeAPIKey, claudeAPITemperature);
-
- return new Response(JSON.stringify(claudeMessagesResponse));
- }
-}
diff --git a/app/api/search/google/route.ts b/app/api/search/google/route.ts
new file mode 100644
index 00000000..f33509f7
--- /dev/null
+++ b/app/api/search/google/route.ts
@@ -0,0 +1,87 @@
+import { experimental_streamText, ExperimentalMessage, StreamingTextResponse, ToolCallPart, ToolResultPart } from 'ai';
+import { OpenAI } from 'ai/openai';
+import { createStreamableUI, createStreamableValue } from 'ai/rsc';
+
+import { searcherPrompt } from '@/lib/prompt';
+import { searcherSchema } from '@/lib/search/searcher';
+import { ApiConfig } from '@/types/app';
+import { withGoogleSearch } from '@/utils/search/engines/google';
+
+export const runtime = 'edge';
+
+export const dynamic = 'force-dynamic';
+
+export async function POST(req: Request) {
+ const {
+ messages,
+ config,
+ stream,
+ }: {
+ messages: ExperimentalMessage[];
+ config: ApiConfig;
+ stream: boolean;
+ } = await req.json();
+
+ let fullResponse = '';
+
+ const streamText = createStreamableValue();
+
+ const uiStream = createStreamableUI();
+
+ const openai = new OpenAI({
+ apiKey: config.provider?.apiKey ?? process.env.OPENAI_API_KEY ?? '',
+ baseUrl: config.provider?.endpoint ?? process.env.OPENAI_API_ENDPOINT ?? 'https://api.openai.com/v1',
+ });
+
+ const result = await experimental_streamText({
+ model: openai.chat('gpt-4'),
+ system: searcherPrompt,
+ messages,
+ tools: {
+ search: {
+ description: 'Search the web for information.',
+ parameters: searcherSchema,
+ execute: async ({ query }: { query: string }) => {
+ const searchResult = await withGoogleSearch(query);
+
+ return searchResult;
+ },
+ },
+ },
+ });
+
+ const toolCalls: ToolCallPart[] = [];
+ const toolResponses: ToolResultPart[] = [];
+ for await (const delta of result.fullStream) {
+ switch (delta.type) {
+ case 'text-delta':
+ if (delta.textDelta) {
+ if (fullResponse.length === 0 && delta.textDelta.length > 0) {
+ }
+
+ fullResponse += delta.textDelta;
+ streamText.update(fullResponse);
+ }
+ break;
+ case 'tool-call':
+ toolCalls.push(delta);
+ break;
+ case 'tool-result':
+ toolResponses.push(delta);
+ break;
+ case 'error':
+ fullResponse += `\nError occurred while executing the tool`;
+ break;
+ }
+ }
+ messages.push({
+ role: 'assistant',
+ content: [{ type: 'text', text: fullResponse }, ...toolCalls],
+ });
+
+ if (toolResponses.length > 0) {
+ messages.push({ role: 'tool', content: toolResponses });
+ }
+
+ return new StreamingTextResponse(result.toAIStream());
+}
diff --git a/app/api/search/route.ts b/app/api/search/route.ts
new file mode 100644
index 00000000..08734c98
--- /dev/null
+++ b/app/api/search/route.ts
@@ -0,0 +1,242 @@
+// import { GeneralModel } from '@/types/model';
+// import { getGoogleSearch } from '@/utils/search/engines/google';
+// import { AnthropicStream, StreamingTextResponse } from 'ai';
+// import { defaultSearchPrompt, template1 } from '@/prompt/search';
+
+// import Anthropic from '@anthropic-ai/sdk';
+
+// import { CallbackManagerForRetrieverRun } from 'langchain/callbacks';
+// import { ChatOpenAI } from '@langchain/openai';
+// import { OpenAIEmbeddings } from '@langchain/openai';
+// import { ChatPromptTemplate, MessagesPlaceholder, PromptTemplate } from '@langchain/core/prompts';
+// import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression';
+// import { TavilySearchAPIRetriever } from '@langchain/community/retrievers/tavily_search_api';
+// import { DocumentCompressorPipeline } from 'langchain/retrievers/document_compressors';
+// import { EmbeddingsFilter } from 'langchain/retrievers/document_compressors/embeddings_filter';
+// import { Document } from 'langchain/document';
+// import { BaseLanguageModel } from 'langchain/base_language';
+// import { HumanMessage, AIMessage } from '@langchain/core/messages';
+// import { StringOutputParser } from '@langchain/core/output_parsers';
+// import { RunnableMap, RunnableBranch, RunnableLambda, Runnable } from '@langchain/core/runnables';
+// import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter';
+// import { GoogleCustomSearch } from 'langchain/tools';
+
+// const anthropic = new Anthropic({
+// apiKey: process.env.ANTHROPIC_API_KEY || '',
+// });
+
+// export const runtime = 'edge';
+
+// interface ChatRequest {
+// questions: string[];
+// chatHistory: string[];
+// }
+
+// const RESPONSE_TEMPLATE = `
+// You are an expert researcher and writer, tasked with answering any question.
+
+// Generate a comprehensive and informative, yet concise answer of 250 words or less for the \
+// given question based solely on the provided search results (URL and content). You must \
+// only use information from the provided search results. Use an unbiased and \
+// journalistic tone. Combine search results together into a coherent answer. Do not \
+// repeat text. Cite search results using [\${{number}}] notation. Only cite the most \
+// relevant results that answer the question accurately. Place these citations at the end \
+// of the sentence or paragraph that reference them - do not put them all at the end. If \
+// different results refer to different entities within the same name, write separate \
+// answers for each entity. If you want to cite multiple results for the same sentence, \
+// format it as \`[\${{number1}}] [\${{number2}}]\`. However, you should NEVER do this with the \
+// same number - if you want to cite \`number1\` multiple times for a sentence, only do \
+// \`[\${{number1}}]\` not \`[\${{number1}}] [\${{number1}}]\`
+
+// You should use bullet points in your answer for readability. Put citations where they apply \
+// rather than putting them all at the end.
+
+// If there is nothing in the context relevant to the question at hand, just say "Hmm, \
+// I'm not sure." Don't try to make up an answer.
+
+// Anything between the following \`context\` html blocks is retrieved from a knowledge \
+// bank, not part of the conversation with the user.
+
+//
+// {context}
+//
+
+// REMEMBER: If there is no relevant information within the context, just say "Hmm, I'm \
+// not sure." Don't try to make up an answer. Anything between the preceding 'context' \
+// html blocks is retrieved from a knowledge bank, not part of the conversation with the \
+// user. The current date is {current_date}.
+// `;
+
+// const REPHRASE_TEMPLATE = `
+// Given the following conversation and a follow up question, rephrase the follow up \
+// question to be a standalone question.
+
+// Chat History:
+// {chat_history}
+// Follow Up Input: {question}
+// Standalone Question:
+// `;
+
+// const getRetriever = () => {
+// const embeddings = new OpenAIEmbeddings({
+// openAIApiKey: process.env.OPENAI_API_KEY,
+// });
+
+// const splitter = new RecursiveCharacterTextSplitter({
+// chunkSize: 800,
+// chunkOverlap: 20,
+// });
+
+// const relevantFilter = new EmbeddingsFilter({
+// embeddings: embeddings,
+// similarityThreshold: 0.8,
+// });
+
+// const pipelineCompressor = new DocumentCompressorPipeline({
+// transformers: [splitter, relevantFilter],
+// });
+
+// const baseTavilyRetriever = new TavilySearchAPIRetriever({
+// k: 6,
+// includeRawContent: true,
+// includeImages: true,
+// });
+
+// const tavilyRetriever = new ContextualCompressionRetriever({
+// baseCompressor: pipelineCompressor,
+// baseRetriever: baseTavilyRetriever,
+// });
+
+// // const baseGoogleRetriever = new GoogleCustomSearchRetriever();
+
+// // const googleRetriever = new ContextualCompressionRetriever({
+// // baseCompressor: pipelineCompressor,
+// // baseRetriever: baseGoogleRetriever,
+// // });
+
+// return tavilyRetriever.withConfig({
+// runName: 'final_source_retriever',
+// });
+// };
+
+// const createRetrieverChain = (llm: BaseLanguageModel, retriever: ContextualCompressionRetriever): Runnable => {
+// const CONDENSE_QUESTION_PROMPT = PromptTemplate.fromTemplate(REPHRASE_TEMPLATE);
+
+// const condenseQuestionChain = (CONDENSE_QUESTION_PROMPT || llm || StringOutputParser).withConfig({
+// runName: 'condense_question',
+// });
+
+// const conversationChain = condenseQuestionChain || retriever;
+
+// return new RunnableBranch(
+// new RunnableLambda({
+// func: (context) => Boolean(context.chatHistory),
+// }).withConfig({
+// runName: 'retrieve_chat_history',
+// })
+// ).withConfig({
+// runName: 'route_depending_on_chat_history',
+// });
+// };
+
+// class GoogleCustomSearchRetriever {
+// search = null;
+// number_search_results = 10;
+
+// cleanSearchQuery(query: string) {
+// // Check if the first character is a digit
+// if (!isNaN(parseInt(query.charAt(0)))) {
+// // Find the position of the first quote
+// let firstQuotePos = query.indexOf('"');
+// if (firstQuotePos !== -1) {
+// // Extract the part of the string after the quote
+// query = query.substring(firstQuotePos + 1);
+// // Remove the trailing quote if present
+// if (query.endsWith('"')) {
+// query = query.slice(0, -1);
+// }
+// }
+// }
+// return query.trim();
+// }
+
+// searchTool(query: string, num_search_results = 1) {
+// let queryClean = this.cleanSearchQuery(query);
+// let result = this.search.results(queryClean, num_search_results);
+// return result;
+// }
+
+// async getRelevantDocuments(query, runManager) {
+// if (typeof process.env.GOOGLE_API_KEY === 'undefined') {
+// throw new Error('No Google API key provided');
+// }
+
+// if (this.search === null) {
+// this.search = new GoogleSearchAPIWrapper();
+// }
+
+// // Get search questions
+// console.log('Generating questions for Google Search ...');
+
+// // Get urls
+// console.log('Searching for relevant urls...');
+// let urlsToLook = [];
+// let searchResults = this.searchTool(query, this.num_search_results);
+// console.log('Searching for relevant urls...');
+// console.log(`Search results: ${searchResults}`);
+// searchResults.forEach((res) => {
+// if (res.link) {
+// urlsToLook.push(res.link);
+// }
+// });
+
+// console.log(searchResults);
+// let loader = new AsyncHtmlLoader(urlsToLook);
+// let html2text = new Html2TextTransformer();
+// console.log('Indexing new urls...');
+// let docs = await loader.load();
+// docs = html2text.transformDocuments(docs);
+// docs.forEach((doc, i) => {
+// if (searchResults[i].title) {
+// doc.metadata['title'] = searchResults[i].title;
+// }
+// });
+// return docs;
+// }
+// }
+
+// export async function POST(req: Request) {
+// const {
+// messages,
+// model,
+// }: {
+// messages: any[];
+// model: GeneralModel;
+// } = await req.json();
+
+// const searchResults = await getGoogleSearch(process.env.GOOGLE_SEARCH_API_KEY || '', process.env.GOOGLE_SEARCH_ENGINE_ID || '', messages[0].content);
+
+// console.log(searchResults);
+
+// const withPromptMessage = template1(searchResults);
+
+// const response = await anthropic.messages.create({
+// messages: [
+// {
+// content: withPromptMessage,
+// role: 'user',
+// },
+// ],
+// model: model.model_id,
+// stream: true,
+// max_tokens: 4096,
+// });
+
+// const stream = AnthropicStream(response);
+
+// return new StreamingTextResponse(stream);
+// }
+
+export async function GET(req: Request) {
+ return Response.json({ error: 'Method Not Allowed' }, { status: 405 });
+}
diff --git a/app/fonts.ts b/app/fonts.ts
deleted file mode 100644
index a1cda72b..00000000
--- a/app/fonts.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Rubik, JetBrains_Mono } from 'next/font/google';
-
-export const rubik = Rubik({
- subsets: ['latin'],
- variable: '--font-rubik',
- display: 'swap',
-});
-
-export const jetbrains_mono = JetBrains_Mono({
- subsets: ['latin'],
- variable: '--font-jetbrains-mono',
- display: 'swap',
-});
diff --git a/app/layout.tsx b/app/layout.tsx
index 1054bc24..44bbbeec 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,79 +1,32 @@
-import '@/styles/globals.css';
-import '@/styles/markdown.css';
-import 'tippy.js/dist/tippy.css';
-
-import Script from 'next/script';
-import { Viewport } from 'next';
-import type { Metadata } from 'next';
+import type { Metadata, Viewport } from 'next';
+import { Onest } from 'next/font/google';
-import { rubik } from '@/app/fonts';
+import RootProvider from '@/app/provider';
-import { Providers } from '@/app/providers';
-
-import { Analytics } from '@vercel/analytics/react';
-import { SpeedInsights } from '@vercel/speed-insights/next';
+import '@/styles/globals.css';
+import 'tippy.js/dist/tippy.css';
-import { siteConfig } from '@/config/site.config';
+const onest = Onest({ subsets: ['latin'] });
export const metadata: Metadata = {
- title: siteConfig.title,
- description: siteConfig.title + ' - ' + siteConfig.description,
+ title: 'Chat Chat',
+ description: 'Chat Chat - Unlock next-level conversations with AI',
};
export const viewport: Viewport = {
- width: 'device-width',
- height: 'device-height',
- initialScale: 1,
minimumScale: 1,
- maximumScale: 1,
- userScalable: false,
- themeColor: '#eee',
};
-export default async function RootLayout({ children, params: { locale } }: { children: React.ReactNode; params: { locale: string } }) {
+export default function RootLayout({
+ children,
+ params: { locale },
+}: Readonly<{
+ children: React.ReactNode;
+ params: { locale: string };
+}>) {
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {children}
-
-
-
-
-
+
+ {children}
);
}
diff --git a/app/manifest.ts b/app/manifest.ts
deleted file mode 100644
index b539d5a3..00000000
--- a/app/manifest.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { MetadataRoute } from 'next';
-
-export default function manifest(): MetadataRoute.Manifest {
- return {
- name: 'Chat Chat',
- short_name: 'Chat Chat',
- start_url: '/',
- display: 'standalone',
- background_color: '#eee',
- theme_color: '#eee',
- icons: [
- {
- src: '/favicon.ico',
- sizes: 'any',
- type: 'image/x-icon',
- },
- {
- src: '/icons/android-chrome-192x192.png',
- sizes: '192x192',
- type: 'image/png',
- },
- {
- src: '/icons/android-chrome-512x512.png',
- sizes: '512x512',
- type: 'image/png',
- },
- ],
- };
-}
diff --git a/app/not-found.tsx b/app/not-found.tsx
index 94d22d77..d7279d1e 100644
--- a/app/not-found.tsx
+++ b/app/not-found.tsx
@@ -1,21 +1,7 @@
-'use client';
-
-import { useRouter } from 'next/navigation';
-
-import { Button } from '@/components/ui/button';
-
export default function NotFound() {
- const router = useRouter();
-
return (
-
-
-
404 Not Found
-
The source you requested is unavailable.
-
router.push('/')}>
- Back Home
-
-
+
);
}
diff --git a/app/provider.tsx b/app/provider.tsx
new file mode 100644
index 00000000..45faa31e
--- /dev/null
+++ b/app/provider.tsx
@@ -0,0 +1,21 @@
+import { Analytics } from '@vercel/analytics/react';
+import { SpeedInsights } from '@vercel/speed-insights/react';
+import { Provider as JotaiProvider } from 'jotai';
+import { Toaster } from 'sonner';
+
+import { ThemeProvider } from '@/hooks/theme';
+
+export default function RootProvider({ children }: Readonly<{ children: React.ReactNode }>) {
+ return (
+
+
+ {children}
+
+
+
+
+
+
+
+ );
+}
diff --git a/app/providers.tsx b/app/providers.tsx
deleted file mode 100644
index dda02e64..00000000
--- a/app/providers.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-'use client';
-
-import { ThemeProvider } from 'next-themes';
-
-export function Providers({ children }: { children: React.ReactNode }) {
- return
{children} ;
-}
diff --git a/app/robots.ts b/app/robots.ts
deleted file mode 100644
index fe765dcf..00000000
--- a/app/robots.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { MetadataRoute } from 'next';
-
-export default function robots(): MetadataRoute.Robots {
- return {
- rules: {
- userAgent: '*',
- allow: '/',
- },
- };
-}
diff --git a/bun.lockb b/bun.lockb
new file mode 100755
index 00000000..e40074e8
Binary files /dev/null and b/bun.lockb differ
diff --git a/components.json b/components.json
index 8b7b3b4a..cf78c8ba 100644
--- a/components.json
+++ b/components.json
@@ -4,7 +4,7 @@
"rsc": true,
"tsx": true,
"tailwind": {
- "config": "tailwind.config.js",
+ "config": "tailwind.config.ts",
"css": "styles/globals.css",
"baseColor": "neutral",
"cssVariables": true,
@@ -12,6 +12,6 @@
},
"aliases": {
"components": "@/components",
- "utils": "@/lib/cn"
+ "utils": "@/lib/ui/utils"
}
}
\ No newline at end of file
diff --git a/components/auth/footer.tsx b/components/auth/footer.tsx
deleted file mode 100644
index 332a5330..00000000
--- a/components/auth/footer.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { customConfig } from '@/config/custom.config';
-
-const AuthFooter = () => {
- return
{customConfig.Auth.footer}
;
-};
-
-export default AuthFooter;
diff --git a/components/auth/form.tsx b/components/auth/form.tsx
deleted file mode 100644
index c006fd8e..00000000
--- a/components/auth/form.tsx
+++ /dev/null
@@ -1,132 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import Link from 'next/link';
-
-import { useTranslations } from 'next-intl';
-
-import { signIn } from 'next-auth/react';
-
-import { toast } from 'react-hot-toast';
-
-import { FaGithub } from 'react-icons/fa';
-import { FcGoogle } from 'react-icons/fc';
-
-import { Input } from '@/components/ui/input';
-import { Button } from '@/components/ui/button';
-
-const AuthForm = ({ login }: { login: boolean }) => {
- const t = useTranslations('');
-
- const [email, setEmail] = useState
('');
-
- const handleEmailSubmit = async () => {
- if (!email) {
- return toast.error(t('Email is required'));
- }
-
- if (!email.includes('@')) {
- return toast.error(t('Invalid email'));
- }
-
- const emailSignIn = await signIn('email', {
- email: email,
- redirect: false,
- callbackUrl: '/dashboard/profile/info',
- });
-
- if (emailSignIn?.error) {
- return toast.error(t('Failed to send email'));
- }
-
- toast.success(t('Email sent, please check your inbox'));
- };
-
- return (
-
-
- {login ? (
- <>
-
{t('Sign In')}
-
- {t('New User?')}{' '}
-
- {t('Sign up')}
-
-
- >
- ) : (
- <>
-
{t('Register')}
-
- {t('Already have an account with us?')}{' '}
-
- {t('Log In')}
-
-
- >
- )}
-
-
- setEmail(e.target.value)}
- className='dark:bg-stone-600'
- />
-
- {t('Sign In With Email')}
-
-
-
-
{t('Beta Notice')}
-
- {t(
- 'We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in'
- )}
-
-
- {/*
-
-
- Or Continue With
-
-
-
-
- signIn('github', {
- callbackUrl: '/dashboard/profile/info',
- })
- }
- >
-
- GitHub
-
-
- signIn('google', {
- callbackUrl: '/dashboard/profile/info',
- })
- }
- >
-
- Google
-
-
*/}
-
- );
-};
-
-export default AuthForm;
diff --git a/components/auth/header.tsx b/components/auth/header.tsx
deleted file mode 100644
index e98375f9..00000000
--- a/components/auth/header.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-'use client';
-
-import Image from 'next/image';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { Button } from '@/components/ui/button';
-
-import { IoArrowBackOutline } from 'react-icons/io5';
-import { siteConfig } from '@/config/site.config';
-
-const AuthHeader = () => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- return (
-
-
router.push('/')}>
-
- {t('Home')}
-
-
-
- );
-};
-
-export default AuthHeader;
diff --git a/components/client/command.tsx b/components/client/command.tsx
deleted file mode 100644
index 91a5c581..00000000
--- a/components/client/command.tsx
+++ /dev/null
@@ -1,132 +0,0 @@
-'use client';
-
-import * as React from 'react';
-
-import { useRouter } from 'next/navigation';
-
-import { Settings, User } from 'lucide-react';
-
-import { FiCode, FiFile, FiMessageCircle } from 'react-icons/fi';
-
-import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from '@/components/ui/command';
-import { useTranslations } from 'next-intl';
-
-export const ClientCommand = () => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const [open, setOpen] = React.useState(false);
-
- React.useEffect(() => {
- const down = (e: KeyboardEvent) => {
- if (e.key === 'k' && e.metaKey) {
- setOpen((open) => !open);
- }
- };
-
- document.addEventListener('keydown', down);
- return () => document.removeEventListener('keydown', down);
- }, []);
-
- return (
-
-
-
- {t('No command found')}
-
-
- {
- router.push('/mode/chat');
- setOpen(false);
- }}
- className='flex items-center'
- >
-
- {t('New Chat')}
-
-
-
- {
- router.push('/mode/code');
- setOpen(false);
- }}
- className='flex items-center'
- >
-
- {t('New Code')}
-
-
-
- {
- router.push('/mode/file');
- setOpen(false);
- }}
- className='flex items-center'
- >
-
- {t('New File')}
-
-
-
-
-
-
- {
- router.push('/dashboard/profile/info');
- setOpen(false);
- }}
- className='flex items-center'
- >
-
- {t('Info')}
-
-
-
- {
- router.push('/dashboard/profile/info/record');
- setOpen(false);
- }}
- className='flex items-center'
- >
-
- {t('Share')}
-
-
-
- {
- router.push('/dashboard/profile/info/settings');
- setOpen(false);
- }}
- className='flex items-center'
- >
-
- {t('Settings')}
-
-
-
-
-
-
- {
- router.push('/dashboard/team');
- setOpen(false);
- }}
- className='flex items-center'
- >
-
- {t('Overview')}
-
-
-
-
-
- );
-};
diff --git a/components/client/toaster.tsx b/components/client/toaster.tsx
deleted file mode 100644
index 282d4332..00000000
--- a/components/client/toaster.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-'use client';
-
-import { Toaster } from 'react-hot-toast';
-
-export const HotToaster = () => {
- return ;
-};
diff --git a/components/dashboard/nav.tsx b/components/dashboard/nav.tsx
deleted file mode 100644
index 3c3e36a4..00000000
--- a/components/dashboard/nav.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-'use client';
-
-import { usePathname } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { signOut } from 'next-auth/react';
-
-import { RxAvatar } from 'react-icons/rx';
-import { AiOutlineCaretRight } from 'react-icons/ai';
-
-import { Avatar, AvatarImage } from '@/components/ui/avatar';
-import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';
-
-import { DashboardSideItems } from '@/components/dashboard/side';
-import { Separator } from '@/components/ui/separator';
-
-const DashboardNav = ({ user }: { user: any }) => {
- const pathname = usePathname();
-
- const t = useTranslations('');
-
- const i18n = /^\/[a-z]{2}-[A-Z]{2}\//.test(pathname ?? '');
-
- const breadcrumbs = pathname
- ?.split('/')
- .filter((path) => path !== '')
- .splice(i18n ? 2 : 1);
-
- const description = DashboardSideItems.find((item) => item.base === breadcrumbs?.[0])?.children.find((child) => child.href === breadcrumbs?.[1])?.description;
-
- return (
-
-
-
- {breadcrumbs?.map((breadcrumb, index) => (
-
-
{t(breadcrumb)}
- {index !== breadcrumbs.length - 1 && (
-
-
-
- )}
-
- ))}
-
-
-
-
- {user.image ? : }
-
-
-
-
-
{user?.name}
-
{user?.email}
-
-
-
-
- signOut({
- callbackUrl: '/',
- })
- }
- >
- {t('Sign out')}
-
-
-
-
-
-
-
-
- );
-};
-
-export default DashboardNav;
diff --git a/components/dashboard/profile-info-form.tsx b/components/dashboard/profile-info-form.tsx
deleted file mode 100644
index cf58ce2a..00000000
--- a/components/dashboard/profile-info-form.tsx
+++ /dev/null
@@ -1,131 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { User } from '@prisma/client';
-
-import { toast } from 'react-hot-toast';
-
-import { Input } from '@/components/ui/input';
-import { Button } from '@/components/ui/button';
-import { Separator } from '@/components/ui/separator';
-
-import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
-
-import { signOut } from 'next-auth/react';
-
-const ProfileInfoForm = ({ user }: any) => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const [name, setName] = useState(user.name);
- const [email, setEmail] = useState(user.email);
- const [image, setImage] = useState(user.image);
-
- const [isLoading, setIsLoading] = useState(false);
-
- const [isDialogOpen, setIsDialogOpen] = useState(false);
-
- const onSave = async () => {
- setIsLoading(true);
-
- const response = await fetch(`/api/user/${user.id}`, {
- method: 'PATCH',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- name: name,
- email: email,
- image: image,
- }),
- });
-
- if (!response?.ok) {
- setIsLoading(false);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- setIsLoading(false);
- toast.success(t('Profile updated'));
- };
-
- const onDelete = async () => {
- const response = await fetch(`/api/user/delete`, {
- method: 'DELETE',
- headers: {
- 'Content-Type': 'application/json',
- },
- });
-
- if (!response?.ok) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- toast.success(t('Account deleted'));
-
- await signOut();
-
- router.push('/');
- };
-
- return (
-
-
-
-
-
-
-
{t('Danger Zoom')}
-
- {t('If you want to permanently remove your account')}. {t('Please click the button below, please note, This could not be undone')}
-
-
-
- {t('Delete Account')}
-
-
-
- {t('Confirming Deletion')}
- {t('Please note: This could not be undone')}
-
-
-
- {t('Confirm')}
-
-
-
-
-
-
- );
-};
-
-export default ProfileInfoForm;
diff --git a/components/dashboard/profile-settings-form.tsx b/components/dashboard/profile-settings-form.tsx
deleted file mode 100644
index 0cccc052..00000000
--- a/components/dashboard/profile-settings-form.tsx
+++ /dev/null
@@ -1,80 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import { useTranslations } from 'next-intl';
-
-import { User } from '@prisma/client';
-
-import { toast } from 'react-hot-toast';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-import { Button } from '@/components/ui/button';
-import { Separator } from '@/components/ui/separator';
-import { Switch } from '@/components/ui/switch';
-
-const ProfileSettingsForm = ({ user }: { user: User }) => {
- const t = useTranslations('');
-
- const [openAIKey, setOpenAIKey] = useState(user.openAIKey);
- const [allowRecordCloudSync, setAllowRecordCloudSync] = useState(user.allowRecordCloudSync);
-
- const [isLoading, setIsLoading] = useState(false);
-
- const onSave = async () => {
- setIsLoading(true);
-
- const response = await fetch(`/api/user/${user.id}`, {
- method: 'PATCH',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- openAIKey: openAIKey,
- allowRecordCloudSync: allowRecordCloudSync,
- }),
- });
-
- if (!response?.ok) {
- setIsLoading(false);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- setIsLoading(false);
- toast.success(t('Profile updated'));
- };
-
- const handleAllowRecordCloudSyncChange = async () => {
- setAllowRecordCloudSync(!allowRecordCloudSync);
- };
-
- return (
-
-
-
-
- OpenAI API Key
- setOpenAIKey(e.target.value)} className='dark:border-stone-400 dark:bg-stone-500' />
-
-
-
-
-
- {t('Auto upload your records to the cloud')}
-
-
-
-
-
- onSave()} className='dark:bg-stone-500' disabled={isLoading}>
- {t('Save')}
-
-
-
-
- );
-};
-
-export default ProfileSettingsForm;
diff --git a/components/dashboard/record/button.tsx b/components/dashboard/record/button.tsx
deleted file mode 100644
index b7d3d1b5..00000000
--- a/components/dashboard/record/button.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-'use client';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { Record } from '@prisma/client';
-
-import { toast } from 'react-hot-toast';
-
-import { Button } from '@/components/ui/button';
-import { siteConfig } from '@/config/site.config';
-
-const RecordButton = ({ records }: { records: Record[] }) => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const handleExport = async () => {
- const data = records.map((record) => {
- return {
- id: record.id,
- type: record.type,
- title: record.title,
- content: record.content,
- share: record.share,
- createdAt: record.createdAt,
- };
- });
-
- const blob = new Blob([JSON.stringify(data)], { type: 'application/json' });
-
- const a = document.createElement('a');
- a.href = URL.createObjectURL(blob);
- a.download = siteConfig.title + '-conversation-record-export-' + new Date() + '.json';
- a.click();
- };
-
- const handleDelete = async () => {
- const confirm = window.confirm(t('Are you sure you want to delete all records?'));
-
- if (confirm) {
- const response = await fetch('/api/record/delete', {
- method: 'DELETE',
- });
-
- if (!response.ok) {
- toast.error(t('Something went wrong, please try again later'));
- return;
- }
-
- toast.success(t('Successfully deleted all records'));
-
- router.refresh();
- }
- };
-
- return (
-
-
- {t('Export All')}
-
-
- {t('Delete All')}
-
-
- );
-};
-
-export default RecordButton;
diff --git a/components/dashboard/record/card.tsx b/components/dashboard/record/card.tsx
deleted file mode 100644
index 25f4f4e4..00000000
--- a/components/dashboard/record/card.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { Record } from '@prisma/client';
-
-import { toast } from 'react-hot-toast';
-
-import { IoCopy } from 'react-icons/io5';
-import { MdDelete } from 'react-icons/md';
-
-import { Switch } from '@/components/ui/switch';
-import { Button } from '@/components/ui/button';
-
-import { formatDate } from '@/utils/app/formatDate';
-
-const RecordCard = ({ record }: { record: Record }) => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const [enableShare, setEnableShare] = useState(false);
-
- const onSwitchShare = async (value: boolean) => {
- setEnableShare(value);
-
- if (!value) return;
-
- const response = await fetch(`/api/share`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- story: JSON.stringify({ id: record.id, type: 'chat', title: record.title, messages: record.content, timestamp: record.createdAt, share: true }),
- }),
- });
-
- if (!response.ok) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- if (data.type == 'update') {
- navigator.clipboard.writeText(window.location.host + `/s/${record.id}`);
- toast.success(`${t('Updated the previous share:')} ${record.id}`);
- return;
- }
-
- navigator.clipboard.writeText(window.location.host + `/s/${record.id}`);
- toast.success(`${t('Copied share link:')} ${record.id}`);
- };
-
- const onCopy = () => {
- const url = `${window.location.origin}/s/${record.id}`;
-
- navigator.clipboard.writeText(url);
- toast.success(`${t('Copied share link:')} ${record.id}`);
- };
-
- const onDelete = async () => {
- const response = await fetch(`/api/record/${record.id}`, {
- method: 'DELETE',
- });
-
- if (!response.ok) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- toast.success(`${t('Deleted record:')} ${record.id}`);
-
- router.refresh();
- };
-
- return (
-
-
-
{record.title}
-
{formatDate(record.createdAt)}
-
-
-
-
-
{t('Share')}
-
- {enableShare && (
-
-
-
- )}
-
-
-
{formatDate(record.updatedAt)}
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default RecordCard;
diff --git a/components/dashboard/side.tsx b/components/dashboard/side.tsx
deleted file mode 100644
index 1b18470e..00000000
--- a/components/dashboard/side.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-'use client';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { BiArrowBack } from 'react-icons/bi';
-import { CgMenuBoxed } from 'react-icons/cg';
-
-import { Button } from '@/components/ui/button';
-import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet';
-
-import { customConfig } from '@/config/custom.config';
-
-const DashboardSide = () => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- return (
- <>
-
-
-
-
-
-
-
-
- {DashboardSideItems.map((item, index) => (
-
-
{t(item.name)}
- {item.children && (
-
- {item.children.map((child, index) => (
- router.push('/dashboard/' + item.base + '/' + child.href)}>
- {t(child.name)}
-
- ))}
-
- )}
-
- ))}
-
-
-
-
-
-
-
router.push('/')}>
-
- {t('Back')}
-
-
-
- {DashboardSideItems.map((item, index) => (
-
-
{t(item.name)}
- {item.children && (
-
- {item.children.map((child, index) => (
- router.push('/dashboard/' + item.base + '/' + child.href)}>
- {t(child.name)}
-
- ))}
-
- )}
-
- ))}
-
-
-
{customConfig.Dashboard.side}
-
-
-
- >
- );
-};
-
-export default DashboardSide;
-
-export const DashboardSideItems = [
- {
- name: 'Profile',
- base: 'profile',
- children: [
- {
- name: 'Overview',
- href: 'info',
- description: `Manage personal info for profile`,
- },
- {
- name: 'Record',
- href: 'record',
- description: `Your account Conversation Record`,
- },
- {
- name: 'Settings',
- href: 'settings',
- description: `Advanced configuration for your account`,
- },
- ],
- },
- {
- name: 'Team',
- base: 'team',
- children: [
- {
- name: 'Overview',
- href: 'info',
- description: 'Team Overview',
- },
- ],
- },
-];
diff --git a/components/dashboard/team/card.tsx b/components/dashboard/team/card.tsx
deleted file mode 100644
index 4d28d7b3..00000000
--- a/components/dashboard/team/card.tsx
+++ /dev/null
@@ -1,224 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { Team } from '@prisma/client';
-
-import { toast } from 'react-hot-toast';
-
-import { MdOutlineEdit, MdDelete, MdExitToApp } from 'react-icons/md';
-
-import { Input } from '@/components/ui/input';
-import { Label } from '@/components/ui/label';
-import { Button } from '@/components/ui/button';
-import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
-
-const TeamCard = ({ team }: { team: Team & { isAuthor: boolean } }) => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const [isEditDialogOpen, setIsEditDialogOpen] = useState(false);
- const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
- const [isQuitDialogOpen, setIsQuitDialogOpen] = useState(false);
-
- // Team Info
- const [name, setName] = useState(team.name);
- const [accessCode, setAccessCode] = useState(team.accessCode);
- const [openAIKey, setOpenAIKey] = useState(team.openAIKey);
- const [openAIEndpoint, setOpenAIEndpoint] = useState(team.openAIEndpoint);
-
- const deleteTeam = async () => {
- const response = await fetch('/api/team/delete', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- id: team.id,
- }),
- });
-
- if (!response.ok) {
- toast.error(t('Failed to delete team'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- toast.error(t('Failed to delete team'));
- return;
- }
-
- toast.success(t('Team deleted'));
-
- setIsDeleteDialogOpen(false);
-
- router.refresh();
- };
-
- const onQuit = async () => {
- const response = await fetch('/api/team/quit', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- teamId: team.id,
- }),
- });
-
- if (!response.ok) {
- toast.error(t('Failed to quit team'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- toast.error(t('Failed to quit team'));
- return;
- }
-
- toast.success(t('Quit successfully'));
-
- setIsQuitDialogOpen(false);
-
- router.refresh();
- };
-
- const onSave = async () => {
- const response = await fetch(`/api/team/${team.id}`, {
- method: 'PATCH',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- name: name,
- accessCode: accessCode,
- openAIKey: openAIKey,
- openAIEndpoint: openAIEndpoint,
- }),
- });
-
- if (!response.ok) {
- toast.error(t('Failed to update team'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- toast.error(t('Failed to update team'));
- return;
- }
-
- toast.success(t('Team updated'));
-
- setIsEditDialogOpen(false);
-
- router.refresh();
- };
-
- return (
-
-
-
{team.name}
-
{team.accessCode}
-
- {!team.isAuthor ? (
-
-
-
-
-
-
-
-
-
-
- {t('Confirm to quit Team')} {team.name}?
-
- {t('This action cannot be undone')}
-
-
-
- {t('Confirm')}
-
-
-
-
-
- ) : (
-
-
-
-
-
-
-
-
-
-
- {t('Edit Team')}: {team.name}
-
-
-
-
-
- {t('Save')}
-
-
-
-
-
-
-
-
-
-
-
-
-
- {t('Confirm to delete Team')} {team.name}?
-
-
- {t('This action cannot be undone')}. {t('This will permanently delete your team and remove your data from our database')}
-
-
-
-
- {t('Confirm')}
-
-
-
-
-
- )}
-
- );
-};
-
-export default TeamCard;
diff --git a/components/dashboard/team/create-button.tsx b/components/dashboard/team/create-button.tsx
deleted file mode 100644
index 11ea5990..00000000
--- a/components/dashboard/team/create-button.tsx
+++ /dev/null
@@ -1,238 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import { MdOutlineAdd } from 'react-icons/md';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-import { Button } from '@/components/ui/button';
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
-import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
-
-const CreateButton = () => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const [isDialogOpen, setIsDialogOpen] = useState(false);
- const [isLoading, setIsLoading] = useState(false);
-
- const [name, setName] = useState('');
- const [accessCode, setAccessCode] = useState('');
-
- const [serviceProvider, setServiceProvider] = useState('OpenAI');
-
- // OpenAI
- const [openAIKey, setOpenAIKey] = useState('');
- const [openAIEndpoint, setOpenAIEndpoint] = useState('');
-
- // Azure
- const [azureKey, setAzureKey] = useState('');
- const [azureEndpoint, setAzureEndpoint] = useState('');
- const [azureDeploymentName, setAzureDeploymentName] = useState('');
-
- // Claude
- const [claudeKey, setClaudeKey] = useState('');
-
- const handleCreate = async () => {
- if (isLoading) {
- return;
- }
-
- if (name.length === 0) {
- toast.error(t('Team name is required'));
- return;
- }
-
- if (accessCode.length === 0) {
- toast.error(t('Team access token is required'));
- return;
- }
-
- if (serviceProvider == 'OpenAI') {
- if (openAIKey.length === 0) {
- toast.error(t('OpenAI Key is required'));
- return;
- }
-
- if (openAIEndpoint.length === 0) {
- toast.error(t('OpenAI Endpoint is required'));
- return;
- }
- }
-
- if (serviceProvider == 'Azure') {
- if (azureKey.length === 0) {
- toast.error(t('Azure Key is required'));
- return;
- }
-
- if (azureEndpoint.length === 0) {
- toast.error(t('Azure Endpoint is required'));
- return;
- }
-
- if (azureDeploymentName.length === 0) {
- toast.error(t('Azure Deployment Name is required'));
- return;
- }
- }
-
- if (serviceProvider == 'Claude' && claudeKey.length === 0) {
- toast.error(t('Claude Key is required'));
- return;
- }
-
- setIsLoading(true);
-
- const response = await fetch('/api/team/create', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- name: name,
- accessCode: accessCode,
- openAIKey: openAIKey,
- openAIEndpoint: openAIEndpoint,
- azureKey: azureKey,
- azureEndpoint: azureEndpoint,
- azureDeploymentName: azureDeploymentName,
- claudeKey: claudeKey,
- }),
- });
-
- if (!response.ok) {
- setIsLoading(false);
- toast.error(t('Failed to create team'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- setIsLoading(false);
- toast.error(t('Failed to create team'));
- return;
- }
-
- setIsLoading(false);
- toast.success(t('Team created: ') + accessCode);
-
- setIsDialogOpen(false);
-
- setAccessCode('');
- setName('');
- setOpenAIKey('');
- setOpenAIEndpoint('');
- setAzureKey('');
- setAzureEndpoint('');
- setAzureDeploymentName('');
- setClaudeKey('');
-
- router.refresh();
- };
-
- let serviceProviderSelection;
-
- switch (serviceProvider) {
- case 'OpenAI':
- serviceProviderSelection = (
- <>
-
- OpenAI Key
- setOpenAIKey(e.target.value)} />
-
-
- OpenAI Endpoint
- setOpenAIEndpoint(e.target.value)} />
-
- >
- );
- break;
- case 'Azure':
- serviceProviderSelection = (
- <>
-
- Azure API Key
- setAzureKey(e.target.value)} />
-
-
- Azure API Endpoint
- setAzureEndpoint(e.target.value)} />
-
-
- Azure Deployment Name
- setAzureDeploymentName(e.target.value)} />
-
- >
- );
- break;
- case 'Claude':
- serviceProviderSelection = (
- <>
-
- Claude API Key
- setClaudeKey(e.target.value)} />
-
- >
- );
- break;
- }
-
- return (
-
-
-
-
-
- {t('Create Team')}
-
-
-
-
- {t('Create Team')}
-
-
-
- {t('Name')}
- setName(e.target.value)} />
-
-
- {t('Access Code')}
- setAccessCode(e.target.value)} />
-
-
- {t('Service Provider')}
-
-
-
-
-
- OpenAI
- Azure AI
- Anthropic Claude
-
-
-
- {serviceProviderSelection}
-
-
-
- {t('Create')}
-
-
-
-
-
- );
-};
-
-export default CreateButton;
diff --git a/components/dashboard/team/join-button.tsx b/components/dashboard/team/join-button.tsx
deleted file mode 100644
index 6cd293e8..00000000
--- a/components/dashboard/team/join-button.tsx
+++ /dev/null
@@ -1,102 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import { GrStatusGoodSmall } from 'react-icons/gr';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-import { Button } from '@/components/ui/button';
-import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
-
-const JoinButton = () => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const [isDialogOpen, setIsDialogOpen] = useState(false);
- const [isLoading, setIsLoading] = useState(false);
-
- const [accessCode, setAccessCode] = useState('');
-
- const handleJoin = async () => {
- if (isLoading) {
- return;
- }
-
- if (accessCode.length === 0) {
- toast.error(t('Team access code is required'));
- return;
- }
-
- setIsLoading(true);
-
- const response = await fetch('/api/team/join', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- accessCode: accessCode,
- }),
- });
-
- if (!response.ok) {
- setIsLoading(false);
- toast.error(t('Failed to join team'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- setIsLoading(false);
- toast.error(t('Failed to join team'));
- return;
- }
-
- setIsLoading(false);
- toast.success(t('Joined team successfully'));
-
- setIsDialogOpen(false);
-
- router.refresh();
- };
-
- return (
-
-
-
-
-
- {t('Join Team')}
-
-
-
-
- {t('Join Team')}
-
-
-
- {t('Access Code')}
- setAccessCode(e.target.value)} />
-
-
-
-
- {t('Join')}
-
-
-
-
-
- );
-};
-
-export default JoinButton;
diff --git a/components/global/button.tsx b/components/global/button.tsx
deleted file mode 100644
index 439d4e2e..00000000
--- a/components/global/button.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-const GlobalButton = ({ icon, text, onClick, className }: { icon: JSX.Element; text: string; onClick: () => void; className?: string }) => (
-
- {icon}
- {text}
-
-);
-
-export default GlobalButton;
diff --git a/components/landing/main/chat-content.tsx b/components/landing/main/chat-content.tsx
deleted file mode 100644
index 4da17655..00000000
--- a/components/landing/main/chat-content.tsx
+++ /dev/null
@@ -1,173 +0,0 @@
-import { useEffect, useRef, useState } from 'react';
-
-import { useTranslations } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import store from '@/hooks/store';
-import { useAtomValue } from 'jotai';
-
-import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
-
-import { TbCopy, TbAB2, TbSpeakerphone, TbEdit } from 'react-icons/tb';
-
-import { renderUserMessage, renderMarkdownMessage } from '@/utils/app/renderMessage';
-import GlobalButton from '@/components/global/button';
-
-const MainContent = ({
- systemResponse,
- waitingSystemResponse,
- conversations,
- reGenerate,
- onEdit,
- isSystemPromptEmpty,
-}: {
- systemResponse: string;
- waitingSystemResponse: boolean;
- conversations: AppMessageProps[];
- reGenerate: (index: number) => void;
- onEdit: (index: number) => void;
- isSystemPromptEmpty: boolean;
-}) => {
- const t = useTranslations('');
-
- const autoSpeech = useAtomValue(store.autoSpeechAtom);
-
- const ttsConfig = useAtomValue(store.textToSpeechConfigAtom);
-
- const autoScroll = useAtomValue(store.isAutoScrollAtom);
-
- const endOfMessageRef = useRef(null);
-
- const [isSpeaking, setIsSpeaking] = useState(false);
-
- const enableUserMarkdownRender = useAtomValue(store.enableUserMarkdownRenderAtom);
-
- const serviceProvider = useAtomValue(store.serviceProviderAtom);
-
- const [isHovered, setIsHovered] = useState(new Array(conversations.length).fill(false));
-
- useEffect(() => {
- if (autoScroll && endOfMessageRef.current) {
- endOfMessageRef.current.scrollIntoView({ behavior: 'smooth' });
- }
- }, [autoScroll, conversations, systemResponse]);
-
- useEffect(() => {
- if (autoSpeech && !isSpeaking && !waitingSystemResponse) {
- onSpeech(conversations.length - 1);
- }
- }, [autoSpeech, conversations]);
-
- const onCopy = (index: number) => {
- navigator.clipboard.writeText(conversations[index].content);
- toast.success(t('Copied to clipboard'));
- };
-
- const onSpeech = (index: number) => {
- if (typeof window !== 'undefined') {
- const synth = window.speechSynthesis;
- const voices = synth.getVoices();
-
- const utterance = new SpeechSynthesisUtterance(conversations[index].content);
-
- utterance.voice = voices.find((voice) => voice.name === ttsConfig.voice) ?? voices[0];
- utterance.rate = ttsConfig.speed;
- utterance.pitch = ttsConfig.pitch;
- utterance.onend = () => {
- setIsSpeaking(false);
- };
-
- synth.speak(utterance);
- setIsSpeaking(true);
- }
- };
-
- const onStopSpeech = () => {
- if (typeof window !== 'undefined') {
- const synth = window.speechSynthesis;
- synth.cancel();
- }
- setIsSpeaking(false);
- };
-
- return (
-
- {conversations
- .filter((m) => m.role != 'system')
- .map((message, index) => {
- const isUser = message.role === 'user';
- const isLast = index === conversations.filter((m) => m.role != 'system').length - 1;
-
- let streamResponse = null;
-
- if (isLast && !isUser && waitingSystemResponse) {
- streamResponse = renderMarkdownMessage(systemResponse);
- }
-
- return (
-
{
- const newIsHovered = [...isHovered];
- newIsHovered[index] = true;
- setIsHovered(newIsHovered);
- }}
- onMouseOut={() => {
- const newIsHovered = [...isHovered];
- newIsHovered[index] = false;
- setIsHovered(newIsHovered);
- }}
- onFocus={() => {
- const newIsHovered = [...isHovered];
- newIsHovered[index] = true;
- setIsHovered(newIsHovered);
- }}
- onBlur={() => {
- const newIsHovered = [...isHovered];
- newIsHovered[index] = false;
- setIsHovered(newIsHovered);
- }}
- >
-
-
-
- {!isUser && }
- {isUser ? 'Y' : serviceProvider}
-
-
{isUser ? t('You') : serviceProvider}
-
- {!waitingSystemResponse && isHovered[index] && (
-
- } text={t('Copy')} onClick={() => onCopy(isSystemPromptEmpty ? index : index + 1)} />
- : }
- text={isUser ? t('Edit') : t('Regenerate')}
- onClick={isUser ? () => onEdit(index) : () => reGenerate(index)}
- />
- {!isUser && (
- }
- text={isSpeaking ? t('Stop') : t('Speech')}
- onClick={isSpeaking ? onStopSpeech : () => onSpeech(index)}
- />
- )}
-
- )}
-
-
- {isUser && !enableUserMarkdownRender ? renderUserMessage(message.content) : renderMarkdownMessage(message.content)}
- {streamResponse}
-
-
- );
- })}
-
-
- );
-};
-
-export default MainContent;
diff --git a/components/landing/main/chat-head.tsx b/components/landing/main/chat-head.tsx
deleted file mode 100644
index c11b2071..00000000
--- a/components/landing/main/chat-head.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import { useEffect, useState } from 'react';
-
-import { useTranslations } from 'next-intl';
-
-import store from '@/hooks/store';
-import { useAtomValue } from 'jotai';
-
-import { toast } from 'react-hot-toast';
-
-import BarLoader from 'react-spinners/BarLoader';
-
-import { BiCoin, BiMoney } from 'react-icons/bi';
-
-import calculateModelPrice from '@/utils/provider/openai/calculateModelPrice';
-
-const ContentHead = ({
- chatTitle,
- chatTitleResponse,
- waitingSystemResponse,
- conversations,
-}: {
- chatTitle: string;
- chatTitleResponse: string;
- waitingSystemResponse: boolean;
- conversations: AppMessageProps[];
-}) => {
- const t = useTranslations('');
-
- const [tokens, setTokens] = useState(0);
-
- const openAIConfig = useAtomValue(store.openAIConfigAtom);
-
- const serviceProvider = useAtomValue(store.serviceProviderAtom);
-
- useEffect(() => {
- if (conversations.length > 0 && (serviceProvider == 'OpenAI' || serviceProvider == 'Team' || serviceProvider == 'Azure')) {
- const getTokens = async () => {
- const response = await fetch('/api/message/tokens', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- messages: conversations,
- }),
- });
-
- if (!response.ok) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const data = await response.json();
-
- setTokens(data.tokenCount);
- };
-
- getTokens();
- }
- }, [conversations, openAIConfig.apiModel, serviceProvider, t]);
-
- return (
-
-
-
{chatTitle ?? chatTitleResponse}
- {(serviceProvider == 'OpenAI' || serviceProvider == 'Team' || serviceProvider == 'Azure') && (
-
-
-
- {tokens}
-
-
-
- {calculateModelPrice(openAIConfig.apiModel as OpenAIModel, tokens).toFixed(5)}
-
-
- )}
-
-
-
-
-
- );
-};
-
-export default ContentHead;
diff --git a/components/landing/main/chat-main.tsx b/components/landing/main/chat-main.tsx
deleted file mode 100644
index 1b67d7fd..00000000
--- a/components/landing/main/chat-main.tsx
+++ /dev/null
@@ -1,553 +0,0 @@
-'use client';
-
-import { useEffect, useState, useRef } from 'react';
-
-import { useSearchParams } from 'next/navigation';
-
-import { useTranslations, useLocale } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import store from '@/hooks/store';
-import { useAtom, useAtomValue } from 'jotai';
-
-import { setLocalStorage } from '@/hooks/setLocalStorage';
-
-import ContentHead from '@/components/landing/main/chat-head';
-import InputArea from '@/components/landing/main/input-area';
-import MainContent from '@/components/landing/main/chat-content';
-
-import ModeSettings from '@/components/landing/main/main-settings';
-
-import generateHash from '@/utils/app/generateHash';
-
-import { getSearchFromGoogleProgrammableSearchEngine } from '@/utils/plugins/search';
-
-import { User } from '@prisma/client';
-
-interface UserSettingsProps {
- user: User;
-}
-
-const ChatMain = () => {
- const searchParams = useSearchParams();
-
- const history = searchParams?.get('history');
- const share = searchParams?.get('share');
-
- const t = useTranslations('');
- const locale = useLocale();
-
- // Conversation Config
- const contextModeAtom = useAtomValue(store.contextModeAtom);
- const { enable: enableContextMode, contextCount } = contextModeAtom;
- const enableStreamMessages = useAtomValue(store.enableStreamMessagesAtom);
- const enablePlugin = useAtomValue(store.enablePluginsAtom);
-
- const [systemPromptContent, setSystemPromptContent] = useAtom(store.systemPromptContentAtom);
- const isSystemPromptEmpty = !systemPromptContent.trim() && /^\s*$/.test(systemPromptContent);
-
- const [systemResponse, setSystemResponse] = useState('');
- const [waitingSystemResponse, setWaitingSystemResponse] = useState(false);
- const stopSystemResponseRef = useRef(false);
-
- const [hasError, setHasError] = useState(false);
-
- const [conversations, setConversations] = useState([]);
- const [conversationID, setConversationID] = useState(generateHash(16));
-
- const [chatTitle, setChatTitle] = useState('Chat');
- const [chatTitleResponse, setChatTitleResponse] = useState('');
-
- // Service Provider
- const serviceProvider = useAtomValue(store.serviceProviderAtom);
-
- // OpenAI
- const openAIConfig = useAtomValue(store.openAIConfigAtom);
-
- // Azure
- const azureConfig = useAtomValue(store.azureConfigAtom);
-
- // Team
- const teamConfig = useAtomValue(store.teamConfigAtom);
-
- // Hugging Face
- const huggingFaceConfig = useAtomValue(store.huggingFaceConfigAtom);
-
- // Cohere
- const cohereConfig = useAtomValue(store.cohereConfigAtom);
-
- // Claude
- const claudeConfig = useAtomValue(store.claudeConfigAtom);
-
- // User Settings
- const [userSettings, setUserSettings] = useState(null);
-
- // Plugins
-
- // Search
- const searchPluginConfig = useAtomValue(store.searchConfigAtom);
-
- // File
- const fileConfig = useAtomValue(store.fileConfigAtom);
- const enableFile = fileConfig.enable;
- const [fileContent, setFileContent] = useState<{ url: string; text: string }[]>([]);
-
- useEffect(() => {
- if (enableFile) {
- for (const element of fileConfig.files) {
- const file = element;
-
- const getFile = async () => {
- const response = await fetch('/api/message/file?url=' + file, {
- method: 'GET',
- headers: {
- 'Content-Type': 'application/json',
- },
- });
-
- const data = await response.json();
-
- if (!data) {
- return;
- }
-
- setFileContent((prev) => [...prev, data]);
- };
-
- getFile();
- }
- }
- }, [fileConfig, enableFile]);
-
- useEffect(() => {
- if (!userSettings) {
- const getUserInfo = async () => {
- const response = await fetch('/api/user/info', {
- method: 'GET',
- headers: {
- 'Content-Type': 'application/json',
- },
- });
-
- if (!response.ok) {
- return;
- }
-
- const data = await response.json();
-
- if (!data) {
- return;
- }
-
- setUserSettings(data);
- };
-
- getUserInfo();
- }
- }, [userSettings]);
-
- const enableSync = userSettings?.user?.allowRecordCloudSync;
-
- useEffect(() => {
- if (share) {
- setConversationID(share);
-
- const getConversation = async () => {
- const response = await fetch('/api/share?id=' + share, {
- method: 'GET',
- headers: {
- 'Content-Type': 'application/json',
- },
- });
-
- const data = await response.json();
-
- if (!data) {
- return;
- }
-
- setChatTitle(data.share.title);
- setConversations(data.share.content);
- };
-
- getConversation();
- }
- }, [share]);
-
- useEffect(() => {
- if (history) {
- setConversationID(history);
-
- const chatValue = localStorage.getItem('histories-chat-' + history);
-
- if (!chatValue) {
- return;
- }
-
- const chatHistory = JSON.parse(chatValue);
-
- setChatTitle(chatHistory.title);
- setConversations(chatHistory.messages);
- }
- }, [history]);
-
- const generateMessagesPayload = (conversations: any[], message: OpenAIMessage) => {
- let messagesPayload;
- if (!enableContextMode) {
- isSystemPromptEmpty || conversations.find((c) => c.role === 'system')
- ? (messagesPayload = [...conversations, message])
- : (messagesPayload = [{ role: 'system', content: systemPromptContent }, ...conversations, message]);
- } else if (contextCount == 0) {
- isSystemPromptEmpty || conversations.find((c) => c.role === 'system') ? (messagesPayload = [message]) : (messagesPayload = [{ role: 'system', content: systemPromptContent }, message]);
- } else {
- isSystemPromptEmpty || conversations.find((c) => c.role === 'system')
- ? (messagesPayload = [...conversations.slice(-contextCount), message])
- : (messagesPayload = [...conversations.slice(-contextCount), { role: 'system', content: systemPromptContent }, message]);
- }
- return messagesPayload;
- };
-
- const handleMessageSend = async (message: AppMessageProps, indexNumber?: number | null, plugin?: PluginProps | null) => {
- setWaitingSystemResponse(true);
-
- isSystemPromptEmpty || conversations.find((c) => c.role === 'system')
- ? setConversations((prev) => [...prev, message])
- : setConversations((prev) => [{ role: 'system', content: systemPromptContent }, ...prev, message]);
-
- let configPayload;
-
- switch (serviceProvider) {
- case 'OpenAI':
- configPayload = {
- apiKey: openAIConfig.apiKey,
- apiEndpoint: openAIConfig.apiEndpoint,
- apiModel: openAIConfig.apiModel,
- apiTemperature: openAIConfig.apiTemperature,
- };
- break;
- case 'Azure':
- configPayload = {
- apiKey: azureConfig.apiKey,
- apiEndpoint: azureConfig.apiEndpoint,
- apiModel: azureConfig.apiModel,
- apiTemperature: azureConfig.apiTemperature,
- apiDeploymentName: azureConfig.apiDeploymentName,
- };
- break;
- case 'Team':
- configPayload = {
- accessCode: teamConfig.accessCode,
- };
- break;
- case 'Hugging Face':
- configPayload = {
- model: huggingFaceConfig.huggingFaceModel,
- accessToken: huggingFaceConfig.accessToken,
- };
- break;
- case 'Cohere':
- configPayload = {
- model: cohereConfig.model,
- apiKey: cohereConfig.apiKey,
- };
- break;
- case 'Claude':
- configPayload = {
- model: claudeConfig.apiModel,
- apiKey: claudeConfig.apiKey,
- apiTemperature: claudeConfig.apiTemperature,
- };
- break;
- default:
- break;
- }
-
- let pluginResponse = null;
- let pluginPrompt = null;
-
- if (plugin && enablePlugin) {
- switch (plugin) {
- case 'search':
- if (searchPluginConfig.searchAPIKey == '' || searchPluginConfig.searchEngineID == '') {
- toast.error(t('Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page'));
- return;
- }
-
- const searchContent = await getSearchFromGoogleProgrammableSearchEngine(searchPluginConfig.searchAPIKey, searchPluginConfig.searchEngineID, message.content);
-
- pluginResponse = searchContent;
-
- pluginPrompt =
- 'I search ' +
- message.content +
- ' for you. Please me let me know what is the search result in details. The following is the search result: \n\n\n' +
- JSON.stringify(pluginResponse);
- break;
- case 'fetch':
- const fetchContent = await fetch('/api/plugins/fetch?url=' + message.content).then((res) => res.json());
-
- if (fetchContent.status != 200) {
- toast.error(t('Unable to fetch content from the URL provided'));
- return;
- }
-
- pluginResponse = fetchContent.content;
- pluginPrompt =
- 'Act as a summarizer. Please summarize ' +
- message.content +
- ' in the ' +
- locale +
- '. Your summary should capture the most important points and ideas of the original text. Please ensure that your summary is clear, concise, and easy to understand. The following is the content: \n\n\n' +
- pluginResponse;
- break;
- default:
- break;
- }
- }
-
- let messagesPayload: AppMessageProps[] = [];
-
- if (plugin && enablePlugin && pluginResponse && pluginPrompt) {
- messagesPayload = generateMessagesPayload(conversations, { role: 'user', content: pluginPrompt });
- } else {
- messagesPayload = generateMessagesPayload(conversations, message);
- }
-
- if (indexNumber && indexNumber >= 0) {
- setConversations((prev) => prev.slice(0, indexNumber));
- messagesPayload = messagesPayload.slice(0, indexNumber);
- }
-
- if (enableFile) {
- let filePrompt = '';
-
- for (const element of fileContent) {
- filePrompt += 'The content of file: ' + element.url + ' is' + element.text + '.\n\n\n';
- }
-
- messagesPayload = [{ role: 'system', content: filePrompt }, ...messagesPayload];
- }
-
- const response = await fetch('/api/messages', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- stream: enableStreamMessages,
- serviceProvider: serviceProvider,
- config: configPayload,
- messages: messagesPayload,
- }),
- });
-
- if (!response.ok) {
- setWaitingSystemResponse(false);
- setHasError(true);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const data = response.body;
-
- if (!data) {
- setWaitingSystemResponse(false);
- setHasError(true);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- setSystemResponse('');
- setConversations((prev) => [...prev, { role: 'assistant', content: '' }]);
-
- const reader = data.getReader();
- const decoder = new TextDecoder();
-
- let done = false;
- let currentResponseMessage = '';
-
- while (!done) {
- if (stopSystemResponseRef.current) {
- done = true;
- break;
- }
-
- const { value, done: readerDone } = await reader.read();
- done = readerDone;
- const chunkValue = decoder.decode(value);
-
- setSystemResponse((prev) => prev + chunkValue);
- currentResponseMessage += chunkValue;
- }
-
- setConversations((prev) => [
- ...prev.slice(0, -1),
- {
- role: 'assistant',
- content: currentResponseMessage,
- },
- ]);
-
- setWaitingSystemResponse(false);
-
- if (!enableContextMode || contextCount > 0) {
- if (chatTitle == 'Chat') {
- let currentChatTitle = '';
- const chatTitlePayload: AppMessageProps[] = [{ role: 'system', content: `Please suggest a title for "${message.content}".` }];
-
- const response = await fetch('/api/messages', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- stream: enableStreamMessages,
- serviceProvider: serviceProvider,
- config: configPayload,
- messages: chatTitlePayload,
- }),
- });
-
- if (!response.ok) {
- return;
- }
-
- const data = response.body;
-
- if (!data) {
- return;
- }
-
- setChatTitleResponse('');
-
- const reader = data.getReader();
- const decoder = new TextDecoder();
-
- let done = false;
-
- while (!done) {
- const { value, done: readerDone } = await reader.read();
- done = readerDone;
- const chunkValue = decoder.decode(value);
-
- setChatTitleResponse((prev) => prev + chunkValue);
- currentChatTitle += chunkValue;
- }
-
- setChatTitle(currentChatTitle);
-
- setLocalStorage(`histories-chat-${conversationID}`, {
- id: conversationID,
- type: 'chat',
- title: currentChatTitle,
- messages: [
- ...conversations,
- message,
- {
- role: 'assistant',
- content: currentResponseMessage,
- },
- ],
- timestamp: new Date().getTime(),
- });
- } else {
- setLocalStorage(`histories-chat-${conversationID}`, {
- id: conversationID,
- type: 'chat',
- title: chatTitle,
- messages: [
- ...conversations,
- message,
- {
- role: 'assistant',
- content: currentResponseMessage,
- },
- ],
- timestamp: new Date().getTime(),
- });
- }
-
- const updateEvent = new CustomEvent('localStorageUpdated');
- window.dispatchEvent(updateEvent);
-
- if (enableSync) {
- const response = await fetch('/api/user/record', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- id: conversationID,
- type: 'chat',
- title: chatTitle,
- messages: [
- ...conversations,
- message,
- {
- role: 'assistant',
- content: currentResponseMessage,
- },
- ],
- timestamp: new Date().getTime(),
- }),
- });
-
- if (!response.ok) {
- return;
- }
- }
- }
- };
-
- return (
-
-
- {conversations.length > 0 &&
}
-
- {conversations.length > 0 ? (
- (isSystemPromptEmpty ? handleMessageSend(conversations[index - 1], index, null) : handleMessageSend(conversations[index], index + 1, null))}
- onEdit={(index: number) => {
- const promptIndex = isSystemPromptEmpty ? index : index + 1;
-
- const newContent = prompt(t('Edit message:'), conversations[promptIndex].content);
-
- if (newContent !== null && newContent !== '') {
- const newMessage: AppMessageProps = {
- role: 'user',
- content: newContent,
- };
-
- setConversations(conversations.slice(0, promptIndex));
-
- handleMessageSend(newMessage);
- }
- }}
- isSystemPromptEmpty={isSystemPromptEmpty}
- />
- ) : (
-
- )}
-
-
- {
- handleMessageSend(message, null, plugin);
- }}
- waitingSystemResponse={waitingSystemResponse}
- stopSystemResponseRef={stopSystemResponseRef}
- />
-
-
-
- );
-};
-
-export default ChatMain;
diff --git a/components/landing/main/code-main.tsx b/components/landing/main/code-main.tsx
deleted file mode 100644
index 39861088..00000000
--- a/components/landing/main/code-main.tsx
+++ /dev/null
@@ -1,303 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import { useTranslations } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import store from '@/hooks/store';
-import { useAtomValue } from 'jotai';
-
-import { Button } from '@/components/ui/button';
-import { Textarea } from '@/components/ui/textarea';
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-import { TbInfoSquareRounded } from 'react-icons/tb';
-
-import generateHash from '@/utils/app/generateHash';
-
-import { setLocalStorage } from '@/hooks/setLocalStorage';
-
-const CodeMain = () => {
- const t = useTranslations('');
-
- const [userMessageInput, setUserMessageInput] = useState('');
-
- const [codeMode, setCodeMode] = useState('Explain');
-
- const [languageMode, setLanguageMode] = useState('JavaScript');
-
- const [customRule, setCustomRule] = useState('');
-
- const [conversationID, setConversationID] = useState(generateHash(16));
-
- const [systemResponse, setSystemResponse] = useState('');
- const [responseLoading, setResponseLoading] = useState(false);
-
- const [hasError, setHasError] = useState(false);
-
- const enableStreamMessages = useAtomValue(store.enableStreamMessagesAtom);
-
- // Service Provider
- const serviceProvider = useAtomValue(store.serviceProviderAtom);
-
- // OpenAI
- const openAIConfig = useAtomValue(store.openAIConfigAtom);
-
- // Azure
- const azureConfig = useAtomValue(store.azureConfigAtom);
-
- // Team
- const teamConfig = useAtomValue(store.teamConfigAtom);
-
- // Hugging Face
- const huggingFaceConfig = useAtomValue(store.huggingFaceConfigAtom);
-
- // Cohere
- const cohereConfig = useAtomValue(store.cohereConfigAtom);
-
- // Claude
- const claudeConfig = useAtomValue(store.claudeConfigAtom);
-
- const onMessageChange = (e: React.ChangeEvent) => {
- setUserMessageInput(e.target.value);
- };
-
- const onProcess = async () => {
- if (!userMessageInput) {
- toast.error(t('Please enter something'));
- return;
- }
-
- let prompt;
-
- switch (codeMode) {
- default:
- case 'Explain':
- prompt = 'You are a programmer and you are explaining code to a non-programmer. Explain the following code:';
- break;
- case 'Convert':
- prompt = `You are a programmer and you are converting code from one language to another. Convert the following code to ${languageMode}:`;
- break;
- case 'Custom':
- prompt = customRule;
- break;
- }
-
- setResponseLoading(true);
-
- let configPayload;
-
- switch (serviceProvider) {
- case 'OpenAI':
- configPayload = {
- apiKey: openAIConfig.apiKey,
- apiEndpoint: openAIConfig.apiEndpoint,
- apiModel: openAIConfig.apiModel,
- apiTemperature: openAIConfig.apiTemperature,
- };
- break;
- case 'Azure':
- configPayload = {
- apiKey: azureConfig.apiKey,
- apiEndpoint: azureConfig.apiEndpoint,
- apiModel: azureConfig.apiModel,
- apiTemperature: azureConfig.apiTemperature,
- apiDeploymentName: azureConfig.apiDeploymentName,
- };
- break;
- case 'Team':
- configPayload = {
- accessCode: teamConfig.accessCode,
- };
- break;
- case 'Hugging Face':
- configPayload = {
- model: huggingFaceConfig.huggingFaceModel,
- accessToken: huggingFaceConfig.accessToken,
- };
- break;
- case 'Cohere':
- configPayload = {
- model: cohereConfig.model,
- apiKey: cohereConfig.apiKey,
- };
- break;
- case 'Claude':
- configPayload = {
- model: claudeConfig.apiModel,
- apiKey: claudeConfig.apiKey,
- apiTemperature: claudeConfig.apiTemperature,
- };
- break;
- default:
- break;
- }
-
- const messagesPayload: AppMessageProps[] = [
- { role: 'system', content: prompt },
- { role: 'user', content: userMessageInput },
- ];
-
- const response = await fetch('/api/messages', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- stream: enableStreamMessages,
- serviceProvider: serviceProvider,
- config: configPayload,
- messages: messagesPayload,
- }),
- });
-
- if (!response.ok) {
- setResponseLoading(false);
- setHasError(true);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const data = response.body;
-
- if (!data) {
- setResponseLoading(false);
- setHasError(true);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- setSystemResponse('');
-
- const reader = data.getReader();
- const decoder = new TextDecoder();
-
- let done = false;
-
- while (!done) {
- const { value, done: readerDone } = await reader.read();
- done = readerDone;
- const chunkValue = decoder.decode(value);
-
- setSystemResponse((prev) => prev + chunkValue);
- }
-
- setResponseLoading(false);
-
- setLocalStorage(`histories-code-${conversationID}`, {
- id: conversationID,
- type: 'code',
- title: codeMode,
- messages: [
- ...messagesPayload,
- {
- role: 'assistant',
- content: systemResponse,
- },
- ],
- timestamp: new Date().getTime(),
- });
-
- const updateEvent = new CustomEvent('localStorageUpdated');
- window.dispatchEvent(updateEvent);
- };
-
- return (
-
-
-
-
-
-
-
-
-
- {CodeModeConfig.map((mode, index) => {
- return (
-
-
- {t(mode.name)}
-
-
- );
- })}
-
-
-
-
-
-
{t(CodeModeConfig.find((mode) => mode.name === codeMode)?.hint)}
-
- {codeMode == 'Custom' && (
-
-
- )}
- {codeMode == 'Convert' && (
-
-
-
-
-
-
- {CodeLanguageList.map((language, index) => {
- return (
-
-
- {language.name}
-
-
- );
- })}
-
-
-
- )}
-
-
- {t('Process')}
-
-
-
{systemResponse}
-
-
- );
-};
-
-export default CodeMain;
-
-const CodeModeConfig = [
- { name: 'Explain', value: 'explain', hint: 'Explain what the code means' },
- { name: 'Convert', value: 'convert', hint: 'Convert the code to a different language' },
- { name: 'Custom', value: 'custom', hint: 'Allow you to create your own custom rule' },
-];
-
-const CodeLanguageList = [
- { name: 'JavaScript', value: 'javascript' },
- { name: 'Python', value: 'python' },
- { name: 'Java', value: 'java' },
- { name: 'C++', value: 'cpp' },
- { name: 'C#', value: 'csharp' },
- { name: 'PHP', value: 'php' },
- { name: 'Ruby', value: 'ruby' },
- { name: 'Go', value: 'go' },
- { name: 'Rust', value: 'rust' },
- { name: 'Swift', value: 'swift' },
- { name: 'Kotlin', value: 'kotlin' },
- { name: 'Dart', value: 'dart' },
- { name: 'C', value: 'c' },
- { name: 'Objective-C', value: 'objectivec' },
- { name: 'Scala', value: 'scala' },
- { name: 'Perl', value: 'perl' },
- { name: 'Haskell', value: 'haskell' },
- { name: 'Lua', value: 'lua' },
- { name: 'R', value: 'r' },
- { name: 'SQL', value: 'sql' },
- { name: 'TypeScript', value: 'typescript' },
- { name: 'HTML', value: 'html' },
- { name: 'CSS', value: 'css' },
- { name: 'JSON', value: 'json' },
- { name: 'XML', value: 'xml' },
-];
diff --git a/components/landing/main/file-main.tsx b/components/landing/main/file-main.tsx
deleted file mode 100644
index c30edd87..00000000
--- a/components/landing/main/file-main.tsx
+++ /dev/null
@@ -1,478 +0,0 @@
-'use client';
-
-import { useRef, useState } from 'react';
-
-import { useTranslations } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import store from '@/hooks/store';
-import { useAtom, useAtomValue } from 'jotai';
-
-import { GrCircleInformation } from 'react-icons/gr';
-import { AiOutlineCloudUpload } from 'react-icons/ai';
-
-import InputArea from '@/components/landing/main/input-area';
-import MainContent from '@/components/landing/main/chat-content';
-
-import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
-
-import generateHash from '@/utils/app/generateHash';
-import { renderMarkdownMessage, renderUserMessage } from '@/utils/app/renderMessage';
-
-import { setLocalStorage } from '@/hooks/setLocalStorage';
-
-const FileMain = () => {
- const t = useTranslations('');
-
- const [conversations, setConversations] = useState([]);
- const [conversationID, setConversationID] = useState(generateHash(16));
-
- const clearedConversation = conversations.slice(3);
-
- const [systemResponse, setSystemResponse] = useState('');
- const [waitingSystemResponse, setWaitingSystemResponse] = useState(false);
- const stopSystemResponseRef = useRef(false);
-
- const [fileName, setFileName] = useState('');
- const [fileAbstract, setFileAbstract] = useState('');
-
- const [hasError, setHasError] = useState(false);
-
- const [fileContent, setFileContent] = useState('');
-
- // Service Provider
- const serviceProvider = useAtomValue(store.serviceProviderAtom);
-
- // OpenAI
- const openAIConfig = useAtomValue(store.openAIConfigAtom);
-
- // Azure
- const azureConfig = useAtomValue(store.azureConfigAtom);
-
- // Team
- const teamConfig = useAtomValue(store.teamConfigAtom);
-
- // Hugging Face
- const huggingFaceConfig = useAtomValue(store.huggingFaceConfigAtom);
-
- // Cohere
- const cohereConfig = useAtomValue(store.cohereConfigAtom);
-
- // Claude
- const claudeConfig = useAtomValue(store.claudeConfigAtom);
-
- const enableStreamMessages = useAtomValue(store.enableStreamMessagesAtom);
-
- const handleFileUpload = async (event: any) => {
- let file = null;
-
- if (event.type == 'drop') {
- file = event.dataTransfer.files?.[0];
- } else {
- file = event.target.files?.[0];
- }
-
- const fileSize = file?.size;
- // const fileType = file?.type;
- const fileName = file?.name;
-
- if (!file) {
- return;
- }
-
- if (fileSize > 524288) {
- toast.error(t('File size must be less than 512KB'));
- return;
- }
-
- const allowedFileExtensions = ['txt', 'doc', 'docx', 'pdf', 'md'];
- const fileExtension = file.name.split('.').pop();
-
- if (!allowedFileExtensions.includes(fileExtension)) {
- toast.error(t('File extension is not allowed'));
- return;
- }
-
- setFileName(file?.name);
-
- const formData = new FormData();
- formData.append('file', file);
-
- try {
- const response = await fetch('/api/message/file', {
- method: 'POST',
- body: formData,
- });
-
- const data = await response.json();
-
- if (!response.ok) {
- toast.error(t('Error when uploading file: ') + data.error);
- return;
- }
-
- setFileContent(data.text);
-
- const messagesPayload: AppMessageProps[] = [
- {
- role: 'system',
- content: `You need to analyze the following file (${file?.name}) content.\n\n`,
- },
- {
- role: 'user',
- content: data.text.replace(/\n/g, '\n'),
- },
- ];
-
- setConversations(messagesPayload);
-
- let configPayload;
-
- switch (serviceProvider) {
- case 'OpenAI':
- configPayload = {
- apiKey: openAIConfig.apiKey,
- apiEndpoint: openAIConfig.apiEndpoint,
- apiModel: openAIConfig.apiModel,
- apiTemperature: openAIConfig.apiTemperature,
- };
- break;
- case 'Azure':
- configPayload = {
- apiKey: azureConfig.apiKey,
- apiEndpoint: azureConfig.apiEndpoint,
- apiModel: azureConfig.apiModel,
- apiTemperature: azureConfig.apiTemperature,
- apiDeploymentName: azureConfig.apiDeploymentName,
- };
- break;
- case 'Team':
- configPayload = {
- accessCode: teamConfig.accessCode,
- };
- break;
- case 'Hugging Face':
- configPayload = {
- model: huggingFaceConfig.huggingFaceModel,
- accessToken: huggingFaceConfig.accessToken,
- };
- break;
- case 'Cohere':
- configPayload = {
- model: cohereConfig.model,
- apiKey: cohereConfig.apiKey,
- };
- break;
- case 'Claude':
- configPayload = {
- model: claudeConfig.apiModel,
- apiKey: claudeConfig.apiKey,
- apiTemperature: claudeConfig.apiTemperature,
- };
- break;
- default:
- break;
- }
-
- const AIResponse = await fetch('/api/messages', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- stream: enableStreamMessages,
- serviceProvider: serviceProvider,
- config: configPayload,
- messages: messagesPayload,
- }),
- });
-
- if (!AIResponse.ok) {
- setHasError(true);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const AIData = AIResponse.body;
-
- if (!AIData) {
- setHasError(true);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- setFileAbstract('');
-
- const reader = AIData.getReader();
- const decoder = new TextDecoder();
-
- let done = false;
- let currentResponseMessage = '';
-
- while (!done) {
- if (stopSystemResponseRef.current) {
- done = true;
- break;
- }
-
- const { value, done: readerDone } = await reader.read();
- done = readerDone;
- const chunkValue = decoder.decode(value);
-
- setFileAbstract((prev) => prev + chunkValue);
- currentResponseMessage += chunkValue;
- }
-
- setConversations([...messagesPayload, { role: 'assistant', content: currentResponseMessage }]);
-
- setLocalStorage(`histories-file-${conversationID}`, {
- id: conversationID,
- type: 'file',
- title: fileName,
- messages: [...messagesPayload, { role: 'assistant', content: currentResponseMessage }],
- timestamp: new Date().getTime(),
- });
-
- const updateEvent = new CustomEvent('localStorageUpdated');
- window.dispatchEvent(updateEvent);
- } catch (error) {
- console.error(error);
- return;
- }
- };
-
- const handleMessageSend = async (message: AppMessageProps, indexNumber?: number) => {
- setWaitingSystemResponse(true);
-
- setConversations((prev) => [...prev, message]);
-
- let configPayload;
-
- switch (serviceProvider) {
- case 'OpenAI':
- configPayload = {
- apiKey: openAIConfig.apiKey,
- apiEndpoint: openAIConfig.apiEndpoint,
- apiModel: openAIConfig.apiModel,
- apiTemperature: openAIConfig.apiTemperature,
- };
- break;
- case 'Azure':
- configPayload = {
- apiKey: azureConfig.apiKey,
- apiEndpoint: azureConfig.apiEndpoint,
- apiModel: azureConfig.apiModel,
- apiTemperature: azureConfig.apiTemperature,
- apiDeploymentName: azureConfig.apiDeploymentName,
- };
- break;
- case 'Team':
- configPayload = {
- accessCode: teamConfig.accessCode,
- };
- break;
- case 'Hugging Face':
- configPayload = {
- model: huggingFaceConfig.huggingFaceModel,
- accessToken: huggingFaceConfig.accessToken,
- };
- break;
- case 'Cohere':
- configPayload = {
- model: cohereConfig.model,
- apiKey: cohereConfig.apiKey,
- };
- break;
- case 'Claude':
- configPayload = {
- model: claudeConfig.apiModel,
- apiKey: claudeConfig.apiKey,
- apiTemperature: claudeConfig.apiTemperature,
- };
- break;
- default:
- break;
- }
-
- let messagesPayload: AppMessageProps[] = [];
-
- messagesPayload = [...conversations, message];
-
- if (indexNumber && indexNumber >= 0) {
- setConversations((prev) => prev.slice(0, indexNumber));
- messagesPayload = messagesPayload.slice(0, indexNumber);
- }
-
- const response = await fetch('/api/messages', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- stream: enableStreamMessages,
- serviceProvider: serviceProvider,
- config: configPayload,
- messages: messagesPayload,
- }),
- });
-
- if (!response.ok) {
- setWaitingSystemResponse(false);
- setHasError(true);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const data = response.body;
-
- if (!data) {
- setWaitingSystemResponse(false);
- setHasError(true);
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- setSystemResponse('');
- setConversations((prev) => [...prev, { role: 'assistant', content: '' }]);
-
- const reader = data.getReader();
- const decoder = new TextDecoder();
-
- let done = false;
- let currentResponseMessage = '';
-
- while (!done) {
- if (stopSystemResponseRef.current) {
- done = true;
- break;
- }
-
- const { value, done: readerDone } = await reader.read();
- done = readerDone;
- const chunkValue = decoder.decode(value);
-
- setSystemResponse((prev) => prev + chunkValue);
- currentResponseMessage += chunkValue;
- }
-
- setConversations((prev) => [
- ...prev.slice(0, -1),
- {
- role: 'assistant',
- content: currentResponseMessage,
- },
- ]);
-
- setWaitingSystemResponse(false);
-
- setLocalStorage(`histories-chat-${conversationID}`, {
- id: conversationID,
- type: 'file',
- title: fileName,
- messages: [
- ...conversations,
- message,
- {
- role: 'assistant',
- content: currentResponseMessage,
- },
- ],
- timestamp: new Date().getTime(),
- });
-
- const updateEvent = new CustomEvent('localStorageUpdated');
- window.dispatchEvent(updateEvent);
- };
-
- return (
-
-
- {fileAbstract == '' ? (
-
-
{
- e.preventDefault();
- e.stopPropagation();
- e.dataTransfer.dropEffect = 'copy';
- }}
- onDrop={(e) => {
- e.preventDefault();
- e.stopPropagation();
- handleFileUpload(e);
- }}
- htmlFor='dropzone-file'
- className='dark:hover:bg-bray-800 flex h-64 w-full cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed border-gray-300 bg-gray-50 transition duration-200 ease-in-out hover:bg-gray-100 dark:border-gray-600 dark:bg-[#333] dark:hover:border-gray-500 dark:hover:bg-gray-600'
- >
-
-
-
- {t('Click to upload')} {t('or drag and drop a file')}
-
-
{t('Any file but images')}
-
-
-
-
- ) : (
-
-
-
-
{fileName}
-
-
-
-
- {renderUserMessage(fileContent)}
-
-
-
{renderMarkdownMessage(fileAbstract)}
-
-
- {
- handleMessageSend(conversations[index + 3], index + 3);
- }}
- onEdit={(index: number) => {
- const newContent = prompt('Edit message:', clearedConversation[index].content);
-
- if (newContent !== null && newContent !== '') {
- const newMessage: AppMessageProps = {
- role: 'user',
- content: newContent,
- };
-
- setConversations(conversations.slice(0, index + 3));
-
- handleMessageSend(newMessage);
- }
- }}
- isSystemPromptEmpty={true}
- />
-
-
- )}
-
-
- {fileAbstract != '' && (
- {
- handleMessageSend(message);
- }}
- waitingSystemResponse={waitingSystemResponse}
- stopSystemResponseRef={stopSystemResponseRef}
- />
- )}
-
-
- );
-};
-
-export default FileMain;
diff --git a/components/landing/main/header.tsx b/components/landing/main/header.tsx
deleted file mode 100644
index e8e054d8..00000000
--- a/components/landing/main/header.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-'use client';
-
-import { useEffect, useState } from 'react';
-
-import Link from 'next/link';
-
-import { usePathname } from 'next/navigation';
-
-import { useTranslations, useLocale } from 'next-intl';
-
-import store from '@/hooks/store';
-import { useAtom } from 'jotai';
-
-import { FiLayout, FiCode, FiFile, FiMessageCircle, FiChevronDown } from 'react-icons/fi';
-
-import LandingSide from '@/components/landing/side';
-
-import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet';
-import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';
-
-const LandingHeader = () => {
- const pathname = usePathname();
-
- const t = useTranslations('');
- const locale = useLocale();
-
- const [isHiddenSideAtom, setIsHiddenSideAtom] = useAtom(store.isHiddenSideAtom);
-
- const handleToggleSide = () => {
- setIsHiddenSideAtom(!isHiddenSideAtom);
- };
-
- const currentMode = ModeList.find((mode) => pathname?.includes(mode.link)) || ModeList.find((mode) => mode.value === 'chat');
-
- const [userInfo, setUserInfo] = useState(null);
-
- useEffect(() => {
- const getUserInfo = async () => {
- const response = await fetch('/api/user/info');
-
- const data = await response.json();
-
- if (data.user) {
- setUserInfo(data.user);
- }
- };
-
- getUserInfo();
- }, []);
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {currentMode && }
- {t(currentMode?.title)}
-
-
-
-
- {ModeList.map((mode, index) => (
-
-
-
- {t(mode.title)}
-
-
- ))}
-
-
-
-
-
- );
-};
-
-export default LandingHeader;
-
-const ModeList = [
- {
- title: 'Chat',
- value: 'chat',
- icon: FiMessageCircle,
- link: '/mode/chat',
- },
- {
- title: 'Code',
- value: 'code',
- icon: FiCode,
- link: '/mode/code',
- },
- // {
- // title: 'File',
- // value: 'file',
- // icon: FiFile,
- // link: '/mode/file',
- // },
-];
diff --git a/components/landing/main/input-area.tsx b/components/landing/main/input-area.tsx
deleted file mode 100644
index e25526af..00000000
--- a/components/landing/main/input-area.tsx
+++ /dev/null
@@ -1,336 +0,0 @@
-import { MutableRefObject, useEffect, useRef, useState } from 'react';
-
-import { useTranslations, useLocale } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import store from '@/hooks/store';
-import { useAtomValue } from 'jotai';
-
-import SpeechRecognition, { useSpeechRecognition } from 'react-speech-recognition';
-
-import { IoStopCircle } from 'react-icons/io5';
-import { TbSend, TbShare2 } from 'react-icons/tb';
-import { MdOutlineKeyboardVoice, MdPause } from 'react-icons/md';
-
-import TextareaAutosize from 'react-textarea-autosize';
-
-import { Badge } from '@/components/ui/badge';
-
-const InputArea = ({
- conversations,
- conversationID,
- conversationType,
- sendMessage,
- waitingSystemResponse,
- stopSystemResponseRef,
-}: {
- conversations: AppMessageProps[];
- conversationID: string;
- conversationType: string;
- sendMessage: (message: AppMessageProps, indexNumber?: number | null, plugin?: any) => void;
- waitingSystemResponse: boolean;
- stopSystemResponseRef: MutableRefObject;
-}) => {
- const t = useTranslations('');
-
- const locale = useLocale();
-
- const [userInput, setUserInput] = useState('');
-
- // commands
- const [showCommands, setShowCommands] = useState(false);
- const [filteredCommands, setFilteredCommands] = useState(CommandsList);
- const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);
-
- // Keyboard
- const isSendKeyEnter = useAtomValue(store.isSendKeyEnterAtom);
- const [isComposing, setIsComposing] = useState(false);
-
- const enableSystemPrompt = useAtomValue(store.enableSystemPrompt);
-
- const enablePlugins = useAtomValue(store.enablePluginsAtom);
-
- const fileConfig = useAtomValue(store.fileConfigAtom);
-
- const contextModeAtom = useAtomValue(store.contextModeAtom);
-
- const { transcript, listening, resetTranscript } = useSpeechRecognition();
- const [isListening, setIsListening] = useState(false);
-
- const searchConfig = useAtomValue(store.searchConfigAtom);
-
- const textAreaRef = useRef(null);
-
- useEffect(() => {
- if (textAreaRef.current) {
- textAreaRef.current.focus();
- }
- }, []);
-
- const handleVoiceInput = () => {
- if (!SpeechRecognition.browserSupportsSpeechRecognition()) {
- toast.error(t('Your browser does not support voice input'));
- return;
- }
-
- if (listening) {
- SpeechRecognition.stopListening();
- setIsListening(false);
- } else {
- SpeechRecognition.startListening({ language: locale, continuous: true });
- setIsListening(true);
- }
- };
-
- const handleTextAreaChange = (e: React.ChangeEvent) => {
- setUserInput(e.target.value);
-
- if (e.target.value.startsWith('/')) {
- const matchingCommands = CommandsList.filter((command) => command.name.startsWith(e.target.value.slice(1)));
- setFilteredCommands(matchingCommands);
- setShowCommands(matchingCommands.length > 0);
- } else {
- setShowCommands(false);
- }
-
- resetTranscript();
- };
-
- useEffect(() => {
- if (transcript) {
- setUserInput(transcript);
- }
- }, [transcript]);
-
- const handleSend = () => {
- if (waitingSystemResponse) {
- toast.error(t('Please wait for the system response'));
- return;
- }
-
- if (userInput.length === 0) {
- toast.error(t('Please enter something'));
- return;
- }
-
- let currentPlugin = null;
- let clearedUserInput;
-
- if (userInput.startsWith('/search ')) {
- if (!searchConfig.searchAPIKey) {
- toast.error(t('Please set up the search config first'));
- return;
- }
- currentPlugin = 'search';
- clearedUserInput = userInput.split('/search ')[1].trim();
- } else if (userInput.startsWith('/fetch ')) {
- currentPlugin = 'fetch';
- clearedUserInput = userInput.split('/fetch ')[1].trim();
- } else {
- clearedUserInput = userInput;
- }
-
- const currentMessage: AppMessageProps = { role: 'user', content: clearedUserInput };
-
- sendMessage(currentMessage, null, currentPlugin);
-
- setUserInput('');
- resetTranscript();
- };
-
- const handleStopSystemResponse = () => {
- stopSystemResponseRef.current = true;
- setTimeout(() => {
- stopSystemResponseRef.current = false;
- }, 1000);
- };
-
- const handleShareConversation = async () => {
- const story = localStorage.getItem(`histories-${conversationType}-${conversationID}`) as string;
-
- if (!story) {
- toast.error(t('Error: Conversation not found'));
- return;
- }
-
- const response = await fetch(`/api/share`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- story,
- }),
- });
-
- if (!response.ok) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- if (data.type == 'update') {
- navigator.clipboard.writeText(window.location.host + `/s/${conversationID}`);
- toast.success(`${t('Updated the previous share:')} ${conversationID}`);
- return;
- }
-
- navigator.clipboard.writeText(window.location.host + `/s/${conversationID}`);
- toast.success(`${t('Copied share link:')} ${conversationID}`);
- };
-
- const handleCompositionStart = () => {
- setIsComposing(true);
- };
-
- const handleCompositionEnd = (e: React.CompositionEvent) => {
- setIsComposing(false);
-
- setUserInput(e.currentTarget.value);
- };
-
- const handleOnKeyDown = (e: any) => {
- if (isComposing) return;
-
- const { shiftKey, key } = e;
- const isEnterKey = key === 'Enter';
- const isSendOnEnter = isSendKeyEnter && isEnterKey && !shiftKey;
- const isSendOnShiftEnter = !isSendKeyEnter && isEnterKey && shiftKey;
-
- if (showCommands && isEnterKey) {
- e.preventDefault();
- handleCommandClick(`/${filteredCommands[selectedCommandIndex].name}`);
- } else if (key === 'Escape') {
- setShowCommands(false);
- } else if ((key === 'ArrowUp' || key === 'ArrowDown') && showCommands) {
- e.preventDefault();
- setSelectedCommandIndex((prevIndex) => (key === 'ArrowUp' ? Math.max(prevIndex - 1, 0) : Math.min(prevIndex + 1, filteredCommands.length - 1)));
- } else if (isSendOnEnter || isSendOnShiftEnter) {
- e.preventDefault();
- handleSend();
- }
- };
-
- const handleCommandClick = (command: string) => {
- setUserInput(command + ' ');
- setShowCommands(false);
- setSelectedCommandIndex(0);
- };
-
- return (
-
-
-
-
- {isSendKeyEnter ? 'enter' : 'shift + enter'}
-
- {conversationType === 'chat' && (
- <>
- {enableSystemPrompt && (
-
- {t('system prompt')}
-
- )}
- {enablePlugins && (
-
- {t('plugins')}
-
- )}
- {contextModeAtom.enable && (
-
- {contextModeAtom.contextCount == 0 ? t('no context') : contextModeAtom.contextCount + ' ' + t('contexts')}
-
- )}
- {fileConfig.enable && (
-
- {t('file')}
-
- )}
- >
- )}
-
- {waitingSystemResponse ? (
-
-
- {t('Stop Generating')}
-
- ) : (
- conversations.length > 0 && (
-
-
-
- {t('Share')}
-
-
- )
- )}
-
-
- {enablePlugins && showCommands && (
-
-
- {filteredCommands.map((command, index) => (
- handleCommandClick(`/${command.name}`)}
- className={`cursor-pointer rounded-lg px-3 py-1 transition duration-200 ease-in-out hover:bg-gray-100 dark:hover:bg-neutral-700 ${
- selectedCommandIndex === index ? 'bg-gray-100 dark:bg-neutral-600' : ''
- }`}
- >
- /{command.name}
- {command.description}
-
- ))}
-
-
- )}
-
-
-
- {!isListening ? : }
-
-
-
-
-
-
-
- );
-};
-
-export default InputArea;
-
-const CommandsList = [
- { name: 'search', description: 'Allow you to search in internet.' },
- { name: 'fetch', description: 'Fetch Content from website' },
-];
diff --git a/components/landing/main/main-settings.tsx b/components/landing/main/main-settings.tsx
deleted file mode 100644
index 207d6318..00000000
--- a/components/landing/main/main-settings.tsx
+++ /dev/null
@@ -1,368 +0,0 @@
-import { useState, useEffect } from 'react';
-
-import Image from 'next/image';
-
-import { useTranslations } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import store from '@/hooks/store';
-import { useAtom, useAtomValue } from 'jotai';
-
-import Tippy from '@tippyjs/react';
-
-import { MdInfoOutline } from 'react-icons/md';
-import { TbCircleArrowRightFilled } from 'react-icons/tb';
-import { RiAddCircleLine, RiCloseCircleLine } from 'react-icons/ri';
-
-import { Badge } from '@/components/ui/badge';
-import { Checkbox } from '@/components/ui/checkbox';
-import { Textarea } from '@/components/ui/textarea';
-import { Separator } from '@/components/ui/separator';
-import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-const ModeSettings = ({ systemPromptContent, setSystemPromptContent }: { systemPromptContent: string; setSystemPromptContent: (content: string) => void }) => {
- const t = useTranslations('');
-
- // Global Disabled
- const [globalDisabled, setGlobalDisabled] = useState(false);
-
- // Stream Messages
- const [enableStreamMessages, setEnableStreamMessages] = useAtom(store.enableStreamMessagesAtom);
-
- // Context Mode
- const [contextModeAtom, setContextModeAtom] = useAtom(store.contextModeAtom);
-
- const [contextCount, setContextCount] = useState(0);
- const [isContextMode, setIsContextMode] = useState(false);
-
- useEffect(() => {
- if (contextModeAtom.enable) {
- setIsContextMode(true);
- setContextCount(contextModeAtom.contextCount);
- } else {
- setIsContextMode(false);
- }
- }, [contextModeAtom]);
-
- // System Prompt
- const [enableSystemPrompt, setEnableSystemPrompt] = useAtom(store.enableSystemPrompt);
-
- // Plugins
- const [enablePlugins, setEnablePlugins] = useAtom(store.enablePluginsAtom);
-
- // File
- const [fileConfig, setFileConfig] = useAtom(store.fileConfigAtom);
- const [enableFile, setEnableFile] = useState(false);
- const [fileLink, setFileLink] = useState('');
- const [files, setFiles] = useState([]);
-
- useEffect(() => {
- if (fileConfig) {
- setFiles(fileConfig.files);
- setEnableFile(fileConfig.enable);
- }
- }, [fileConfig, setEnableFile]);
-
- // Service Provider
- const serviceProvider = useAtomValue(store.serviceProviderAtom);
-
- // OpenAI
- const openAIConfig = useAtomValue(store.openAIConfigAtom);
-
- // Azure
- const azureConfig = useAtomValue(store.azureConfigAtom);
-
- // Hugging Face
- const huggingFaceConfig = useAtomValue(store.huggingFaceConfigAtom);
-
- // Cohere
- const cohereConfig = useAtomValue(store.cohereConfigAtom);
-
- // Claude
- const claudeConfig = useAtomValue(store.claudeConfigAtom);
-
- const handleCheckStreamMessages = (value: boolean) => {
- setEnableStreamMessages(value);
- };
-
- const handleContextModeCheck = (value: boolean) => {
- setContextModeAtom({ enable: value, contextCount });
- };
-
- const handleCheckSystemPrompt = (value: boolean) => {
- setSystemPromptContent('');
- setEnableSystemPrompt(value);
- };
-
- const handleCheckPlugins = (value: boolean) => {
- setEnablePlugins(value);
- };
-
- const handleCheckFile = (value: boolean) => {
- setEnableFile(value);
- setFileConfig({ enable: value, files });
- };
-
- const onAdd = () => {
- if (!fileLink.startsWith('http')) {
- toast.error(t('Please enter a valid URL'));
- return;
- }
-
- if (files.includes(fileLink)) {
- toast.error(t('This URL already exists'));
- return;
- }
-
- if (files.length >= 3) {
- toast.error(t('You can only add 3 files'));
- return;
- }
-
- setFiles([...files, fileLink]);
- setFileConfig({ enable: true, files: [...files, fileLink] });
-
- setFileLink('');
- };
-
- const onDelete = (index: number) => {
- const newFiles = files.filter((_, i) => i !== index);
-
- setFiles(newFiles);
- };
-
- useEffect(() => {
- switch (serviceProvider) {
- case 'OpenAI':
- case 'Team':
- case 'Azure':
- setGlobalDisabled(false);
- setEnableStreamMessages(true);
- break;
- default:
- case 'Cohere':
- case 'Hugging Face':
- case 'Claude':
- setGlobalDisabled(true);
- setEnableSystemPrompt(false);
- setIsContextMode(true);
- setEnableStreamMessages(false);
- break;
- }
- }, [serviceProvider, setEnableStreamMessages, setEnableSystemPrompt, setIsContextMode]);
-
- let CurrentConfig;
-
- switch (serviceProvider) {
- case 'OpenAI':
- case 'Team':
- CurrentConfig = (
- <>
-
- {t('Current Model')}: {openAIConfig?.apiModel}
-
-
- {t('Temperature')}: {openAIConfig?.apiTemperature}
-
- >
- );
- break;
- case 'Azure':
- CurrentConfig = (
- <>
-
- {t('Current Model')}: {azureConfig?.apiModel}
-
-
- {t('Temperature')}: {azureConfig?.apiTemperature}
-
- >
- );
- break;
- case 'Hugging Face':
- CurrentConfig = (
- <>
-
- {t('Current Model')}: {huggingFaceConfig?.huggingFaceModel}
-
- >
- );
- break;
- case 'Cohere':
- CurrentConfig = (
- <>
-
- {t('Current Model')}: {cohereConfig?.model}
-
- >
- );
- break;
- case 'Claude':
- CurrentConfig = (
- <>
-
- {t('Current Model')}: {claudeConfig?.apiModel}
-
- >
- );
- break;
- default:
- break;
- }
-
- return (
-
-
-
-
-
-
-
-
-
-
{t('Stream Messages')}
-
-
-
-
-
-
-
-
-
-
-
{t('Context Mode')}
- {isContextMode ? (
-
{
- setContextCount(parseInt(value));
- setContextModeAtom({ enable: true, contextCount: parseInt(value) });
- }}
- >
-
-
-
-
- 0
- 2
- 4
- 6
- 8
- 10
-
-
- ) : null}
-
-
-
-
-
-
-
-
-
-
-
{t('System Prompt')}
-
-
-
-
-
- {enableSystemPrompt && (
-
-
-
-
-
-
-
- )}
-
-
-
-
-
-
{t('Plugins')}
-
-
-
-
-
-
- {t('Beta')}
-
-
-
-
-
-
-
{t('File')}
-
-
-
-
-
-
- {t('Beta')}
-
- {enableFile && (
-
-
-
-
-
- {files.map((file, index) => {
- return (
-
-
-
onDelete(index)}
- >
-
-
-
- );
- })}
-
- {
- setFileLink(e.target.value);
- }}
- className='flex w-10/12 overflow-x-auto rounded-lg border-2 bg-transparent p-2 text-sm'
- />
-
-
-
-
-
-
- )}
-
-
-
-
- {/*
-
- */}
-
-
-
-
- );
-};
-
-export default ModeSettings;
diff --git a/components/landing/side/footer/app-info.tsx b/components/landing/side/footer/app-info.tsx
deleted file mode 100644
index eff051c8..00000000
--- a/components/landing/side/footer/app-info.tsx
+++ /dev/null
@@ -1,99 +0,0 @@
-'use client';
-
-import { useEffect, useState } from 'react';
-
-import Link from 'next/link';
-import Image from 'next/image';
-
-import { useTranslations } from 'next-intl';
-
-import { Badge } from '@/components/ui/badge';
-import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/dialog';
-
-import packageInfo from '@/package.json';
-
-export default function AppInfo() {
- const t = useTranslations('');
-
- const [isVersionDialogOpen, setIsVersionDialogOpen] = useState(false);
-
- const currentYear = new Date().getFullYear();
-
- const [isLatestVersion, setIsLatestVersion] = useState(true);
-
- useEffect(() => {
- const getVersion = async () => {
- const res = await fetch('/api/app/latest');
- const data = await res.json();
-
- if (data.tag_name != packageInfo.version) {
- setIsLatestVersion(false);
- }
- };
-
- getVersion();
- }, [isLatestVersion]);
-
- return (
-
-
-
- v{packageInfo.version}
-
-
-
-
-
-
-
Chat Chat
-
v{packageInfo.version}
- {!isLatestVersion && (
-
-
{t('New Version Available')}
-
- )}
-
-
-
- Copyright © {currentYear}{' '}
-
- Chat Chat
-
- . AGPL-3.0 License.
-
-
-
- Privacy Policy
-
-
- Cookies
-
-
- GitHub
-
-
- Harry Yep
-
-
-
-
-
-
- );
-}
diff --git a/components/landing/side/footer/app-settings/header.tsx b/components/landing/side/footer/app-settings/header.tsx
deleted file mode 100644
index 25c4f547..00000000
--- a/components/landing/side/footer/app-settings/header.tsx
+++ /dev/null
@@ -1,186 +0,0 @@
-'use client';
-
-import { useEffect, useState } from 'react';
-
-import { useTranslations } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import store from '@/hooks/store';
-import { useAtom } from 'jotai';
-
-import Tippy from '@tippyjs/react';
-
-import { MdInfoOutline } from 'react-icons/md';
-import { BiBrush, BiExport, BiImport } from 'react-icons/bi';
-
-import { Label } from '@/components/ui/label';
-
-import { Switch } from '@/components/ui/switch';
-import { Button } from '@/components/ui/button';
-import { Separator } from '@/components/ui/separator';
-import GlobalButton from '@/components/global/button';
-
-const AppSettingsHeader = () => {
- const t = useTranslations('');
-
- const [isSendKeyEnter, setIsSendKeyEnter] = useAtom(store.isSendKeyEnterAtom);
-
- const [enableAutoSpeech, setEnableAutoSpeech] = useAtom(store.autoSpeechAtom);
-
- const [enableUserMarkdownRender, setEnableUserMarkdownRender] = useAtom(store.enableUserMarkdownRenderAtom);
-
- const [enableAutoScroll, setEnableAutoScroll] = useAtom(store.isAutoScrollAtom);
-
- const [histories, setHistories] = useState([]);
-
- const handleSwitchAutoSpeech = () => {
- setEnableAutoSpeech(!enableAutoSpeech);
- toast.success(`${t('Auto Speech')} ${enableAutoSpeech ? t('disabled') : t('enabled')}`);
- };
-
- const handleSwitchUserMarkdownRender = () => {
- setEnableUserMarkdownRender(!enableUserMarkdownRender);
- toast.success(`${t('Render user message using Markdown')} ${enableUserMarkdownRender ? t('disabled') : t('enabled')}`);
- };
-
- const handleSwitchSendMessageKey = () => {
- setIsSendKeyEnter(!isSendKeyEnter);
- toast.success(`${t('Send message key changed to')} ${isSendKeyEnter ? 'Enter' : 'Shift + Enter'}`);
- };
-
- const handleSwitchAutoScroll = () => {
- setEnableAutoScroll(!enableAutoScroll);
- toast.success(`${t('AutoScroll')} ${enableAutoScroll ? t('disabled') : t('enabled')}`);
- };
-
- useEffect(() => {
- const updateHistories = () => {
- const conversationKeys = Object.keys(localStorage).filter((key) => key.startsWith('histories-'));
-
- const conversationValues = conversationKeys.map((key) => {
- const chatValue = localStorage.getItem(key);
- return JSON.parse(chatValue || '{}');
- });
-
- setHistories(conversationValues);
- };
-
- updateHistories();
-
- window.addEventListener('localStorageUpdated', updateHistories);
-
- return () => {
- window.removeEventListener('localStorageUpdated', updateHistories);
- };
- }, []);
-
- const handleExportHistory = () => {
- const data = histories.map((item) => {
- return item;
- });
-
- const blob = new Blob([JSON.stringify(data)], { type: 'application/json' });
- const url = URL.createObjectURL(blob);
-
- const download = document.createElement('a');
-
- download.href = url;
- download.download = `chatchat-history-${new Date().getTime()}.json`;
- download.click();
- };
-
- const handleImportHistory = () => {
- const input = document.createElement('input');
-
- input.type = 'file';
- input.accept = 'application/json';
- input.click();
-
- input.onchange = () => {
- const file = input.files?.[0];
-
- if (file) {
- const reader = new FileReader();
-
- reader.readAsText(file, 'UTF-8');
-
- reader.onload = (e) => {
- const result = e.target?.result;
-
- if (result) {
- const data = JSON.parse(result as string);
-
- if (data) {
- data.forEach((item: HistoryProps) => {
- localStorage.setItem(`histories-${item.type}-${item.id}`, JSON.stringify(item));
- });
-
- toast.success(t('Imported history successfully!'));
- }
- }
- };
- }
-
- const updateEvent = new CustomEvent('localStorageUpdated');
- window.dispatchEvent(updateEvent);
- };
- };
-
- const handleClearHistory = () => {
- const chatKeys = Object.keys(localStorage).filter((key) => key.startsWith('histories-'));
-
- chatKeys.forEach((key) => {
- localStorage.removeItem(key);
- });
-
- setHistories([]);
-
- toast.success(t('Cleared history successfully!'));
-
- const updateEvent = new CustomEvent('localStorageUpdated');
- window.dispatchEvent(updateEvent);
- };
-
- return (
-
-
-
- {t('Send Message using Enter Key')}
-
-
-
-
-
-
-
-
- {t('Auto Speech')}
-
-
-
-
-
-
-
-
- {t('Render user message using Markdown')}
-
-
-
- {t('AutoScroll to end of message')}
-
-
-
-
{t('History Record')}
-
- } text={t('Export')} onClick={handleExportHistory} />
- } text={t('Import')} onClick={handleImportHistory} />
- } text={t('Clear')} onClick={handleClearHistory} />
-
-
-
- );
-};
-
-export default AppSettingsHeader;
diff --git a/components/landing/side/footer/app-settings/index.tsx b/components/landing/side/footer/app-settings/index.tsx
deleted file mode 100644
index 0e2e9d30..00000000
--- a/components/landing/side/footer/app-settings/index.tsx
+++ /dev/null
@@ -1,569 +0,0 @@
-'use client';
-
-import { useEffect, useState } from 'react';
-
-import { useTranslations } from 'next-intl';
-
-import { User } from '@prisma/client';
-
-import { toast } from 'react-hot-toast';
-
-import store from '@/hooks/store';
-import { useAtom } from 'jotai';
-
-import { TbAdjustmentsHorizontal } from 'react-icons/tb';
-
-import { Badge } from '@/components/ui/badge';
-import { Label } from '@/components/ui/label';
-import { Button } from '@/components/ui/button';
-import { Separator } from '@/components/ui/separator';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import { Select, SelectContent, SelectItem, SelectGroup, SelectTrigger, SelectValue } from '@/components/ui/select';
-import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetFooter, SheetTitle, SheetTrigger } from '@/components/ui/sheet';
-
-import TeamServiceProvider from './service-provider/team';
-import AzureServiceProvider from './service-provider/azure';
-import OpenAIServiceProvider from './service-provider/openai';
-import ClaudeServiceProvider from './service-provider/claude';
-import CustomServiceProvider from './service-provider/custom';
-import CohereServiceProvider from './service-provider/cohere';
-import ExtensionServiceProvider from './service-provider/extension';
-import HuggingFaceServiceProvider from './service-provider/huggingface';
-import AppSettingsHeader from '@/components/landing/side/footer/app-settings/header';
-import TabSearch from '@/components/landing/side/footer/app-settings/tab-search';
-import TabTTS from '@/components/landing/side/footer/app-settings/tab-tts';
-
-const SideAppSettings = ({ user }: { user: User | null }) => {
- const t = useTranslations('');
-
- const [isSheetOpen, setIsSheetOpen] = useState(false);
-
- // Text To Speech
- const synth = typeof window !== 'undefined' ? window.speechSynthesis : null;
- const voices = synth ? synth.getVoices() : null;
-
- const [ttsVoice, setTTSVoice] = useState('');
- const [ttsSpeed, setTTSSpeed] = useState(1.0);
- const [ttsPitch, setTTSPitch] = useState(1.0);
- const [ttsSample, setTTSSample] = useState(t('Hello. I am your virtual AI assistant'));
-
- const [ttsConfig, setTTSConfig] = useAtom(store.textToSpeechConfigAtom);
-
- const [isSpeaking, setIsSpeaking] = useState(false);
-
- // Search
- const [searchEngine, setSearchEngine] = useState(searchEnginesList[0].name);
- const [searchEngineID, setSearchEngineID] = useState('');
- const [searchAPIKey, setSearchAPIKey] = useState('');
-
- const [searchConfig, setSearchConfig] = useAtom(store.searchConfigAtom);
-
- useEffect(() => {
- if (synth) {
- const loadVoices = async () => {
- const voices = await new Promise((resolve) => {
- const voiceList = synth.getVoices();
- if (voiceList.length) {
- resolve(voiceList);
- } else {
- synth.addEventListener('voiceschanged', () => {
- resolve(synth.getVoices());
- });
- }
- });
-
- setTTSVoice(voices[0]?.name);
- };
-
- loadVoices();
- }
- }, [synth]);
-
- useEffect(() => {
- if (ttsConfig) {
- setTTSVoice(ttsConfig.voice);
- setTTSSpeed(ttsConfig.speed);
- setTTSPitch(ttsConfig.pitch);
- }
- }, [ttsConfig]);
-
- useEffect(() => {
- if (searchConfig) {
- setSearchEngine(searchConfig.searchEngine);
- setSearchEngineID(searchConfig.searchEngineID);
- setSearchAPIKey(searchConfig.searchAPIKey);
- }
- }, [searchConfig]);
-
- const [currentServiceProvider, setCurrentServiceProvider] = useState('OpenAI');
- const [serviceProvider, setServiceProvider] = useAtom(store.serviceProviderAtom);
-
- // OpenAI, Custom
- const [apiKey, setApiKey] = useState('');
- const [apiEndpoint, setApiEndpoint] = useState('');
- const [apiModel, setApiModel] = useState('');
- const [apiTemperature, setApiTemperature] = useState(0.3);
-
- // OpenAI
- const [openAIConfig, setOpenAIConfig] = useAtom(store.openAIConfigAtom);
- const [useCloudSettings, setUseCloudSettings] = useAtom(store.useCloudSettingsAtom);
-
- const [isAzure, setIsAzure] = useState(false);
-
- // Azure
- const [azureConfig, setAzureConfig] = useAtom(store.azureConfigAtom);
- const [azureAPIKey, setAzureAPIKey] = useState('');
- const [azureAPIModel, setAzureAPIModel] = useState('');
- const [azureAPIEndpoint, setAzureAPIEndpoint] = useState('');
- const [azureAPITemperature, setAzureAPITemperature] = useState(0.3);
- const [azureAPIDeploymentName, setAzureAPIDeploymentName] = useState('');
-
- // Hugging Face
- const [accessToken, setAccessToken] = useState('');
- const [huggingFaceModel, setHuggingFaceModel] = useState('');
- const [huggingFaceConfig, setHuggingFaceConfig] = useAtom(store.huggingFaceConfigAtom);
-
- // Team
- const [accessCode, setAccessCode] = useState('');
- const [teamConfig, setTeamConfig] = useAtom(store.teamConfigAtom);
-
- // Cohere
- const [cohereAPIKey, setCohereAPIKey] = useState('');
- const [cohereModel, setCohereModel] = useState('');
- const [cohereConfig, setCohereConfig] = useAtom(store.cohereConfigAtom);
-
- // Claude
- const [claudeConfig, setClaudeConfig] = useAtom(store.claudeConfigAtom);
- const [claudeAPIKey, setClaudeAPIKey] = useState('');
- const [claudeAPIModel, setClaudeAPIModel] = useState('');
- const [claudeAPITemperature, setClaudeAPITemperature] = useState(0.3);
-
- useEffect(() => {
- if (isSheetOpen && serviceProvider) {
- setCurrentServiceProvider(serviceProvider);
- }
- }, [isSheetOpen, serviceProvider]);
-
- useEffect(() => {
- if (openAIConfig) {
- setApiKey(openAIConfig.apiKey);
- setApiEndpoint(openAIConfig.apiEndpoint);
- setApiModel(openAIConfig.apiModel);
- setApiTemperature(openAIConfig.apiTemperature);
- }
-
- if (azureConfig) {
- setAzureAPIKey(azureConfig.apiKey);
- setAzureAPIModel(azureConfig.apiModel);
- setAzureAPIEndpoint(azureConfig.apiEndpoint);
- setAzureAPITemperature(azureConfig.apiTemperature);
- setAzureAPIDeploymentName(azureConfig.apiDeploymentName);
- }
-
- if (teamConfig) {
- setAccessCode(teamConfig.accessCode);
- }
-
- if (huggingFaceConfig) {
- setAccessToken(huggingFaceConfig.accessToken);
- setHuggingFaceModel(huggingFaceConfig.huggingFaceModel);
- }
-
- if (cohereConfig) {
- setCohereAPIKey(cohereConfig.apiKey);
- setCohereModel(cohereConfig.model);
- }
-
- if (claudeConfig) {
- setClaudeAPIKey(claudeConfig.apiKey);
- setClaudeAPIModel(claudeConfig.apiModel);
- setClaudeAPITemperature(claudeConfig.apiTemperature);
- }
- }, [azureConfig, claudeConfig, cohereConfig, huggingFaceConfig, openAIConfig, teamConfig]);
-
- let ProviderConfig = null;
-
- switch (currentServiceProvider) {
- case 'OpenAI':
- ProviderConfig = (
-
- );
- break;
- case 'Azure':
- ProviderConfig = (
-
- );
- break;
- case 'Hugging Face':
- ProviderConfig = ;
- break;
- case 'Claude':
- ProviderConfig = (
-
- );
- break;
- case 'Custom':
- ProviderConfig = ;
- break;
- case 'Team':
- ProviderConfig = ;
- break;
- case 'Cohere':
- ProviderConfig = ;
- break;
- case 'Extension':
- ProviderConfig = ;
- break;
- default:
- ProviderConfig = null;
- break;
- }
-
- const onCancel = () => {
- setIsSheetOpen(false);
- };
-
- const onReset = () => {
- setCurrentServiceProvider('OpenAI');
- setServiceProvider('OpenAI');
-
- setOpenAIConfig({
- apiKey: '',
- apiEndpoint: '',
- apiModel: 'gpt-3.5-turbo',
- apiTemperature: 0.3,
- });
-
- setAzureConfig({
- apiKey: '',
- apiEndpoint: '',
- apiModel: 'gpt-3.5-turbo',
- apiTemperature: 0.3,
- apiDeploymentName: '',
- });
-
- setTeamConfig({
- accessCode: '',
- });
-
- setHuggingFaceConfig({
- accessToken: '',
- huggingFaceModel: 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5',
- });
-
- setCohereConfig({
- apiKey: '',
- model: 'command-nightly',
- });
-
- setClaudeConfig({
- apiKey: '',
- apiModel: 'claude-v1',
- apiTemperature: 1.0,
- });
-
- setAccessCode('');
-
- setApiKey('');
- setApiEndpoint('');
-
- toast.success(t('Settings reset'));
- };
-
- const onSave = () => {
- setTTSConfig({
- voice: ttsVoice,
- speed: ttsSpeed,
- pitch: ttsPitch,
- });
-
- setSearchConfig({
- searchEngine: searchEngine,
- searchEngineID: searchEngineID,
- searchAPIKey: searchAPIKey,
- });
-
- if (currentServiceProvider == 'OpenAI' && !useCloudSettings) {
- if (apiKey !== '' && apiKey.length < 5) {
- toast.error(t('Please fill in all required fields'));
- return;
- }
-
- if (apiEndpoint != '' && !(apiEndpoint.startsWith('https://') || apiEndpoint.startsWith('http://'))) {
- toast.error(t('Invalid API Endpoint'));
- return;
- }
- }
-
- if (currentServiceProvider == 'Azure' && (!azureAPIKey || !azureAPIEndpoint || !azureAPIDeploymentName)) {
- toast.error(t('Please fill in all required fields'));
- return;
- }
-
- if (!user && currentServiceProvider == 'Team') {
- toast.error(t('Please login to join a team'));
- return;
- }
-
- if (currentServiceProvider == 'Hugging Face' && !accessToken) {
- toast.error(t('Please fill in all required fields'));
- return;
- }
-
- if (currentServiceProvider == 'Cohere' && !cohereAPIKey) {
- toast.error(t('Please fill in all required fields'));
- return;
- }
-
- if (currentServiceProvider == 'Claude' && !claudeAPIKey) {
- toast.error(t('Please fill in all required fields'));
- return;
- }
-
- switch (currentServiceProvider) {
- case 'OpenAI':
- setOpenAIConfig({
- apiKey,
- apiEndpoint,
- apiModel,
- apiTemperature,
- });
- break;
- case 'Azure':
- setAzureConfig({
- apiKey: azureAPIKey,
- apiEndpoint: azureAPIEndpoint,
- apiModel: azureAPIModel,
- apiTemperature: azureAPITemperature,
- apiDeploymentName: azureAPIDeploymentName,
- });
- break;
- case 'Team':
- setTeamConfig({
- accessCode,
- });
- break;
- case 'Hugging Face':
- setHuggingFaceConfig({
- accessToken,
- huggingFaceModel,
- });
- break;
- case 'Cohere':
- setCohereConfig({
- model: cohereModel,
- apiKey: cohereAPIKey,
- });
- break;
- case 'Claude':
- setClaudeConfig({
- apiKey: claudeAPIKey,
- apiModel: claudeAPIModel,
- apiTemperature: claudeAPITemperature,
- });
- break;
- default:
- break;
- }
-
- setServiceProvider(currentServiceProvider);
-
- toast.success(t('Settings saved'));
-
- setIsSheetOpen(false);
- };
-
- return (
-
-
-
-
-
-
-
-
- {t('App Settings')}
-
- {t('You are using')} {serviceProvider}
-
-
-
-
-
-
-
- {t('Service Provider')}
- {t('Text To Speech')}
- {t('Web Search')}
-
-
-
-
-
- {t('AI Service Provider')}
- setCurrentServiceProvider(value as ServiceProviderProps)}>
-
-
-
-
- {serviceProviderList
- // .sort((a, b) => a.name.localeCompare(b.name))
- .map((service, index) => (
-
-
- {service.name}{' '}
- {service.status !== 1 &&
- (service.status == 0 ? (
-
- {t('Planned')}
-
- ) : (
-
- {t('Beta')}
-
- ))}
-
-
- ))}
-
-
-
-
{ProviderConfig}
-
-
-
-
-
-
-
-
-
-
-
-
-
- {t('Cancel')}
-
-
- {t('Reset')}
-
-
- {t('Save')}
-
-
-
-
- );
-};
-
-export default SideAppSettings;
-
-const searchEnginesList = [
- {
- name: 'Programmable Search Engine (By Google)',
- value: 'pse',
- },
-];
-
-interface ServiceProviderListProps {
- name: string;
- value: ServiceProviderProps;
- status: number;
-}
-
-const serviceProviderList: ServiceProviderListProps[] = [
- // {
- // name: 'OpenAI / Azure OpenAI',
- // value: 'OpenAI',
- // status: 1,
- // },
- {
- name: 'OpenAI',
- value: 'OpenAI',
- status: 1,
- },
- {
- name: 'Azure OpenAI',
- value: 'Azure',
- status: 1,
- },
- {
- name: 'Claude',
- value: 'Claude',
- status: 2,
- },
- {
- name: 'Cohere',
- value: 'Cohere',
- status: 1,
- },
- {
- name: 'Hugging Face',
- value: 'Hugging Face',
- status: 1,
- },
- {
- name: 'Team',
- value: 'Team',
- status: 2,
- },
- {
- name: 'Custom',
- value: 'Custom',
- status: 0,
- },
-];
diff --git a/components/landing/side/footer/app-settings/service-provider/azure.tsx b/components/landing/side/footer/app-settings/service-provider/azure.tsx
deleted file mode 100644
index e2e424cc..00000000
--- a/components/landing/side/footer/app-settings/service-provider/azure.tsx
+++ /dev/null
@@ -1,107 +0,0 @@
-import Link from 'next/link';
-
-import { useTranslations } from 'next-intl';
-
-import { FiClipboard } from 'react-icons/fi';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-import { Slider } from '@/components/ui/slider';
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
-import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-import { azureModelConfig } from '@/config/provider/azure.config';
-
-const AzureServiceProvider = ({
- azureAPIKey,
- azureAPIModel,
- azureAPIEndpoint,
- azureAPITemperature,
- azureAPIDeploymentName,
- setAzureAPIKey,
- setAzureAPIModel,
- setAzureAPIEndpoint,
- setAzureAPITemperature,
- setAzureAPIDeploymentName,
-}: {
- azureAPIKey: string;
- azureAPIModel: string;
- azureAPIEndpoint: string;
- azureAPITemperature: number;
- azureAPIDeploymentName: string;
- setAzureAPIKey: (azureAPIKey: string) => void;
- setAzureAPIModel: (azureAPIModel: string) => void;
- setAzureAPIEndpoint: (azureAPIEndpoint: string) => void;
- setAzureAPITemperature: (azureAPITemperature: number) => void;
- setAzureAPIDeploymentName: (azureAPIDeploymentName: string) => void;
-}) => {
- const t = useTranslations('');
-
- return (
- <>
-
-
- {t('Goodwill Reminders')}
-
- You need to provide the{' '}
-
- Azure API Key
- {' '}
- to use this service. Sign up for access{' '}
-
- here
-
- .
-
-
-
-
- GPT Model
- setAzureAPIModel(value as OpenAIModel)}>
-
-
-
-
- {azureModelConfig.map((model, index) => {
- return (
-
- {model.model}
-
- );
- })}
-
-
-
-
-
- API Key
- setAzureAPIKey(e.target.value)} />
-
-
- API Endpoint
- setAzureAPIEndpoint(e.target.value)} />
-
-
- API Deployment Name
- setAzureAPIDeploymentName(e.target.value)} />
-
-
- API Version
-
-
-
-
Temperature: {azureAPITemperature}
-
-
setAzureAPITemperature(e)} />
-
-
Stable
-
Standard
-
Creative
-
-
-
- >
- );
-};
-
-export default AzureServiceProvider;
diff --git a/components/landing/side/footer/app-settings/service-provider/claude.tsx b/components/landing/side/footer/app-settings/service-provider/claude.tsx
deleted file mode 100644
index eca9bc75..00000000
--- a/components/landing/side/footer/app-settings/service-provider/claude.tsx
+++ /dev/null
@@ -1,88 +0,0 @@
-import Link from 'next/link';
-
-import { useTranslations } from 'next-intl';
-
-import { FiClipboard } from 'react-icons/fi';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-
-import { Slider } from '@/components/ui/slider';
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
-import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-import { claudeModelConfig } from '@/config/provider/claude.config';
-
-const ClaudeServiceProvider = ({
- claudeAPIKey,
- claudeAPIModel,
- claudeAPITemperature,
- setClaudeAPIKey,
- setClaudeAPIModel,
- setClaudeAPITemperature,
-}: {
- claudeAPIKey: string;
- claudeAPIModel: string;
- claudeAPITemperature: number;
- setClaudeAPIKey: (claudeAPIKey: string) => void;
- setClaudeAPIModel: (claudeAPIModel: OpenAIModel) => void;
- setClaudeAPITemperature: (claudeAPITemperature: number) => void;
-}) => {
- const t = useTranslations('');
-
- return (
- <>
-
-
- {t('Goodwill Reminders')}
-
- You need to provide the{' '}
-
- Claude API Key
- {' '}
- to use this service. Sign up for waitlist{' '}
-
- here
-
- .
-
-
-
-
- API Model
- setClaudeAPIModel(value as OpenAIModel)}>
-
-
-
-
- {claudeModelConfig.map((model, index) => {
- return (
-
- {model.model}
-
- );
- })}
-
-
-
-
-
- API Key
- setClaudeAPIKey(e.target.value)} />
-
-
-
Temperature: {claudeAPITemperature}
-
-
setClaudeAPITemperature(e)} />
-
-
{t('Stable')}
-
{t('Standard')}
-
{t('Creative')}
-
-
-
- >
- );
-};
-
-export default ClaudeServiceProvider;
diff --git a/components/landing/side/footer/app-settings/service-provider/cohere.tsx b/components/landing/side/footer/app-settings/service-provider/cohere.tsx
deleted file mode 100644
index 6e6e3969..00000000
--- a/components/landing/side/footer/app-settings/service-provider/cohere.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import Link from 'next/link';
-
-import { useTranslations } from 'next-intl';
-
-import { FiClipboard } from 'react-icons/fi';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
-import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-import { cohereModelConfig } from '@/config/provider/cohere.config';
-
-const CohereServiceProvider = ({
- cohereAPIKey,
- cohereModel,
- setCohereAPIKey,
- setCohereModel,
-}: {
- cohereAPIKey: string;
- cohereModel: string;
- setCohereAPIKey: (cohereAPIKey: string) => void;
- setCohereModel: (cohereModel: string) => void;
-}) => {
- const t = useTranslations('');
-
- return (
- <>
-
-
- {t('Goodwill Reminders')}
-
- You need to provide the{' '}
-
- Cohere API Key
- {' '}
- to use this service.
-
-
-
- Model
- setCohereModel(value)}>
-
-
-
-
- {cohereModelConfig.map((model, index) => {
- return (
-
- {model.model}
-
- );
- })}
-
-
-
-
- API Key
- setCohereAPIKey(e.target.value)} />
-
- >
- );
-};
-
-export default CohereServiceProvider;
diff --git a/components/landing/side/footer/app-settings/service-provider/custom.tsx b/components/landing/side/footer/app-settings/service-provider/custom.tsx
deleted file mode 100644
index abdc7154..00000000
--- a/components/landing/side/footer/app-settings/service-provider/custom.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { useTranslations } from 'next-intl';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-
-const CustomServiceProvider = () => {
- const t = useTranslations('');
-
- return (
- <>
-
- API Key
-
-
-
- API Endpoint
-
-
- >
- );
-};
-
-export default CustomServiceProvider;
diff --git a/components/landing/side/footer/app-settings/service-provider/extension.tsx b/components/landing/side/footer/app-settings/service-provider/extension.tsx
deleted file mode 100644
index e440dbd2..00000000
--- a/components/landing/side/footer/app-settings/service-provider/extension.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { useTranslations } from 'next-intl';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-
-const ExtensionServiceProvider = () => {
- const t = useTranslations('');
-
- return (
- <>
-
- {t('Entry Point')}
-
-
- >
- );
-};
-
-export default ExtensionServiceProvider;
diff --git a/components/landing/side/footer/app-settings/service-provider/huggingface.tsx b/components/landing/side/footer/app-settings/service-provider/huggingface.tsx
deleted file mode 100644
index cd6d276a..00000000
--- a/components/landing/side/footer/app-settings/service-provider/huggingface.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-import Link from 'next/link';
-
-import { useTranslations } from 'next-intl';
-
-import { FiClipboard } from 'react-icons/fi';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
-import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-import { huggingFaceModelConfig } from '@/config/provider/huggingface.config';
-
-const HuggingFaceServiceProvider = ({
- accessToken,
- huggingFaceModel,
- setAccessToken,
- setHuggingFaceModel,
-}: {
- accessToken: string;
- huggingFaceModel: string;
- setAccessToken: (accessToken: string) => void;
- setHuggingFaceModel: (huggingFaceModel: string) => void;
-}) => {
- const t = useTranslations('');
-
- return (
- <>
-
-
- {t('Goodwill Reminders')}
-
- You need to provide the{' '}
-
- Hugging Face Access Token
- {' '}
- to use this service.
-
-
-
- Model
- setHuggingFaceModel(value)}>
-
-
-
-
- {huggingFaceModelConfig.map((model, index) => {
- return (
-
- {model.model}
-
- );
- })}
-
-
-
-
- Access Token
- setAccessToken(e.target.value)} />
-
- >
- );
-};
-
-export default HuggingFaceServiceProvider;
diff --git a/components/landing/side/footer/app-settings/service-provider/openai.tsx b/components/landing/side/footer/app-settings/service-provider/openai.tsx
deleted file mode 100644
index 2d3a9f96..00000000
--- a/components/landing/side/footer/app-settings/service-provider/openai.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-'use client';
-
-import { useEffect, useState } from 'react';
-
-import { useTranslations } from 'next-intl';
-
-import { User } from '@prisma/client';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-import { Switch } from '@/components/ui/switch';
-import { Slider } from '@/components/ui/slider';
-import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-import { openAIModelConfig } from '@/config/provider/openai.config';
-
-const OpenAIServiceProvider = ({
- apiKey,
- apiEndpoint,
- apiModel,
- apiTemperature,
- setApiKey,
- setApiEndpoint,
- setApiModel,
- setApiTemperature,
- user,
- useCloudSettings,
- setUseCloudSettings,
- azureAPIDeploymentName,
- setAzureAPIDeploymentName,
- isAzure,
- setIsAzure,
-}: {
- apiKey: string;
- apiEndpoint: string;
- apiModel: OpenAIModel;
- apiTemperature: number;
- setApiKey: (apiKey: string) => void;
- setApiEndpoint: (apiEndpoint: string) => void;
- setApiModel: (apiModel: OpenAIModel) => void;
- setApiTemperature: (apiTemperature: number) => void;
- user: User | null;
- useCloudSettings: boolean;
- setUseCloudSettings: (useCloudSettings: boolean) => void;
- azureAPIDeploymentName: string;
- setAzureAPIDeploymentName: (azureAPIDeploymentName: string) => void;
- isAzure: boolean;
- setIsAzure: (isAzure: boolean) => void;
-}) => {
- const t = useTranslations('');
-
- const [openaiProvider, setOpenaiProvider] = useState('OpenAI');
-
- useEffect(() => {
- if (openaiProvider === 'Azure') {
- setIsAzure(true);
- } else {
- setIsAzure(false);
- }
- }, [openaiProvider, setIsAzure]);
-
- if (user && useCloudSettings) {
- setApiKey(user?.openAIKey || '');
- setApiEndpoint('https://api.openai.com');
- }
-
- useEffect(() => {
- if (!user) {
- setUseCloudSettings(false);
- }
- }, [setUseCloudSettings, user]);
-
- return (
- <>
- {/*
- OpenAI Provider
- setOpenaiProvider(value as OpenAIProvider)}>
-
-
-
-
-
- Azure
-
-
- OpenAI
-
-
-
-
*/}
- {user && (
-
- {t('Use Cloud Settings')}
- setUseCloudSettings(!useCloudSettings)} />
-
- )}
-
-
- GPT Model
- setApiModel(value as OpenAIModel)}>
-
-
-
-
- {openAIModelConfig.map((model, index) => {
- return (
-
- {model.model}
-
- );
- })}
-
-
-
-
-
- API Key
- setApiKey(e.target.value)} />
-
-
- API Endpoint
- setApiEndpoint(e.target.value)} />
-
- {/* {isAzure && (
- <>
-
- API Deployment Name
- setAzureAPIDeploymentName(e.target.value)} />
-
-
- API Version
-
-
- >
- )} */}
-
-
Temperature: {apiTemperature}
-
-
setApiTemperature(e)} />
-
-
{t('Stable')}
-
{t('Standard')}
-
{t('Creative')}
-
-
-
- >
- );
-};
-
-export default OpenAIServiceProvider;
diff --git a/components/landing/side/footer/app-settings/service-provider/team.tsx b/components/landing/side/footer/app-settings/service-provider/team.tsx
deleted file mode 100644
index a8ff511f..00000000
--- a/components/landing/side/footer/app-settings/service-provider/team.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { useTranslations } from 'next-intl';
-
-import { FiClipboard } from 'react-icons/fi';
-
-import { Label } from '@/components/ui/label';
-import { Input } from '@/components/ui/input';
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
-
-const TeamServiceProvider = ({ accessCode, setAccessCode }: { accessCode: string; setAccessCode: (accessCode: string) => void }) => {
- const t = useTranslations('');
-
- return (
- <>
-
-
- {t('Goodwill Reminders')}
- This is a feature for teams. You can create a team in dashboard. However, this feature is only available for fully setup deployment.
-
-
- Team Access Code
- setAccessCode(e.target.value)} />
-
- >
- );
-};
-
-export default TeamServiceProvider;
diff --git a/components/landing/side/footer/app-settings/tab-provider.tsx b/components/landing/side/footer/app-settings/tab-provider.tsx
deleted file mode 100644
index 00026150..00000000
--- a/components/landing/side/footer/app-settings/tab-provider.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-const TabProvider = () => {
- return
;
-};
diff --git a/components/landing/side/footer/app-settings/tab-search.tsx b/components/landing/side/footer/app-settings/tab-search.tsx
deleted file mode 100644
index a2118d28..00000000
--- a/components/landing/side/footer/app-settings/tab-search.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-'use client';
-
-import { useTranslations } from 'next-intl';
-
-import { Input } from '@/components/ui/input';
-import { Label } from '@/components/ui/label';
-
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-const TabSearch = ({
- searchEngine,
- searchEngineID,
- searchAPIKey,
- setSearchEngine,
- setSearchEngineID,
- setSearchAPIKey,
-}: {
- searchEngine: string;
- searchEngineID: string;
- searchAPIKey: string;
- setSearchEngine: (searchEngine: string) => void;
- setSearchEngineID: (searchEngineID: string) => void;
- setSearchAPIKey: (searchAPIKey: string) => void;
-}) => {
- const t = useTranslations('');
-
- return (
-
-
- {t('Search Engine')}
- setSearchEngine(value)}>
-
-
-
-
- {searchEnginesList.map((engine) => {
- return (
-
- {engine.name}
-
- );
- })}
-
-
-
-
- Search Engine ID
- setSearchEngineID(e.target.value)} />
-
-
- Search API Key
- setSearchAPIKey(e.target.value)} />
-
-
- );
-};
-
-export default TabSearch;
-
-const searchEnginesList = [
- {
- name: 'Programmable Search Engine (By Google)',
- value: 'pse',
- },
-];
diff --git a/components/landing/side/footer/app-settings/tab-tts.tsx b/components/landing/side/footer/app-settings/tab-tts.tsx
deleted file mode 100644
index 70cead89..00000000
--- a/components/landing/side/footer/app-settings/tab-tts.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-import { useTranslations } from 'next-intl';
-
-import { Input } from '@/components/ui/input';
-import { Label } from '@/components/ui/label';
-import { Button } from '@/components/ui/button';
-import { Slider } from '@/components/ui/slider';
-import { Separator } from '@/components/ui/separator';
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
-
-const TabTTS = ({
- synth,
- voices,
- ttsVoice,
- ttsSpeed,
- ttsPitch,
- ttsSample,
- isSpeaking,
- setTTSVoice,
- setTTSSpeed,
- setTTSPitch,
- setTTSSample,
- setIsSpeaking,
-}: {
- synth: SpeechSynthesis | null;
- voices: SpeechSynthesisVoice[] | null;
-
- ttsVoice: string;
- ttsSpeed: number;
- ttsPitch: number;
- ttsSample: string;
- isSpeaking: boolean;
- setTTSVoice: (ttsVoice: string) => void;
- setTTSSpeed: (ttsSpeed: number) => void;
- setTTSPitch: (ttsPitch: number) => void;
- setTTSSample: (ttsSample: string) => void;
- setIsSpeaking: (isSpeaking: boolean) => void;
-}) => {
- const t = useTranslations('');
-
- return voices && voices.length > 0 ? (
-
-
- {t('Voice')}
- setTTSVoice(value)}>
-
-
-
-
- {voices.map((voice) => {
- return (
-
- {voice.name} ({voice.lang})
-
- );
- })}
-
-
-
-
-
- {t('Speaking Speed')}: {ttsSpeed}
-
- setTTSSpeed(value)} />
-
-
-
-
{t('Sample')}
-
setTTSSample(e.target.value)} />
-
- {
- setIsSpeaking(true);
- const utterance = new SpeechSynthesisUtterance(ttsSample);
- utterance.voice = voices.find((voice) => voice.name === ttsVoice) || null;
- utterance.rate = ttsSpeed;
- utterance.pitch = ttsPitch;
- synth && synth.speak(utterance);
- utterance.onend = () => setIsSpeaking(false);
- }}
- disabled={isSpeaking}
- className='inline-flex items-center justify-center space-x-2'
- >
- {t('Speak')}
-
-
-
-
- ) : (
-
-
{t('Text to Speech is not supported in your browser')}
-
- );
-};
-
-export default TabTTS;
diff --git a/components/landing/side/footer/index.tsx b/components/landing/side/footer/index.tsx
deleted file mode 100644
index 3805a8e2..00000000
--- a/components/landing/side/footer/index.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-'use client';
-
-import { User } from '@prisma/client';
-
-import SideAppSettings from '@/components/landing/side/footer/app-settings';
-import UserLogin from '@/components/landing/side/footer/user-login';
-import AppInfo from '@/components/landing/side/footer/app-info';
-import UserDropdown from '@/components/landing/side/footer/user-dropdown';
-import MoreDropdown from '@/components/landing/side/footer/more-dropdown';
-
-const SideFooter = ({ user }: { user: User | null }) => {
- return (
-
- );
-};
-
-export default SideFooter;
diff --git a/components/landing/side/footer/more-dropdown.tsx b/components/landing/side/footer/more-dropdown.tsx
deleted file mode 100644
index 5fe1a3c2..00000000
--- a/components/landing/side/footer/more-dropdown.tsx
+++ /dev/null
@@ -1,149 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-
-import { useRouter, useParams } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { useTheme } from 'next-themes';
-
-import { IoLanguage } from 'react-icons/io5';
-import { FiMoreHorizontal } from 'react-icons/fi';
-import { TbContrast, TbMoonFilled, TbSunFilled } from 'react-icons/tb';
-
-import {
- DropdownMenu,
- DropdownMenuTrigger,
- DropdownMenuContent,
- DropdownMenuRadioItem,
- DropdownMenuSeparator,
- DropdownMenuPortal,
- DropdownMenuSub,
- DropdownMenuSubContent,
- DropdownMenuSubTrigger,
- DropdownMenuRadioGroup,
-} from '@/components/ui/dropdown-menu';
-
-const MoreDropdown = () => {
- const router = useRouter();
-
- const params = useParams();
-
- const i18Language = params?.locale as string;
-
- const [language, setLanguage] = useState(i18Language);
-
- const { theme, setTheme } = useTheme();
-
- const t = useTranslations('');
-
- return (
-
-
-
-
-
-
-
-
-
-
- {t('Theme')}
-
-
-
-
- {themeList.map((theme, index) => (
-
- {theme.icon}
- {t(theme.name)}
-
- ))}
-
-
-
-
-
-
-
-
- {t('Language')}
-
-
-
-
- {languageList
- .sort((a, b) => (a.value > b.value ? 1 : -1))
- .map((language, index) => (
- router.push('/' + language.value)}>
- {language.name}
-
- ))}
-
-
-
-
-
-
- );
-};
-
-export default MoreDropdown;
-
-const themeList = [
- {
- name: 'Light',
- value: 'light',
- icon: ,
- },
- {
- name: 'Dark',
- value: 'dark',
- icon: ,
- },
- {
- name: 'System',
- value: 'system',
- icon: ,
- },
-];
-
-const languageList = [
- {
- value: 'zh-CN',
- name: '🇨🇳 简体中文',
- },
- {
- value: 'zh-HK',
- name: '🇭🇰 繁体中文',
- },
- {
- value: 'en',
- name: '🇺🇸 English',
- },
- {
- value: 'ja',
- name: '🇯🇵 日本語',
- },
- {
- value: 'ko',
- name: '🇰🇷 한국어',
- },
- {
- value: 'ru',
- name: '🇷🇺 Русский',
- },
- {
- value: 'de',
- name: '🇩🇪 Deutsch',
- },
- {
- value: 'fr',
- name: '🇫🇷 Français',
- },
- {
- value: 'es',
- name: '🇪🇸 Español',
- },
-];
diff --git a/components/landing/side/footer/user-dropdown.tsx b/components/landing/side/footer/user-dropdown.tsx
deleted file mode 100644
index ff68991b..00000000
--- a/components/landing/side/footer/user-dropdown.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-'use client';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { signOut } from 'next-auth/react';
-
-import { User } from '@prisma/client';
-
-import { RxAvatar } from 'react-icons/rx';
-
-import { Avatar, AvatarImage } from '@/components/ui/avatar';
-import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from '@/components/ui/dropdown-menu';
-
-const UserDropdown = ({ user }: { user: User }) => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- return (
-
-
-
-
{user?.image ? : }
-
{user.name}
-
-
-
-
-
{user?.name}
-
{user?.email}
-
-
- router.push('/dashboard/profile/info')}>{t('Profile')}
- router.push('/dashboard/team/info')}>{t('Team')}
-
-
- signOut({
- callbackUrl: '/',
- })
- }
- >
- {t('Sign Out')}
-
-
-
- );
-};
-
-export default UserDropdown;
diff --git a/components/landing/side/footer/user-login.tsx b/components/landing/side/footer/user-login.tsx
deleted file mode 100644
index b458e0a6..00000000
--- a/components/landing/side/footer/user-login.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-'use client';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { FiUser } from 'react-icons/fi';
-import { IoLogInOutline } from 'react-icons/io5';
-
-import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '@/components/ui/dropdown-menu';
-
-const UserLogin = () => {
- const t = useTranslations('');
-
- const router = useRouter();
-
- return (
-
-
-
-
-
-
-
- router.push('/login')} className='cursor-pointer space-x-1'>
-
- {t('Login')}
-
-
-
- );
-};
-
-export default UserLogin;
diff --git a/components/landing/side/header.tsx b/components/landing/side/header.tsx
deleted file mode 100644
index 587113df..00000000
--- a/components/landing/side/header.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import Image from 'next/image';
-
-import { useTranslations } from 'next-intl';
-
-import { siteConfig } from '@/config/site.config';
-
-const SideHeader = () => {
- const t = useTranslations('');
-
- return (
-
-
-
-
{siteConfig.title}
-
{t(siteConfig.description)}
-
-
- );
-};
-
-export default SideHeader;
diff --git a/components/landing/side/history.tsx b/components/landing/side/history.tsx
deleted file mode 100644
index 86fe5739..00000000
--- a/components/landing/side/history.tsx
+++ /dev/null
@@ -1,249 +0,0 @@
-'use client';
-
-import { useEffect, useState } from 'react';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { toast } from 'react-hot-toast';
-
-import { TiPinOutline, TiDeleteOutline, TiBrush } from 'react-icons/ti';
-
-import { Input } from '@/components/ui/input';
-import { Button } from '@/components/ui/button';
-import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
-
-const SideHistory = () => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const [userInput, setUserInput] = useState('');
-
- const [histories, setHistories] = useState([]);
- const [pinHistories, setPinHistories] = useState([]);
-
- useEffect(() => {
- const updateHistories = () => {
- const conversationKeys = Object.keys(localStorage).filter((key) => key.startsWith('histories-'));
-
- const conversationValues = conversationKeys.map((key) => {
- const chatValue = localStorage.getItem(key);
- return JSON.parse(chatValue || '{}');
- });
-
- setHistories(conversationValues);
- };
-
- updateHistories();
-
- window.addEventListener('localStorageUpdated', updateHistories);
-
- return () => {
- window.removeEventListener('localStorageUpdated', updateHistories);
- };
- }, []);
-
- const onHistoryPin = (id: string) => {
- setPinHistories((prev) => [...prev, histories?.find((history) => history.id == id) as HistoryProps]);
- };
-
- const onHistoryUnpin = (id: string) => {
- setPinHistories((prev) => prev.filter((history) => history.id != id));
- };
-
- const [newTitle, setNewTitle] = useState(null);
- const [titleDialogOpen, setTitleDialogOpen] = useState(false);
-
- const onSaveTitleChange = (id: string, type: string, title: string) => {
- if (newTitle !== title) {
- const history = localStorage.getItem(`histories-${type}-${id}`);
-
- if (history) {
- const historyObj = JSON.parse(history);
- historyObj.title = newTitle;
- localStorage.setItem(`histories-${type}-${id}`, JSON.stringify(historyObj));
- toast.success(t('Title changed'));
-
- const updateEvent = new CustomEvent('localStorageUpdated');
- window.dispatchEvent(updateEvent);
- }
-
- setTitleDialogOpen(false);
- setNewTitle(null);
- }
- };
-
- const onHistoryDelete = (id: string, type: string) => {
- localStorage.removeItem(`histories-${type}-${id}`);
- toast.success(t('History deleted'));
-
- const updateEvent = new CustomEvent('localStorageUpdated');
- window.dispatchEvent(updateEvent);
- };
-
- const onShareClick = async (type: string, id: string) => {
- const story = localStorage.getItem(`histories-${type}-${id}`) as string;
-
- if (!story) {
- toast.error(t('Error: Conversation not found'));
- return;
- }
-
- const response = await fetch(`/api/share`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- story,
- }),
- });
-
- if (!response.ok) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- const data = await response.json();
-
- if (!data.success) {
- toast.error(t('Error: Something went wrong'));
- return;
- }
-
- if (data.type == 'update') {
- navigator.clipboard.writeText(window.location.host + `/s/${id}`);
- toast.success(`${t('Updated the previous share:')} ${id}`);
- return;
- }
-
- navigator.clipboard.writeText(window.location.host + `/s/${id}`);
- toast.success(`${t('Copied share link:')} ${id}`);
- };
-
- const searchedHistories =
- userInput !== ''
- ? histories.filter((history) => history.title.toLowerCase().includes(userInput.toLowerCase())).sort((a, b) => b.timestamp - a.timestamp)
- : histories.filter((history) => !pinHistories.some((pinHistory) => pinHistory.id === history.id)).sort((a, b) => b.timestamp - a.timestamp);
-
- return (
-
-
{
- setUserInput(e.target.value);
- }}
- className='bg-neutral-100 dark:bg-neutral-700'
- />
-
- {pinHistories.map((pinHistory) => {
- return (
-
-
-
onHistoryUnpin(pinHistory.id)}>
-
-
- {pinHistory.type == 'chat' ? (
-
router.push(`/mode/${pinHistory.type}?history=${pinHistory.id}`)}>
- {pinHistory.title}
-
- ) : (
-
- )}
-
-
-
onShareClick(pinHistory.type, pinHistory.id)}>
- {pinHistory.type}
-
-
-
-
-
-
-
-
-
- Edit Title
-
-
- setNewTitle(e.target.value)} />
-
-
- onSaveTitleChange(pinHistory.id, pinHistory.type, pinHistory.title)}>
- Save
-
-
-
-
-
onHistoryDelete(pinHistory.id, pinHistory.type)}>
-
-
-
-
- );
- })}
- {searchedHistories.map((history) => {
- return (
-
-
-
onHistoryPin(history.id)}>
-
-
- {history.type == 'chat' ? (
-
router.push(`/mode/${history.type}?history=${history.id}`)}>
- {history.title}
-
- ) : (
-
- )}
-
-
-
onShareClick(history.type, history.id)}>
- {history.type}
-
-
-
-
-
-
-
-
-
- Edit Title
-
-
- setNewTitle(e.target.value)} />
-
-
- onSaveTitleChange(history.id, history.type, history.title)}>
- Save
-
-
-
-
-
onHistoryDelete(history.id, history.type)}>
-
-
-
-
- );
- })}
-
-
- );
-};
-
-export default SideHistory;
diff --git a/components/landing/side/index.tsx b/components/landing/side/index.tsx
deleted file mode 100644
index 1b7df7d0..00000000
--- a/components/landing/side/index.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-'use client';
-
-import { User } from '@prisma/client';
-
-import store from '@/hooks/store';
-import { useAtom } from 'jotai';
-
-import SideHistory from '@/components/landing/side/history';
-
-import SideFooter from '@/components/landing/side/footer';
-import SideHeader from '@/components/landing/side/header';
-import NewConversationButton from '@/components/landing/side/new-conversation-button';
-
-const LandingSide = ({ className, user }: { className?: string; user: User | null }) => {
- const isHiddenSide = useAtom(store.isHiddenSideAtom)[0];
-
- if (isHiddenSide) return null;
-
- return (
-
- );
-};
-
-export default LandingSide;
diff --git a/components/landing/side/new-conversation-button.tsx b/components/landing/side/new-conversation-button.tsx
deleted file mode 100644
index acc5aead..00000000
--- a/components/landing/side/new-conversation-button.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-'use client';
-
-import { useTranslations } from 'next-intl';
-
-import { HiChatBubbleLeft } from 'react-icons/hi2';
-
-const NewConversationButton = () => {
- const t = useTranslations('');
-
- return (
-
- (location.href = '/')}
- >
-
- {t('New Conversation')}
-
-
- );
-};
-
-export default NewConversationButton;
diff --git a/components/layout/add-button.tsx b/components/layout/add-button.tsx
new file mode 100644
index 00000000..4566a33b
--- /dev/null
+++ b/components/layout/add-button.tsx
@@ -0,0 +1,59 @@
+'use client';
+
+import { IoMdAdd } from 'react-icons/io';
+import { IoSearch } from 'react-icons/io5';
+import { RiChat1Line } from 'react-icons/ri';
+import Tippy from '@tippyjs/react';
+import { usePathname, useRouter } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+
+import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/custom/dropdown-menu';
+
+export const AddButton = () => {
+ const router = useRouter();
+
+ const t = useTranslations();
+
+ const pathname = usePathname();
+
+ return (
+
+
+
+
+
+ {pathname === '/' ? t('chat') : t('search')}
+
+
+
+
+ {
+ if (pathname === '/') {
+ router.refresh();
+ } else {
+ router.push('/');
+ }
+ }}
+ className='flex cursor-pointer items-center justify-between'
+ >
+ {t('chat')}
+
+
+ {
+ if (pathname === '/search') {
+ router.refresh();
+ } else {
+ router.push('/search');
+ }
+ }}
+ className='flex cursor-pointer items-center justify-between'
+ >
+ {t('search')}
+
+
+
+
+ );
+};
diff --git a/components/layout/brand.tsx b/components/layout/brand.tsx
new file mode 100644
index 00000000..14495c8b
--- /dev/null
+++ b/components/layout/brand.tsx
@@ -0,0 +1,14 @@
+import Link from 'next/link';
+
+import { VersionBadge } from '@/components/layout/version-badge';
+
+export const Brand = () => {
+ return (
+
+
+ Chat Chat
+
+
+
+ );
+};
diff --git a/components/layout/chat/conversation-window.tsx b/components/layout/chat/conversation-window.tsx
new file mode 100644
index 00000000..0b63de88
--- /dev/null
+++ b/components/layout/chat/conversation-window.tsx
@@ -0,0 +1,62 @@
+import { LuClipboardCopy, LuLoader2 } from 'react-icons/lu';
+import { Message } from 'ai';
+import { useTranslations } from 'next-intl';
+import { toast } from 'sonner';
+
+import { renderMarkdownMessage } from '@/components/layout/message';
+import { UserAvatar } from '@/components/layout/user-avatar';
+
+export const ConversationWindow = ({
+ messages,
+ isLoading,
+}: Readonly<{
+ messages: Message[];
+ isLoading: boolean;
+}>) => {
+ const t = useTranslations();
+
+ const onCopy = (context: string) => {
+ navigator.clipboard.writeText(context);
+
+ toast.success(t('copied'), {
+ position: 'top-right',
+ });
+ };
+
+ return (
+
+ {messages.map((m) => (
+
+ {m.role == 'user' ? (
+
+ ) : (
+
+
{renderMarkdownMessage(m.content)}
+ {!isLoading && (
+
+ onCopy(m.content)}
+ className='inline-flex items-center space-x-1 rounded-md px-0.5 transition duration-300 ease-in-out hover:bg-neutral-400/30'
+ >
+
+ {t('copy')}
+
+ {/*
+
+ {t('resend')}
+ */}
+
+ )}
+
+ )}
+
+ ))}
+ {isLoading &&
}
+
+ );
+};
diff --git a/components/layout/chat/input-box.tsx b/components/layout/chat/input-box.tsx
new file mode 100644
index 00000000..239a27ab
--- /dev/null
+++ b/components/layout/chat/input-box.tsx
@@ -0,0 +1,91 @@
+'use client';
+
+import { FaStop } from 'react-icons/fa';
+import { FaArrowUp } from 'react-icons/fa6';
+import Tippy from '@tippyjs/react';
+import { useAtom } from 'jotai';
+import { useRouter } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+
+import { Textarea } from '@/components/ui/textarea';
+import store from '@/hooks/store';
+
+export const InputBox = ({
+ input,
+ inputRef,
+ loading,
+ handleInput,
+ handleSubmit,
+ handleStop,
+}: Readonly<{
+ input: string;
+ inputRef: React.RefObject;
+ loading: boolean;
+ handleInput: (e: React.ChangeEvent) => void;
+ handleSubmit: (e: React.FormEvent) => void;
+ handleStop: (e: React.FormEvent) => void;
+}>) => {
+ const router = useRouter();
+
+ const t = useTranslations();
+
+ const [preferences] = useAtom(store.preferencesAtom);
+ const [conversationSettings] = useAtom(store.conversationSettingsAtom);
+
+ const [currentUseModel] = useAtom(store.currentUseModelAtom);
+
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ if (preferences.enterSend) {
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ handleSubmit(e as unknown as React.FormEvent);
+ }
+ } else if (e.key === 'Enter' && e.shiftKey) {
+ e.preventDefault();
+ handleSubmit(e as unknown as React.FormEvent);
+ }
+ };
+
+ return (
+
+ );
+};
diff --git a/components/layout/history-list.tsx b/components/layout/history-list.tsx
new file mode 100644
index 00000000..3d5caa2d
--- /dev/null
+++ b/components/layout/history-list.tsx
@@ -0,0 +1,85 @@
+import { useState } from 'react';
+import { HiDotsHorizontal } from 'react-icons/hi';
+import { PiChatTeardropBold } from 'react-icons/pi';
+import { useRouter } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+
+import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/custom/dropdown-menu';
+import { Conversation } from '@/types/conversation';
+
+export const HistoryList = ({ conversations, setConversations }: { conversations: Conversation[] | null; setConversations: (conversations: Conversation[]) => void }) => {
+ const router = useRouter();
+
+ const t = useTranslations();
+
+ const [isDropdownOpen, setIsDropdownOpen] = useState(false);
+
+ const deleteConversation = (id: string) => {
+ const conversations = localStorage.getItem('conversations');
+
+ if (conversations) {
+ const parsedConversations = JSON.parse(conversations);
+
+ const updatedConversations = parsedConversations.filter((conversation: Conversation) => conversation.id !== id);
+
+ setConversations(updatedConversations);
+ }
+ };
+
+ return (
+
+ {conversations
+ ?.filter((conversation: Conversation) => conversation.conversation.length > 0)
+ .toSorted((a, b) => {
+ return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
+ })
+ .map((conversation: Conversation) => (
+
+
{
+ router.push(`?chat=${conversation.id}`);
+ }}
+ className='flex w-full items-center justify-start space-x-1 transition duration-300 ease-in-out hover:underline'
+ >
+
+ {conversation.conversation[0].content}
+
+
+
+
+ {new Date(conversation.createdAt).toLocaleString('en-US', {
+ month: 'short',
+ day: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ hour12: false,
+ })}
+
+
{conversation.conversation.length}
+
+
+
+
+
+
+ {
+ e.stopPropagation();
+ deleteConversation(conversation.id);
+ setIsDropdownOpen(false);
+ }}
+ className='text-red-500'
+ >
+ {t('delete')}
+
+
+
+
+
+ ))}
+
+ );
+};
diff --git a/components/layout/language-dropdown.tsx b/components/layout/language-dropdown.tsx
new file mode 100644
index 00000000..9743687c
--- /dev/null
+++ b/components/layout/language-dropdown.tsx
@@ -0,0 +1,41 @@
+'use client';
+
+import { IoLanguage } from 'react-icons/io5';
+import { usePathname, useRouter } from 'next/navigation';
+import { useLocale } from 'next-intl';
+
+import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from '@/components/ui/custom/dropdown-menu';
+import { LanguageList } from '@/config/i18n';
+
+export const LanguageDropdown = () => {
+ const locale = useLocale();
+
+ const router = useRouter();
+
+ const pathname = usePathname();
+
+ return (
+
+
+
+ {LanguageList.find((l) => l.id === locale)?.flag}
+
+
+ {
+ router.push('/' + value + pathname);
+ }}
+ >
+ {LanguageList.map((lang) => {
+ return (
+
+ {lang.flag + ' ' + lang.name}
+
+ );
+ })}
+
+
+
+ );
+};
diff --git a/components/layout/lightbox.tsx b/components/layout/lightbox.tsx
new file mode 100644
index 00000000..b0295e19
--- /dev/null
+++ b/components/layout/lightbox.tsx
@@ -0,0 +1,24 @@
+'use client';
+
+import Lightbox from 'react-spring-lightbox';
+import { ImagesList } from 'react-spring-lightbox/dist/types/ImagesList';
+
+export const LightBox = ({
+ images,
+ open,
+ setOpen,
+ currentIndex,
+ setCurrentIndex,
+}: {
+ images: ImagesList;
+ open: boolean;
+ setOpen: (open: boolean) => void;
+ currentIndex: number;
+ setCurrentIndex: (index: number) => void;
+}) => {
+ const gotoPrevious = () => currentIndex > 0 && setCurrentIndex(currentIndex - 1);
+
+ const gotoNext = () => currentIndex + 1 < images.length && setCurrentIndex(currentIndex + 1);
+
+ return setOpen(false)} />;
+};
diff --git a/components/layout/message.tsx b/components/layout/message.tsx
new file mode 100644
index 00000000..5a6ac0ec
--- /dev/null
+++ b/components/layout/message.tsx
@@ -0,0 +1,117 @@
+'use client';
+
+import { FaDownload } from 'react-icons/fa6';
+import ReactMarkdown from 'react-markdown';
+import Link from 'next/link';
+import rehypeKatex from 'rehype-katex';
+import remarkGfm from 'remark-gfm';
+import remarkMath from 'remark-math';
+
+import 'katex/dist/katex.min.css';
+
+export const renderMarkdownMessage = (content: string, hightlight?: string, setHightLight?: (value: string) => void) => {
+ return (
+ (
+
+ {children}
+
+ ),
+ h1: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ h2: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ h3: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ h4: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ h5: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ h6: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ ul: ({ children, ...props }: any) => (
+
+ ),
+ ol: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ li: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ blockquote: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ button: ({ children, ...props }: any) => (
+ setHightLight && setHightLight(encodeURIComponent(props.href))}
+ onMouseLeave={() => setHightLight && setHightLight('')}
+ >
+ {children}
+
+ ),
+ code: ({ children, ...props }: any) => (
+
+ {children}
+
+ ),
+ img: ({ children, ...props }: any) => (
+
+
+
{
+ const link = document.createElement('a');
+ link.target = '_blank';
+ link.href = props.src;
+ link.download = props.src;
+ link.click();
+ }}
+ >
+
+
+
+ ),
+ }}
+ >
+ {content}
+
+ );
+};
+
+export const RenderSimpleMessage = ({ content }: { content: string }) => {
+ return {content}
;
+};
diff --git a/components/layout/model-select.tsx b/components/layout/model-select.tsx
new file mode 100644
index 00000000..07392297
--- /dev/null
+++ b/components/layout/model-select.tsx
@@ -0,0 +1,305 @@
+import { IoChevronDown } from 'react-icons/io5';
+import { useAtom } from 'jotai';
+import Image from 'next/image';
+import Link from 'next/link';
+import { usePathname } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuRadioGroup,
+ DropdownMenuRadioItem,
+ DropdownMenuSeparator,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuTrigger,
+} from '@/components/ui/custom/dropdown-menu';
+import { Provider } from '@/config/provider';
+// import { model as AmazonModel } from '@/config/provider/amazon';
+import { model as AnthropicModel } from '@/config/provider/anthropic';
+// import { model as AzureOpenAIModel } from '@/config/provider/azure';
+import { model as CohereModel } from '@/config/provider/cohere';
+import { model as FireworksModel } from '@/config/provider/fireworks';
+import { model as GoogleModel } from '@/config/provider/google';
+import { model as GroqModel } from '@/config/provider/groq';
+import { model as HuggingFaceModel } from '@/config/provider/huggingface';
+import { model as MistralModel } from '@/config/provider/mistral';
+import { model as OpenAIModel } from '@/config/provider/openai';
+import { model as PerplexityModel } from '@/config/provider/perplexity';
+import store from '@/hooks/store';
+import { Model, SimpleModel } from '@/types/model';
+import { ProviderSetting } from '@/types/settings';
+
+export const ModelSelect = () => {
+ const t = useTranslations();
+
+ const [currentUseModel, setCurrentUseModel] = useAtom(store.currentUseModelAtom);
+
+ const [recentUsedModels, setRecentUsedModels] = useAtom(store.recentUsedModelsAtom);
+
+ const [currentProviderSettings] = useAtom(store.currentProviderSettingsAtom);
+
+ const customProviderModel = useAtom(store.customProviderModelAtom);
+
+ const handleModelChange = (newModel: SimpleModel) => {
+ setCurrentUseModel(newModel);
+ setRecentUsedModels((prevModels) => {
+ if (!prevModels) return [newModel];
+ const newModels = prevModels.filter((model) => model.model_id !== newModel.model_id);
+ return [newModel, ...newModels].slice(0, 5);
+ });
+ };
+
+ return (
+
+
+
+ {currentUseModel.model_name}
+
+
+
+ {recentUsedModels && recentUsedModels.length > 0 && (
+ <>
+ {t('recent_used')}
+ {recentUsedModels.slice(0, 3).map((model) => (
+ handleModelChange(model)} className='flex cursor-pointer items-center space-x-2'>
+
+ {model.model_name}
+
+ ))}
+
+ >
+ )}
+ {t('more_providers')}
+ {/* */}
+
+ {/* */}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const ModelSelector = ({
+ label,
+ models,
+ recentUsedModel,
+ setCurrentUseModel,
+ currentProviderSettings,
+ allowSearch = false,
+ configured,
+}: {
+ label: Provider;
+ models: Model[] | null;
+ recentUsedModel: SimpleModel;
+ setCurrentUseModel: (value: SimpleModel) => void;
+ currentProviderSettings: ProviderSetting | null;
+ allowSearch?: boolean;
+ configured: boolean;
+}) => {
+ const t = useTranslations();
+
+ const pathname = usePathname();
+
+ const hasKeyStored = configured;
+
+ const isProviderConfigured = (currentProviderSettings && currentProviderSettings[label] && currentProviderSettings[label] !== null) || hasKeyStored;
+
+ return (
+
+
+
+
+
+ {!isProviderConfigured ? (
+ <>
+
+ {t('provider_not_configured')}
+
+
+
+ {t('go_to_settings')}
+
+
+
+ >
+ ) : (
+ hasKeyStored && (
+ <>
+
+ {t('provider_configured_globally')}
+
+
+ >
+ )
+ )}
+ {
+ const selectedModel = models?.find((model) => model.name === value);
+ if (selectedModel) {
+ setCurrentUseModel({ provider: label, model_id: selectedModel.id, model_name: selectedModel.name });
+ }
+ }}
+ >
+ {models?.map(({ id, name, vision }) => (
+
+ {name}
+ {vision && 👀 }
+
+ ))}
+
+
+
+ );
+};
+
+const CustomModelSelector = ({
+ label,
+ recentUsedModel,
+ setCurrentUseModel,
+ currentProviderSettings,
+}: {
+ label: Provider;
+ recentUsedModel: SimpleModel;
+ setCurrentUseModel: (value: SimpleModel) => void;
+ currentProviderSettings: ProviderSetting | null;
+}) => {
+ const t = useTranslations();
+
+ const isCustomConfigured = currentProviderSettings && currentProviderSettings['Custom'] && currentProviderSettings['Custom'] !== null;
+
+ return (
+
+
+
+
+
+
+ {!isCustomConfigured ? t('provider_not_configured') : t('add_mode_custom_provider')}
+
+
+
+ {t('go_to_settings')}
+
+
+
+ {
+ if (value === null) return;
+
+ setCurrentUseModel({ provider: JSON.parse(value).basedProvider as Provider, model_id: JSON.parse(value).model, model_name: JSON.parse(value).model });
+ }}
+ >
+ {currentProviderSettings?.Custom?.map((custom, index) => (
+
+ {custom.model}
+
+ ))}
+
+
+
+ );
+};
diff --git a/components/layout/search-select.tsx b/components/layout/search-select.tsx
new file mode 100644
index 00000000..ce2ac4ff
--- /dev/null
+++ b/components/layout/search-select.tsx
@@ -0,0 +1,77 @@
+import { IoChevronDown } from 'react-icons/io5';
+import { useAtom } from 'jotai';
+import Image from 'next/image';
+import Link from 'next/link';
+import { useTranslations } from 'next-intl';
+
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuRadioGroup,
+ DropdownMenuRadioItem,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from '@/components/ui/custom/dropdown-menu';
+import { SearchEngine } from '@/config/search';
+import store from '@/hooks/store';
+import { SearchEngineSetting } from '@/types/search';
+
+export const SearchSelect = () => {
+ const t = useTranslations();
+
+ const [currentSearchEngine, setCurrentSearchEngine] = useAtom(store.currentSearchEngineAtom);
+ const [currentSearchEngineSettings] = useAtom(store.currentSearchEngineSettingsAtom);
+
+ const hasKeyStored = process.env['NEXT_PUBLIC_ACCESS_TAVILY_SEARCH'] == 'true';
+
+ const isTavilyConfigured = (currentSearchEngineSettings && currentSearchEngineSettings.Tavily !== null) || hasKeyStored;
+
+ return (
+
+
+
+ {currentSearchEngine}
+
+
+
+ {
+ setCurrentSearchEngine(value === 'Tavily' ? SearchEngine.Tavily : SearchEngine.Google);
+ }}
+ >
+ {!isTavilyConfigured ? (
+ <>
+
+ {t('search_engine_not_configured')}
+
+
+
+ {t('go_to_settings')}
+
+
+
+ >
+ ) : (
+ hasKeyStored && (
+ <>
+
+ {t('search_engine_configured_globally')}
+
+
+ >
+ )
+ )}
+
+
+
+
+
+
+ );
+};
diff --git a/components/layout/search/block/additions.tsx b/components/layout/search/block/additions.tsx
new file mode 100644
index 00000000..33a9ba50
--- /dev/null
+++ b/components/layout/search/block/additions.tsx
@@ -0,0 +1,32 @@
+'use client';
+
+import { LuCheckCheck } from 'react-icons/lu';
+import { useTranslations } from 'next-intl';
+
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+
+export const Additions = ({
+ content,
+ input,
+}: Readonly<{
+ content: {
+ [key: string]: boolean;
+ };
+ input: string;
+}>) => {
+ const t = useTranslations();
+
+ let options: string[] = Object.entries(content).reduce((acc: string[], [option, checked]) => {
+ if (checked) acc.push(option);
+ return acc;
+ }, []);
+
+ const additions = options.join(', ');
+
+ return (
+
+
+ {
{t('focus_on') + ': ' + input + t('and') + ' ' + additions}
}
+
+ );
+};
diff --git a/components/layout/search/block/answer.tsx b/components/layout/search/block/answer.tsx
new file mode 100644
index 00000000..94a61449
--- /dev/null
+++ b/components/layout/search/block/answer.tsx
@@ -0,0 +1,31 @@
+'use client';
+
+import { AiOutlineSolution } from 'react-icons/ai';
+import { StreamableValue, useStreamableValue } from 'ai/rsc';
+import { useAtom } from 'jotai';
+import { useTranslations } from 'next-intl';
+
+import { renderMarkdownMessage } from '@/components/layout/message';
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+import store from '@/hooks/store';
+
+export const Answer = ({
+ content,
+}: Readonly<{
+ content: string | StreamableValue;
+}>) => {
+ const t = useTranslations();
+
+ const [data, error, pending] = useStreamableValue(content);
+
+ const [sameCitationId, setSameCitationId] = useAtom(store.sameCitationAtom);
+
+ if (error) return {t('error')}
;
+
+ return (
+
+
+
{renderMarkdownMessage(data ?? '', sameCitationId, (value) => setSameCitationId(value))}
+
+ );
+};
diff --git a/components/layout/search/block/ask-follow-up-question.tsx b/components/layout/search/block/ask-follow-up-question.tsx
new file mode 100644
index 00000000..28a77c8a
--- /dev/null
+++ b/components/layout/search/block/ask-follow-up-question.tsx
@@ -0,0 +1,54 @@
+'use client';
+
+import { useRef, useState } from 'react';
+import { LiaReadme } from 'react-icons/lia';
+import { useActions, useUIState } from 'ai/rsc';
+import { useAtom } from 'jotai';
+import { useTranslations } from 'next-intl';
+
+import type { AI } from '@/app/[locale]/(home)/action';
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+import { Question } from '@/components/layout/search/block/question';
+import { InputBox } from '@/components/layout/search/input-box';
+import store from '@/hooks/store';
+
+export const AskFollowUpQuestion = () => {
+ const t = useTranslations();
+
+ const { search } = useActions();
+
+ const [isProSearch] = useAtom(store.isProSearchAtom);
+ const [currentUseModel] = useAtom(store.currentUseModelAtom);
+ const [currentProviderSettings] = useAtom(store.currentProviderSettingsAtom);
+ const [currentSearchEngineSettings] = useAtom(store.currentSearchEngineSettingsAtom);
+
+ const [input, setInput] = useState('');
+ const inputRef = useRef(null);
+
+ const [messages, setMessages] = useUIState();
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ const formData = new FormData(e.currentTarget as HTMLFormElement);
+
+ const userMessage = {
+ id: Date.now(),
+ isGenerating: false,
+ component: ,
+ };
+
+ const searchResponse = await search(currentUseModel, currentProviderSettings, currentSearchEngineSettings, formData, isProSearch);
+
+ setMessages((currentMessages) => [...currentMessages, userMessage, searchResponse]);
+
+ setInput('');
+ };
+
+ return (
+
+
+
+
+ );
+};
diff --git a/components/layout/search/block/block-title.tsx b/components/layout/search/block/block-title.tsx
new file mode 100644
index 00000000..ed06546f
--- /dev/null
+++ b/components/layout/search/block/block-title.tsx
@@ -0,0 +1,15 @@
+import { IconType } from 'react-icons/lib';
+
+interface BlockTitleProps {
+ title: string;
+ icon: IconType;
+}
+
+export const BlockTitle = (props: BlockTitleProps) => {
+ return (
+
+ );
+};
diff --git a/components/layout/search/block/clarifier.tsx b/components/layout/search/block/clarifier.tsx
new file mode 100644
index 00000000..de236ab9
--- /dev/null
+++ b/components/layout/search/block/clarifier.tsx
@@ -0,0 +1,139 @@
+'use client';
+
+import React, { useEffect, useState } from 'react';
+import { BsFillQuestionDiamondFill } from 'react-icons/bs';
+import { useActions, useStreamableValue, useUIState } from 'ai/rsc';
+import { useAtom } from 'jotai';
+import { useTranslations } from 'next-intl';
+
+import type { AI } from '@/app/[locale]/(home)/action';
+import { Additions } from '@/components/layout/search/block/additions';
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+import { BlockError } from '@/components/layout/search/block/error';
+import { Checkbox } from '@/components/ui/custom/checkbox';
+import { Input } from '@/components/ui/custom/input';
+import store from '@/hooks/store';
+import { TClarifier } from '@/types/search';
+
+export const Clarifier = ({ clarify }: { clarify?: TClarifier }) => {
+ const t = useTranslations();
+
+ const { search } = useActions();
+
+ const [isProSearch] = useAtom(store.isProSearchAtom);
+ const [currentUseModel] = useAtom(store.currentUseModelAtom);
+ const [currentProviderSettings] = useAtom(store.currentProviderSettingsAtom);
+ const [currentSearchEngineSettings] = useAtom(store.currentSearchEngineSettingsAtom);
+
+ const [input, setInput] = useState('');
+
+ const [skipped, setSkipped] = useState(false);
+
+ const [allowSubmit, setAllowSubmit] = useState(false);
+
+ const [isClarified, setIsClarified] = useState(false);
+
+ const [messages, setMessages] = useUIState();
+
+ const [data, error, pending] = useStreamableValue(clarify);
+
+ const [selected, setSelected] = useState<{
+ [key: string]: boolean;
+ }>({});
+
+ const handleInputChange = (e: React.ChangeEvent) => {
+ setInput(e.target.value);
+ canBeProceed();
+ };
+
+ const handleOptionChange = (selectedOption: string) => {
+ const updatedCheckedOptions = {
+ ...selected,
+ [selectedOption]: !selected[selectedOption],
+ };
+ setSelected(updatedCheckedOptions);
+ canBeProceed(updatedCheckedOptions);
+ };
+
+ const canBeProceed = (currentOptions = selected) => {
+ setAllowSubmit(Object.values(currentOptions).some((checked) => checked) || !!input);
+ };
+
+ const handleSubmit = async (e: React.FormEvent, skip?: boolean) => {
+ e.preventDefault();
+
+ setIsClarified(true);
+ setSkipped(skip || false);
+
+ const formData = skip ? undefined : new FormData(e.target as HTMLFormElement);
+
+ const searchResponse = await search(currentUseModel, currentProviderSettings, currentSearchEngineSettings, formData, isProSearch, skip);
+
+ setMessages((currentMessages) => [...currentMessages, searchResponse]);
+ };
+
+ const handleNoIdea = (e: React.MouseEvent) => {
+ handleSubmit(e as unknown as React.FormEvent, true);
+ };
+
+ useEffect(() => {
+ canBeProceed();
+ }, [input]);
+
+ if (error) {
+ return ;
+ }
+
+ if (skipped) {
+ return null;
+ }
+
+ if (isClarified) {
+ return ;
+ }
+
+ return (
+
+
+
+
+ {data?.options && data?.options?.length > 0 && (
+
+ {data?.options?.map((option, index) => (
+
+ handleOptionChange(option?.content as string)} />
+
+ {option?.content}
+
+
+ ))}
+
+ )}
+ {data?.allowsInput && (
+
+ {data?.clarifyLabel}
+
+
+ )}
+
+
+ {t('no_idea')}
+
+
+ {t('confirm')}
+
+
+
+
+
+ );
+};
diff --git a/components/layout/search/block/error.tsx b/components/layout/search/block/error.tsx
new file mode 100644
index 00000000..a7ec7de2
--- /dev/null
+++ b/components/layout/search/block/error.tsx
@@ -0,0 +1,40 @@
+'use client';
+
+import { BiError } from 'react-icons/bi';
+import { useTranslations } from 'next-intl';
+
+import { renderMarkdownMessage } from '@/components/layout/message';
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+
+type ErrorType = 'not_supported' | 'provider_not_configured' | 'search_engine_not_configured' | 'error';
+
+export const BlockError = ({
+ content,
+ type = 'error',
+}: Readonly<{
+ content: any;
+ type: ErrorType;
+}>) => {
+ const t = useTranslations();
+
+ const RenderErrorMessage = () => {
+ switch (type) {
+ case 'not_supported':
+ return {t('provider_not_supported') ?? content}
;
+ case 'search_engine_not_configured':
+ return {t('search_engine_not_configured') ?? content}
;
+ case 'provider_not_configured':
+ return {t('provider_not_configured') ?? content}
;
+ case 'error':
+ default:
+ return {renderMarkdownMessage(content ?? '')}
;
+ }
+ };
+
+ return (
+
+
+
{RenderErrorMessage()}
+
+ );
+};
diff --git a/components/layout/search/block/focus-point.tsx b/components/layout/search/block/focus-point.tsx
new file mode 100644
index 00000000..bb0cdbca
--- /dev/null
+++ b/components/layout/search/block/focus-point.tsx
@@ -0,0 +1,15 @@
+import { LuFocus } from 'react-icons/lu';
+import { useTranslations } from 'next-intl';
+
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+
+export const FocusPoint = ({ query }: { query: string }) => {
+ const t = useTranslations();
+
+ return (
+
+ );
+};
diff --git a/components/layout/search/block/images.tsx b/components/layout/search/block/images.tsx
new file mode 100644
index 00000000..9a59699d
--- /dev/null
+++ b/components/layout/search/block/images.tsx
@@ -0,0 +1,91 @@
+'use client';
+
+import { useState } from 'react';
+import { BsImage } from 'react-icons/bs';
+import { useTranslations } from 'next-intl';
+
+import { LightBox } from '@/components/layout/lightbox';
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+
+export const Images = ({ images, query }: { images: string[]; query?: string }) => {
+ const t = useTranslations();
+
+ const [selectedIndex, setSelectedIndex] = useState(0);
+
+ const [open, setOpen] = useState(false);
+
+ const [isAllResources, setIsAllResources] = useState(false);
+
+ const shown = isAllResources ? images : images.slice(0, 4);
+ const hidden = isAllResources ? [] : images.slice(4);
+
+ const hiddenCount = hidden.length;
+
+ const onClickOnImage = (index: number) => {
+ setSelectedIndex(index ?? '0');
+ setOpen(true);
+ };
+
+ const lightBoxImages = images.map((image) => {
+ return {
+ alt: query,
+ src: image,
+ };
+ });
+
+ return (
+
+
+ {!images || images.length === 0 ? (
+
{t('no_image_found')}
+ ) : (
+
+
({ alt: image.alt || '', src: image.src }))}
+ open={open}
+ setOpen={setOpen}
+ currentIndex={selectedIndex}
+ setCurrentIndex={setSelectedIndex}
+ />
+ {shown.map((image: string, index: number) => (
+ onClickOnImage(index)}>
+ {image ? (
+
+ ) : (
+
+ )}
+
+ ))}
+ {!isAllResources && hiddenCount > 0 ? (
+ setIsAllResources(true)}
+ >
+
+ {hidden.map((image: string, index: number) => {
+ return (
+
setSelectedIndex(index)}
+ className='relative flex aspect-video w-3/12 cursor-pointer flex-col items-center justify-center rounded-md bg-black/30 text-sm text-white/80'
+ >
+
+
+ );
+ })}
+
+ {t('show_more_images')}
+
+ ) : (
+ setIsAllResources(false)}
+ >
+ {t('show_less_images')}
+
+ )}
+
+ )}
+
+ );
+};
diff --git a/components/layout/search/block/question.tsx b/components/layout/search/block/question.tsx
new file mode 100644
index 00000000..b4a34804
--- /dev/null
+++ b/components/layout/search/block/question.tsx
@@ -0,0 +1,18 @@
+'use client';
+
+import { FaQuestion } from 'react-icons/fa6';
+import { useTranslations } from 'next-intl';
+
+import { RenderSimpleMessage } from '@/components/layout/message';
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+
+export const Question = ({ content }: Readonly<{ content: string }>) => {
+ const t = useTranslations();
+
+ return (
+
+
+
+
+ );
+};
diff --git a/components/layout/search/block/related.tsx b/components/layout/search/block/related.tsx
new file mode 100644
index 00000000..8e8dd033
--- /dev/null
+++ b/components/layout/search/block/related.tsx
@@ -0,0 +1,81 @@
+'use client';
+
+import React from 'react';
+import { LuPlus } from 'react-icons/lu';
+import { PiPlugsConnectedDuotone } from 'react-icons/pi';
+import { useActions, useStreamableValue, useUIState } from 'ai/rsc';
+import { useAtom } from 'jotai';
+import { useTranslations } from 'next-intl';
+
+import { AI } from '@/app/[locale]/(home)/action';
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+import { BlockError } from '@/components/layout/search/block/error';
+import { Question } from '@/components/layout/search/block/question';
+import store from '@/hooks/store';
+import { TIllustrator } from '@/types/search';
+
+export const Related = ({ relatedQueries }: { relatedQueries: TIllustrator }) => {
+ const t = useTranslations();
+
+ const { search } = useActions();
+
+ const [isProSearch] = useAtom(store.isProSearchAtom);
+ const [currentUseModel] = useAtom(store.currentUseModelAtom);
+ const [currentProviderSettings] = useAtom(store.currentProviderSettingsAtom);
+ const [currentSearchEngineSettings] = useAtom(store.currentSearchEngineSettingsAtom);
+
+ const [messages, setMessages] = useUIState();
+
+ const [data, error, pending] = useStreamableValue(relatedQueries);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ const formData = new FormData(e.currentTarget as HTMLFormElement);
+
+ const submitter = (e.nativeEvent as SubmitEvent).submitter as HTMLTextAreaElement;
+
+ let query = '';
+
+ if (submitter) {
+ formData.append(submitter.name, submitter.value);
+ query = submitter.value;
+ }
+
+ const userMessage = {
+ id: Date.now(),
+ isGenerating: false,
+ component: ,
+ };
+
+ const searchResponse = await search(currentUseModel, currentProviderSettings, currentSearchEngineSettings, formData, isProSearch);
+
+ setMessages((currentMessages) => [...currentMessages, userMessage, searchResponse]);
+ };
+
+ if (error) {
+ return ;
+ }
+
+ return (
+
+
+
+ {data?.items
+ ?.filter((item) => item?.query !== '')
+ .map((item, index) => (
+
+
+ {item?.query}
+
+ ))}
+
+
+ );
+};
diff --git a/components/layout/search/block/searching.tsx b/components/layout/search/block/searching.tsx
new file mode 100644
index 00000000..e6f21dd8
--- /dev/null
+++ b/components/layout/search/block/searching.tsx
@@ -0,0 +1,17 @@
+'use client';
+
+import { AiOutlineSolution } from 'react-icons/ai';
+import { useTranslations } from 'next-intl';
+
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+
+export const Searching = () => {
+ const t = useTranslations();
+
+ return (
+
+
+
{t('searching_slogan')}
+
+ );
+};
diff --git a/components/layout/search/block/sources.tsx b/components/layout/search/block/sources.tsx
new file mode 100644
index 00000000..7b6fc8fd
--- /dev/null
+++ b/components/layout/search/block/sources.tsx
@@ -0,0 +1,81 @@
+'use client';
+
+import { useState } from 'react';
+import { GrResources } from 'react-icons/gr';
+import { useAtom } from 'jotai';
+import Link from 'next/link';
+import { useTranslations } from 'next-intl';
+
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+import { UserAvatar } from '@/components/layout/user-avatar';
+import store from '@/hooks/store';
+import { TavilyResult } from '@/types/search/resources';
+
+export const Sources = ({ results }: Readonly<{ results: TavilyResult[] }>) => {
+ const t = useTranslations();
+
+ const [isAllResources, setIsAllResources] = useState(false);
+
+ const [sameCitationId, setSameCitationId] = useAtom(store.sameCitationAtom);
+
+ const shown = isAllResources ? results : results.slice(0, 3);
+ const hidden = isAllResources ? [] : results.slice(3);
+
+ const hiddenCount = hidden.length;
+
+ return (
+
+
+
+ {shown.map((result: TavilyResult, index: number) => (
+
setSameCitationId(encodeURIComponent(result.url))}
+ onMouseLeave={() => setSameCitationId('')}
+ >
+
{result.content}
+
+
+
{new URL(result.url).hostname}
+
+
+ ))}
+ {!isAllResources && hiddenCount > 0 ? (
+
setIsAllResources(true)}
+ >
+
+ {hidden.map((result: TavilyResult, index: number) => {
+ return (
+
+ );
+ })}
+
+ {t('show_all_resources')}
+
+ ) : (
+
setIsAllResources(false)}
+ >
+ {t('show_less_resources')}
+
+ )}
+
+
+ );
+};
diff --git a/components/layout/search/block/try-ask.tsx b/components/layout/search/block/try-ask.tsx
new file mode 100644
index 00000000..52a6a0dd
--- /dev/null
+++ b/components/layout/search/block/try-ask.tsx
@@ -0,0 +1,38 @@
+'use client';
+
+import { memo } from 'react';
+import { PiStarFourBold } from 'react-icons/pi';
+import { useLocale, useTranslations } from 'next-intl';
+
+import { BlockTitle } from '@/components/layout/search/block/block-title';
+import { questions } from '@/config/search/question';
+
+export const TryAsk = memo(function TryAsk({
+ setInput,
+}: Readonly<{
+ setInput: (value: string) => void;
+}>) {
+ const t = useTranslations();
+
+ const locale = useLocale();
+
+ const localeQuestions = questions[locale] ?? questions.en;
+ const randomQuestions = localeQuestions.sort(() => Math.random() - 0.5).slice(0, 5);
+
+ return (
+
+
+
+ {randomQuestions.map((question) => (
+ setInput(question.value)}
+ className='rounded-md bg-neutral-200/70 px-3 text-sm transition duration-300 ease-in-out hover:bg-neutral-300/70 dark:bg-neutral-600/70 dark:text-neutral-200/70 dark:hover:bg-neutral-500/70'
+ >
+ {question.question}
+
+ ))}
+
+
+ );
+});
diff --git a/components/layout/search/input-box.tsx b/components/layout/search/input-box.tsx
new file mode 100644
index 00000000..0b7b4245
--- /dev/null
+++ b/components/layout/search/input-box.tsx
@@ -0,0 +1,80 @@
+'use client';
+
+import { FaArrowUp } from 'react-icons/fa';
+import Tippy from '@tippyjs/react';
+import { useAtom } from 'jotai';
+import { useRouter } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+
+import { Switch } from '@/components/ui/custom/switch';
+import { Textarea } from '@/components/ui/custom/textarea';
+import store from '@/hooks/store';
+
+export const InputBox = ({
+ input,
+ inputRef,
+ setInput,
+ handleSubmit,
+}: Readonly<{
+ input: string;
+ inputRef: React.RefObject;
+ setInput: (value: string) => void;
+ handleSubmit: (e: React.FormEvent) => void;
+}>) => {
+ const router = useRouter();
+
+ const t = useTranslations();
+
+ const [preferences] = useAtom(store.preferencesAtom);
+ const [conversationSettings] = useAtom(store.conversationSettingsAtom);
+
+ const [currentUseModel] = useAtom(store.currentUseModelAtom);
+
+ const [isProSearch, setIsProSearch] = useAtom(store.isProSearchAtom);
+
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ if (preferences.enterSend) {
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ handleSubmit(e as React.FormEvent);
+ }
+ } else if (e.key === 'Enter' && e.shiftKey) {
+ e.preventDefault();
+ handleSubmit(e as React.FormEvent);
+ }
+ };
+
+ return (
+
+ setInput(e.target.value)}
+ className='h-28 resize-none rounded-xl border border-neutral-400/40 outline-none transition duration-200 ease-in-out hover:border-neutral-500/50 focus-visible:border-neutral-800/80 focus-visible:ring-0 focus-visible:ring-offset-0 dark:border-neutral-600/60 dark:bg-neutral-600/70 dark:text-neutral-200/70 dark:placeholder:text-neutral-400/60 dark:hover:border-neutral-600/60 dark:focus-visible:border-neutral-800/80 dark:focus-visible:ring-0 dark:focus-visible:ring-offset-0'
+ />
+
+
+
+
{t('pro')}
+
{
+ setIsProSearch(!isProSearch);
+ }}
+ />
+
+
+
0 ? t('send_question') : t('enter_something_to_send')}>
+ 0 ? 'cursor-pointer' : 'cursor-not-allowed'}`}
+ >
+
+
+
+
+
+ );
+};
diff --git a/components/layout/search/search-window.tsx b/components/layout/search/search-window.tsx
new file mode 100644
index 00000000..380cfa69
--- /dev/null
+++ b/components/layout/search/search-window.tsx
@@ -0,0 +1,94 @@
+import { useCallback, useEffect, useRef, useState } from 'react';
+import { useActions, useUIState } from 'ai/rsc';
+import { useAtom } from 'jotai';
+import { useTranslations } from 'next-intl';
+
+import type { AI } from '@/app/[locale]/(home)/action';
+import { Question } from '@/components/layout/search/block/question';
+import { TryAsk } from '@/components/layout/search/block/try-ask';
+import { InputBox } from '@/components/layout/search/input-box';
+import store from '@/hooks/store';
+
+export const SearchWindow = () => {
+ const t = useTranslations();
+
+ const { search } = useActions();
+
+ const [isProSearch] = useAtom(store.isProSearchAtom);
+ const [currentUseModel] = useAtom(store.currentUseModelAtom);
+ const [currentProviderSettings] = useAtom(store.currentProviderSettingsAtom);
+ const [currentSearchEngineSettings] = useAtom(store.currentSearchEngineSettingsAtom);
+
+ const [input, setInput] = useState('');
+ const inputRef = useRef(null);
+
+ const [messages, setMessages] = useUIState();
+
+ const [isSend, setIsSend] = useState(false);
+
+ useEffect(() => {
+ if (isSend) {
+ inputRef.current?.focus();
+ setIsSend(false);
+ }
+ }, [isSend]);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (isSend) {
+ handleClear();
+ setIsSend(false);
+ }
+
+ setMessages((currentMessages) => [
+ ...currentMessages,
+ {
+ id: Date.now(),
+ isGenerating: false,
+ component: ,
+ },
+ ]);
+
+ const formData = new FormData(e.currentTarget);
+
+ const searchResponse = await search(currentUseModel, currentProviderSettings, currentSearchEngineSettings, formData, isProSearch);
+
+ setMessages((currentMessages) => [...currentMessages, searchResponse]);
+
+ setInput('');
+ };
+
+ const handleClear = () => {
+ setIsSend(true);
+ setMessages([]);
+ };
+
+ useEffect(() => {
+ inputRef.current?.focus();
+ }, []);
+
+ const setInputStable = useCallback((value: string) => {
+ setInput(value);
+ }, []);
+
+ if (messages.length > 0) {
+ return (
+
+ {messages.map((message: { id: number; component: React.ReactNode }) => (
+
+ {message.component}
+
+ ))}
+
+ );
+ }
+
+ return (
+
+
{t('search_slogan')}
+
+
+
+ );
+};
diff --git a/components/layout/settings-dialog.tsx b/components/layout/settings-dialog.tsx
new file mode 100644
index 00000000..cf0a33f5
--- /dev/null
+++ b/components/layout/settings-dialog.tsx
@@ -0,0 +1,222 @@
+'use client';
+
+import { useEffect, useState } from 'react';
+import { IoCog } from 'react-icons/io5';
+import { TbRosetteFilled } from 'react-icons/tb';
+import { useAtom } from 'jotai';
+import { useRouter, useSearchParams } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+import { toast } from 'sonner';
+
+import { GeneralSettings } from '@/components/layout/settings/general';
+import { ProviderSettings } from '@/components/layout/settings/provider';
+import { SearchSettings } from '@/components/layout/settings/search';
+import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/custom/dialog';
+import { Provider } from '@/config/provider';
+import { SearchEngine } from '@/config/search';
+import store from '@/hooks/store';
+import { SearchEngineSetting } from '@/types/search';
+import { AdvancedSettings, Preference, ProviderSetting } from '@/types/settings';
+
+export const SettingsDialog = () => {
+ const router = useRouter();
+
+ const t = useTranslations();
+
+ const [isOpen, setIsOpen] = useState(false);
+
+ const [activeTab, setActiveTab] = useState('general');
+
+ const searchParams = useSearchParams();
+
+ const open = searchParams.get('open');
+ const tab = searchParams.get('tab');
+ const provider = searchParams.get('provider');
+ const search = searchParams.get('search');
+
+ const [generalPreferences, setGeneralPreferences] = useAtom(store.preferencesAtom);
+ const [advancedSettings, setAdvancedSettings] = useAtom(store.advancedSettingsAtom);
+
+ // Provider settings
+ const [currentProvider, setCurrentProvider] = useState((provider as Provider) ?? Provider.OpenAI);
+ const [currentProviderSettings, setCurrentProviderSettings] = useAtom(store.currentProviderSettingsAtom);
+
+ const [amazon, setAmazon] = useState(currentProviderSettings?.Amazon || null);
+ const [anthropic, setAnthropic] = useState(currentProviderSettings?.Anthropic || null);
+ const [azure, setAzure] = useState(currentProviderSettings?.Azure || null);
+ const [cohere, setCohere] = useState(currentProviderSettings?.Cohere || null);
+ const [fireworks, setFireworks] = useState(currentProviderSettings?.Fireworks || null);
+ const [google, setGoogle] = useState(currentProviderSettings?.Google || null);
+ const [groq, setGroq] = useState(currentProviderSettings?.Groq || null);
+ const [huggingFace, setHuggingFace] = useState(currentProviderSettings?.HuggingFace || null);
+ const [mistral, setMistral] = useState(currentProviderSettings?.Mistral || null);
+ const [openAI, setOpenAI] = useState(currentProviderSettings?.OpenAI || null);
+ const [perplexity, setPerplexity] = useState(currentProviderSettings?.Perplexity || null);
+
+ const [custom, setCustom] = useState(currentProviderSettings?.Custom || null);
+
+ // --------------------------------------------------
+
+ // Search Provider settings
+ const [currentSearchEngine, setCurrentSearchEngine] = useState((search as SearchEngine) ?? SearchEngine.Tavily);
+ const [currentSearchEngineSettings, setCurrentSearchEngineSettings] = useAtom(store.currentSearchEngineSettingsAtom);
+
+ const [tavily, setTavily] = useState(currentSearchEngineSettings?.Tavily || null);
+
+ // --------------------------------------------------
+
+ useEffect(() => {
+ if (open === 'settings') {
+ setIsOpen(true);
+
+ if (tab === 'general') {
+ setActiveTab('general');
+ }
+ if (tab === 'provider') {
+ setActiveTab('provider');
+
+ if (provider) {
+ setCurrentProvider(provider as Provider);
+ }
+ }
+ if (tab == 'search') {
+ setActiveTab('search');
+
+ if (search) {
+ setCurrentSearchEngine(search as SearchEngine);
+ }
+ }
+ }
+ }, [open]);
+
+ const onSave = () => {
+ setCurrentProviderSettings({
+ Anthropic: anthropic!,
+ Cohere: cohere!,
+ Fireworks: fireworks!,
+ Google: google!,
+ Groq: groq!,
+ HuggingFace: huggingFace!,
+ Mistral: mistral!,
+ OpenAI: openAI!,
+ Perplexity: perplexity!,
+
+ Custom: custom!,
+ });
+
+ setCurrentSearchEngineSettings({
+ Tavily: tavily!,
+ });
+
+ setIsOpen(false);
+
+ router.back();
+
+ toast.success(t('settings_saved'), {
+ position: 'top-right',
+ duration: 1500,
+ });
+ };
+
+ return (
+ {
+ if (open) {
+ router.push('?open=settings');
+ } else {
+ router.push('?');
+ }
+ setIsOpen(open);
+ }}
+ >
+
+
+
+
+
+
{
+ router.push('?open=settings&tab=general');
+ setActiveTab('general');
+ }}
+ >
+
+ {t('general')}
+
+
{
+ router.push('?open=settings&tab=provider');
+ setActiveTab('provider');
+ }}
+ >
+
+ {t('provider')}
+
+
{
+ router.push('?open=settings&tab=search');
+ setActiveTab('search');
+ }}
+ >
+
+ {t('search')}
+
+
+
+ {
+ {
+ general: (
+
+ ),
+ provider: (
+
+ ),
+ search:
,
+ }[activeTab]
+ }
+
+
+ {t('save')}
+
+
+
+
+
+ );
+};
diff --git a/components/layout/settings-drawer.tsx b/components/layout/settings-drawer.tsx
new file mode 100644
index 00000000..e9a55688
--- /dev/null
+++ b/components/layout/settings-drawer.tsx
@@ -0,0 +1,207 @@
+'use client';
+
+import { useEffect, useState } from 'react';
+import { useAtom } from 'jotai';
+import { useRouter, useSearchParams } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+import { toast } from 'sonner';
+
+import { GeneralSettings } from '@/components/layout/settings/general';
+import { ProviderSettings } from '@/components/layout/settings/provider';
+import { SearchSettings } from '@/components/layout/settings/search';
+import { Button } from '@/components/ui/button';
+import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '@/components/ui/custom/drawer';
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
+import { Provider } from '@/config/provider';
+import { SearchEngine } from '@/config/search';
+import store from '@/hooks/store';
+import { SearchEngineSetting } from '@/types/search';
+import { AdvancedSettings, Preference, ProviderSetting } from '@/types/settings';
+
+export const SettingsDrawer = () => {
+ const router = useRouter();
+
+ const t = useTranslations();
+
+ const [isOpen, setIsOpen] = useState(false);
+
+ const [activeTab, setActiveTab] = useState('general');
+
+ const searchParams = useSearchParams();
+
+ const open = searchParams.get('open');
+ const tab = searchParams.get('tab');
+ const provider = searchParams.get('provider');
+ const search = searchParams.get('search');
+
+ const [generalPreferences, setGeneralPreferences] = useAtom(store.preferencesAtom);
+ const [advancedSettings, setAdvancedSettings] = useAtom(store.advancedSettingsAtom);
+
+ // Provider settings
+ const [currentProvider, setCurrentProvider] = useState((provider as Provider) ?? Provider.OpenAI);
+ const [currentProviderSettings, setCurrentProviderSettings] = useAtom(store.currentProviderSettingsAtom);
+
+ const [amazon, setAmazon] = useState(currentProviderSettings?.Amazon || null);
+ const [anthropic, setAnthropic] = useState(currentProviderSettings?.Anthropic || null);
+ const [azure, setAzure] = useState(currentProviderSettings?.Azure || null);
+ const [cohere, setCohere] = useState(currentProviderSettings?.Cohere || null);
+ const [fireworks, setFireworks] = useState(currentProviderSettings?.Fireworks || null);
+ const [google, setGoogle] = useState(currentProviderSettings?.Google || null);
+ const [groq, setGroq] = useState(currentProviderSettings?.Groq || null);
+ const [huggingFace, setHuggingFace] = useState(currentProviderSettings?.HuggingFace || null);
+ const [mistral, setMistral] = useState(currentProviderSettings?.Mistral || null);
+ const [openAI, setOpenAI] = useState(currentProviderSettings?.OpenAI || null);
+ const [perplexity, setPerplexity] = useState(currentProviderSettings?.Perplexity || null);
+
+ const [custom, setCustom] = useState(currentProviderSettings?.Custom || null);
+
+ // --------------------------------------------------
+
+ // Search Provider settings
+ const [currentSearchEngine, setCurrentSearchEngine] = useState((search as SearchEngine) ?? SearchEngine.Tavily);
+ const [currentSearchEngineSettings, setCurrentSearchEngineSettings] = useAtom(store.currentSearchEngineSettingsAtom);
+
+ const [tavily, setTavily] = useState(currentSearchEngineSettings?.Tavily || null);
+
+ // --------------------------------------------------
+
+ useEffect(() => {
+ if (open === 'settings') {
+ setIsOpen(true);
+
+ if (tab === 'general') {
+ setActiveTab('general');
+ }
+ if (tab === 'provider') {
+ setActiveTab('provider');
+
+ if (provider) {
+ setCurrentProvider(provider as Provider);
+ }
+ }
+ if (tab == 'search') {
+ setActiveTab('search');
+
+ if (search) {
+ setCurrentSearchEngine(search as SearchEngine);
+ }
+ }
+ }
+ }, [open]);
+
+ const onSave = () => {
+ setCurrentProviderSettings({
+ Anthropic: anthropic!,
+ Cohere: cohere!,
+ Fireworks: fireworks!,
+ Google: google!,
+ Groq: groq!,
+ HuggingFace: huggingFace!,
+ Mistral: mistral!,
+ OpenAI: openAI!,
+ Perplexity: perplexity!,
+ });
+
+ setCurrentSearchEngineSettings({
+ Tavily: tavily!,
+ });
+
+ setIsOpen(false);
+
+ router.back();
+
+ toast.success(t('settings_saved'), {
+ position: 'top-right',
+ duration: 1500,
+ });
+ };
+
+ return (
+ {
+ if (open) {
+ router.push('?open=settings');
+ } else {
+ router.push('?');
+ }
+ setIsOpen(open);
+ }}
+ >
+
+
+
+ {
+ setActiveTab(value);
+ if (value === 'general') {
+ router.push('?open=settings&tab=general');
+ }
+ if (value === 'provider') {
+ router.push('?open=settings&tab=provider');
+ }
+ if (value === 'search') {
+ router.push('?open=settings&tab=search');
+ }
+ }}
+ >
+
+ {t('general')}
+ {t('provider')}
+ {t('search')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t('save')}
+
+
+
+
+ );
+};
diff --git a/components/layout/settings/general.tsx b/components/layout/settings/general.tsx
new file mode 100644
index 00000000..3582e0fe
--- /dev/null
+++ b/components/layout/settings/general.tsx
@@ -0,0 +1,187 @@
+import { GrCircleInformation } from 'react-icons/gr';
+import { MdOutlineInfo } from 'react-icons/md';
+import Tippy from '@tippyjs/react';
+import { useAtom } from 'jotai';
+import Link from 'next/link';
+import { useTranslations } from 'next-intl';
+import { toast } from 'sonner';
+
+import { Switch } from '@/components/ui/custom/switch';
+import { Textarea } from '@/components/ui/custom/textarea';
+import { Label } from '@/components/ui/label';
+import store from '@/hooks/store';
+import { AdvancedSettings, Preference } from '@/types/settings';
+
+export const GeneralSettings = ({
+ generalPreferences,
+ setGeneralPreferences,
+ advancedSettings,
+ setAdvancedSettings,
+}: {
+ generalPreferences: Preference;
+ setGeneralPreferences: (value: Preference) => void;
+ advancedSettings: AdvancedSettings;
+ setAdvancedSettings: (value: AdvancedSettings) => void;
+}) => {
+ const t = useTranslations();
+
+ const [conversations, setConversations] = useAtom(store.conversationsAtom);
+ const [conversationSettings, setConversationSettings] = useAtom(store.conversationSettingsAtom);
+
+ const onExportConversations = () => {
+ const data = JSON.stringify(conversations);
+ const blob = new Blob([data], { type: 'text/plain' });
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = 'chatchat-conversations.json';
+ a.click();
+ };
+
+ const onDeleteConversations = () => {
+ setConversations([]);
+
+ toast.success(t('all_conversations_deleted'));
+ };
+
+ return (
+
+
+
+
{t('preferences')}
+
+
+ {
+ setGeneralPreferences({
+ ...generalPreferences,
+ enterSend: checked,
+ });
+ }}
+ />
+ {t('send_message_with_enter')}
+
+
+ {
+ setGeneralPreferences({
+ ...generalPreferences,
+ useMarkdown: checked,
+ });
+ }}
+ />
+ {t('render_message_with_markdown')}
+
+
+
+
+
+
+
{t('conversation')}
+
+
+
{t('conversation_records')}
+
+
+ {t('export')}
+
+
+ {t('delete')}
+
+
+
+
+
+ {t('system_prompt')}
+
+
+
+
+
+
+
+ setConversationSettings({ ...conversationSettings, systemPrompt: e.target.value })}
+ className='h-6 max-h-36'
+ />
+
+
+ {/*
+ {t('number_of_context')}
+ {
+ setConversationSettings({
+ ...conversationSettings,
+ numOfContext: parseInt(value),
+ });
+ }}
+ >
+
+
+
+
+ {t('no_limit')}
+ 1
+ 3
+ 5
+ 7
+ 9
+
+
+
*/}
+
+
+
+
+
+
{t('advanced')}
+
+
+ {
+ setAdvancedSettings({
+ ...advancedSettings,
+ unifiedEndpoint: checked,
+ });
+ }}
+ />
+ {t('use_unified_endpoint')}
+
+
+ {
+ setAdvancedSettings({
+ ...advancedSettings,
+ streamMessages: checked,
+ });
+ }}
+ />
+
+ {t('stream_messages')}{' '}
+
+ (SSE)
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/components/layout/settings/provider.tsx b/components/layout/settings/provider.tsx
new file mode 100644
index 00000000..45656813
--- /dev/null
+++ b/components/layout/settings/provider.tsx
@@ -0,0 +1,152 @@
+import Image from 'next/image';
+import { useRouter } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+
+// import { AmazonProvider } from '@/components/layout/settings/provider/amazon';
+import { AnthropicProvider } from '@/components/layout/settings/provider/anthropic';
+// import { AzureProvider } from '@/components/layout/settings/provider/azure';
+import { CohereProvider } from '@/components/layout/settings/provider/cohere';
+import { CustomProvider } from '@/components/layout/settings/provider/custom';
+import { FireworksProvider } from '@/components/layout/settings/provider/fireworks';
+import { GoogleProvider } from '@/components/layout/settings/provider/google';
+import { GroqProvider } from '@/components/layout/settings/provider/groq';
+import { HuggingFaceProvider } from '@/components/layout/settings/provider/huggingface';
+import { MistralProvider } from '@/components/layout/settings/provider/mistral';
+import { OpenAIProvider } from '@/components/layout/settings/provider/openai';
+import { PerplexityProvider } from '@/components/layout/settings/provider/perplexity';
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/custom/select';
+import { Provider, Providers } from '@/config/provider';
+import { ProviderSetting } from '@/types/settings';
+
+export const ProviderSettings = ({
+ currentProvider,
+ setCurrentProvider,
+ amazon,
+ setAmazon,
+ anthropic,
+ setAnthropic,
+ azure,
+ setAzure,
+ cohere,
+ setCohere,
+ fireworks,
+ setFireworks,
+ google,
+ setGoogle,
+ groq,
+ setGroq,
+ huggingFace,
+ setHuggingFace,
+ mistral,
+ setMistral,
+ openAI,
+ setOpenAI,
+ perplexity,
+ setPerplexity,
+
+ custom,
+ setCustom,
+}: {
+ currentProvider: Provider;
+ setCurrentProvider: (value: Provider) => void;
+ amazon: ProviderSetting['Amazon'] | null;
+ setAmazon: (value: ProviderSetting['Amazon'] | null) => void;
+ anthropic: ProviderSetting['Anthropic'] | null;
+ setAnthropic: (value: ProviderSetting['Anthropic'] | null) => void;
+ azure: ProviderSetting['Azure'] | null;
+ setAzure: (value: ProviderSetting['Azure'] | null) => void;
+ cohere: ProviderSetting['Cohere'] | null;
+ setCohere: (value: ProviderSetting['Cohere'] | null) => void;
+ fireworks: ProviderSetting['Fireworks'] | null;
+ setFireworks: (value: ProviderSetting['Fireworks'] | null) => void;
+ google: ProviderSetting['Google'] | null;
+ setGoogle: (value: ProviderSetting['Google'] | null) => void;
+ groq: ProviderSetting['Groq'] | null;
+ setGroq: (value: ProviderSetting['Groq'] | null) => void;
+ huggingFace: ProviderSetting['HuggingFace'] | null;
+ setHuggingFace: (value: ProviderSetting['HuggingFace'] | null) => void;
+ mistral: ProviderSetting['Mistral'] | null;
+ setMistral: (value: ProviderSetting['Mistral'] | null) => void;
+ openAI: ProviderSetting['OpenAI'] | null;
+ setOpenAI: (value: ProviderSetting['OpenAI'] | null) => void;
+ perplexity: ProviderSetting['Perplexity'] | null;
+ setPerplexity: (value: ProviderSetting['Perplexity'] | null) => void;
+
+ custom: ProviderSetting['Custom'] | null;
+ setCustom: (value: ProviderSetting['Custom'] | null) => void;
+}) => {
+ const t = useTranslations();
+
+ const router = useRouter();
+
+ const RenderProviderSettings = () => {
+ switch (currentProvider) {
+ // case Provider.Amazon:
+ // return ;
+ case Provider.Anthropic:
+ return ;
+ // case Provider.Azure:
+ // return ;
+ case Provider.Cohere:
+ return ;
+ case Provider.Fireworks:
+ return ;
+ case Provider.Google:
+ return ;
+ case Provider.Groq:
+ return ;
+ case Provider.HuggingFace:
+ return ;
+ case Provider.Mistral:
+ return ;
+ case Provider.OpenAI:
+ return ;
+ case Provider.Perplexity:
+ return ;
+ case Provider.Custom:
+ return ;
+ default:
+ return null;
+ }
+ };
+
+ return (
+
+
+
{t('provider')}
+
{
+ router.push('?open=settings&tab=provider&provider=' + value);
+ setCurrentProvider(Providers.find((provider) => provider.name === value)!.name);
+ }}
+ >
+
+
+
+ {currentProvider}
+
+ }
+ />
+
+
+ {Providers.filter((provider) => provider.name !== 'Amazon' && provider.name !== 'Azure')
+ .toSorted((a, b) => a.name.localeCompare(b.name))
+ .map((provider) => (
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
diff --git a/components/layout/settings/provider/amazon.tsx b/components/layout/settings/provider/amazon.tsx
new file mode 100644
index 00000000..98edd8a0
--- /dev/null
+++ b/components/layout/settings/provider/amazon.tsx
@@ -0,0 +1,48 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const AmazonProvider = ({ amazon, setAmazon }: { amazon: ProviderSetting['Amazon'] | null; setAmazon: (value: ProviderSetting['Amazon'] | null) => void }) => {
+ return (
+
+
+
Amazon API Key
+
{
+ setAmazon({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+
Amazon Secret Key
+
{
+ setAmazon({
+ secretKey: e.target.value,
+ });
+ }}
+ />
+
+
+
Amazon Region
+
{
+ setAmazon({
+ region: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/anthropic.tsx b/components/layout/settings/provider/anthropic.tsx
new file mode 100644
index 00000000..6a5e4fe3
--- /dev/null
+++ b/components/layout/settings/provider/anthropic.tsx
@@ -0,0 +1,22 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const AnthropicProvider = ({ anthropic, setAnthropic }: { anthropic: ProviderSetting['Anthropic'] | null; setAnthropic: (value: ProviderSetting['Anthropic'] | null) => void }) => {
+ return (
+
+
+
Anthropic API Key
+
{
+ setAnthropic({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/azure.tsx b/components/layout/settings/provider/azure.tsx
new file mode 100644
index 00000000..b3a4cd2c
--- /dev/null
+++ b/components/layout/settings/provider/azure.tsx
@@ -0,0 +1,48 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const AzureProvider = ({ azure, setAzure }: { azure: ProviderSetting['Azure'] | null; setAzure: (value: ProviderSetting['Azure'] | null) => void }) => {
+ return (
+
+
+
Azure API Key
+
{
+ setAzure({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+
Azure Endpoint
+
{
+ setAzure({
+ endpoint: e.target.value,
+ });
+ }}
+ />
+
+
+
Azure Deployment Name
+
{
+ setAzure({
+ deploymentName: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/cohere.tsx b/components/layout/settings/provider/cohere.tsx
new file mode 100644
index 00000000..3936fe9e
--- /dev/null
+++ b/components/layout/settings/provider/cohere.tsx
@@ -0,0 +1,22 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const CohereProvider = ({ cohere, setCohere }: { cohere: ProviderSetting['Cohere'] | null; setCohere: (value: ProviderSetting['Cohere'] | null) => void }) => {
+ return (
+
+
+
Cohere API Key
+
{
+ setCohere({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/custom.tsx b/components/layout/settings/provider/custom.tsx
new file mode 100644
index 00000000..baaa58eb
--- /dev/null
+++ b/components/layout/settings/provider/custom.tsx
@@ -0,0 +1,145 @@
+import { useState } from 'react';
+import { IoMdAdd } from 'react-icons/io';
+import { MdDelete } from 'react-icons/md';
+import Image from 'next/image';
+import { useTranslations } from 'next-intl';
+
+import { Input } from '@/components/ui/custom/input';
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/custom/select';
+import { Provider, Providers } from '@/config/provider';
+import { ProviderSetting, SingleCustomSettings } from '@/types/settings';
+
+export const CustomProvider = ({ custom, setCustom }: { custom: ProviderSetting['Custom'] | null; setCustom: (value: ProviderSetting['Custom'] | null) => void }) => {
+ const t = useTranslations();
+
+ const [newCustom, setNewCustom] = useState(null);
+
+ const onAddCustom = () => {
+ if (!newCustom) {
+ return;
+ }
+
+ setCustom(custom && typeof custom[Symbol.iterator] === 'function' ? [...custom, newCustom] : [newCustom]);
+ };
+
+ const onDeleteCustom = (index: number) => {
+ setCustom(custom?.filter((_, i) => i !== index));
+ };
+
+ return (
+
+
+
+
{t('based_provider')}
+
{
+ setNewCustom({ ...newCustom, basedProvider: value as Provider });
+ }}
+ >
+
+
+
+ {newCustom?.basedProvider}
+
+ }
+ />
+
+
+ {Providers.filter((provider) => provider.name !== 'Custom')
+ .filter((provider) => provider.name !== 'Amazon' && provider.name !== 'Azure')
+ .toSorted((a, b) => a.name.localeCompare(b.name))
+ .map((provider) => (
+
+
+
+ ))}
+
+
+
+
+
{t('custom_api_key')}
+
{
+ setNewCustom({
+ ...newCustom,
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+
{t('custom_api_endpoint')}
+
{
+ setNewCustom({
+ ...newCustom,
+ endpoint: e.target.value,
+ });
+ }}
+ />
+
+
+
{t('custom_model')}
+
{
+ setNewCustom({
+ ...newCustom,
+ model: e.target.value,
+ });
+ }}
+ />
+
+ {custom && custom.length > 0 && (
+
+
+
+
{t('saved_custom_model')}
+
+
+ {custom?.map((c, index) => (
+
+
+
{
+ onDeleteCustom(index);
+ }}
+ >
+
+
+
+ ))}
+
+
+ )}
+
+ );
+};
diff --git a/components/layout/settings/provider/fireworks.tsx b/components/layout/settings/provider/fireworks.tsx
new file mode 100644
index 00000000..d227ff23
--- /dev/null
+++ b/components/layout/settings/provider/fireworks.tsx
@@ -0,0 +1,22 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const FireworksProvider = ({ fireworks, setFireworks }: { fireworks: ProviderSetting['Fireworks'] | null; setFireworks: (value: ProviderSetting['Fireworks'] | null) => void }) => {
+ return (
+
+
+
Fireworks API Key
+
{
+ setFireworks({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/google.tsx b/components/layout/settings/provider/google.tsx
new file mode 100644
index 00000000..0102539f
--- /dev/null
+++ b/components/layout/settings/provider/google.tsx
@@ -0,0 +1,22 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const GoogleProvider = ({ google, setGoogle }: { google: ProviderSetting['Google'] | null; setGoogle: (value: ProviderSetting['Google'] | null) => void }) => {
+ return (
+
+
+
Google AI Studio API Key
+
{
+ setGoogle({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/groq.tsx b/components/layout/settings/provider/groq.tsx
new file mode 100644
index 00000000..e877078d
--- /dev/null
+++ b/components/layout/settings/provider/groq.tsx
@@ -0,0 +1,22 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const GroqProvider = ({ groq, setGroq }: { groq: ProviderSetting['Groq'] | null; setGroq: (value: ProviderSetting['Groq'] | null) => void }) => {
+ return (
+
+
+
Groq API Key
+
{
+ setGroq({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/huggingface.tsx b/components/layout/settings/provider/huggingface.tsx
new file mode 100644
index 00000000..a01cc658
--- /dev/null
+++ b/components/layout/settings/provider/huggingface.tsx
@@ -0,0 +1,28 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const HuggingFaceProvider = ({
+ huggingFace,
+ setHuggingFace,
+}: {
+ huggingFace: ProviderSetting['HuggingFace'] | null;
+ setHuggingFace: (value: ProviderSetting['HuggingFace'] | null) => void;
+}) => {
+ return (
+
+
+
HuggingFace API Key
+
{
+ setHuggingFace({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/mistral.tsx b/components/layout/settings/provider/mistral.tsx
new file mode 100644
index 00000000..9f19dc73
--- /dev/null
+++ b/components/layout/settings/provider/mistral.tsx
@@ -0,0 +1,22 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const MistralProvider = ({ mistral, setMistral }: { mistral: ProviderSetting['Mistral'] | null; setMistral: (value: ProviderSetting['Mistral'] | null) => void }) => {
+ return (
+
+
+
Mistral API Key
+
{
+ setMistral({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/openai.tsx b/components/layout/settings/provider/openai.tsx
new file mode 100644
index 00000000..498b2b77
--- /dev/null
+++ b/components/layout/settings/provider/openai.tsx
@@ -0,0 +1,37 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const OpenAIProvider = ({ openAI, setOpenAI }: { openAI: ProviderSetting['OpenAI'] | null; setOpenAI: (value: ProviderSetting['OpenAI'] | null) => void }) => {
+ return (
+
+
+
OpenAI API Key
+
{
+ setOpenAI({
+ ...openAI,
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+
OpenAI Endpoint
+
{
+ setOpenAI({
+ ...openAI,
+ endpoint: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/provider/perplexity.tsx b/components/layout/settings/provider/perplexity.tsx
new file mode 100644
index 00000000..bc77b628
--- /dev/null
+++ b/components/layout/settings/provider/perplexity.tsx
@@ -0,0 +1,35 @@
+import { Input } from '@/components/ui/custom/input';
+import { ProviderSetting } from '@/types/settings';
+
+export const PerplexityProvider = ({ perplexity, setPerplexity }: { perplexity: ProviderSetting['Perplexity'] | null; setPerplexity: (value: ProviderSetting['Perplexity'] | null) => void }) => {
+ return (
+
+
+
Perplexity API Key
+
{
+ setPerplexity({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+
Perplexity Endpoint
+
{
+ setPerplexity({
+ endpoint: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/settings/search.tsx b/components/layout/settings/search.tsx
new file mode 100644
index 00000000..fd4a6d72
--- /dev/null
+++ b/components/layout/settings/search.tsx
@@ -0,0 +1,72 @@
+import Image from 'next/image';
+import { useRouter } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+
+import { TavilySearchEngine } from '@/components/layout/settings/searcher/tavily';
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/custom/select';
+import { SearchEngine, SearchEngines } from '@/config/search';
+import { SearchEngineSetting } from '@/types/search';
+
+export const SearchSettings = ({
+ currentSearchEngine,
+ setCurrentSearchEngine,
+ tavily,
+ setTavily,
+}: {
+ currentSearchEngine: SearchEngine;
+ setCurrentSearchEngine: (value: SearchEngine) => void;
+ tavily: SearchEngineSetting['Tavily'] | null;
+ setTavily: (value: SearchEngineSetting['Tavily'] | null) => void;
+}) => {
+ const t = useTranslations();
+
+ const router = useRouter();
+
+ const RenderProviderSettings = () => {
+ switch (currentSearchEngine) {
+ case SearchEngine.Tavily:
+ return ;
+ case SearchEngine.Google:
+ default:
+ return null;
+ }
+ };
+
+ return (
+
+
+
{t('provider')}
+
{
+ router.push('?open=settings&tab=search&search=' + value);
+ setCurrentSearchEngine(SearchEngines.find((searcher) => searcher.name === value)!.name);
+ }}
+ >
+
+
+
+ {currentSearchEngine}
+
+ }
+ />
+
+
+ {SearchEngines.toSorted((a, b) => a.name.localeCompare(b.name)).map((searcher) => (
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
diff --git a/components/layout/settings/searcher/tavily.tsx b/components/layout/settings/searcher/tavily.tsx
new file mode 100644
index 00000000..233f5549
--- /dev/null
+++ b/components/layout/settings/searcher/tavily.tsx
@@ -0,0 +1,22 @@
+import { Input } from '@/components/ui/custom/input';
+import { SearchEngineSetting } from '@/types/search';
+
+export const TavilySearchEngine = ({ tavily, setTavily }: { tavily: SearchEngineSetting['Tavily'] | null; setTavily: (value: SearchEngineSetting['Tavily'] | null) => void }) => {
+ return (
+
+
+
Tavily API Key
+
{
+ setTavily({
+ apiKey: e.target.value,
+ });
+ }}
+ />
+
+
+ );
+};
diff --git a/components/layout/share-button.tsx b/components/layout/share-button.tsx
new file mode 100644
index 00000000..523358a9
--- /dev/null
+++ b/components/layout/share-button.tsx
@@ -0,0 +1,97 @@
+import { LuShare } from 'react-icons/lu';
+import Tippy from '@tippyjs/react';
+import { saveAs } from 'file-saver';
+import { useAtom } from 'jotai';
+import { useSearchParams } from 'next/navigation';
+import { useTranslations } from 'next-intl';
+import { toast } from 'sonner';
+
+import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/custom/dropdown-menu';
+import store from '@/hooks/store';
+import { Conversation } from '@/types/conversation';
+
+export const ShareButton = () => {
+ const t = useTranslations();
+
+ const chat = useSearchParams().get('chat');
+
+ const [conversations] = useAtom(store.conversationsAtom);
+
+ const formatAsMarkdown = (conversation: Conversation) => {
+ return conversation.conversation.map((message) => `**${message.role}:** ${message.content}`).join('\n\n');
+ };
+
+ const convertTextToImage = (text: string) => {
+ const canvas = document.createElement('canvas');
+ const context = canvas.getContext('2d');
+
+ canvas.width = 800;
+ canvas.height = 600;
+
+ if (context) {
+ context.fillStyle = '#000';
+ context.font = '16px Arial';
+
+ const lines = text.split('\\n');
+ let y = 20;
+ lines.forEach((line) => {
+ context.fillText(line, 10, y);
+ y += 30;
+ });
+ }
+
+ return canvas.toDataURL('image/png');
+ };
+
+ const onShareAsMarkdown = () => {
+ const conversation = conversations?.find((conversation) => conversation.id === chat);
+
+ if (!conversation) {
+ toast.error(t('conversation_not_found'), {
+ position: 'top-right',
+ });
+ return;
+ }
+
+ const markdownContent = formatAsMarkdown(conversation);
+ const blob = new Blob([markdownContent], { type: 'text/markdown;charset=utf-8' });
+ saveAs(blob, `conversation-${chat}.md`);
+ };
+
+ const onShareAsImage = () => {
+ const conversation = conversations?.find((conversation) => conversation.id === chat);
+
+ if (!conversation) {
+ toast.error(t('conversation_not_found'), {
+ position: 'top-right',
+ });
+ return;
+ }
+
+ const markdownContent = formatAsMarkdown(conversation);
+ const imageData = convertTextToImage(markdownContent);
+
+ const link = document.createElement('a');
+ link.download = `conversation-${chat}.png`;
+ link.href = imageData;
+ link.click();
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ Markdown
+
+
+ {t('image')}
+
+
+
+ );
+};
diff --git a/components/layout/theme-dropdown.tsx b/components/layout/theme-dropdown.tsx
new file mode 100644
index 00000000..d368dafa
--- /dev/null
+++ b/components/layout/theme-dropdown.tsx
@@ -0,0 +1,50 @@
+'use client';
+
+import { useEffect, useState } from 'react';
+import { IoInvertMode } from 'react-icons/io5';
+import { useTranslations } from 'next-intl';
+import { useTheme } from 'next-themes';
+
+import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from '@/components/ui/custom/dropdown-menu';
+import { ThemeList } from '@/config/theme';
+
+export const ThemeDropdown = () => {
+ const t = useTranslations();
+
+ const [mounted, setMounted] = useState(false);
+ const { theme, setTheme } = useTheme();
+
+ useEffect(() => {
+ setMounted(true);
+ }, []);
+
+ if (!mounted) {
+ return null;
+ }
+
+ return (
+
+
+
+ 🌞
+ 🌚
+
+
+ {
+ setTheme(value);
+ }}
+ >
+ {ThemeList.map((theme) => {
+ return (
+
+ {theme.icon + ' ' + t(`${theme.name.toString().toLowerCase()}`)}
+
+ );
+ })}
+
+
+
+ );
+};
diff --git a/components/layout/user-avatar.tsx b/components/layout/user-avatar.tsx
new file mode 100644
index 00000000..e5338b2d
--- /dev/null
+++ b/components/layout/user-avatar.tsx
@@ -0,0 +1,18 @@
+import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
+
+export const UserAvatar = ({
+ avatarUrl,
+ avatarFallback,
+ className,
+}: Readonly<{
+ avatarUrl?: string;
+ avatarFallback?: string;
+ className?: string;
+}>) => {
+ return (
+
+
+ {avatarFallback ?? 'NO'}
+
+ );
+};
diff --git a/components/layout/version-badge.tsx b/components/layout/version-badge.tsx
new file mode 100644
index 00000000..75f1913c
--- /dev/null
+++ b/components/layout/version-badge.tsx
@@ -0,0 +1,95 @@
+'use client';
+
+import { useEffect, useState } from 'react';
+import Link from 'next/link';
+import { useTranslations } from 'next-intl';
+
+import { VersionLabel } from '@/components/layout/version-label';
+import { Avatar, AvatarImage } from '@/components/ui/avatar';
+import { Badge } from '@/components/ui/badge';
+import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/dialog';
+import packageInfo from '@/package.json';
+
+export const VersionBadge = () => {
+ const t = useTranslations();
+
+ const [isLatestVersion, setIsLatestVersion] = useState(true);
+
+ const getVersion = async () => {
+ const res = await fetch('/api/app/latest');
+ const data = await res.json();
+
+ if (data.tag_name != packageInfo.version) {
+ setIsLatestVersion(false);
+ }
+ };
+
+ useEffect(() => {
+ getVersion();
+ }, [isLatestVersion]);
+
+ return (
+
+
+
+
+
+
+
+
+
+
Chat Chat
+
+ {!isLatestVersion && (
+
+
{t('new_version_available')}
+
+ )}
+
+
+
+
+
{t('docs')}
+
+
+
{t('open_source_message', { license: 'AGPL-3.0' })}
+
+
+
+
+
+ {t('privacy_policy')}
+
+
+ {t('cookies')}
+
+
+
+ {t('made_by_author', { author: 'Harry Yep' })}
+
+
+
+
+
+ );
+};
diff --git a/components/layout/version-label.tsx b/components/layout/version-label.tsx
new file mode 100644
index 00000000..e8cb6a00
--- /dev/null
+++ b/components/layout/version-label.tsx
@@ -0,0 +1,5 @@
+import packageInfo from '@/package.json';
+
+export const VersionLabel = () => {
+ return v{packageInfo.version}
;
+};
diff --git a/components/share/post.tsx b/components/share/post.tsx
deleted file mode 100644
index b968cb2e..00000000
--- a/components/share/post.tsx
+++ /dev/null
@@ -1,128 +0,0 @@
-'use client';
-
-import { useRouter } from 'next/navigation';
-
-import { useTranslations } from 'next-intl';
-
-import { Share } from '@prisma/client';
-
-import { toast } from 'react-hot-toast';
-
-import { TbCopy } from 'react-icons/tb';
-import { BiLink, BiChat } from 'react-icons/bi';
-
-import { Separator } from '@/components/ui/separator';
-
-import { renderMarkdownMessage, renderUserMessage } from '@/utils/app/renderMessage';
-
-import { siteConfig } from '@/config/site.config';
-
-interface ShareProps {
- share: Pick;
-}
-
-const SharePost = ({ share }: ShareProps) => {
- const router = useRouter();
-
- const t = useTranslations('');
-
- const contentString = JSON.stringify(share.content, null, 2);
-
- const content = JSON.parse(contentString);
-
- const onCopyMessage = (index: number) => {
- navigator.clipboard.writeText(content[index].content);
- toast.success(t('Copied to clipboard'));
- };
-
- const onCopyLink = () => {
- navigator.clipboard.writeText(window.location.href);
- toast.success(t('Copied to clipboard'));
- };
-
- const handleContinueConversation = () => {
- router.push(`/?share=${share.id}&type=${share.type}`);
- };
-
- return (
-
-
-
-
- {siteConfig.title} {t('Share')}
-
-
-
- {share.type == 'chat' && (
-
-
- {t('Continue this Conversation')}
-
- )}
- onCopyLink()}
- >
-
- {t('Copy share link')}
-
-
-
-
-
-
-
- {content?.map((message: OpenAIMessage, index: number) => {
- const isUser = message.role === 'user';
-
- return (
-
-
- {isUser ? (
- <>
-
onCopyMessage(index)}
- >
-
- {t('Copy')}
-
-
{t('You')}
- >
- ) : (
- <>
-
AI
-
onCopyMessage(index)}
- >
-
- {t('Copy')}
-
- >
- )}
-
-
- {!isUser ? renderMarkdownMessage(message.content) : renderUserMessage(message.content)}
-
-
- );
- })}
-
-
-
-
- );
-};
-
-export default SharePost;
diff --git a/components/ui/accordion.tsx b/components/ui/accordion.tsx
deleted file mode 100644
index f6197ce7..00000000
--- a/components/ui/accordion.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-'use client';
-
-import * as React from 'react';
-import * as AccordionPrimitive from '@radix-ui/react-accordion';
-import { ChevronDown } from 'lucide-react';
-
-import { cn } from '@/lib/cn';
-
-const Accordion = AccordionPrimitive.Root;
-
-const AccordionItem = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-AccordionItem.displayName = 'AccordionItem';
-
-const AccordionTrigger = React.forwardRef, React.ComponentPropsWithoutRef>(
- ({ className, children, ...props }, ref) => (
-
- svg]:rotate-180', className)}
- {...props}
- >
- {children}
-
-
-
- )
-);
-AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
-
-const AccordionContent = React.forwardRef, React.ComponentPropsWithoutRef>(
- ({ className, children, ...props }, ref) => (
-
- {children}
-
- )
-);
-
-AccordionContent.displayName = AccordionPrimitive.Content.displayName;
-
-export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
diff --git a/components/ui/alert.tsx b/components/ui/alert.tsx
deleted file mode 100644
index 52f67657..00000000
--- a/components/ui/alert.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import * as React from 'react';
-import { cva, type VariantProps } from 'class-variance-authority';
-
-import { cn } from '@/lib/cn';
-
-const alertVariants = cva('relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', {
- variants: {
- variant: {
- default: 'bg-background text-foreground',
- destructive: 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',
- },
- },
- defaultVariants: {
- variant: 'default',
- },
-});
-
-const Alert = React.forwardRef & VariantProps>(({ className, variant, ...props }, ref) => (
-
-));
-Alert.displayName = 'Alert';
-
-const AlertTitle = React.forwardRef>(({ className, ...props }, ref) => (
-
-));
-AlertTitle.displayName = 'AlertTitle';
-
-const AlertDescription = React.forwardRef>(({ className, ...props }, ref) => (
-
-));
-AlertDescription.displayName = 'AlertDescription';
-
-export { Alert, AlertTitle, AlertDescription };
diff --git a/components/ui/avatar.tsx b/components/ui/avatar.tsx
index 876340f6..6adecd2b 100644
--- a/components/ui/avatar.tsx
+++ b/components/ui/avatar.tsx
@@ -3,7 +3,7 @@
import * as React from 'react';
import * as AvatarPrimitive from '@radix-ui/react-avatar';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const Avatar = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx
index f2208449..e52904df 100644
--- a/components/ui/badge.tsx
+++ b/components/ui/badge.tsx
@@ -1,7 +1,7 @@
import * as React from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const badgeVariants = cva('inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', {
variants: {
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
index 3d0b6de7..9fb9b6e6 100644
--- a/components/ui/button.tsx
+++ b/components/ui/button.tsx
@@ -2,7 +2,7 @@ import * as React from 'react';
import { Slot } from '@radix-ui/react-slot';
import { cva, type VariantProps } from 'class-variance-authority';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const buttonVariants = cva(
'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
diff --git a/components/ui/checkbox.tsx b/components/ui/checkbox.tsx
index 79d92ec1..be932c19 100644
--- a/components/ui/checkbox.tsx
+++ b/components/ui/checkbox.tsx
@@ -4,7 +4,7 @@ import * as React from 'react';
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
import { Check } from 'lucide-react';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const Checkbox = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-Command.displayName = CommandPrimitive.displayName;
-
-interface CommandDialogProps extends DialogProps {}
-
-const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
- return (
-
-
-
- {children}
-
-
-
- );
-};
-
-const CommandInput = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-
-
-
-));
-
-CommandInput.displayName = CommandPrimitive.Input.displayName;
-
-const CommandList = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-
-CommandList.displayName = CommandPrimitive.List.displayName;
-
-const CommandEmpty = React.forwardRef, React.ComponentPropsWithoutRef>((props, ref) => (
-
-));
-
-CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
-
-const CommandGroup = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-
-CommandGroup.displayName = CommandPrimitive.Group.displayName;
-
-const CommandSeparator = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
-
-const CommandItem = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-
-CommandItem.displayName = CommandPrimitive.Item.displayName;
-
-const CommandShortcut = ({ className, ...props }: React.HTMLAttributes) => {
- return ;
-};
-CommandShortcut.displayName = 'CommandShortcut';
-
-export { Command, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator };
diff --git a/components/ui/custom/checkbox.tsx b/components/ui/custom/checkbox.tsx
new file mode 100644
index 00000000..ebbfa134
--- /dev/null
+++ b/components/ui/custom/checkbox.tsx
@@ -0,0 +1,25 @@
+'use client';
+
+import * as React from 'react';
+import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
+import { Check } from 'lucide-react';
+
+import { cn } from '@/lib/ui/utils';
+
+const Checkbox = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+
+
+
+
+));
+Checkbox.displayName = CheckboxPrimitive.Root.displayName;
+
+export { Checkbox };
diff --git a/components/ui/custom/dialog.tsx b/components/ui/custom/dialog.tsx
new file mode 100644
index 00000000..4be2d7b5
--- /dev/null
+++ b/components/ui/custom/dialog.tsx
@@ -0,0 +1,58 @@
+'use client';
+
+import * as React from 'react';
+import * as DialogPrimitive from '@radix-ui/react-dialog';
+
+import { cn } from '@/lib/ui/utils';
+
+const Dialog = DialogPrimitive.Root;
+
+const DialogTrigger = DialogPrimitive.Trigger;
+
+const DialogPortal = DialogPrimitive.Portal;
+
+const DialogClose = DialogPrimitive.Close;
+
+const DialogOverlay = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
+
+const DialogContent = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+));
+DialogContent.displayName = DialogPrimitive.Content.displayName;
+
+const DialogHeader = ({ className, ...props }: React.HTMLAttributes) =>
;
+DialogHeader.displayName = 'DialogHeader';
+
+const DialogFooter = ({ className, ...props }: React.HTMLAttributes) =>
;
+DialogFooter.displayName = 'DialogFooter';
+
+const DialogTitle = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DialogTitle.displayName = DialogPrimitive.Title.displayName;
+
+const DialogDescription = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DialogDescription.displayName = DialogPrimitive.Description.displayName;
+
+export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
diff --git a/components/ui/custom/drawer.tsx b/components/ui/custom/drawer.tsx
new file mode 100644
index 00000000..a7a1ecae
--- /dev/null
+++ b/components/ui/custom/drawer.tsx
@@ -0,0 +1,53 @@
+'use client';
+
+import * as React from 'react';
+import { Drawer as DrawerPrimitive } from 'vaul';
+
+import { cn } from '@/lib/ui/utils';
+
+const Drawer = ({ shouldScaleBackground = true, ...props }: React.ComponentProps) => ;
+Drawer.displayName = 'Drawer';
+
+const DrawerTrigger = DrawerPrimitive.Trigger;
+
+const DrawerPortal = DrawerPrimitive.Portal;
+
+const DrawerClose = DrawerPrimitive.Close;
+
+const DrawerOverlay = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
+
+const DrawerContent = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, children, ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+));
+DrawerContent.displayName = 'DrawerContent';
+
+const DrawerHeader = ({ className, ...props }: React.HTMLAttributes) =>
;
+DrawerHeader.displayName = 'DrawerHeader';
+
+const DrawerFooter = ({ className, ...props }: React.HTMLAttributes) =>
;
+DrawerFooter.displayName = 'DrawerFooter';
+
+const DrawerTitle = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
+
+const DrawerDescription = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
+
+export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger };
diff --git a/components/ui/custom/dropdown-menu.tsx b/components/ui/custom/dropdown-menu.tsx
new file mode 100644
index 00000000..86af1dfb
--- /dev/null
+++ b/components/ui/custom/dropdown-menu.tsx
@@ -0,0 +1,168 @@
+'use client';
+
+import * as React from 'react';
+import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
+import { Check, ChevronRight, Circle } from 'lucide-react';
+
+import { cn } from '@/lib/ui/utils';
+
+const DropdownMenu = DropdownMenuPrimitive.Root;
+
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
+
+const DropdownMenuGroup = DropdownMenuPrimitive.Group;
+
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
+
+const DropdownMenuSub = DropdownMenuPrimitive.Sub;
+
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
+
+const DropdownMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+));
+DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
+
+const DropdownMenuSubContent = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ className, ...props }, ref) => (
+
+ )
+);
+DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
+
+const DropdownMenuContent = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+ )
+);
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
+
+const DropdownMenuCheckboxItem = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+ )
+);
+DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
+
+const DropdownMenuRadioItem = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+ )
+);
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => );
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
+
+const DropdownMenuSeparator = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ className, ...props }, ref) =>
+);
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
+
+const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => {
+ return ;
+};
+DropdownMenuShortcut.displayName = 'DropdownMenuShortcut';
+
+export {
+ DropdownMenu,
+ DropdownMenuCheckboxItem,
+ DropdownMenuContent,
+ DropdownMenuGroup,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuPortal,
+ DropdownMenuRadioGroup,
+ DropdownMenuRadioItem,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuTrigger,
+};
diff --git a/components/ui/custom/input.tsx b/components/ui/custom/input.tsx
new file mode 100644
index 00000000..0a9e16b1
--- /dev/null
+++ b/components/ui/custom/input.tsx
@@ -0,0 +1,23 @@
+import * as React from 'react';
+
+import { cn } from '@/lib/ui/utils';
+
+export interface InputProps extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(({ className, type, ...props }, ref) => {
+ return (
+
+ );
+});
+Input.displayName = 'Input';
+
+export { Input };
diff --git a/components/ui/custom/select.tsx b/components/ui/custom/select.tsx
new file mode 100644
index 00000000..2206c065
--- /dev/null
+++ b/components/ui/custom/select.tsx
@@ -0,0 +1,105 @@
+'use client';
+
+import * as React from 'react';
+import * as SelectPrimitive from '@radix-ui/react-select';
+import { Check, ChevronDown, ChevronUp } from 'lucide-react';
+
+import { cn } from '@/lib/ui/utils';
+
+const Select = SelectPrimitive.Root;
+
+const SelectGroup = SelectPrimitive.Group;
+
+const SelectValue = SelectPrimitive.Value;
+
+const SelectTrigger = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1',
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+));
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
+
+const SelectScrollUpButton = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ className, ...props }, ref) => (
+
+
+
+ )
+);
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
+
+const SelectScrollDownButton = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ className, ...props }, ref) => (
+
+
+
+ )
+);
+SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
+
+const SelectContent = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ className, children, position = 'popper', ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+ )
+);
+SelectContent.displayName = SelectPrimitive.Content.displayName;
+
+const SelectLabel = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
+
+const SelectItem = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+
+ {children}
+
+));
+SelectItem.displayName = SelectPrimitive.Item.displayName;
+
+const SelectSeparator = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
+
+export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };
diff --git a/components/ui/custom/switch.tsx b/components/ui/custom/switch.tsx
new file mode 100644
index 00000000..da1a3ab6
--- /dev/null
+++ b/components/ui/custom/switch.tsx
@@ -0,0 +1,24 @@
+'use client';
+
+import * as React from 'react';
+import * as SwitchPrimitives from '@radix-ui/react-switch';
+
+import { cn } from '@/lib/ui/utils';
+
+const Switch = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+
+
+));
+Switch.displayName = SwitchPrimitives.Root.displayName;
+
+export { Switch };
diff --git a/components/ui/custom/textarea.tsx b/components/ui/custom/textarea.tsx
new file mode 100644
index 00000000..6c58cca6
--- /dev/null
+++ b/components/ui/custom/textarea.tsx
@@ -0,0 +1,21 @@
+import * as React from 'react';
+
+import { cn } from '@/lib/ui/utils';
+
+export interface TextareaProps extends React.TextareaHTMLAttributes {}
+
+const Textarea = React.forwardRef(({ className, ...props }, ref) => {
+ return (
+
+ );
+});
+Textarea.displayName = 'Textarea';
+
+export { Textarea };
diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx
index a07a877b..796a0d08 100644
--- a/components/ui/dialog.tsx
+++ b/components/ui/dialog.tsx
@@ -4,7 +4,7 @@ import * as React from 'react';
import * as DialogPrimitive from '@radix-ui/react-dialog';
import { X } from 'lucide-react';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const Dialog = DialogPrimitive.Root;
diff --git a/components/ui/drawer.tsx b/components/ui/drawer.tsx
new file mode 100644
index 00000000..9169af0c
--- /dev/null
+++ b/components/ui/drawer.tsx
@@ -0,0 +1,49 @@
+'use client';
+
+import * as React from 'react';
+import { Drawer as DrawerPrimitive } from 'vaul';
+
+import { cn } from '@/lib/ui/utils';
+
+const Drawer = ({ shouldScaleBackground = true, ...props }: React.ComponentProps) => ;
+Drawer.displayName = 'Drawer';
+
+const DrawerTrigger = DrawerPrimitive.Trigger;
+
+const DrawerPortal = DrawerPrimitive.Portal;
+
+const DrawerClose = DrawerPrimitive.Close;
+
+const DrawerOverlay = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
+
+const DrawerContent = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, children, ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+));
+DrawerContent.displayName = 'DrawerContent';
+
+const DrawerHeader = ({ className, ...props }: React.HTMLAttributes) =>
;
+DrawerHeader.displayName = 'DrawerHeader';
+
+const DrawerFooter = ({ className, ...props }: React.HTMLAttributes) =>
;
+DrawerFooter.displayName = 'DrawerFooter';
+
+const DrawerTitle = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
+
+const DrawerDescription = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
+
+));
+DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
+
+export { Drawer, DrawerPortal, DrawerOverlay, DrawerTrigger, DrawerClose, DrawerContent, DrawerHeader, DrawerFooter, DrawerTitle, DrawerDescription };
diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx
index 07e92b8b..5c8243d8 100644
--- a/components/ui/dropdown-menu.tsx
+++ b/components/ui/dropdown-menu.tsx
@@ -4,7 +4,7 @@ import * as React from 'react';
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
import { Check, ChevronRight, Circle } from 'lucide-react';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const DropdownMenu = DropdownMenuPrimitive.Root;
diff --git a/components/ui/input.tsx b/components/ui/input.tsx
index b148b727..fbec1f4e 100644
--- a/components/ui/input.tsx
+++ b/components/ui/input.tsx
@@ -1,6 +1,6 @@
import * as React from 'react';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
export interface InputProps extends React.InputHTMLAttributes {}
diff --git a/components/ui/label.tsx b/components/ui/label.tsx
index 8433ec60..1eabdb58 100644
--- a/components/ui/label.tsx
+++ b/components/ui/label.tsx
@@ -4,7 +4,7 @@ import * as React from 'react';
import * as LabelPrimitive from '@radix-ui/react-label';
import { cva, type VariantProps } from 'class-variance-authority';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70');
diff --git a/components/ui/popover.tsx b/components/ui/popover.tsx
deleted file mode 100644
index 3edc1771..00000000
--- a/components/ui/popover.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-'use client';
-
-import * as React from 'react';
-import * as PopoverPrimitive from '@radix-ui/react-popover';
-
-import { cn } from '@/lib/cn';
-
-const Popover = PopoverPrimitive.Root;
-
-const PopoverTrigger = PopoverPrimitive.Trigger;
-
-const PopoverContent = React.forwardRef, React.ComponentPropsWithoutRef>(
- ({ className, align = 'center', sideOffset = 4, ...props }, ref) => (
-
-
-
- )
-);
-PopoverContent.displayName = PopoverPrimitive.Content.displayName;
-
-export { Popover, PopoverTrigger, PopoverContent };
diff --git a/components/ui/select.tsx b/components/ui/select.tsx
index a8c432a8..d4ab018b 100644
--- a/components/ui/select.tsx
+++ b/components/ui/select.tsx
@@ -4,7 +4,7 @@ import * as React from 'react';
import * as SelectPrimitive from '@radix-ui/react-select';
import { Check, ChevronDown, ChevronUp } from 'lucide-react';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const Select = SelectPrimitive.Root;
diff --git a/components/ui/separator.tsx b/components/ui/separator.tsx
deleted file mode 100644
index d5260be8..00000000
--- a/components/ui/separator.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-'use client';
-
-import * as React from 'react';
-import * as SeparatorPrimitive from '@radix-ui/react-separator';
-
-import { cn } from '@/lib/cn';
-
-const Separator = React.forwardRef, React.ComponentPropsWithoutRef>(
- ({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (
-
- )
-);
-Separator.displayName = SeparatorPrimitive.Root.displayName;
-
-export { Separator };
diff --git a/components/ui/sheet.tsx b/components/ui/sheet.tsx
deleted file mode 100644
index a26b6a6d..00000000
--- a/components/ui/sheet.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-'use client';
-
-import * as React from 'react';
-import * as SheetPrimitive from '@radix-ui/react-dialog';
-import { cva, type VariantProps } from 'class-variance-authority';
-import { X } from 'lucide-react';
-
-import { cn } from '@/lib/cn';
-
-const Sheet = SheetPrimitive.Root;
-
-const SheetTrigger = SheetPrimitive.Trigger;
-
-const SheetClose = SheetPrimitive.Close;
-
-const SheetPortal = SheetPrimitive.Portal;
-
-const SheetOverlay = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
-
-const sheetVariants = cva(
- 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500',
- {
- variants: {
- side: {
- top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
- bottom: 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
- left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',
- right: 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',
- },
- },
- defaultVariants: {
- side: 'right',
- },
- }
-);
-
-interface SheetContentProps extends React.ComponentPropsWithoutRef, VariantProps {}
-
-const SheetContent = React.forwardRef, SheetContentProps>(({ side = 'right', className, children, ...props }, ref) => (
-
-
-
- {children}
-
-
- Close
-
-
-
-));
-SheetContent.displayName = SheetPrimitive.Content.displayName;
-
-const SheetHeader = ({ className, ...props }: React.HTMLAttributes) =>
;
-SheetHeader.displayName = 'SheetHeader';
-
-const SheetFooter = ({ className, ...props }: React.HTMLAttributes) =>
;
-SheetFooter.displayName = 'SheetFooter';
-
-const SheetTitle = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-SheetTitle.displayName = SheetPrimitive.Title.displayName;
-
-const SheetDescription = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-));
-SheetDescription.displayName = SheetPrimitive.Description.displayName;
-
-export { Sheet, SheetPortal, SheetOverlay, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription };
diff --git a/components/ui/slider.tsx b/components/ui/slider.tsx
deleted file mode 100644
index 445d8211..00000000
--- a/components/ui/slider.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-'use client';
-
-import * as React from 'react';
-import * as SliderPrimitive from '@radix-ui/react-slider';
-
-import { cn } from '@/lib/cn';
-
-const Slider = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
-
-
-
-
-
-
-));
-Slider.displayName = SliderPrimitive.Root.displayName;
-
-export { Slider };
diff --git a/components/ui/switch.tsx b/components/ui/switch.tsx
index b7bdd1a1..14066e59 100644
--- a/components/ui/switch.tsx
+++ b/components/ui/switch.tsx
@@ -3,7 +3,7 @@
import * as React from 'react';
import * as SwitchPrimitives from '@radix-ui/react-switch';
-import { cn } from '@/lib/cn';
+import { cn } from '@/lib/ui/utils';
const Switch = React.forwardRef, React.ComponentPropsWithoutRef>(({ className, ...props }, ref) => (
{}
diff --git a/config/custom.config.tsx b/config/custom.config.tsx
deleted file mode 100644
index f5163f58..00000000
--- a/config/custom.config.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import Link from 'next/link';
-
-interface customConfigProps {
- Auth: {
- footer: JSX.Element;
- };
- Dashboard: {
- side: string;
- footer: JSX.Element;
- };
-}
-
-export const customConfig: customConfigProps = {
- Auth: {
- footer: (
-
- By continuing, you agree to our{' '}
-
- Terms of Service
-
- ,{' '}
-
- Privacy Policy
- {' '}
- and{' '}
-
- Cookie Policy
-
- .
-
- ),
- },
- Dashboard: {
- side: '© Chat Chat',
- footer: (
-
- Copyright © Chat Chat.{' '}
-
- Open-Source
-
- . AGPL-3.0 License.
-
- ),
- },
-};
diff --git a/config/i18n/index.ts b/config/i18n/index.ts
new file mode 100644
index 00000000..9baaf5fc
--- /dev/null
+++ b/config/i18n/index.ts
@@ -0,0 +1,69 @@
+export const LanguageList = [
+ {
+ id: 'de',
+ name: 'Deutsch',
+ flag: '🇩🇪',
+ },
+ {
+ id: 'en',
+ name: 'English',
+ flag: '🇺🇸',
+ },
+ {
+ id: 'es',
+ name: 'Español',
+ flag: '🇪🇸',
+ },
+ {
+ id: 'fr',
+ name: 'Français',
+ flag: '🇫🇷',
+ },
+ {
+ id: 'it',
+ name: 'Italiano',
+ flag: '🇮🇹',
+ },
+ {
+ id: 'ja',
+ name: '日本語',
+ flag: '🇯🇵',
+ },
+ {
+ id: 'ko',
+ name: '한국어',
+ flag: '🇰🇷',
+ },
+ {
+ id: 'nl',
+ name: 'Nederlands',
+ flag: '🇳🇱',
+ },
+ {
+ id: 'pt',
+ name: 'Português',
+ flag: '🇵🇹',
+ },
+ {
+ id: 'ru',
+ name: 'Русский',
+ flag: '🇷🇺',
+ },
+ {
+ id: 'zh-CN',
+ name: '简体中文',
+ flag: '🇨🇳',
+ },
+ {
+ id: 'zh-HK',
+ name: '繁体中文(香港)',
+ flag: '🇭🇰',
+ },
+ {
+ id: 'zh-TW',
+ name: '繁體中文(台湾)',
+ flag: '🇹🇼',
+ },
+];
+
+export const languageId = ['de', 'en', 'es', 'fr', 'it', 'ja', 'ko', 'nl', 'pt', 'ru', 'zh-CN', 'zh-HK', 'zh-TW'];
diff --git a/config/plugin.config.ts b/config/plugin.config.ts
deleted file mode 100644
index 26b7fd5f..00000000
--- a/config/plugin.config.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const pluginConfig = [
- { name: 'search', description: 'Search in internet.' },
- { name: 'fetch', description: 'Fetch website content.' },
-];
diff --git a/config/provider/amazon.ts b/config/provider/amazon.ts
new file mode 100644
index 00000000..643feaab
--- /dev/null
+++ b/config/provider/amazon.ts
@@ -0,0 +1,227 @@
+import { Model } from '@/types/model';
+
+export type AmazonModelId =
+ | 'amazon.titan-text-express-v1'
+ | 'amazon.titan-text-lite-v1'
+ | 'amazon.titan-embed-text-v1'
+ | 'amazon.titan-embed-image-v1'
+ | 'amazon.titan-image-generator-v1'
+ | 'anthropic.claude-v2'
+ | 'anthropic.claude-v2:1'
+ | 'anthropic.claude-3-sonnet-20240229-v1:0'
+ | 'anthropic.claude-3-haiku-20240307-v1:0'
+ | 'anthropic.claude-instant-v1'
+ | 'ai21.j2-mid-v1'
+ | 'ai21.j2-ultra-v1'
+ | 'cohere.command-text-v14'
+ | 'cohere.command-light-text-v14'
+ | 'cohere.embed-english-v3'
+ | 'cohere.embed-multilingual-v3'
+ | 'meta.llama2-13b-chat-v1'
+ | 'meta.llama2-70b-chat-v1'
+ | 'mistral.mistral-7b-instruct-v0:2'
+ | 'mistral.mixtral-8x7b-instruct-v0:1'
+ | 'stability.stable-diffusion-xl-v0'
+ | 'stability.stable-diffusion-xl-v1';
+export type AmazonModelName =
+ | 'Titan Text G1 - Express'
+ | 'Titan Text G1 - Lite'
+ | 'Titan Embeddings G1 - Text'
+ | 'Titan Multimodal Embeddings G1'
+ | 'Titan Image Generator G1'
+ | 'Claude 2'
+ | 'Claude 2.1'
+ | 'Claude 3 Sonnet'
+ | 'Claude 3 Haiku'
+ | 'Claude Instant'
+ | 'Jurassic-2 Mid'
+ | 'Jurassic-2 Ultra'
+ | 'Command'
+ | 'Command Light'
+ | 'Embed English'
+ | 'Embed Multilingual'
+ | 'Llama 2 Chat 13B'
+ | 'Llama 2 Chat 70B'
+ | 'Mistral 7B Instruct'
+ | 'Mixtral 8x7B Instruct'
+ | 'Stable Diffusion XL v0'
+ | 'Stable Diffusion XL v1';
+
+export const model: Model[] = [
+ {
+ id: 'amazon.titan-text-express-v1',
+ name: 'Titan Text G1 - Express',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'amazon.titan-text-lite-v1',
+ name: 'Titan Text G1 - Lite',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'amazon.titan-embed-text-v1',
+ name: 'Titan Embeddings G1 - Text',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'amazon.titan-embed-image-v1',
+ name: 'Titan Multimodal Embeddings G1',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'amazon.titan-image-generator-v1',
+ name: 'Titan Image Generator G1',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'anthropic.claude-v2',
+ name: 'Claude 2',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'anthropic.claude-v2:1',
+ name: 'Claude 2.1',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'anthropic.claude-3-sonnet-20240229-v1:0',
+ name: 'Claude 3 Sonnet',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'anthropic.claude-3-haiku-20240307-v1:0',
+ name: 'Claude 3 Haiku',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 1.5,
+ },
+ {
+ id: 'anthropic.claude-instant-v1',
+ name: 'Claude Instant',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'ai21.j2-mid-v1',
+ name: 'Jurassic-2 Mid',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'ai21.j2-ultra-v1',
+ name: 'Jurassic-2 Ultra',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'cohere.command-text-v14',
+ name: 'Command',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'cohere.command-light-text-v14',
+ name: 'Command Light',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'cohere.embed-english-v3',
+ name: 'Embed English',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'cohere.embed-multilingual-v3',
+ name: 'Embed Multilingual',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'meta.llama2-13b-chat-v1',
+ name: 'Llama 2 Chat 13B',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'meta.llama2-70b-chat-v1',
+ name: 'Llama 2 Chat 70B',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'mistral.mistral-7b-instruct-v0:2',
+ name: 'Mistral 7B Instruct',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'mistral.mixtral-8x7b-instruct-v0:1',
+ name: 'Mixtral 8x7B Instruct',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'stability.stable-diffusion-xl-v0',
+ name: 'Stable Diffusion XL v0',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'stability.stable-diffusion-xl-v1',
+ name: 'Stable Diffusion XL v1',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+];
diff --git a/config/provider/anthropic.ts b/config/provider/anthropic.ts
new file mode 100644
index 00000000..f406c7fb
--- /dev/null
+++ b/config/provider/anthropic.ts
@@ -0,0 +1,61 @@
+import { Model } from '@/types/model';
+
+export type AnthropicModelId = 'claude-3-opus-20240229' | 'claude-3-sonnet-20240229' | 'claude-3-haiku-20240307' | 'claude-2.1' | 'claude-2.0' | 'claude-instant-1.2';
+export type AnthropicModelName = 'Claude 3 Sonnet' | 'Claude 3 Haiku' | 'Claude 3 Opus' | 'Claude 2.1' | 'Claude 2.0' | 'Claude Instant 1.2';
+
+export const model: Model[] = [
+ {
+ id: 'claude-3-sonnet-20240229',
+ name: 'Claude 3 Sonnet',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ vision: true,
+ },
+ {
+ id: 'claude-3-haiku-20240307',
+ name: 'Claude 3 Haiku',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 1.5,
+ vision: true,
+ },
+ {
+ id: 'claude-3-opus-20240229',
+ name: 'Claude 3 Opus',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 90.0,
+ vision: true,
+ },
+ {
+ id: 'claude-2.1',
+ name: 'Claude 2.1',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ vision: false,
+ },
+ {
+ id: 'claude-2.0',
+ name: 'Claude 2.0',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ vision: false,
+ },
+ {
+ id: 'claude-instant-1.2',
+ name: 'Claude Instant 1.2',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ vision: false,
+ },
+];
diff --git a/config/provider/azure.config.ts b/config/provider/azure.config.ts
deleted file mode 100644
index fc8fa245..00000000
--- a/config/provider/azure.config.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export const azureModelConfig = [
- {
- model: 'gpt-4',
- maxTokens: 8192,
- price: 0.06 / 1000,
- },
- {
- model: 'gpt-4-32k',
- maxTokens: 32768,
- price: 0.12 / 1000,
- },
-];
diff --git a/config/provider/azure.ts b/config/provider/azure.ts
new file mode 100644
index 00000000..1cf89dbe
--- /dev/null
+++ b/config/provider/azure.ts
@@ -0,0 +1,101 @@
+import { Model } from '@/types/model';
+
+export type AzureOpenAIModelId =
+ | 'gpt-4'
+ | 'gpt-4-0613'
+ | 'gpt-4-1106-preview'
+ | 'gpt-4-0125-preview'
+ | 'gpt-4-vision-preview'
+ | 'gpt-4-32k-0613'
+ | 'gpt-35-turbo-0301'
+ | 'gpt-35-turbo-0613'
+ | 'gpt-35-turbo-1106'
+ | 'gpt-35-turbo-0125'
+ | 'gpt-35-turbo-16k-0613';
+export type AzureOpenAIModelName =
+ | 'GPT-4'
+ | 'GPT-4 0613'
+ | 'GPT-4 1106 Preview'
+ | 'GPT-4 0125 Preview'
+ | 'GPT-4 Vision Preview'
+ | 'GPT-4 32K 0613'
+ | 'GPT-3.5 Turbo 0301'
+ | 'GPT-3.5 Turbo 0613'
+ | 'GPT-3.5 Turbo 1106'
+ | 'GPT-3.5 Turbo 0125'
+ | 'GPT-3.5 Turbo 16K 0613';
+
+export const model: Model[] = [
+ {
+ id: 'gpt-4',
+ name: 'GPT-4',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-0613',
+ name: 'GPT-4 0613',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-1106-preview',
+ name: 'GPT-4 1106 Preview',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-0125-preview',
+ name: 'GPT-4 0125 Preview',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-vision-preview',
+ name: 'GPT-4 Vision Preview',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-32k-0613',
+ name: 'GPT-4 32K 0613',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-35-turbo-0301',
+ name: 'GPT-3.5 Turbo 0301',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-35-turbo-0613',
+ name: 'GPT-3.5 Turbo 0613',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-35-turbo-1106',
+ name: 'GPT-3.5 Turbo 1106',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18,
+ },
+];
diff --git a/config/provider/claude.config.ts b/config/provider/claude.config.ts
deleted file mode 100644
index 1d1d9c90..00000000
--- a/config/provider/claude.config.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export const claudeModelConfig = [
- {
- model: 'claude-instant-1',
- },
- {
- model: 'claude-2',
- },
-];
diff --git a/config/provider/cohere.config.ts b/config/provider/cohere.config.ts
deleted file mode 100644
index b8eeb1f9..00000000
--- a/config/provider/cohere.config.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const cohereModelConfig = [
- {
- model: 'command-nightly',
- },
-];
diff --git a/config/provider/cohere.ts b/config/provider/cohere.ts
new file mode 100644
index 00000000..3e27d7d5
--- /dev/null
+++ b/config/provider/cohere.ts
@@ -0,0 +1,55 @@
+import { Model } from '@/types/model';
+
+export type CohereModelId = 'command-light' | 'command-light-nightly' | 'command' | 'command-nightly' | 'command-r' | 'command-r-plus';
+export type CohereModelName = 'Command Light' | 'Command Light Nightly' | 'Command' | 'Command Nightly' | 'Command R' | 'Command R +';
+
+export const model: Model[] = [
+ {
+ id: 'command-light',
+ name: 'Command Light',
+ maxInputTokens: 4096,
+ maxOutputTokens: 4096,
+ maxTokens: 4096,
+ price: 18.0,
+ },
+ {
+ id: 'command-light-nightly',
+ name: 'Command Light Nightly',
+ maxInputTokens: 8192,
+ maxOutputTokens: 8192,
+ maxTokens: 8192,
+ price: 1.5,
+ },
+ {
+ id: 'command',
+ name: 'Command',
+ maxInputTokens: 4096,
+ maxOutputTokens: 4096,
+ maxTokens: 4096,
+ price: 90.0,
+ },
+ {
+ id: 'command-nightly',
+ name: 'Command Nightly',
+ maxInputTokens: 8192,
+ maxOutputTokens: 8192,
+ maxTokens: 8192,
+ price: 90.0,
+ },
+ {
+ id: 'command-r',
+ name: 'Command R',
+ maxInputTokens: 128000,
+ maxOutputTokens: 4096,
+ maxTokens: 128000,
+ price: 90.0,
+ },
+ {
+ id: 'command-r-plus',
+ name: 'Command R +',
+ maxInputTokens: 128000,
+ maxOutputTokens: 4096,
+ maxTokens: 128000,
+ price: 90.0,
+ },
+];
diff --git a/config/provider/fireworks.ts b/config/provider/fireworks.ts
new file mode 100644
index 00000000..db014da6
--- /dev/null
+++ b/config/provider/fireworks.ts
@@ -0,0 +1,117 @@
+import { Model } from '@/types/model';
+
+export type FireworksModelId =
+ | 'accounts/fireworks/models/llama-v2-7b'
+ | 'accounts/fireworks/models/llama-v2-7b-chat'
+ | 'accounts/fireworks/models/llama-v2-13b'
+ | 'accounts/fireworks/models/llama-v2-13b-chat'
+ | 'accounts/fireworks/models/llama-v2-34b-code-w8a16'
+ | 'accounts/fireworks/models/llama-v2-70b-chat'
+ | 'accounts/fireworks/models/mistral-7b'
+ | 'accounts/fireworks/models/mistral-7b-instruct-4k'
+ | 'accounts/fireworks/models/zephyr-7b-beta'
+ | 'accounts/fireworks/models/mixtral-8x7b'
+ | 'accounts/fireworks/models/mixtral-8x7b-instruct';
+export type FireworksModelName =
+ | 'LLAMA V2 7B'
+ | 'LLAMA V2 7B Chat'
+ | 'LLAMA V2 13B'
+ | 'LLAMA V2 13B Chat'
+ | 'LLAMA V2 34B Code W8A16'
+ | 'LLAMA V2 70B Chat'
+ | 'Mistral 7B'
+ | 'Mistral 7B Instruct 4K'
+ | 'Zephyr 7B Beta'
+ | 'Mixtral 8x7B'
+ | 'Mixtral 8x7B Instruct';
+
+export const model: Model[] = [
+ {
+ id: 'accounts/fireworks/models/llama-v2-7b',
+ name: 'LLAMA V2 7B',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/llama-v2-7b-chat',
+ name: 'LLAMA V2 7B Chat',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/llama-v2-13b',
+ name: 'LLAMA V2 13B',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/llama-v2-13b-chat',
+ name: 'LLAMA V2 13B Chat',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/llama-v2-34b-code-w8a16',
+ name: 'LLAMA V2 34B Code W8A16',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/llama-v2-70b-chat',
+ name: 'LLAMA V2 70B Chat',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/mistral-7b',
+ name: 'Mistral 7B',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/mistral-7b-instruct-4k',
+ name: 'Mistral 7B Instruct 4K',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/zephyr-7b-beta',
+ name: 'Zephyr 7B Beta',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/mixtral-8x7b',
+ name: 'Mixtral 8x7B',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'accounts/fireworks/models/mixtral-8x7b-instruct',
+ name: 'Mixtral 8x7B Instruct',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+];
diff --git a/config/provider/google.ts b/config/provider/google.ts
new file mode 100644
index 00000000..1242cd86
--- /dev/null
+++ b/config/provider/google.ts
@@ -0,0 +1,23 @@
+import { Model } from '@/types/model';
+
+export type GoogleModelId = 'gemini-1.5-pro-latest' | 'gemini-pro';
+export type GoogleModelName = 'Gemini 1.5 Pro' | 'Gemini Pro';
+
+export const model: Model[] = [
+ {
+ id: 'gemini-pro',
+ name: 'Gemini Pro',
+ maxInputTokens: 30720,
+ maxOutputTokens: 2048,
+ maxTokens: 1000,
+ price: 0.06,
+ },
+ {
+ id: 'gemini-1.5-pro-latest',
+ name: 'Gemini 1.5 Pro',
+ maxInputTokens: 1048576,
+ maxOutputTokens: 8192,
+ maxTokens: 1000,
+ price: 0.06,
+ },
+];
diff --git a/config/provider/groq.ts b/config/provider/groq.ts
new file mode 100644
index 00000000..df305025
--- /dev/null
+++ b/config/provider/groq.ts
@@ -0,0 +1,31 @@
+import { Model } from '@/types/model';
+
+export type GroqModelId = 'llama2-70b-4096' | 'mixtral-8x7b-32768' | 'gemma-7b-it';
+export type GroqModelName = 'LLaMA2 70b Chat' | 'Mixtral 8x7b Instruct v0.1' | 'Gemma 7b it';
+
+export const model: Model[] = [
+ {
+ id: 'llama2-70b-4096',
+ name: 'LLaMA2 70b Chat',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: 4096,
+ price: 0.06,
+ },
+ {
+ id: 'mixtral-8x7b-32768',
+ name: 'Mixtral 8x7b Instruct v0.1',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: 32768,
+ price: 0.06,
+ },
+ {
+ id: 'gemma-7b-it',
+ name: 'Gemma 7b it',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: 8192,
+ price: 0.06,
+ },
+];
diff --git a/config/provider/huggingface.config.ts b/config/provider/huggingface.config.ts
deleted file mode 100644
index efe1417a..00000000
--- a/config/provider/huggingface.config.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-export const huggingFaceModelConfig = [
- {
- model: 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5',
- reference: 'https://huggingface.co/OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5',
- },
- {
- model: 'EleutherAI/gpt-neox-20b',
- reference: 'https://huggingface.co/EleutherAI/gpt-neox-20b',
- },
- {
- model: 'bigscience/bloomz',
- reference: 'https://huggingface.co/bigscience/bloomz',
- },
-];
diff --git a/config/provider/huggingface.ts b/config/provider/huggingface.ts
new file mode 100644
index 00000000..cd58a864
--- /dev/null
+++ b/config/provider/huggingface.ts
@@ -0,0 +1,15 @@
+import { Model } from '@/types/model';
+
+export type HuggingFaceModelId = 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5';
+export type HuggingFaceModelName = 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5';
+
+export const model: Model[] = [
+ {
+ id: 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5',
+ name: 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+];
diff --git a/config/provider/index.ts b/config/provider/index.ts
new file mode 100644
index 00000000..a72dabd0
--- /dev/null
+++ b/config/provider/index.ts
@@ -0,0 +1,107 @@
+import { AmazonModelId, AmazonModelName } from '@/config/provider/amazon';
+import { AnthropicModelId, AnthropicModelName } from '@/config/provider/anthropic';
+import { AzureOpenAIModelId, AzureOpenAIModelName } from '@/config/provider/azure';
+import { CohereModelId, CohereModelName } from '@/config/provider/cohere';
+import { FireworksModelId, FireworksModelName } from '@/config/provider/fireworks';
+import { GoogleModelId, GoogleModelName } from '@/config/provider/google';
+import { GroqModelId, GroqModelName } from '@/config/provider/groq';
+import { HuggingFaceModelId, HuggingFaceModelName } from '@/config/provider/huggingface';
+import { MistralModelId, MistralModelName } from '@/config/provider/mistral';
+import { OpenAIModelId, OpenAIModelName } from '@/config/provider/openai';
+import { PerplexityModelId, PerplexityModelName } from '@/config/provider/perplexity';
+
+export type AllModelId =
+ | AmazonModelId
+ | AnthropicModelId
+ | AzureOpenAIModelId
+ | CohereModelId
+ | FireworksModelId
+ | GroqModelId
+ | HuggingFaceModelId
+ | MistralModelId
+ | GoogleModelId
+ | OpenAIModelId
+ | PerplexityModelId;
+
+export type AllModelName =
+ | AmazonModelName
+ | AnthropicModelName
+ | AzureOpenAIModelName
+ | CohereModelName
+ | FireworksModelName
+ | GroqModelName
+ | HuggingFaceModelName
+ | MistralModelName
+ | GoogleModelName
+ | OpenAIModelName
+ | PerplexityModelName;
+
+export enum Provider {
+ Amazon = 'Amazon',
+ OpenAI = 'OpenAI',
+ Google = 'Google',
+ Anthropic = 'Anthropic',
+ Azure = 'Azure',
+ Cohere = 'Cohere',
+ Fireworks = 'Fireworks',
+ Groq = 'Groq',
+ HuggingFace = 'HuggingFace',
+ Mistral = 'Mistral',
+ Perplexity = 'Perplexity',
+
+ Custom = 'Custom',
+}
+
+export const Providers: {
+ id: string;
+ name: Provider;
+}[] = [
+ {
+ id: 'amazon',
+ name: Provider.Amazon,
+ },
+ {
+ id: 'openai',
+ name: Provider.OpenAI,
+ },
+ {
+ id: 'google',
+ name: Provider.Google,
+ },
+ {
+ id: 'anthropic',
+ name: Provider.Anthropic,
+ },
+ {
+ id: 'azure',
+ name: Provider.Azure,
+ },
+ {
+ id: 'cohere',
+ name: Provider.Cohere,
+ },
+ {
+ id: 'fireworks',
+ name: Provider.Fireworks,
+ },
+ {
+ id: 'groq',
+ name: Provider.Groq,
+ },
+ {
+ id: 'huggingface',
+ name: Provider.HuggingFace,
+ },
+ {
+ id: 'mistral',
+ name: Provider.Mistral,
+ },
+ {
+ id: 'perplexity',
+ name: Provider.Perplexity,
+ },
+ {
+ id: 'custom',
+ name: Provider.Custom,
+ },
+];
diff --git a/config/provider/mistral.ts b/config/provider/mistral.ts
new file mode 100644
index 00000000..cb00a7ec
--- /dev/null
+++ b/config/provider/mistral.ts
@@ -0,0 +1,47 @@
+import { Model } from '@/types/model';
+
+export type MistralModelId = 'open-mistral-7b' | 'open-mixtral-8x7b' | 'mistral-small-latest' | 'mistral-medium-latest' | 'mistral-large-latest';
+export type MistralModelName = 'open-mistral-7b' | 'open-mixtral-8x7b' | 'mistral-small-latest' | 'mistral-medium-latest' | 'mistral-large-latest';
+
+export const model: Model[] = [
+ {
+ id: 'open-mistral-7b',
+ name: 'open-mistral-7b',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'open-mixtral-8x7b',
+ name: 'open-mixtral-8x7b',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'mistral-small-latest',
+ name: 'mistral-small-latest',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'mistral-medium-latest',
+ name: 'mistral-medium-latest',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'mistral-large-latest',
+ name: 'mistral-large-latest',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+];
diff --git a/config/provider/openai.config.ts b/config/provider/openai.config.ts
deleted file mode 100644
index 7c40d95d..00000000
--- a/config/provider/openai.config.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-interface openAIModelConfig {
- model: OpenAIModel;
- maxTokens: number;
- price: number;
-}
-
-export const openAIModelConfig: openAIModelConfig[] = [
- {
- model: 'gpt-4',
- maxTokens: 8192,
- price: 0.06 / 1000,
- },
- {
- model: 'gpt-4-0613',
- maxTokens: 8192,
- price: 0.06 / 1000,
- },
- {
- model: 'gpt-4-0125-preview',
- maxTokens: 128000,
- price: 0.03 / 1000,
- },
- {
- model: 'gpt-4-1106-preview',
- maxTokens: 128000,
- price: 0.03 / 1000,
- },
- {
- model: 'gpt-4-vision-preview',
- maxTokens: 128000,
- price: 0.03 / 1000,
- },
- {
- model: 'gpt-4-32k',
- maxTokens: 32768,
- price: 0.12 / 1000,
- },
- {
- model: 'gpt-4-32k-0613',
- maxTokens: 32768,
- price: 0.12 / 1000,
- },
- {
- model: 'gpt-3.5-turbo',
- maxTokens: 4096,
- price: 0.002 / 1000,
- },
- {
- model: 'gpt-3.5-turbo-16k',
- maxTokens: 16385,
- price: 0.004 / 1000,
- },
- {
- model: 'gpt-3.5-turbo-1106',
- maxTokens: 16385,
- price: 0.003 / 1000,
- },
- {
- model: 'gpt-3.5-turbo-instruct',
- maxTokens: 4096,
- price: 0.0035 / 1000,
- },
-];
diff --git a/config/provider/openai.ts b/config/provider/openai.ts
new file mode 100644
index 00000000..da0b6d84
--- /dev/null
+++ b/config/provider/openai.ts
@@ -0,0 +1,112 @@
+import { Model } from '@/types/model';
+
+export type OpenAIModelId =
+ | 'gpt-4'
+ | 'gpt-4-0613'
+ | 'gpt-4-1106-preview'
+ | 'gpt-4-0125-preview'
+ | 'gpt-4-vision-preview'
+ | 'gpt-4-32k-0613'
+ | 'gpt-3.5-turbo'
+ | 'gpt-3.5-turbo-0301'
+ | 'gpt-3.5-turbo-0613'
+ | 'gpt-3.5-turbo-1106'
+ | 'gpt-3.5-turbo-0125'
+ | 'gpt-3.5-turbo-16k-0613';
+export type OpenAIModelName =
+ | 'GPT-4'
+ | 'GPT-4 0613'
+ | 'GPT-4 1106 Preview'
+ | 'GPT-4 0125 Preview'
+ | 'GPT-4 Vision Preview'
+ | 'GPT-4 32K 0613'
+ | 'GPT-3.5 Turbo'
+ | 'GPT-3.5 Turbo 0301'
+ | 'GPT-3.5 Turbo 0613'
+ | 'GPT-3.5 Turbo 1106'
+ | 'GPT-3.5 Turbo 0125'
+ | 'GPT-3.5 Turbo 16K 0613';
+
+export const model: Model[] = [
+ {
+ id: 'gpt-4',
+ name: 'GPT-4',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-0613',
+ name: 'GPT-4 0613',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-1106-preview',
+ name: 'GPT-4 1106 Preview',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-0125-preview',
+ name: 'GPT-4 0125 Preview',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-4-vision-preview',
+ name: 'GPT-4 Vision Preview',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ vision: true,
+ },
+ {
+ id: 'gpt-4-32k-0613',
+ name: 'GPT-4 32K 0613',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-3.5-turbo',
+ name: 'GPT-3.5 Turbo',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 16385,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-3.5-turbo-0301',
+ name: 'GPT-3.5 Turbo 0301',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-3.5-turbo-0613',
+ name: 'GPT-3.5 Turbo 0613',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18.0,
+ },
+ {
+ id: 'gpt-3.5-turbo-1106',
+ name: 'GPT-3.5 Turbo 1106',
+ maxInputTokens: null,
+ maxOutputTokens: 4096,
+ maxTokens: 200000,
+ price: 18,
+ },
+];
diff --git a/config/provider/perplexity.ts b/config/provider/perplexity.ts
new file mode 100644
index 00000000..1d2c5ab8
--- /dev/null
+++ b/config/provider/perplexity.ts
@@ -0,0 +1,55 @@
+import { Model } from '@/types/model';
+
+export type PerplexityModelId = 'sonar-small-chat' | 'sonar-small-online' | 'sonar-medium-chat' | 'sonar-medium-online' | 'mistral-7b-instruct' | 'mixtral-8x7b-instruct';
+export type PerplexityModelName = 'Sonar Small Chat' | 'Sonar Small Online' | 'Sonar Medium Chat' | 'Sonar Medium Online' | 'Mistral 7B Instruct' | 'Mixtral 8x7B Instruct';
+
+export const model: Model[] = [
+ {
+ id: 'sonar-small-chat',
+ name: 'Sonar Small Chat',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'sonar-small-online',
+ name: 'Sonar Small Online',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'sonar-medium-chat',
+ name: 'Sonar Medium Chat',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'sonar-medium-online',
+ name: 'Sonar Medium Online',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'mistral-7b-instruct',
+ name: 'Mistral 7B Instruct',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+ {
+ id: 'mixtral-8x7b-instruct',
+ name: 'Mixtral 8x7B Instruct',
+ maxInputTokens: null,
+ maxOutputTokens: null,
+ maxTokens: null,
+ price: null,
+ },
+];
diff --git a/config/search/index.ts b/config/search/index.ts
new file mode 100644
index 00000000..a7505bf7
--- /dev/null
+++ b/config/search/index.ts
@@ -0,0 +1,18 @@
+export enum SearchEngine {
+ Google = 'Google',
+ Tavily = 'Tavily',
+}
+
+export const SearchEngines: {
+ id: string;
+ name: SearchEngine;
+}[] = [
+ {
+ id: 'google',
+ name: SearchEngine.Google,
+ },
+ {
+ id: 'tavily',
+ name: SearchEngine.Tavily,
+ },
+];
diff --git a/config/search/question.ts b/config/search/question.ts
new file mode 100644
index 00000000..8b83be07
--- /dev/null
+++ b/config/search/question.ts
@@ -0,0 +1,1537 @@
+import { TLocale } from '@/types/i18n';
+
+export const en_questions = [
+ {
+ question: 'Who is the president of the United States?',
+ value: 'Who is the president of the United States?',
+ },
+ {
+ question: 'How many planets are in the Solar System?',
+ value: 'How many planets are in the Solar System?',
+ },
+ {
+ question: 'What is the largest ocean in the world?',
+ value: 'What is the largest ocean in the world?',
+ },
+ {
+ question: 'Who invented the telephone?',
+ value: 'Who invented the telephone?',
+ },
+ {
+ question: 'How many sides does a square have?',
+ value: 'How many sides does a square have?',
+ },
+ {
+ question: 'What is the capital city of Australia?',
+ value: 'What is the capital city of Australia?',
+ },
+ {
+ question: 'Who wrote the novel "To Kill a Mockingbird"?',
+ value: 'Who wrote the novel "To Kill a Mockingbird"?',
+ },
+ {
+ question: 'How many bones are in the human body?',
+ value: 'How many bones are in the human body?',
+ },
+ {
+ question: 'What is the largest mammal in the world?',
+ value: 'What is the largest mammal in the world?',
+ },
+ {
+ question: 'Who was the first president of the United States?',
+ value: 'Who was the first president of the United States?',
+ },
+ {
+ question: 'How many colors are in a rainbow?',
+ value: 'How many colors are in a rainbow?',
+ },
+ {
+ question: 'What is the largest planet in the Solar System?',
+ value: 'What is the largest planet in the Solar System?',
+ },
+ {
+ question: 'Who is the founder of Apple Inc.?',
+ value: 'Who is the founder of Apple Inc.?',
+ },
+ {
+ question: 'How many rings are on the Olympic flag?',
+ value: 'How many rings are on the Olympic flag?',
+ },
+ {
+ question: 'What is the largest continent in the world?',
+ value: 'What is the largest continent in the world?',
+ },
+ {
+ question: 'Who is the author of the "Harry Potter" book series?',
+ value: 'Who is the author of the "Harry Potter" book series?',
+ },
+ {
+ question: 'How many days are in a year?',
+ value: 'How many days are in a year?',
+ },
+ {
+ question: 'What is the longest river in the world?',
+ value: 'What is the longest river in the world?',
+ },
+ {
+ question: 'Who is the founder of Microsoft?',
+ value: 'Who is the founder of Microsoft?',
+ },
+ {
+ question: 'How many planets in the Solar System have rings?',
+ value: 'How many planets in the Solar System have rings?',
+ },
+ {
+ question: 'What is the tallest mountain in the world?',
+ value: 'What is the tallest mountain in the world?',
+ },
+ {
+ question: 'Who was the first person to walk on the Moon?',
+ value: 'Who was the first person to walk on the Moon?',
+ },
+ {
+ question: 'How many sides does a hexagon have?',
+ value: 'How many sides does a hexagon have?',
+ },
+ {
+ question: 'What is the capital city of Canada?',
+ value: 'What is the capital city of Canada?',
+ },
+ {
+ question: 'Who is the author of the novel "1984"?',
+ value: 'Who is the author of the novel "1984"?',
+ },
+ {
+ question: 'How many planets are in the Milky Way galaxy?',
+ value: 'How many planets are in the Milky Way galaxy?',
+ },
+ {
+ question: 'What is the largest ocean on Earth?',
+ value: 'What is the largest ocean on Earth?',
+ },
+ {
+ question: 'Who is the founder of Amazon?',
+ value: 'Who is the founder of Amazon?',
+ },
+ {
+ question: 'How many sides does a pentagon have?',
+ value: 'How many sides does a pentagon have?',
+ },
+ {
+ question: 'What is the currency used in the United Kingdom?',
+ value: 'What is the currency used in the United Kingdom?',
+ },
+ {
+ question: 'Who is the author of the "Lord of the Rings" book series?',
+ value: 'Who is the author of the "Lord of the Rings" book series?',
+ },
+ {
+ question: 'How many planets in the Solar System are classified as "dwarf planets"?',
+ value: 'How many planets in the Solar System are classified as "dwarf planets"?',
+ },
+ {
+ question: 'What is the largest mammal in the ocean?',
+ value: 'What is the largest mammal in the ocean?',
+ },
+ {
+ question: 'Who is the founder of Tesla?',
+ value: 'Who is the founder of Tesla?',
+ },
+ {
+ question: 'How many sides does a triangle have?',
+ value: 'How many sides does a triangle have?',
+ },
+ {
+ question: 'What is the capital city of France?',
+ value: 'What is the capital city of France?',
+ },
+ {
+ question: 'Who is the author of the novel "Pride and Prejudice"?',
+ value: 'Who is the author of the novel "Pride and Prejudice"?',
+ },
+ {
+ question: 'How many planets are in the Solar System?',
+ value: 'How many planets are in the Solar System?',
+ },
+ {
+ question: 'What is the largest animal on Earth?',
+ value: 'What is the largest animal on Earth?',
+ },
+ {
+ question: 'Who is the founder of Google?',
+ value: 'Who is the founder of Google?',
+ },
+ {
+ question: 'How many layers are in the human skin?',
+ value: 'How many layers are in the human skin?',
+ },
+ {
+ question: 'What is the capital city of Italy?',
+ value: 'What is the capital city of Italy?',
+ },
+ {
+ question: 'Who is the author of the novel "The Great Gatsby"?',
+ value: 'Who is the author of the novel "The Great Gatsby"?',
+ },
+ {
+ question: 'How many planets in the Solar System are considered "terrestrial planets"?',
+ value: 'How many planets in the Solar System are considered "terrestrial planets"?',
+ },
+ {
+ question: 'What is the largest desert in the world?',
+ value: 'What is the largest desert in the world?',
+ },
+ {
+ question: 'Who is the founder of Coca-Cola?',
+ value: 'Who is the founder of Coca-Cola?',
+ },
+ {
+ question: 'How many planets in the Solar System have moons?',
+ value: 'How many planets in the Solar System have moons?',
+ },
+ {
+ question: 'What is the capital city of Japan?',
+ value: 'What is the capital city of Japan?',
+ },
+ {
+ question: 'Who is the author of the novel "The Catcher in the Rye"?',
+ value: 'Who is the author of the novel "The Catcher in the Rye"?',
+ },
+ {
+ question: 'How many planets in the Solar System are considered "gas giants"?',
+ value: 'How many planets in the Solar System are considered "gas giants"?',
+ },
+ {
+ question: 'What is the largest continent by land area?',
+ value: 'What is the largest continent by land area?',
+ },
+ {
+ question: 'Who is the founder of Nike?',
+ value: 'Who is the founder of Nike?',
+ },
+ {
+ question: 'How many planets in the Solar System are classified as "inner planets"?',
+ value: 'How many planets in the Solar System are classified as "inner planets"?',
+ },
+ {
+ question: 'What is the capital city of Germany?',
+ value: 'What is the capital city of Germany?',
+ },
+ {
+ question: 'Who is the author of the novel "Brave New World"?',
+ value: 'Who is the author of the novel "Brave New World"?',
+ },
+ {
+ question: 'How many planets in the Solar System are classified as "outer planets"?',
+ value: 'How many planets in the Solar System are classified as "outer planets"?',
+ },
+ {
+ question: 'What is the longest river in Africa?',
+ value: 'What is the longest river in Africa?',
+ },
+ {
+ question: "Who is the founder of McDonald's?",
+ value: "Who is the founder of McDonald's?",
+ },
+ {
+ question: 'How many planets in the Solar System are classified as "rocky planets"?',
+ value: 'How many planets in the Solar System are classified as "rocky planets"?',
+ },
+ {
+ question: 'What is the capital city of Spain?',
+ value: 'What is the capital city of Spain?',
+ },
+ {
+ question: 'Who is the author of the novel "One Hundred Years of Solitude"?',
+ value: 'Who is the author of the novel "One Hundred Years of Solitude"?',
+ },
+ {
+ question: 'How many planets in the Solar System have an atmosphere?',
+ value: 'How many planets in the Solar System have an atmosphere?',
+ },
+];
+
+export const zh_CN_questions = [
+ {
+ question: '肯德基的创始人是谁?',
+ value: '肯德基的创始人是谁?',
+ },
+ {
+ question: '美国总统是谁?',
+ value: '美国总统是谁?',
+ },
+ {
+ question: '太阳系有多少颗行星?',
+ value: '太阳系有多少颗行星?',
+ },
+ {
+ question: '世界最大的海洋是哪个?',
+ value: '世界最大的海洋是哪个?',
+ },
+ {
+ question: '谁发明了电话?',
+ value: '谁发明了电话?',
+ },
+ {
+ question: '正方形有多少条边?',
+ value: '正方形有多少条边?',
+ },
+ {
+ question: '澳大利亚的首都是哪里?',
+ value: '澳大利亚的首都是哪里?',
+ },
+ {
+ question: '谁写了小说《杀死一只知更鸟》?',
+ value: '谁写了小说《杀死一只知更鸟》?',
+ },
+ {
+ question: '人体有多少块骨头?',
+ value: '人体有多少块骨头?',
+ },
+ {
+ question: '世界最大的哺乳动物是什么?',
+ value: '世界最大的哺乳动物是什么?',
+ },
+ {
+ question: '美国第一任总统是谁?',
+ value: '美国第一任总统是谁?',
+ },
+ {
+ question: '彩虹有多少种颜色?',
+ value: '彩虹有多少种颜色?',
+ },
+ {
+ question: '太阳系中最大的行星是哪个?',
+ value: '太阳系中最大的行星是哪个?',
+ },
+ {
+ question: '苹果公司的创始人是谁?',
+ value: '苹果公司的创始人是谁?',
+ },
+ {
+ question: '奥运会旗帜上有多少个环?',
+ value: '奥运会旗帜上有多少个环?',
+ },
+ {
+ question: '世界最大的洲是哪个?',
+ value: '世界最大的洲是哪个?',
+ },
+ {
+ question: '谁是《哈利·波特》系列小说的作者?',
+ value: '谁是《哈利·波特》系列小说的作者?',
+ },
+ {
+ question: '一年有多少天?',
+ value: '一年有多少天?',
+ },
+ {
+ question: '世界最长的河流是哪条?',
+ value: '世界最长的河流是哪条?',
+ },
+ {
+ question: '微软的创始人是谁?',
+ value: '微软的创始人是谁?',
+ },
+ {
+ question: '太阳系有多少颗行星有环?',
+ value: '太阳系有多少颗行星有环?',
+ },
+ {
+ question: '世界最高的山峰是哪座?',
+ value: '世界最高的山峰是哪座?',
+ },
+ {
+ question: '第一个登陆月球的人是谁?',
+ value: '第一个登陆月球的人是谁?',
+ },
+ {
+ question: '正六边形有多少条边?',
+ value: '正六边形有多少条边?',
+ },
+ {
+ question: '加拿大的首都是哪里?',
+ value: '加拿大的首都是哪里?',
+ },
+ {
+ question: '谁写了小说《1984》?',
+ value: '谁写了小说《1984》?',
+ },
+ {
+ question: '银河系有多少颗行星?',
+ value: '银河系有多少颗行星?',
+ },
+ {
+ question: '地球上最大的海洋是哪个?',
+ value: '地球上最大的海洋是哪个?',
+ },
+ {
+ question: '亚马逊的创始人是谁?',
+ value: '亚马逊的创始人是谁?',
+ },
+ {
+ question: '正五边形有多少条边?',
+ value: '正五边形有多少条边?',
+ },
+ {
+ question: '英国使用的货币是什么?',
+ value: '英国使用的货币是什么?',
+ },
+ {
+ question: '谁写了《指环王》系列小说?',
+ value: '谁写了《指环王》系列小说?',
+ },
+ {
+ question: '太阳系有多少颗"矮行星"?',
+ value: '太阳系有多少颗"矮行星"?',
+ },
+ {
+ question: '海洋中最大的哺乳动物是什么?',
+ value: '海洋中最大的哺乳动物是什么?',
+ },
+ {
+ question: '特斯拉的创始人是谁?',
+ value: '特斯拉的创始人是谁?',
+ },
+ {
+ question: '三角形有多少条边?',
+ value: '三角形有多少条边?',
+ },
+ {
+ question: '法国的首都是哪里?',
+ value: '法国的首都是哪里?',
+ },
+ {
+ question: '谁写了小说《傲慢与偏见》?',
+ value: '谁写了小说《傲慢与偏见》?',
+ },
+ {
+ question: '太阳系有多少颗行星?',
+ value: '太阳系有多少颗行星?',
+ },
+ {
+ question: '世界上最大的动物是什么?',
+ value: '世界上最大的动物是什么?',
+ },
+ {
+ question: 'Google的创始人是谁?',
+ value: 'Google的创始人是谁?',
+ },
+ {
+ question: '人体皮肤有多少层?',
+ value: '人体皮肤有多少层?',
+ },
+ {
+ question: '意大利的首都是哪里?',
+ value: '意大利的首都是哪里?',
+ },
+ {
+ question: '谁写了小说《了不起的盖茨比》?',
+ value: '谁写了小说《了不起的盖茨比》?',
+ },
+ {
+ question: '太阳系有多少颗"地球类行星"?',
+ value: '太阳系有多少颗"地球类行星"?',
+ },
+ {
+ question: '世界最大的沙漠是哪个?',
+ value: '世界最大的沙漠是哪个?',
+ },
+ {
+ question: '可口可乐的创始人是谁?',
+ value: '可口可乐的创始人是谁?',
+ },
+ {
+ question: '太阳系有多少颗行星有卫星?',
+ value: '太阳系有多少颗行星有卫星?',
+ },
+ {
+ question: '日本的首都是哪里?',
+ value: '日本的首都是哪里?',
+ },
+ {
+ question: '谁写了小说《麦田里的守望者》?',
+ value: '谁写了小说《麦田里的守望者》?',
+ },
+ {
+ question: '太阳系有多少颗"气体巨行星"?',
+ value: '太阳系有多少颗"气体巨行星"?',
+ },
+ {
+ question: '面积最大的洲是哪个?',
+ value: '面积最大的洲是哪个?',
+ },
+ {
+ question: 'Nike的创始人是谁?',
+ value: 'Nike的创始人是谁?',
+ },
+ {
+ question: '太阳系有多少颗"内行星"?',
+ value: '太阳系有多少颗"内行星"?',
+ },
+ {
+ question: '德国的首都是哪里?',
+ value: '德国的首都是哪里?',
+ },
+ {
+ question: '谁写了小说《美丽新世界》?',
+ value: '谁写了小说《美丽新世界》?',
+ },
+ {
+ question: '太阳系有多少颗"外行星"?',
+ value: '太阳系有多少颗"外行星"?',
+ },
+ {
+ question: '非洲最长的河流是哪条?',
+ value: '非洲最长的河流是哪条?',
+ },
+ {
+ question: '麦当劳的创始人是谁?',
+ value: '麦当劳的创始人是谁?',
+ },
+ {
+ question: '太阳系有多少颗"岩石类行星"?',
+ value: '太阳系有多少颗"岩石类行星"?',
+ },
+ {
+ question: '西班牙的首都是哪里?',
+ value: '西班牙的首都是哪里?',
+ },
+ {
+ question: '谁写了小说《百年孤独》?',
+ value: '谁写了小说《百年孤独》?',
+ },
+ {
+ question: '太阳系有多少颗行星有大气层?',
+ value: '太阳系有多少颗行星有大气层?',
+ },
+];
+
+export const zh_HK_questions = [
+ {
+ question: '肯德基嘅創辦人係邊個?',
+ value: '肯德基嘅創辦人係邊個?',
+ },
+ {
+ question: '美國總統係邊個?',
+ value: '美國總統係邊個?',
+ },
+ {
+ question: '太陽系有幾多個行星?',
+ value: '太陽系有幾多個行星?',
+ },
+ {
+ question: '世界最大嘅海洋係邊個?',
+ value: '世界最大嘅海洋係邊個?',
+ },
+ {
+ question: '邊個發明咗電話?',
+ value: '邊個發明咗電話?',
+ },
+ {
+ question: '正方形有幾多條邊?',
+ value: '正方形有幾多條邊?',
+ },
+ {
+ question: '澳大利亞嘅首都係邊裏?',
+ value: '澳大利亞嘅首都係邊裏?',
+ },
+ {
+ question: '邊個寫咗小說《消失的鳳毛麟角》?',
+ value: '邊個寫咗小說《消失的鳳毛麟角》?',
+ },
+ {
+ question: '人體有幾多塊骨頭?',
+ value: '人體有幾多塊骨頭?',
+ },
+ {
+ question: '世界最大嘅哺乳動物係乜?',
+ value: '世界最大嘅哺乳動物係乜?',
+ },
+ {
+ question: '美國第一任總統係邊個?',
+ value: '美國第一任總統係邊個?',
+ },
+ {
+ question: '彩虹有幾多種顏色?',
+ value: '彩虹有幾多種顏色?',
+ },
+ {
+ question: '太陽系中最大嘅行星係邊個?',
+ value: '太陽系中最大嘅行星係邊個?',
+ },
+ {
+ question: 'Apple公司嘅創辦人係邊個?',
+ value: 'Apple公司嘅創辦人係邊個?',
+ },
+ {
+ question: '奧運會旗幟上有幾多個環?',
+ value: '奧運會旗幟上有幾多個環?',
+ },
+ {
+ question: '世界最大嘅洲係邊個?',
+ value: '世界最大嘅洲係邊個?',
+ },
+ {
+ question: '邊個係《哈利·波特》書系嘅作者?',
+ value: '邊個係《哈利·波特》書系嘅作者?',
+ },
+ {
+ question: '一年有幾多日?',
+ value: '一年有幾多日?',
+ },
+ {
+ question: '世界最長嘅河係邊條?',
+ value: '世界最長嘅河係邊條?',
+ },
+ {
+ question: 'Microsoft嘅創辦人係邊個?',
+ value: 'Microsoft嘅創辦人係邊個?',
+ },
+ {
+ question: '太陽系有幾多個行星有環?',
+ value: '太陽系有幾多個行星有環?',
+ },
+ {
+ question: '世界最高嘅山係邊座?',
+ value: '世界最高嘅山係邊座?',
+ },
+ {
+ question: '首個登陸月球嘅人係邊個?',
+ value: '首個登陸月球嘅人係邊個?',
+ },
+ {
+ question: '正六邊形有幾多條邊?',
+ value: '正六邊形有幾多條邊?',
+ },
+ {
+ question: '加拿大嘅首都係邊裏?',
+ value: '加拿大嘅首都係邊裏?',
+ },
+ {
+ question: '邊個寫咗小說《1984》?',
+ value: '邊個寫咗小說《1984》?',
+ },
+ {
+ question: '銀河系有幾多個行星?',
+ value: '銀河系有幾多個行星?',
+ },
+ {
+ question: '地球上最大嘅海洋係邊個?',
+ value: '地球上最大嘅海洋係邊個?',
+ },
+ {
+ question: 'Amazon嘅創辦人係邊個?',
+ value: 'Amazon嘅創辦人係邊個?',
+ },
+ {
+ question: '正五邊形有幾多條邊?',
+ value: '正五邊形有幾多條邊?',
+ },
+ {
+ question: '英國用嘅貨幣係乜?',
+ value: '英國用嘅貨幣係乜?',
+ },
+ {
+ question: '邊個寫咗《指環王》書系?',
+ value: '邊個寫咗《指環王》書系?',
+ },
+ {
+ question: '太陽系有幾多個"矮行星"?',
+ value: '太陽系有幾多個"矮行星"?',
+ },
+ {
+ question: '海洋中最大嘅哺乳動物係乜?',
+ value: '海洋中最大嘅哺乳動物係乜?',
+ },
+ {
+ question: 'Tesla嘅創辦人係邊個?',
+ value: 'Tesla嘅創辦人係邊個?',
+ },
+ {
+ question: '三角形有幾多條邊?',
+ value: '三角形有幾多條邊?',
+ },
+ {
+ question: '法國嘅首都係邊裏?',
+ value: '法國嘅首都係邊裏?',
+ },
+ {
+ question: '邊個寫咗小說《傲慢與偏見》?',
+ value: '邊個寫咗小說《傲慢與偏見》?',
+ },
+ {
+ question: '太陽系有幾多個行星?',
+ value: '太陽系有幾多個行星?',
+ },
+ {
+ question: '世界上最大嘅動物係乜?',
+ value: '世界上最大嘅動物係乜?',
+ },
+ {
+ question: 'Google嘅創辦人係邊個?',
+ value: 'Google嘅創辦人係邊個?',
+ },
+ {
+ question: '人體皮膚有幾多層?',
+ value: '人體皮膚有幾多層?',
+ },
+ {
+ question: '意大利嘅首都係邊裏?',
+ value: '意大利嘅首都係邊裏?',
+ },
+ {
+ question: '邊個寫咗小說《偉大的蓋茨比》?',
+ value: '邊個寫咗小說《偉大的蓋茨比》?',
+ },
+ {
+ question: '太陽系有幾多個"地球型行星"?',
+ value: '太陽系有幾多個"地球型行星"?',
+ },
+ {
+ question: '世界最大嘅沙漠係邊個?',
+ value: '世界最大嘅沙漠係邊個?',
+ },
+ {
+ question: 'Coca-Cola嘅創辦人係邊個?',
+ value: 'Coca-Cola嘅創辦人係邊個?',
+ },
+ {
+ question: '太陽系有幾多個行星有衛星?',
+ value: '太陽系有幾多個行星有衛星?',
+ },
+ {
+ question: '日本嘅首都係邊裏?',
+ value: '日本嘅首都係邊裏?',
+ },
+ {
+ question: '邊個寫咗小說《麥田捕手》?',
+ value: '邊個寫咗小說《麥田捕手》?',
+ },
+ {
+ question: '太陽系有幾多個"氣體巨行星"?',
+ value: '太陽系有幾多個"氣體巨行星"?',
+ },
+ {
+ question: '面積最大嘅洲係邊個?',
+ value: '面積最大嘅洲係邊個?',
+ },
+ {
+ question: 'Nike嘅創辦人係邊個?',
+ value: 'Nike嘅創辦人係邊個?',
+ },
+ {
+ question: '太陽系有幾多個"內行星"?',
+ value: '太陽系有幾多個"內行星"?',
+ },
+ {
+ question: '德國嘅首都係邊裏?',
+ value: '德國嘅首都係邊裏?',
+ },
+ {
+ question: '邊個寫咗小說《美麗新世界》?',
+ value: '邊個寫咗小說《美麗新世界》?',
+ },
+ {
+ question: '太陽系有幾多個"外行星"?',
+ value: '太陽系有幾多個"外行星"?',
+ },
+ {
+ question: '非洲最長嘅河係邊條?',
+ value: '非洲最長嘅河係邊條?',
+ },
+ {
+ question: "McDonald's嘅創辦人係邊個?",
+ value: "McDonald's嘅創辦人係邊個?",
+ },
+ {
+ question: '太陽系有幾多個"岩石類行星"?',
+ value: '太陽系有幾多個"岩石類行星"?',
+ },
+ {
+ question: '西班牙嘅首都係邊裏?',
+ value: '西班牙嘅首都係邊裏?',
+ },
+ {
+ question: '邊個寫咗小說《百年孤獨》?',
+ value: '邊個寫咗小說《百年孤獨》?',
+ },
+ {
+ question: '太陽系有幾多個行星有大氣層?',
+ value: '太陽系有幾多個行星有大氣層?',
+ },
+];
+
+export const zh_TW_questions = [
+ {
+ question: '肯德基的創辦人是誰?',
+ value: '肯德基的創辦人是誰?',
+ },
+ {
+ question: '美國總統是誰?',
+ value: '美國總統是誰?',
+ },
+ {
+ question: '太陽系有幾個行星?',
+ value: '太陽系有幾個行星?',
+ },
+ {
+ question: '世界最大的海洋是哪一個?',
+ value: '世界最大的海洋是哪一個?',
+ },
+ {
+ question: '誰發明了電話?',
+ value: '誰發明了電話?',
+ },
+ {
+ question: '正方形有幾條邊?',
+ value: '正方形有幾條邊?',
+ },
+ {
+ question: '澳大利亞的首都在哪裡?',
+ value: '澳大利亞的首都在哪裡?',
+ },
+ {
+ question: '誰寫了小說《殺死一隻知更鳥》?',
+ value: '誰寫了小說《殺死一隻知更鳥》?',
+ },
+ {
+ question: '人體有幾塊骨頭?',
+ value: '人體有幾塊骨頭?',
+ },
+ {
+ question: '世界最大的哺乳動物是什麼?',
+ value: '世界最大的哺乳動物是什麼?',
+ },
+ {
+ question: '美國第一任總統是誰?',
+ value: '美國第一任總統是誰?',
+ },
+ {
+ question: '彩虹有幾種顏色?',
+ value: '彩虹有幾種顏色?',
+ },
+ {
+ question: '太陽系中最大的行星是哪個?',
+ value: '太陽系中最大的行星是哪個?',
+ },
+ {
+ question: 'Apple公司的創辦人是誰?',
+ value: 'Apple公司的創辦人是誰?',
+ },
+ {
+ question: '奧運會旗幟上有幾個環?',
+ value: '奧運會旗幟上有幾個環?',
+ },
+ {
+ question: '世界最大的大洲是哪一個?',
+ value: '世界最大的大洲是哪一個?',
+ },
+ {
+ question: '誰是《哈利波特》系列小說的作者?',
+ value: '誰是《哈利波特》系列小說的作者?',
+ },
+ {
+ question: '一年有幾天?',
+ value: '一年有幾天?',
+ },
+ {
+ question: '世界最長的河流是哪一條?',
+ value: '世界最長的河流是哪一條?',
+ },
+ {
+ question: 'Microsoft的創辦人是誰?',
+ value: 'Microsoft的創辦人是誰?',
+ },
+ {
+ question: '太陽系有幾個行星有環?',
+ value: '太陽系有幾個行星有環?',
+ },
+ {
+ question: '世界最高的山峰是哪座?',
+ value: '世界最高的山峰是哪座?',
+ },
+ {
+ question: '第一個登陸月球的人是誰?',
+ value: '第一個登陸月球的人是誰?',
+ },
+ {
+ question: '正六邊形有幾條邊?',
+ value: '正六邊形有幾條邊?',
+ },
+ {
+ question: '加拿大的首都在哪裡?',
+ value: '加拿大的首都在哪裡?',
+ },
+ {
+ question: '誰寫了小說《一九八四》?',
+ value: '誰寫了小說《一九八四》?',
+ },
+ {
+ question: '銀河系有幾個行星?',
+ value: '銀河系有幾個行星?',
+ },
+ {
+ question: '地球上最大的海洋是哪一個?',
+ value: '地球上最大的海洋是哪一個?',
+ },
+ {
+ question: 'Amazon的創辦人是誰?',
+ value: 'Amazon的創辦人是誰?',
+ },
+ {
+ question: '正五邊形有幾條邊?',
+ value: '正五邊形有幾條邊?',
+ },
+ {
+ question: '英國使用的貨幣是什麼?',
+ value: '英國使用的貨幣是什麼?',
+ },
+ {
+ question: '誰寫了《魔戒》系列小說?',
+ value: '誰寫了《魔戒》系列小說?',
+ },
+ {
+ question: '太陽系有幾個"矮行星"?',
+ value: '太陽系有幾個"矮行星"?',
+ },
+ {
+ question: '海洋中最大的哺乳動物是什麼?',
+ value: '海洋中最大的哺乳動物是什麼?',
+ },
+ {
+ question: 'Tesla的創辦人是誰?',
+ value: 'Tesla的創辦人是誰?',
+ },
+ {
+ question: '三角形有幾條邊?',
+ value: '三角形有幾條邊?',
+ },
+ {
+ question: '法國的首都在哪裡?',
+ value: '法國的首都在哪裡?',
+ },
+ {
+ question: '誰寫了小說《傲慢與偏見》?',
+ value: '誰寫了小說《傲慢與偏見》?',
+ },
+ {
+ question: '太陽系有幾個行星?',
+ value: '太陽系有幾個行星?',
+ },
+ {
+ question: '世界上最大的動物是什麼?',
+ value: '世界上最大的動物是什麼?',
+ },
+ {
+ question: 'Google的創辦人是誰?',
+ value: 'Google的創辦人是誰?',
+ },
+ {
+ question: '人體皮膚有幾層?',
+ value: '人體皮膚有幾層?',
+ },
+ {
+ question: '義大利的首都在哪裡?',
+ value: '義大利的首都在哪裡?',
+ },
+ {
+ question: '誰寫了小說《了不起的蓋茨比》?',
+ value: '誰寫了小說《了不起的蓋茨比》?',
+ },
+ {
+ question: '太陽系有幾個"內行星"?',
+ value: '太陽系有幾個"內行星"?',
+ },
+ {
+ question: '世界最大的沙漠是哪一個?',
+ value: '世界最大的沙漠是哪一個?',
+ },
+ {
+ question: '可口可樂的創辦人是誰?',
+ value: '可口可樂的創辦人是誰?',
+ },
+ {
+ question: '太陽系有幾個行星有衛星?',
+ value: '太陽系有幾個行星有衛星?',
+ },
+ {
+ question: '日本的首都在哪裡?',
+ value: '日本的首都在哪裡?',
+ },
+ {
+ question: '誰寫了小說《麥田捕手》?',
+ value: '誰寫了小說《麥田捕手》?',
+ },
+ {
+ question: '太陽系有幾個"氣體巨行星"?',
+ value: '太陽系有幾個"氣體巨行星"?',
+ },
+ {
+ question: '面積最大的大洲是哪一個?',
+ value: '面積最大的大洲是哪一個?',
+ },
+ {
+ question: 'Nike的創辦人是誰?',
+ value: 'Nike的創辦人是誰?',
+ },
+ {
+ question: '太陽系有幾個"外行星"?',
+ value: '太陽系有幾個"外行星"?',
+ },
+ {
+ question: '德國的首都在哪裡?',
+ value: '德國的首都在哪裡?',
+ },
+ {
+ question: '誰寫了小說《美麗新世界》?',
+ value: '誰寫了小說《美麗新世界》?',
+ },
+ {
+ question: '非洲最長的河流是哪一條?',
+ value: '非洲最長的河流是哪一條?',
+ },
+ {
+ question: "McDonald's的創辦人是誰?",
+ value: "McDonald's的創辦人是誰?",
+ },
+ {
+ question: '太陽系有幾個"岩石行星"?',
+ value: '太陽系有幾個"岩石行星"?',
+ },
+ {
+ question: '西班牙的首都在哪裡?',
+ value: '西班牙的首都在哪裡?',
+ },
+ {
+ question: '誰寫了小說《百年孤寂》?',
+ value: '誰寫了小說《百年孤寂》?',
+ },
+ {
+ question: '太陽系有幾個行星有大氣層?',
+ value: '太陽系有幾個行星有大氣層?',
+ },
+];
+
+export const ja_questions = [
+ {
+ question: 'KFCの創設者は誰ですか?',
+ value: 'KFCの創設者は誰ですか?',
+ },
+ {
+ question: '米国の大統領は誰ですか?',
+ value: '米国の大統領は誰ですか?',
+ },
+ {
+ question: '太陽系にはいくつの惑星がありますか?',
+ value: '太陽系にはいくつの惑星がありますか?',
+ },
+ {
+ question: '世界最大の海洋はどれですか?',
+ value: '世界最大の海洋はどれですか?',
+ },
+ {
+ question: '電話の発明者は誰ですか?',
+ value: '電話の発明者は誰ですか?',
+ },
+ {
+ question: '正方形は何角形ですか?',
+ value: '正方形は何角形ですか?',
+ },
+ {
+ question: 'オーストラリアの首都はどこですか?',
+ value: 'オーストラリアの首都はどこですか?',
+ },
+ {
+ question: '小説「トゥー・キル・ア・モッキングバード」の作者は誰ですか?',
+ value: '小説「トゥー・キル・ア・モッキングバード」の作者は誰ですか?',
+ },
+ {
+ question: '人間の体にはいくつの骨がありますか?',
+ value: '人間の体にはいくつの骨がありますか?',
+ },
+ {
+ question: '世界最大の哺乳類は何ですか?',
+ value: '世界最大の哺乳類は何ですか?',
+ },
+ {
+ question: '米国初代大統領は誰ですか?',
+ value: '米国初代大統領は誰ですか?',
+ },
+ {
+ question: '虹にはいくつの色がありますか?',
+ value: '虹にはいくつの色がありますか?',
+ },
+ {
+ question: '太陽系で最大の惑星はどれですか?',
+ value: '太陽系で最大の惑星はどれですか?',
+ },
+ {
+ question: 'Apple Inc.の創設者は誰ですか?',
+ value: 'Apple Inc.の創設者は誰ですか?',
+ },
+ {
+ question: 'オリンピックの旗にはいくつの輪があります?',
+ value: 'オリンピックの旗にはいくつの輪があります?',
+ },
+ {
+ question: '世界最大の大陸はどれですか?',
+ value: '世界最大の大陸はどれですか?',
+ },
+ {
+ question: '「ハリー・ポッター」シリーズの作者は誰ですか?',
+ value: '「ハリー・ポッター」シリーズの作者は誰ですか?',
+ },
+ {
+ question: '1年には何日がありますか?',
+ value: '1年には何日がありますか?',
+ },
+ {
+ question: '世界最長の川はどれですか?',
+ value: '世界最長の川はどれですか?',
+ },
+ {
+ question: 'Microsoftの創設者は誰ですか?',
+ value: 'Microsoftの創設者は誰ですか?',
+ },
+ {
+ question: '太陽系の中で環があるのはいくつの惑星ですか?',
+ value: '太陽系の中で環があるのはいくつの惑星ですか?',
+ },
+ {
+ question: '世界一高い山はどれですか?',
+ value: '世界一高い山はどれですか?',
+ },
+ {
+ question: '最初に月面を歩いた人は誰ですか?',
+ value: '最初に月面を歩いた人は誰ですか?',
+ },
+ {
+ question: '正六角形は何角形ですか?',
+ value: '正六角形は何角形ですか?',
+ },
+ {
+ question: 'カナダの首都はどこですか?',
+ value: 'カナダの首都はどこですか?',
+ },
+ {
+ question: '小説「1984年」の作者は誰ですか?',
+ value: '小説「1984年」の作者は誰ですか?',
+ },
+ {
+ question: '銀河系には何個の惑星がありますか?',
+ value: '銀河系には何個の惑星がありますか?',
+ },
+ {
+ question: '地球上最大の海はどれですか?',
+ value: '地球上最大の海はどれですか?',
+ },
+ {
+ question: 'Amazonの創設者は誰ですか?',
+ value: 'Amazonの創設者は誰ですか?',
+ },
+ {
+ question: '正五角形は何角形ですか?',
+ value: '正五角形は何角形ですか?',
+ },
+ {
+ question: '英国の通貨は何ですか?',
+ value: '英国の通貨は何ですか?',
+ },
+ {
+ question: '「指輪物語」シリーズの作者は誰ですか?',
+ value: '「指輪物語」シリーズの作者は誰ですか?',
+ },
+ {
+ question: '太陽系には何個の「矮惑星」がありますか?',
+ value: '太陽系には何個の「矮惑星」がありますか?',
+ },
+ {
+ question: '海洋中最大の哺乳類は何ですか?',
+ value: '海洋中最大の哺乳類は何ですか?',
+ },
+ {
+ question: 'Teslaの創設者は誰ですか?',
+ value: 'Teslaの創設者は誰ですか?',
+ },
+ {
+ question: '三角形は何角形ですか?',
+ value: '三角形は何角形ですか?',
+ },
+ {
+ question: 'フランスの首都はどこですか?',
+ value: 'フランスの首都はどこですか?',
+ },
+ {
+ question: '小説「高慢と偏見」の作者は誰ですか?',
+ value: '小説「高慢と偏見」の作者は誰ですか?',
+ },
+ {
+ question: '太陽系には何個の惑星がありますか?',
+ value: '太陽系には何個の惑星がありますか?',
+ },
+ {
+ question: '世界最大の動物は何ですか?',
+ value: '世界最大の動物は何ですか?',
+ },
+ {
+ question: 'Googleの創設者は誰ですか?',
+ value: 'Googleの創設者は誰ですか?',
+ },
+ {
+ question: '人間の皮膚には何層あります?',
+ value: '人間の皮膚には何層あります?',
+ },
+ {
+ question: 'イタリアの首都はどこですか?',
+ value: 'イタリアの首都はどこですか?',
+ },
+ {
+ question: '小説「グレート・ギャツビー」の作者は誰ですか?',
+ value: '小説「グレート・ギャツビー」の作者は誰ですか?',
+ },
+ {
+ question: '太陽系の中で「地球型惑星」は何個ありますか?',
+ value: '太陽系の中で「地球型惑星」は何個ありますか?',
+ },
+ {
+ question: '世界最大の砂漠はどれですか?',
+ value: '世界最大の砂漠はどれですか?',
+ },
+ {
+ question: 'Coca-Colaの創設者は誰ですか?',
+ value: 'Coca-Colaの創設者は誰ですか?',
+ },
+ {
+ question: '太陽系の惑星で衛星があるのは何個ですか?',
+ value: '太陽系の惑星で衛星があるのは何個ですか?',
+ },
+ {
+ question: '日本の首都はどこですか?',
+ value: '日本の首都はどこですか?',
+ },
+ {
+ question: '小説「ライ麦畑でつかまえて」の作者は誰ですか?',
+ value: '小説「ライ麦畑でつかまえて」の作者は誰ですか?',
+ },
+ {
+ question: '太陽系の中で「ガス惑星」は何個ありますか?',
+ value: '太陽系の中で「ガス惑星」は何個ありますか?',
+ },
+ {
+ question: '面積最大の大陸はどれですか?',
+ value: '面積最大の大陸はどれですか?',
+ },
+ {
+ question: 'Nikeの創設者は誰ですか?',
+ value: 'Nikeの創設者は誰ですか?',
+ },
+ {
+ question: '太陽系の中で「内惑星」は何個ありますか?',
+ value: '太陽系の中で「内惑星」は何個ありますか?',
+ },
+ {
+ question: 'ドイツの首都はどこですか?',
+ value: 'ドイツの首都はどこですか?',
+ },
+ {
+ question: '小説「すばらしい新世界」の作者は誰ですか?',
+ value: '小説「すばらしい新世界」の作者は誰ですか?',
+ },
+ {
+ question: '太陽系の中で「外惑星」は何個ありますか?',
+ value: '太陽系の中で「外惑星」は何個ありますか?',
+ },
+ {
+ question: 'アフリカ最長の川はどれですか?',
+ value: 'アフリカ最長の川はどれですか?',
+ },
+ {
+ question: "McDonald'sの創設者は誰ですか?",
+ value: "McDonald'sの創設者は誰ですか?",
+ },
+ {
+ question: '太陽系の中で「岩石惑星」は何個ありますか?',
+ value: '太陽系の中で「岩石惑星」は何個ありますか?',
+ },
+ {
+ question: 'スペインの首都はどこですか?',
+ value: 'スペインの首都はどこですか?',
+ },
+ {
+ question: '小説「百年の孤独」の作者は誰ですか?',
+ value: '小説「百年の孤独」の作者は誰ですか?',
+ },
+ {
+ question: '太陽系の惑星で大気圏があるのは何個ですか?',
+ value: '太陽系の惑星で大気圏があるのは何個ですか?',
+ },
+];
+
+export const ko_questions = [
+ {
+ question: 'KFC의 창립자는 누구인가요?',
+ value: 'KFC의 창립자는 누구인가요?',
+ },
+ {
+ question: '미국 대통령은 누구인가요?',
+ value: '미국 대통령은 누구인가요?',
+ },
+ {
+ question: '태양계에 몇 개의 행성이 있나요?',
+ value: '태양계에 몇 개의 행성이 있나요?',
+ },
+ {
+ question: '세계에서 가장 큰 해양은 어디인가요?',
+ value: '세계에서 가장 큰 해양은 어디인가요?',
+ },
+ {
+ question: '전화기를 발명한 사람은 누구인가요?',
+ value: '전화기를 발명한 사람은 누구인가요?',
+ },
+ {
+ question: '정사각형은 몇 각형인가요?',
+ value: '정사각형은 몇 각형인가요?',
+ },
+ {
+ question: '호주의 수도는 어디인가요?',
+ value: '호주의 수도는 어디인가요?',
+ },
+ {
+ question: '소설 "To Kill a Mockingbird"의 작가는 누구인가요?',
+ value: '소설 "To Kill a Mockingbird"의 작가는 누구인가요?',
+ },
+ {
+ question: '인간 몸에는 몇 개의 뼈가 있나요?',
+ value: '인간 몸에는 몇 개의 뼈가 있나요?',
+ },
+ {
+ question: '세계에서 가장 큰 포유동물은 무엇인가요?',
+ value: '세계에서 가장 큰 포유동물은 무엇인가요?',
+ },
+ {
+ question: '미국 초대 대통령은 누구인가요?',
+ value: '미국 초대 대통령은 누구인가요?',
+ },
+ {
+ question: '무지개에는 몇 가지 색이 있나요?',
+ value: '무지개에는 몇 가지 색이 있나요?',
+ },
+ {
+ question: '태양계에서 가장 큰 행성은 어디인가요?',
+ value: '태양계에서 가장 큰 행성은 어디인가요?',
+ },
+ {
+ question: 'Apple Inc.의 설립자는 누구인가요?',
+ value: 'Apple Inc.의 설립자는 누구인가요?',
+ },
+ {
+ question: '올림픽 깃발에는 몇 개의 링이 있나요?',
+ value: '올림픽 깃발에는 몇 개의 링이 있나요?',
+ },
+ {
+ question: '세계에서 가장 큰 대륙은 어디인가요?',
+ value: '세계에서 가장 큰 대륙은 어디인가요?',
+ },
+ {
+ question: '"해리 포터" 시리즈의 작가는 누구인가요?',
+ value: '"해리 포터" 시리즈의 작가는 누구인가요?',
+ },
+ {
+ question: '1년은 몇 일인가요?',
+ value: '1년은 몇 일인가요?',
+ },
+ {
+ question: '세계에서 가장 긴 강은 어디인가요?',
+ value: '세계에서 가장 긴 강은 어디인가요?',
+ },
+ {
+ question: 'Microsoft의 설립자는 누구인가요?',
+ value: 'Microsoft의 설립자는 누구인가요?',
+ },
+ {
+ question: '태양계에서 고리가 있는 행성은 몇 개인가요?',
+ value: '태양계에서 고리가 있는 행성은 몇 개인가요?',
+ },
+ {
+ question: '세계에서 가장 높은 산은 어디인가요?',
+ value: '세계에서 가장 높은 산은 어디인가요?',
+ },
+ {
+ question: '맨 처음 달에 착륙한 사람은 누구인가요?',
+ value: '맨 처음 달에 착륙한 사람은 누구인가요?',
+ },
+ {
+ question: '정육각형은 몇 각형인가요?',
+ value: '정육각형은 몇 각형인가요?',
+ },
+ {
+ question: '캐나다의 수도는 어디인가요?',
+ value: '캐나다의 수도는 어디인가요?',
+ },
+ {
+ question: '소설 "1984"의 작가는 누구인가요?',
+ value: '소설 "1984"의 작가는 누구인가요?',
+ },
+ {
+ question: '은하계에는 몇 개의 행성이 있나요?',
+ value: '은하계에는 몇 개의 행성이 있나요?',
+ },
+ {
+ question: '지구에서 가장 큰 바다는 어디인가요?',
+ value: '지구에서 가장 큰 바다는 어디인가요?',
+ },
+ {
+ question: 'Amazon의 설립자는 누구인가요?',
+ value: 'Amazon의 설립자는 누구인가요?',
+ },
+ {
+ question: '정오각형은 몇 각형인가요?',
+ value: '정오각형은 몇 각형인가요?',
+ },
+ {
+ question: '영국의 통화는 무엇인가요?',
+ value: '영국의 통화는 무엇인가요?',
+ },
+ {
+ question: '"반지의 제왕" 시리즈의 작가는 누구인가요?',
+ value: '"반지의 제왕" 시리즈의 작가는 누구인가요?',
+ },
+ {
+ question: '태양계에 몇 개의 "왜행성"이 있나요?',
+ value: '태양계에 몇 개의 "왜행성"이 있나요?',
+ },
+ {
+ question: '바다에서 가장 큰 포유동물은 무엇인가요?',
+ value: '바다에서 가장 큰 포유동물은 무엇인가요?',
+ },
+ {
+ question: 'Tesla의 설립자는 누구인가요?',
+ value: 'Tesla의 설립자는 누구인가요?',
+ },
+ {
+ question: '삼각형은 몇 각형인가요?',
+ value: '삼각형은 몇 각형인가요?',
+ },
+ {
+ question: '프랑스의 수도는 어디인가요?',
+ value: '프랑스의 수도는 어디인가요?',
+ },
+ {
+ question: '소설 "오만과 편견"의 작가는 누구인가요?',
+ value: '소설 "오만과 편견"의 작가는 누구인가요?',
+ },
+ {
+ question: '태양계에 몇 개의 행성이 있나요?',
+ value: '태양계에 몇 개의 행성이 있나요?',
+ },
+ {
+ question: '세계에서 가장 큰 동물은 무엇인가요?',
+ value: '세계에서 가장 큰 동물은 무엇인가요?',
+ },
+ {
+ question: 'Google의 설립자는 누구인가요?',
+ value: 'Google의 설립자는 누구인가요?',
+ },
+ {
+ question: '인간 피부에는 몇 층이 있나요?',
+ value: '인간 피부에는 몇 층이 있나요?',
+ },
+ {
+ question: '이탈리아의 수도는 어디인가요?',
+ value: '이탈리아의 수도는 어디인가요?',
+ },
+ {
+ question: '소설 "대gatsby"의 작가는 누구인가요?',
+ value: '소설 "대gatsby"의 작가는 누구인가요?',
+ },
+ {
+ question: '태양계에 몇 개의 "지구형 행성"이 있나요?',
+ value: '태양계에 몇 개의 "지구형 행성"이 있나요?',
+ },
+ {
+ question: '세계에서 가장 큰 사막은 어디인가요?',
+ value: '세계에서 가장 큰 사막은 어디인가요?',
+ },
+ {
+ question: 'Coca-Cola의 설립자는 누구인가요?',
+ value: 'Coca-Cola의 설립자는 누구인가요?',
+ },
+ {
+ question: '태양계에서 위성이 있는 행성은 몇 개인가요?',
+ value: '태양계에서 위성이 있는 행성은 몇 개인가요?',
+ },
+ {
+ question: '일본의 수도는 어디인가요?',
+ value: '일본의 수도는 어디인가요?',
+ },
+ {
+ question: '소설 "파수꾼"의 작가는 누구인가요?',
+ value: '소설 "파수꾼"의 작가는 누구인가요?',
+ },
+ {
+ question: '태양계에 몇 개의 "가스 행성"이 있나요?',
+ value: '태양계에 몇 개의 "가스 행성"이 있나요?',
+ },
+ {
+ question: '면적이 가장 큰 대륙은 어디인가요?',
+ value: '면적이 가장 큰 대륙은 어디인가요?',
+ },
+ {
+ question: 'Nike의 설립자는 누구인가요?',
+ value: 'Nike의 설립자는 누구인가요?',
+ },
+ {
+ question: '태양계에 몇 개의 "내행성"이 있나요?',
+ value: '태양계에 몇 개의 "내행성"이 있나요?',
+ },
+ {
+ question: '독일의 수도는 어디인가요?',
+ value: '독일의 수도는 어디인가요?',
+ },
+ {
+ question: '소설 "멋진 신세계"의 작가는 누구인가요?',
+ value: '소설 "멋진 신세계"의 작가는 누구인가요?',
+ },
+ {
+ question: '태양계에 몇 개의 "외행성"이 있나요?',
+ value: '태양계에 몇 개의 "외행성"이 있나요?',
+ },
+ {
+ question: '아프리카에서 가장 긴 강은 어디인가요?',
+ value: '아프리카에서 가장 긴 강은 어디인가요?',
+ },
+ {
+ question: "McDonald's의 창립자는 누구인가요?",
+ value: "McDonald's의 창립자는 누구인가요?",
+ },
+ {
+ question: '태양계에 몇 개의 "암석 행성"이 있나요?',
+ value: '태양계에 몇 개의 "암석 행성"이 있나요?',
+ },
+ {
+ question: '스페인의 수도는 어디인가요?',
+ value: '스페인의 수도는 어디인가요?',
+ },
+ {
+ question: '소설 "백년동안의 고독"의 작가는 누구인가요?',
+ value: '소설 "백년동안의 고독"의 작가는 누구인가요?',
+ },
+ {
+ question: '태양계에 대기권이 있는 행성은 몇 개인가요?',
+ value: '태양계에 대기권이 있는 행성은 몇 개인가요?',
+ },
+];
+
+export const questions: {
+ [key in TLocale]: {
+ question: string;
+ value: string;
+ }[];
+} = {
+ en: en_questions,
+ 'zh-CN': zh_CN_questions,
+ 'zh-HK': zh_HK_questions,
+ 'zh-TW': zh_TW_questions,
+ ja: ja_questions,
+ ko: ko_questions,
+};
diff --git a/config/site.config.ts b/config/site.config.ts
deleted file mode 100644
index 52d98a99..00000000
--- a/config/site.config.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-// Self Config your site for here
-interface SiteConfigProps {
- title: string;
- description: string;
-}
-
-export const siteConfig: SiteConfigProps = {
- title: 'Chat Chat',
- description: 'Unlock next-level conversations with AI',
-};
diff --git a/config/theme/index.ts b/config/theme/index.ts
new file mode 100644
index 00000000..78668797
--- /dev/null
+++ b/config/theme/index.ts
@@ -0,0 +1,19 @@
+export const ThemeList = [
+ {
+ id: 'system',
+ name: 'System',
+ icon: '🌐',
+ },
+ {
+ id: 'light',
+ name: 'Light',
+ icon: '🌞',
+ },
+ {
+ id: 'dark',
+ name: 'Dark',
+ icon: '🌚',
+ },
+];
+
+export const themeId = ['system', 'light', 'dark'];
diff --git a/docker-compose.yml b/docker-compose.yml
index 115f9b11..a39ccd18 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,24 +1,39 @@
version: '3.4'
services:
- chatchat:
- image: chatchat
- build:
- context: .
- dockerfile: ./Dockerfile
- environment:
- - NODE_ENV=production
- - DATABASE_URL=postgresql://user:password@example.com:port/dbname
- - NEXTAUTH_URL=http://localhost:3000
- - NEXTAUTH_SECRET=example
- - EMAIL_HOST=smtp.example.com
- - EMAIL_PORT=587
- - EMAIL_USERNAME=john@example.com
- - EMAIL_PASSWORD=example
- - EMAIL_FROM=John
- #- GITHUB_CLIENT_ID=
- #- GITHUB_CLIENT_SECRET=
- #- GOOGLE_CLIENT_ID=
- #- GOOGLE_CLIENT_SECRET=
- ports:
- - 3000:3000
+ chatchat:
+ image: chatchat
+ build:
+ context: .
+ dockerfile: ./Dockerfile
+ environment:
+ - AWS_ACCESS_KEY=
+ - AWS_SECRET_KEY=
+ - AWS_REGION=
+
+ - ANTHROPIC_API_KEY=
+
+ - AZURE_OPENAI_API_KEY=
+ - AZURE_OPENAI_ENDPOINT=
+ - AZURE_OPENAI_DEPLOY_INSTANCE_NAME=
+
+ - COHERE_API_KEY=
+
+ - FIREWORKS_API_KEY=
+
+ - GOOGLE_API_KEY=
+
+ - GROQ_API_KEY=
+
+ - HUGGINGFACE_API_KEY=
+
+ - MISTRAL_API_KEY=
+
+ - OPENAI_API_KEY=
+ - OPENAI_API_ENDPOINT=
+
+ - PERPLEXITY_API_KEY=
+ - PERPLEXITY_ENDPOINT=
+ restart: always
+ ports:
+ - 3000:3000
diff --git a/docs/README.JA.md b/docs/README.JA.md
deleted file mode 100644
index 843f870b..00000000
--- a/docs/README.JA.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# [Chat Chat](https://chat.okisdev.com)
-
-> Chat Chat で、次のレベルの AI 会話体験を引き出しましょう。OpenAI、Microsoft Azure、Claude、Cohere、Hugging Face などの複数の API を使用して、AI 会話体験をさらにリッチにすることができます。
-
-[![LICENSE](https://img.shields.io/github/license/okisdev/ChatChat?style=flat-square)](https://github.com/okisdev/ChatChat/blob/master/LICENSE) [![Twitter](https://img.shields.io/twitter/follow/okisdev)](https://twitter.com/okisdev) [![Telegram](https://img.shields.io/badge/Telegram-Chat%20Chat-blue?style=flat-square&logo=telegram)](https://t.me/+uWx9qtafv-BiNGVk)
-
-
- English | 繁体中文 | 简体中文 | 日本語
-
-
-
-
- Documentation
-
- | Common Issue
-
-
-## 重要な注意事項
-
-- 一部の API は有償 API です。ご利用の際は、利用規約をご確認の上、ご同意ください。
-- 一部の機能は開発中です。PR または Issue を提出してください。
-- デモはデモンストレーションのみを目的としており、一部のユーザーデータを保持する場合があります。
-- AI は不快なコンテンツを生成する可能性があります、注意して使用してください。
-
-## プレビュー
-
-### インターフェイス
-
-![UI](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/UI-1.png)
-
-![Dashboard](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/Dashboard-1.png)
-
-### 機能
-
-https://user-images.githubusercontent.com/66008528/235539101-562afbc8-cb62-41cc-84d9-1ea8ed83d435.mp4
-
-https://user-images.githubusercontent.com/66008528/235539163-35f7ee91-e357-453a-ae8b-998018e003a7.mp4
-
-## 特徴
-
-- [x] TTS
-- [x] ダークモード
-- [x] ファイルとチャット
-- [x] Markdown のフォーマット
-- [x] 多言語対応
-- [x] システムプロンプトのサポート
-- [x] ショートカットメニュー (command + k)
-- [x] ラップされた API(プロキシが不要)
-- [x] 会話を共有するためのサポート
-- [x] チャット履歴(ローカルおよびクラウド同期)
-- [x] ストリーミングメッセージ (SSE) のサポート
-- [x] プラグイン対応(`/search`、`/fetch`)
-- [x] メッセージコードシンタックスハイライトのサポート
-- [x] OpenAI、Microsoft Azure、Claude、Cohere、Hugging Face に対応
-
-## ロードマップ
-
-https://github.com/users/okisdev/projects/7 をご参照ください
-
-## 使用方法
-
-### 前提条件
-
-- OpenAI、Microsoft Azure、Claude、Cohere、Hugging Face のいずれかの API キー
-
-### 環境変数
-
-| 変数名 | 説明 | デフォルト | 必須 | プロンプト |
-| ----------------- | ------------------------------- | ---------- | ------- | ---------------------------------------------------------------------------------------------------------------- |
-| `DATABASE_URL` | Postgresql データベースアドレス | | **Yes** | `postgresql://` で始まる(不要な場合は `postgresql://user:password@example.com:port/dbname` を記入してください) |
-| `NEXTAUTH_URL` | あなたのウェブサイトの URL | | **Yes** | (プレフィックス付き) |
-| `NEXTAUTH_SECRET` | NextAuth Secret | | **Yes** | ランダムハッシュ(16 ビットが最適) |
-| `EMAIL_HOST` | SMTP ホスト | | No | |
-| `EMAIL_PORT` | SMTP ポート | 587 | No | |
-| `EMAIL_USERNAME` | SMTP ユーザ名 | | No | |
-| `EMAIL_PASSWORD` | SMTP パスワード | | No | |
-| `EMAIL_FROM` | SMTP 送信アドレス | | No | |
-
-### デプロイ
-
-> 詳細は[ドキュメント](https://docs.okis.dev/chat/deployment/)を参照してください。
-
-#### ローカルデプロイ
-
-```bash
-git clone https://github.com/okisdev/ChatChat.git
-cd ChatChat
-cp .env.example .env
-pnpm i
-pnpm dev
-```
-
-#### Vercel
-
-[![Deployed in Vercel](https://vercel.com/button)](https://vercel.com/import/project?template=https://github.com/okisdev/ChatChat)
-
-#### Zeabur
-
-[Zeabur](https://zeabur.com) にアクセスしてデプロイしてください。
-
-#### Railway
-
-[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/-WWW5r)
-
-#### Docker
-
-```bash
-docker build -t chatchat .
-docker run -p 3000:3000 chatchat -e DATABASE_URL="" -e NEXTAUTH_URL="" -e NEXTAUTH_SECRET="" -e EMAIL_HOST="" -e EMAIL_PORT="" -e EMAIL_USERNAME="" -e EMAIL_PASSWORD="" -e EMAIL_FROM=""
-```
-
-もしくは
-
-```bash
-docker run -p 3000:3000 -e DATABASE_URL="" -e NEXTAUTH_URL="" -e NEXTAUTH_SECRET="" -e EMAIL_HOST="" -e EMAIL_PORT="" -e EMAIL_USERNAME="" -e EMAIL_PASSWORD="" -e EMAIL_FROM="" ghcr.io/okisdev/chatchat:latest
-```
-
-## ライセンス
-
-[AGPL-3.0](./LICENSE)
-
-## サポートしてください
-
-[![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/okisdev)
-
-## 技術スタック
-
-nextjs / tailwindcss / shadcn UI
diff --git a/docs/README.zh_CN.md b/docs/README.zh_CN.md
deleted file mode 100644
index 921bd867..00000000
--- a/docs/README.zh_CN.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# [Chat Chat](https://chat.okisdev.com)
-
-> Chat Chat,解锁你的下一级 AI 对话体验。你可以使用 OpenAI、微软 Azure、Claude、Cohere、Hugging Face 等多个 API,让你的 AI 对话体验更加丰富。
-
-[![LICENSE](https://img.shields.io/github/license/okisdev/ChatChat?style=flat-square)](https://github.com/okisdev/ChatChat/blob/master/LICENSE) [![Twitter](https://img.shields.io/twitter/follow/okisdev)](https://twitter.com/okisdev) [![Telegram](https://img.shields.io/badge/Telegram-Chat%20Chat-blue?style=flat-square&logo=telegram)](https://t.me/+uWx9qtafv-BiNGVk)
-
-
- English | 繁体中文 | 简体中文 | 日本語
-
-
-
-
- 文档
-
- | 常见问题
-
-
-## 重要提示
-
-- 本项目仅供学习交流使用,请确保使用前已经阅读了 LICENSE。
-- 部分 API 为付费 API,使用前请确保你已经阅读并同意了相关服务条款。
-- 本项目会在一定范围内获取到用户部分数据,请确保你已经阅读并同意了隐私政策。
-- 部分功能还在开发中,如果遇到任何问题,欢迎提交 PR 或者 Issue。
-- 部分模型并不完善,可能出现样式不一致,上下文不连贯,或者生成了不适当内容等问题。
-
-## 预览
-
-### 界面
-
-![UI](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/UI-1.png)
-
-![Dashboard](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/Dashboard-1.png)
-
-### 功能演示
-
-https://user-images.githubusercontent.com/66008528/235539101-562afbc8-cb62-41cc-84d9-1ea8ed83d435.mp4
-
-https://user-images.githubusercontent.com/66008528/235539163-35f7ee91-e357-453a-ae8b-998018e003a7.mp4
-
-## 功能
-
-- [x] TTS
-- [x] 黑暗模式
-- [x] 与文件聊天
-- [x] 支持多种语言
-- [x] 支持分享对话
-- [x] 支持流信息(SSE)
-- [x] Markdown 格式化
-- [x] 支持消息代码语法高亮
-- [x] 支持 System Prompt
-- [x] 快捷菜单(command + k)
-- [x] 聊天记录(本地和云端同步)
-- [x] 封装的 API(不再需要代理)
-- [x] 支持插件功能(`/search`, `/fetch`)
-- [x] 支持 OpenAI, Microsoft Azure, Claude, Cohere, Hugging Face
-
-## Roadmap
-
-请参考 https://github.com/users/okisdev/projects/7
-
-## 使用
-
-### 前提条件
-
-- 来自 OpenAI、Microsoft Azure、Claude、Cohere、Hugging Face 的任何 API 密钥
-
-### 环境变量
-
-| 变量名称 | 描述 | 默认 | 是否强制需要 | 提示 |
-| ----------------- | --------------------- | ---- | ------------ | --------------------------------------------------------------------------------------------------- |
-| `DATABASE_URL` | Postgresql 数据库地址 | | **Yes** | 以 `postgresql://` 开头 (如果不需要,请填写 `postgresql://user:password@example.com:port/dbname`) |
-| `NEXTAUTH_URL` | 您的网站 URL | | **Yes** | (带前缀) |
-| `NEXTAUTH_SECRET` | NextAuth Secret | | **Yes** | 随机哈希数值(16 位最佳) |
-| `EMAIL_HOST` | SMTP Host | | No | |
-| `EMAIL_PORT` | SMTP Port | 587 | No | |
-| `EMAIL_USERNAME` | SMTP username | | No | |
-| `EMAIL_PASSWORD` | SMTP password | | No | |
-| `EMAIL_FROM` | SMTP 发送地址 | | No | |
-
-### 部署
-
-> 请在部署前修改环境变量,更详细的部署流程请看 https://docs.okis.dev/zh-CN/chat/deployment/
-
-#### 本地部署
-
-```bash
-git clone https://github.com/okisdev/ChatChat.git
-cd ChatChat
-cp .env.example .env
-pnpm i
-pnpm dev
-```
-
-#### Vercel
-
-[![部署在 Vercel](https://vercel.com/button)](https://vercel.com/import/project?template=https://github.com/okisdev/ChatChat)
-
-#### Zeabur
-
-访问 [Zeabur](https://zeabur.com) 来部署
-
-#### Railway
-
-[![部署在 Railway](https://railway.app/button.svg)](https://railway.app/template/-WWW5r)
-
-#### Docker
-
-```bash
-docker build -t chatchat .
-docker run -p 3000:3000 chatchat -e DATABASE_URL="" -e NEXTAUTH_URL="" -e NEXTAUTH_SECRET="" -e EMAIL_HOST="" -e EMAIL_PORT="" -e EMAIL_USERNAME="" -e EMAIL_PASSWORD="" -e EMAIL_FROM=""
-```
-
-或者
-
-```bash
-docker run -p 3000:3000 -e DATABASE_URL="" -e NEXTAUTH_URL="" -e NEXTAUTH_SECRET="" -e EMAIL_HOST="" -e EMAIL_PORT="" -e EMAIL_USERNAME="" -e EMAIL_PASSWORD="" -e EMAIL_FROM="" ghcr.io/okisdev/chatchat:latest
-```
-
-## LICENSE
-
-[AGPL-3.0](./LICENSE)
-
-## 支持我
-
-[![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/okisdev)
-
-## 技术栈
-
-nextjs / tailwindcss / shadcn UI
diff --git a/docs/README.zh_HK.md b/docs/README.zh_HK.md
deleted file mode 100644
index 9173d3eb..00000000
--- a/docs/README.zh_HK.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# [Chat Chat](https://chat.okisdev.com)
-
-> Chat Chat,解鎖你的下一級 AI 對話體驗。你可以使用 OpenAI、微軟 Azure、Claude、Cohere、Hugging Face 等多個 API,讓你的 AI 對話體驗更加豐富。
-
-[![LICENSE](https://img.shields.io/github/license/okisdev/ChatChat?style=flat-square)](https://github.com/okisdev/ChatChat/blob/master/LICENSE) [![Twitter](https://img.shields.io/twitter/follow/okisdev)](https://twitter.com/okisdev) [![Telegram](https://img.shields.io/badge/Telegram-Chat%20Chat-blue?style=flat-square&logo=telegram)](https://t.me/+uWx9qtafv-BiNGVk)
-
-
- English | 繁體中文 | 簡體中文 | 日本語
-
-
-
-
- 文檔
-
- | 常見問題
-
-
-## 重要提示
-
-- 部分 API 為付費 API,使用前請確保你已經閱讀並同意了相關服務條款。
-- 本項目會在一定範圍內獲取到用戶部分數據,請確保你已經閱讀並同意了隱私政策。
-- 部分功能還在開發中,歡迎提交 PR 或者 Issue。
-- AI 可能會生成令人反感的內容,請謹慎使用。
-
-## 預覽
-
-### 界面
-
-![UI](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/UI-1.png)
-
-![Dashboard](https://cdn.harrly.com/project/GitHub/Chat-Chat/img/Dashboard-1.png)
-
-### 功能演示
-
-https://user-images.githubusercontent.com/66008528/235539101-562afbc8-cb62-41cc-84d9-1ea8ed83d435.mp4
-
-https://user-images.githubusercontent.com/66008528/235539163-35f7ee91-e357-453a-ae8b-998018e003a7.mp4
-
-## 功能
-
-- [x] TTS
-- [x] 暗色模式
-- [x] 與文件聊天
-- [x] 多語言支持
-- [x] 支持分享對話
-- [x] 支持流信息(SSE)
-- [x] Markdown 格式化
-- [x] 支持消息代碼語法高亮
-- [x] 支持 System Prompt
-- [x] 快捷菜單(command + k)
-- [x] 聊天記錄(本地和雲端同步)
-- [x] 封裝的 API(不再需要代理)
-- [x] 支持插件功能(`/search`, `/fetch`)
-- [x] 支持 OpenAI, Microsoft Azure, Claude, Cohere, Hugging Face
-
-## Roadmap
-
-請查看 https://github.com/users/okisdev/projects/7
-
-## 使用
-
-### 前提條件
-
-- 來自 OpenAI、Microsoft Azure、Claude、Cohere、Hugging Face 的任何 API 密鑰
-
-### 環境變量
-
-| 變量名稱 | 描述 | 默認 | 是否強制需要 | 提示 |
-| ----------------- | --------------------- | ---- | ------------ | --------------------------------------------------------------------------------------------------- |
-| `DATABASE_URL` | Postgresql 數據庫地址 | | **Yes** | 以 `postgresql://` 開頭 (如果不需要,請填寫 `postgresql://user:password@example.com:port/dbname`) |
-| `NEXTAUTH_URL` | 您的網站 URL | | **Yes** | (帶前綴) |
-| `NEXTAUTH_SECRET` | NextAuth Secret | | **Yes** | 隨機哈希數值(16 位最佳) |
-| `EMAIL_HOST` | SMTP Host | | No | |
-| `EMAIL_PORT` | SMTP Port | 587 | No | |
-| `EMAIL_USERNAME` | SMTP username | | No | |
-| `EMAIL_PASSWORD` | SMTP password | | No | |
-| `EMAIL_FROM` | SMTP 發送地址 | | No | |
-
-### 部署
-
-> 請在部署前更改環境變量,如需更詳細的部署流程請看 https://docs.okis.dev/chat/deployment/
-
-#### 本地部署
-
-```bash
-git clone https://github.com/okisdev/ChatChat.git
-cd ChatChat
-cp .env.example .env
-pnpm i
-pnpm dev
-```
-
-#### Vercel
-
-[![部署在 Vercel](https://vercel.com/button)](https://vercel.com/import/project?template=https://github.com/okisdev/ChatChat)
-
-#### Zeabur
-
-訪問 [Zeabur](https://zeabur.com) 來部署
-
-#### Railway
-
-[![部署在 Railway](https://railway.app/button.svg)](https://railway.app/template/-WWW5r)
-
-#### Docker
-
-```bash
-docker build -t chatchat .
-docker run -p 3000:3000 chatchat -e DATABASE_URL="" -e NEXTAUTH_URL="" -e NEXTAUTH_SECRET="" -e EMAIL_HOST="" -e EMAIL_PORT="" -e EMAIL_USERNAME="" -e EMAIL_PASSWORD="" -e EMAIL_FROM=""
-```
-
-或者
-
-```bash
-docker run -p 3000:3000 -e DATABASE_URL="" -e NEXTAUTH_URL="" -e NEXTAUTH_SECRET="" -e EMAIL_HOST="" -e EMAIL_PORT="" -e EMAIL_USERNAME="" -e EMAIL_PASSWORD="" -e EMAIL_FROM="" ghcr.io/okisdev/chatchat:latest
-```
-
-## LICENSE
-
-[AGPL-3.0](./LICENSE)
-
-## 支持我
-
-[![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/okisdev)
-
-## 技術棧
-
-nextjs / tailwindcss / shadcn UI
diff --git a/hooks/setLocalStorage.ts b/hooks/setLocalStorage.ts
deleted file mode 100644
index 9511495b..00000000
--- a/hooks/setLocalStorage.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function setLocalStorage(key: string, initialValue: T) {
- return localStorage.setItem(key, JSON.stringify(initialValue));
-}
diff --git a/hooks/storage.ts b/hooks/storage.ts
new file mode 100644
index 00000000..5275ef54
--- /dev/null
+++ b/hooks/storage.ts
@@ -0,0 +1,7 @@
+export const setLocalStorage = (key: string, value: any) => {
+ return localStorage.setItem(key, JSON.stringify(value));
+};
+
+export const getLocalStorage = (key: string) => {
+ return JSON.parse(localStorage.getItem(key) ?? '[]');
+};
diff --git a/hooks/store.ts b/hooks/store.ts
index 293bcdd5..b73da98f 100644
--- a/hooks/store.ts
+++ b/hooks/store.ts
@@ -1,127 +1,76 @@
import { atom } from 'jotai';
import { atomWithStorage } from 'jotai/utils';
-// ------------------ Layout Config ------------------
+import { Provider } from '@/config/provider';
+import { OpenAIModelId, OpenAIModelName } from '@/config/provider/openai';
+import { SearchEngine } from '@/config/search';
+import { Conversation } from '@/types/conversation';
+import { Model, SimpleModel } from '@/types/model';
+import { SearchEngineSetting } from '@/types/search';
+import { AdvancedSettings, ConversationSettings, Preference, ProviderSetting, Theme } from '@/types/settings';
-// Layout
-const isHiddenSideAtom = atomWithStorage('isHiddenSide', false);
+// provider management
+const currentProviderSettingsAtom = atomWithStorage('currentProviderSettings', null);
-// ------------------ Conversation Config ------------------
+const customProviderModelAtom = atomWithStorage('customProviderModel', null);
-// Conversation Config
-const isSendKeyEnterAtom = atomWithStorage('enterKeySend', true);
-const isAutoScrollAtom = atomWithStorage('autoScroll', false);
-const enableStreamMessagesAtom = atomWithStorage('enableStreamMessages', true);
-const systemPromptContentAtom = atomWithStorage('systemPrompt', '');
-const enableSystemPrompt = atomWithStorage('enableSystemPrompt', false);
-const enablePluginsAtom = atomWithStorage('enablePlugins', false);
-const contextModeAtom = atomWithStorage<{
- enable: boolean;
- contextCount: number;
-}>('context-mode', {
- enable: false,
- contextCount: 0,
-});
-const enableUserMarkdownRenderAtom = atomWithStorage('enableUserMarkdownRender', false);
-
-// Text to Speech Config
-const textToSpeechConfigAtom = atomWithStorage('textToSpeechConfig', {
- voice: '',
- speed: 1.0,
- pitch: 1.0,
-});
+// search engine management
+const currentSearchEngineSettingsAtom = atomWithStorage('currentSearchEngineSettings', null);
-const autoSpeechAtom = atomWithStorage('autoSpeech', false);
+const currentSearchEngineAtom = atomWithStorage('currentSearchEngine', SearchEngine.Tavily);
-// Search Config
-const searchConfigAtom = atomWithStorage('searchConfig', {
- searchEngine: 'pse',
- searchEngineID: '',
- searchAPIKey: '',
+// model management
+const currentUseModelAtom = atomWithStorage('currentUseModel', {
+ provider: Provider.OpenAI,
+ model_id: 'gpt-3.5-turbo' as OpenAIModelId,
+ model_name: 'GPT-3.5 Turbo' as OpenAIModelName,
});
-// File Config
-const fileConfigAtom = atomWithStorage<{
- enable: boolean;
- files: string[];
-}>('fileConfig', {
- enable: false,
- files: [],
-});
-
-const enableFileAtom = atom((get) => get(fileConfigAtom).enable);
-const filesAtom = atom((get) => get(fileConfigAtom).files);
-
-// ------------------ App Config ------------------
+const recentUsedModelsAtom = atomWithStorage('recentUsedModels', null);
-const serviceProviderAtom = atomWithStorage('serviceProvider', 'OpenAI');
+// settings management
+const themeAtom = atom(Theme.System);
-// OpenAI Config
-const useCloudSettingsAtom = atomWithStorage('useCloudSettings', false);
-
-const openAIConfigAtom = atomWithStorage('openAIConfig', {
- apiKey: '',
- apiEndpoint: '',
- apiModel: 'gpt-3.5-turbo',
- apiTemperature: 0.3,
+const preferencesAtom = atomWithStorage('preferences', {
+ theme: Theme.System,
+ // sendKey: 'enter',
+ enterSend: true,
+ // autoRead: false,
+ // renderMode: 'markdown',
+ useMarkdown: false,
+ // autoScroll: false,
});
-// Azure Config
-const azureConfigAtom = atomWithStorage('azureConfig', {
- apiKey: '',
- apiEndpoint: '',
- apiModel: 'gpt-4',
- apiTemperature: 0.3,
- apiDeploymentName: '',
+const advancedSettingsAtom = atomWithStorage('advancedSettings', {
+ unifiedEndpoint: false,
+ streamMessages: false,
});
-// Team Config
-const teamConfigAtom = atomWithStorage('teamConfig', {
- accessCode: '',
+const conversationSettingsAtom = atomWithStorage('conversationSettings', {
+ numOfContext: 0,
+ systemPrompt: null,
});
-// Hugging Face Config
-const huggingFaceConfigAtom = atomWithStorage('huggingFaceConfig', {
- huggingFaceModel: 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5',
- accessToken: '',
-});
+// conversation management
+const conversationsAtom = atomWithStorage('conversations', null);
-// Cohere Config
-const cohereConfigAtom = atomWithStorage('cohereConfig', {
- model: 'command-nightly',
- apiKey: '',
-});
-
-// Claude Config
-const claudeConfigAtom = atomWithStorage('claudeConfig', {
- apiKey: '',
- apiModel: 'claude-instant-1',
- apiTemperature: 1.0,
-});
+// search management
+const sameCitationAtom = atom('sameCitationId');
+const isProSearchAtom = atomWithStorage('pro', false);
-// eslint-disable-next-line import/no-anonymous-default-export
+// export atoms
export default {
- isHiddenSideAtom,
- isSendKeyEnterAtom,
- isAutoScrollAtom,
- enableStreamMessagesAtom,
- fileConfigAtom,
- enableFileAtom,
- filesAtom,
- systemPromptContentAtom,
- enableSystemPrompt,
- enablePluginsAtom,
- contextModeAtom,
- enableUserMarkdownRenderAtom,
- textToSpeechConfigAtom,
- autoSpeechAtom,
- searchConfigAtom,
- serviceProviderAtom,
- useCloudSettingsAtom,
- openAIConfigAtom,
- azureConfigAtom,
- teamConfigAtom,
- huggingFaceConfigAtom,
- cohereConfigAtom,
- claudeConfigAtom,
+ currentUseModelAtom,
+ recentUsedModelsAtom,
+ currentProviderSettingsAtom,
+ customProviderModelAtom,
+ currentSearchEngineSettingsAtom,
+ currentSearchEngineAtom,
+ themeAtom,
+ preferencesAtom,
+ advancedSettingsAtom,
+ conversationSettingsAtom,
+ conversationsAtom,
+ sameCitationAtom,
+ isProSearchAtom,
};
diff --git a/hooks/theme.tsx b/hooks/theme.tsx
new file mode 100644
index 00000000..9147686b
--- /dev/null
+++ b/hooks/theme.tsx
@@ -0,0 +1,9 @@
+'use client';
+
+import * as React from 'react';
+import { ThemeProvider as NextThemesProvider } from 'next-themes';
+import { type ThemeProviderProps } from 'next-themes/dist/types';
+
+export function ThemeProvider({ children, ...props }: Readonly) {
+ return {children} ;
+}
diff --git a/hooks/window.ts b/hooks/window.ts
new file mode 100644
index 00000000..5f11ee6c
--- /dev/null
+++ b/hooks/window.ts
@@ -0,0 +1,19 @@
+import { useEffect, useState } from 'react';
+
+export function useMediaQuery(query: string) {
+ const [value, setValue] = useState(false);
+
+ useEffect(() => {
+ function onChange(event: MediaQueryListEvent) {
+ setValue(event.matches);
+ }
+
+ const result = matchMedia(query);
+ result.addEventListener('change', onChange);
+ setValue(result.matches);
+
+ return () => result.removeEventListener('change', onChange);
+ }, [query]);
+
+ return value;
+}
diff --git a/i18n.ts b/i18n.ts
index fd5a43a3..8930bc4d 100644
--- a/i18n.ts
+++ b/i18n.ts
@@ -1,7 +1,14 @@
+import { notFound } from 'next/navigation';
import { getRequestConfig } from 'next-intl/server';
-export default getRequestConfig(async ({ locale }) => ({
- messages: (await import(`./locales/${locale}.json`)).default,
- timeZone: 'UTC',
- now: new Date(),
-}));
+import { languageId } from '@/config/i18n';
+
+const locales = languageId;
+
+export default getRequestConfig(async ({ locale }) => {
+ if (!locales.includes(locale as any)) notFound();
+
+ return {
+ messages: (await import(`@/locales/${locale}.json`)).default,
+ };
+});
diff --git a/lib/auth.ts b/lib/auth.ts
deleted file mode 100644
index be531499..00000000
--- a/lib/auth.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import type { NextAuthOptions } from 'next-auth';
-
-import EmailProvider from 'next-auth/providers/email';
-import GitHubProvider from 'next-auth/providers/github';
-import GoogleProvider from 'next-auth/providers/google';
-
-import { PrismaAdapter } from '@next-auth/prisma-adapter';
-
-import { database } from '@/lib/database';
-
-export const authOptions: NextAuthOptions = {
- adapter: PrismaAdapter(database),
- callbacks: {
- // async signIn({ user, account, profile }) {
- // console.log('signIn', user, account, profile);
-
- // const existingUser = await database.user.findUnique({
- // where: {
- // email: user.email as string,
- // },
- // });
-
- // let updateFields = {
- // name: user?.name,
- // email: user?.email,
- // image: user?.image,
- // platform: account?.provider,
- // emailVerified: undefined,
- // };
-
- // if (existingUser && existingUser.platform && existingUser.platform !== 'email' && account?.provider === 'email') {
- // updateFields.emailVerified = new Date() as any;
- // }
-
- // if (existingUser && existingUser.platform && existingUser.emailVerified) {
- // return true; // Don't update anything
- // }
-
- // await database.user.upsert({
- // where: {
- // email: user.email as string,
- // },
- // create: {
- // ...updateFields,
- // },
- // update: {
- // ...updateFields,
- // },
- // });
-
- // return true;
- // },
- async session({ token, session }) {
- if (token) {
- session.user.id = token.id;
- session.user.name = token.name;
- session.user.email = token.email;
- session.user.image = token.picture;
- }
-
- return session;
- },
- async jwt({ token, user }) {
- const databaseUser = await database.user.findFirst({
- where: {
- email: token.email,
- },
- });
-
- if (!databaseUser) {
- if (user) {
- token.id = user?.id;
- }
- return token;
- }
-
- return {
- id: databaseUser.id,
- name: databaseUser.name,
- email: databaseUser.email,
- picture: databaseUser.image,
- };
- },
- },
- cookies: {
- sessionToken: {
- name: 'next-auth.session-token',
- options: {
- httpOnly: true,
- sameSite: 'lax',
- path: '/',
- secure: process.env.NODE_ENV === 'production',
- },
- },
- },
- pages: {
- signIn: '/login',
- },
- providers: [
- EmailProvider({
- server: {
- host: process.env.EMAIL_HOST,
- port: Number(process.env.EMAIL_PORT) || 587,
- auth: {
- user: process.env.EMAIL_USERNAME,
- pass: process.env.EMAIL_PASSWORD,
- },
- },
- from: process.env.EMAIL_FROM,
- }),
- GitHubProvider({
- clientId: process.env.GITHUB_CLIENT_ID || '',
- clientSecret: process.env.GITHUB_CLIENT_SECRET || '',
- }),
- GoogleProvider({
- clientId: process.env.GOOGLE_CLIENT_ID || '',
- clientSecret: process.env.GOOGLE_CLIENT_SECRET || '',
- }),
- ],
- secret: process.env.NEXTAUTH_SECRET,
- session: {
- strategy: 'jwt',
- },
- debug: process.env.NODE_ENV !== 'production',
-};
diff --git a/lib/auth/session.ts b/lib/auth/session.ts
deleted file mode 100644
index d59ce696..00000000
--- a/lib/auth/session.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { getServerSession } from 'next-auth/next';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export async function getSession() {
- return await getServerSession(authOptions);
-}
-
-export async function getCurrentUser() {
- const session = await getSession();
-
- const user = session && session.user;
-
- return user;
-}
-
-export async function getCurrentUserProfile() {
- const user = await getCurrentUser();
-
- if (!user) {
- return null;
- }
-
- const userProfile = database.user.findUnique({
- where: {
- id: user.id,
- },
- });
-
- return userProfile;
-}
diff --git a/lib/database.ts b/lib/database.ts
deleted file mode 100644
index a5c6a14b..00000000
--- a/lib/database.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-// Credit: @shadcn
-
-import { PrismaClient } from '@prisma/client';
-
-declare global {
- var cachedPrisma: PrismaClient;
-}
-
-let prisma: PrismaClient;
-
-if (process.env.NODE_ENV === 'production') {
- prisma = new PrismaClient();
-} else {
- if (!global.cachedPrisma) {
- global.cachedPrisma = new PrismaClient();
- }
- prisma = global.cachedPrisma;
-}
-
-export const database = prisma;
diff --git a/lib/prompt/index.ts b/lib/prompt/index.ts
new file mode 100644
index 00000000..91b8e48b
--- /dev/null
+++ b/lib/prompt/index.ts
@@ -0,0 +1,100 @@
+export const searcherPrompt = `As a comprehensive web research assistant, your role is to conduct thorough research and gather relevant information to fully address user queries. For each question, analyze search results in detail to deliver an informed response that meets the user's specific needs.
+
+Include relevant visual aids like images, charts, or diagrams to enhance comprehension. When referencing external sources, always cite them clearly. Use the following format to include URLs in your citations: [[number]](THE_URL_FOUND). For instance, if you mention a source, you should format the URL like this: [[1]](https://google.com).
+
+Your objective is to use advanced search capabilities to transform basic inquiries into comprehensive, authoritative answers that satisfy and inform the user. Focus on providing practical insights and adding meaningful context, rather than merely listing facts.
+
+Additionally, aim to synthesize information into a cohesive and useful response that is customized for the user. Anticipate potential follow-up questions and strive to deliver a level of service that surpasses user expectations.
+`;
+
+export const challengerPrompt = `As a comprehensive web research assistant, your main goal is to fully understand the user's question, perform thorough online research to collect the most pertinent information, and deliver a customized, detailed response. To do this, start by analyzing the user's input to decide the best course of action.
+
+You have two options:
+
+**proceed**: Choose this option if the information provided is adequate for effectively addressing the query. Continue with your research and develop a comprehensive response.
+
+**challenge**: Select this if you believe that obtaining more details from the user could significantly improve your response's value and personalization. In this case, offer the user a structured form with either preset choices or open-ended fields to collect additional information.
+
+Make your decision based on a thorough evaluation of the query and the likelihood that additional information from the user could enhance the quality, relevance, and overall utility of your response.
+
+For example, if the query is specific, like "What's the weather like in New York today?", you should **proceed** as the question is clear and the answer can be directly found through web research. However, if the query is vague, such as "What is the weather like?", you should **challenge** by providing a form that requests more specific details to ensure a tailored response.
+
+Choose wisely to ensure you meet your objectives as a web research assistant by providing the most valuable, informed, and user-centered support possible.
+`;
+
+export const clarifierPrompt = `As a comprehensive web research assistant, your task is to understand the user's query thoroughly and deliver the most detailed and accurate response possible. If the initial information from the user is unclear or insufficient, you should proactively seek additional details.
+
+For this purpose, you should structure your follow-up questions in a clear and organized format. Here's a template for crafting these questions:
+
+{
+ "question": "A concise, direct question designed to clarify the user's intent or gather more specific details.",
+ "options": [
+ {
+ "value": "option1",
+ "content": "A predefined choice that might address common aspects of the query"
+ },
+ {
+ "value": "option2",
+ "content": "Another predefined choice offering an alternative"
+ }
+ // Additional options can be added as needed
+ ],
+ "allowsInput": true/false, // Boolean value indicating if the user can enter free-form input
+ "clarifyLabel": "Label indicating the purpose of the input field",
+ "clarifyPlaceholder": "Placeholder text to guide the user’s free-form input"
+}
+
+Example follow-up query:
+
+{
+ "question": "What specific information do you need about Company X?",
+ "options": [
+ {
+ "value": "founders",
+ "content": "Founders"
+ },
+ {
+ "value": "latest news",
+ "content": "Latest News"
+ },
+ {
+ "value": "competitors",
+ "content": "Competitors"
+ },
+ {
+ "value": "products",
+ "content": "Products"
+ }
+ // More options can be included
+ ],
+ "allowsInput": true,
+ "clarifyLabel": "If other, please specify",
+ "clarifyPlaceholder": "e.g., Financial performance"
+}
+
+This structured approach with predefined options guides the user to provide focused responses related to their query, while the option for free-form input allows them to offer additional details or context not covered by the initial options. Your ultimate aim is to collect sufficient information to provide a comprehensive, precise, and customized response that surpasses the user's expectations.
+`;
+
+export const illustratorPrompt = `As a comprehensive web research assistant, your task is to create three follow-up queries that delve deeper into the topic based on the initial query and information found in search results. These follow-up queries should anticipate the user's potential information needs and aid in a more thorough understanding of the topic.
+
+Here’s the format to structure your output:
+
+{
+ "related": [
+ "related query 1",
+ "related query 2",
+ "related query 3"
+ // Additional related queries can be included
+ ]
+}
+
+For instance, if the initial query was "Who is Joe Biden?", your follow-up queries could include:
+
+1. What are Joe Biden's key policy initiatives as President of the United States?
+2. How has Joe Biden's foreign policy affected US relations with China?
+3. What are the major criticisms of Joe Biden's economic policies?
+
+These queries should provide a progressive exploration of the subject, starting from a general inquiry and moving towards more detailed and specific aspects. The aim is to generate a set of queries that guide the user to a deeper, more comprehensive understanding of the subject, ensuring a structured and logical progression of information.
+
+Your role is to foresee the user's informational needs and craft queries that not only answer the immediate question but also lead to a more complete understanding of the topic.
+`;
diff --git a/lib/provider/Anthropic.ts b/lib/provider/Anthropic.ts
new file mode 100644
index 00000000..09325c63
--- /dev/null
+++ b/lib/provider/Anthropic.ts
@@ -0,0 +1,5 @@
+import { Anthropic } from 'ai/anthropic';
+
+export const anthropic = new Anthropic({
+ apiKey: process.env.ANTHROPIC_API_KEY ?? '',
+});
diff --git a/lib/provider/Google.ts b/lib/provider/Google.ts
new file mode 100644
index 00000000..53bf245b
--- /dev/null
+++ b/lib/provider/Google.ts
@@ -0,0 +1,6 @@
+import { Google } from 'ai/google';
+
+export const google = new Google({
+ apiKey: process.env.GOOGLE_API_KEY ?? '',
+ // baseUrl: process.env.OPENAI_API_ENDPOINT ?? '',
+});
diff --git a/lib/provider/OpenAI.ts b/lib/provider/OpenAI.ts
new file mode 100644
index 00000000..9809ccae
--- /dev/null
+++ b/lib/provider/OpenAI.ts
@@ -0,0 +1,6 @@
+import { OpenAI } from 'ai/openai';
+
+export const openai = new OpenAI({
+ apiKey: process.env.OPENAI_API_KEY ?? '',
+ // baseUrl: process.env.OPENAI_API_ENDPOINT ?? '',
+});
diff --git a/lib/search/challenger.tsx b/lib/search/challenger.tsx
new file mode 100644
index 00000000..46c4a4bc
--- /dev/null
+++ b/lib/search/challenger.tsx
@@ -0,0 +1,27 @@
+import { experimental_generateObject, ExperimentalMessage } from 'ai';
+import { OpenAI } from 'ai/openai';
+import { z } from 'zod';
+
+import { challengerPrompt } from '@/lib/prompt';
+import { SimpleModel } from '@/types/model';
+import { ProviderSetting } from '@/types/settings';
+
+export const challengerSchema = z.object({
+ next: z.enum(['proceed', 'challenge']),
+});
+
+export const challenger = async (messages: ExperimentalMessage[], model: SimpleModel, currentProviderSettings: ProviderSetting | null) => {
+ 'use server';
+
+ const openai = new OpenAI({
+ apiKey: currentProviderSettings?.OpenAI?.apiKey ?? process.env.OPENAI_API_KEY ?? '',
+ // baseUrl: currentProviderSettings?.OpenAI?.endpoint ?? process.env.OPENAI_API_ENDPOINT ?? 'https://api.openai.com/v1',
+ });
+
+ return await experimental_generateObject({
+ model: openai.chat(model.model_id ?? 'gpt-3.5-turbo'),
+ system: challengerPrompt,
+ messages,
+ schema: challengerSchema,
+ });
+};
diff --git a/lib/search/clarifier.tsx b/lib/search/clarifier.tsx
new file mode 100644
index 00000000..00d7e685
--- /dev/null
+++ b/lib/search/clarifier.tsx
@@ -0,0 +1,53 @@
+import { experimental_streamObject, ExperimentalMessage } from 'ai';
+import { OpenAI } from 'ai/openai';
+import { createStreamableUI, createStreamableValue } from 'ai/rsc';
+import { z } from 'zod';
+
+import { Clarifier } from '@/components/layout/search/block/clarifier';
+import { clarifierPrompt } from '@/lib/prompt';
+import { SimpleModel } from '@/types/model';
+import { TClarifier } from '@/types/search';
+import { ProviderSetting } from '@/types/settings';
+
+export const clarifierSchema = z.object({
+ question: z.string().describe('The clarify question'),
+ options: z.array(z.object({ value: z.string(), content: z.string() })).describe('The clarify options'),
+ allowsInput: z.boolean().describe('Whether the clarify allows for input'),
+ clarifyLabel: z.string().optional().describe('The clarify label for input'),
+ clarifyPlaceholder: z.string().optional().describe('The clarify placeholder for input'),
+});
+
+export const clarifier = async (uiStream: ReturnType, messages: ExperimentalMessage[], model: SimpleModel, currentProviderSettings: ProviderSetting | null) => {
+ 'use server';
+
+ const objectStream = createStreamableValue();
+
+ uiStream.update( );
+
+ let clarifierResponse: TClarifier = {};
+
+ const openai = new OpenAI({
+ apiKey: currentProviderSettings?.OpenAI?.apiKey ?? process.env.OPENAI_API_KEY ?? '',
+ // baseUrl: currentProviderSettings?.OpenAI?.endpoint ?? process.env.OPENAI_API_ENDPOINT ?? 'https://api.openai.com/v1',
+ });
+
+ await experimental_streamObject({
+ model: openai.chat(model.model_id ?? 'gpt-4-turbo'),
+ system: clarifierPrompt,
+ messages,
+ schema: clarifierSchema,
+ })
+ .then(async (res) => {
+ for await (const obj of res.partialObjectStream) {
+ if (obj) {
+ objectStream.update(obj);
+ clarifierResponse = obj;
+ }
+ }
+ })
+ .finally(() => {
+ objectStream.done();
+ });
+
+ return clarifierResponse;
+};
diff --git a/lib/search/illustrator.tsx b/lib/search/illustrator.tsx
new file mode 100644
index 00000000..7c69a872
--- /dev/null
+++ b/lib/search/illustrator.tsx
@@ -0,0 +1,48 @@
+import { experimental_streamObject, ExperimentalMessage } from 'ai';
+import { OpenAI } from 'ai/openai';
+import { createStreamableUI, createStreamableValue } from 'ai/rsc';
+import { z } from 'zod';
+
+import { Related } from '@/components/layout/search/block/related';
+import { illustratorPrompt } from '@/lib/prompt';
+import { SimpleModel } from '@/types/model';
+import { TIllustrator } from '@/types/search';
+import { ProviderSetting } from '@/types/settings';
+
+export const illustratorSchema = z.object({
+ items: z
+ .array(
+ z.object({
+ query: z.string(),
+ })
+ )
+ .length(3),
+});
+
+export const illustrator = async (uiStream: ReturnType, messages: ExperimentalMessage[], model: SimpleModel, currentProviderSettings: ProviderSetting | null) => {
+ 'use server';
+
+ const objectStream = createStreamableValue();
+
+ uiStream.append( );
+
+ const openai = new OpenAI({
+ apiKey: currentProviderSettings?.OpenAI?.apiKey ?? process.env.OPENAI_API_KEY ?? '',
+ // baseUrl: currentProviderSettings?.OpenAI?.endpoint ?? process.env.OPENAI_API_ENDPOINT ?? 'https://api.openai.com/v1',
+ });
+
+ await experimental_streamObject({
+ model: openai.chat(model.model_id ?? 'gpt-4-turbo'),
+ system: illustratorPrompt,
+ messages,
+ schema: illustratorSchema,
+ })
+ .then(async (res) => {
+ for await (const obj of res.partialObjectStream) {
+ objectStream.update(obj);
+ }
+ })
+ .finally(() => {
+ objectStream.done();
+ });
+};
diff --git a/lib/search/searcher.tsx b/lib/search/searcher.tsx
new file mode 100644
index 00000000..c2942210
--- /dev/null
+++ b/lib/search/searcher.tsx
@@ -0,0 +1,103 @@
+import { experimental_streamText, ExperimentalMessage, ToolCallPart, ToolResultPart } from 'ai';
+import { OpenAI } from 'ai/openai';
+import { createStreamableUI, createStreamableValue } from 'ai/rsc';
+import { z } from 'zod';
+
+import { Answer } from '@/components/layout/search/block/answer';
+import { FocusPoint } from '@/components/layout/search/block/focus-point';
+import { Images } from '@/components/layout/search/block/images';
+import { Sources } from '@/components/layout/search/block/sources';
+import { searcherPrompt } from '@/lib/prompt';
+import { SimpleModel } from '@/types/model';
+import { SearchEngineSetting } from '@/types/search';
+import { ProviderSetting } from '@/types/settings';
+import { withTavilySearch } from '@/utils/search/engines/tavily';
+
+export const searcherSchema = z.object({
+ query: z.string().describe('The search query'),
+ max_results: z.number().max(20).default(10).describe('The maximum number of results to return'),
+ search_depth: z.enum(['basic', 'advanced']).default('basic').describe('The type of search to perform'),
+});
+
+export const searcher = async (
+ uiStream: ReturnType,
+ streamText: ReturnType>,
+ messages: ExperimentalMessage[],
+ isProSearch: boolean,
+ model: SimpleModel,
+ currentSearchEngineSettings: SearchEngineSetting | null,
+ currentProviderSettings: ProviderSetting | null
+) => {
+ 'use server';
+
+ let fullResponse = '';
+
+ const openai = new OpenAI({
+ apiKey: currentProviderSettings?.OpenAI?.apiKey ?? process.env.OPENAI_API_KEY ?? '',
+ // baseUrl: currentProviderSettings?.OpenAI?.endpoint ?? process.env.OPENAI_API_ENDPOINT ?? 'https://api.openai.com/v1',
+ });
+
+ const result = await experimental_streamText({
+ model: openai.chat(model.model_id ?? 'gpt-4-turbo'),
+ maxTokens: 2500,
+ system: searcherPrompt,
+ messages,
+ tools: {
+ search: {
+ description: 'Search the web for information',
+ parameters: searcherSchema,
+ execute: async ({ query, max_results, search_depth }: { query: string; max_results: number; search_depth: 'basic' | 'advanced' }) => {
+ uiStream.update( );
+
+ const searchResult = await withTavilySearch(query, isProSearch ? 15 : max_results, isProSearch ? 'advanced' : search_depth, currentSearchEngineSettings?.Tavily);
+
+ uiStream.update( );
+
+ uiStream.append( );
+
+ uiStream.append( );
+
+ return searchResult;
+ },
+ },
+ },
+ });
+
+ const toolCalls: ToolCallPart[] = [];
+ const toolResponses: ToolResultPart[] = [];
+
+ for await (const delta of result.fullStream) {
+ switch (delta.type) {
+ case 'text-delta':
+ if (delta.textDelta) {
+ if (fullResponse.length === 0 && delta.textDelta.length > 0) {
+ uiStream.update( );
+ }
+
+ fullResponse += delta.textDelta;
+ streamText.update(fullResponse);
+ }
+ break;
+ case 'tool-call':
+ toolCalls.push(delta);
+ break;
+ case 'tool-result':
+ toolResponses.push(delta);
+ break;
+ case 'error':
+ fullResponse += `Error: ${delta.error}`;
+ break;
+ }
+ }
+
+ messages.push({
+ role: 'assistant',
+ content: [{ type: 'text', text: fullResponse }, ...toolCalls],
+ });
+
+ if (toolResponses.length > 0) {
+ messages.push({ role: 'tool', content: toolResponses });
+ }
+
+ return { result, fullResponse };
+};
diff --git a/lib/cn.ts b/lib/ui/utils.ts
similarity index 100%
rename from lib/cn.ts
rename to lib/ui/utils.ts
diff --git a/locales/de.json b/locales/de.json
index 3bd47f38..fff9144d 100644
--- a/locales/de.json
+++ b/locales/de.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "KI-Dienstleister",
- "Access Code": "Zugangscode",
- "Account deleted": "Konto gelöscht",
- "Advanced": "Erweitert",
- "Advanced Conversation Settings": "Erweiterte Unterhaltungseinstellungen",
- "Advanced configuration for your account": "Erweiterte Konfiguration für Ihr Konto",
- "Allow you to create your own custom rule": "Ermöglicht es Ihnen, Ihre eigenen benutzerdefinierten Regeln zu erstellen",
- "Already have an account with us?": "Sie haben bereits ein Konto bei uns?",
- "Any file but images": "Alle Dateien außer Bilder",
- "App Settings": "App-Einstellungen",
- "Are you sure you want to delete all records?": "Sind Sie sicher, dass Sie alle Aufzeichnungen löschen möchten?",
- "Auto Speech": "Automatische Sprache",
- "Auto read out all replies": "Alle Antworten automatisch vorlesen",
- "Auto upload your records to the cloud": "Ihre Aufzeichnungen automatisch in der Cloud hochladen",
- "Avatar": "Avatar",
- "Azure Deployment Name is required": "Azure-Bereitstellungsname ist erforderlich",
- "Azure Endpoint is required": "Azure-Endpunkt ist erforderlich",
- "Azure Key is required": "Azure-Schlüssel ist erforderlich",
- "Back": "Zurück",
- "Beta": "Beta",
- "Beta Notice": "Beta-Hinweis",
- "Cancel": "Abbrechen",
- "Chat": "Chat",
- "Claude Key is required": "Claude-Schlüssel ist erforderlich",
- "Clear": "Löschen",
- "Cleared history successfully!": "Verlauf erfolgreich gelöscht!",
- "Click to upload": "Klicken Sie zum Hochladen",
- "Code": "Code",
- "Confirm": "Bestätigen",
- "Confirm to delete Team": "Bestätigen, um Team zu löschen",
- "Confirm to quit Team": "Bestätigen, um Team zu verlassen",
- "Confirming Deletion": "Löschung bestätigen",
- "Context Mode": "Kontext Modus",
- "Continue this Conversation": "Diese Unterhaltung fortsetzen",
- "Conversation": "Unterhaltung",
- "Conversation Settings": "Unterhaltungseinstellungen",
- "Conversation context length": "Länge des Unterhaltungskontexts",
- "Conversation with files": "Unterhaltung mit Dateien",
- "Convert": "Konvertieren",
- "Convert the code to a different language": "Konvertieren Sie den Code in eine andere Sprache",
- "Copied": "Kopiert",
- "Copied share link:": "Freigabe-Link kopiert:",
- "Copied to clipboard": "In die Zwischenablage kopiert",
- "Copy": "Kopieren",
- "Copy share link": "Freigabe-Link kopieren",
- "Create": "Erstellen",
- "Create Team": "Team erstellen",
- "Create new conversation next time": "Nächstes Mal neue Unterhaltung erstellen",
- "Creative": "Kreativ",
- "Current Model": "Aktuelles Modell",
- "Custom": "Benutzerdefiniert",
- "Customize the roles of your conversations": "Individualisieren Sie die Rollen Ihrer Unterhaltungen",
- "Danger Zoom": "Gefährliche Operationen",
- "Dark": "Dunkel",
- "Delete Account": "Konto löschen",
- "Delete All": "Alle löschen",
- "Deleted record:": "Aufzeichnung gelöscht:",
- "Edit": "Bearbeiten",
- "Edit Team": "Team bearbeiten",
- "Edit message:": "Nachricht bearbeiten:",
- "Email Address": "E-Mail-Adresse",
- "Email is required": "E-Mail-Adresse ist erforderlich",
- "Email sent, please check your inbox": "E-Mail gesendet, bitte überprüfen Sie Ihren Posteingang",
- "Enable plugins for improved AI conversation": "Plugins aktivieren für verbesserte AI-Unterhaltungen",
- "Enter new title": "Neuen Titel eingeben",
- "Entry Point": "Einstiegspunkt",
- "Error when uploading file: ": "Fehler beim Hochladen der Datei:",
- "Error: Conversation not found": "Fehler: Unterhaltung nicht gefunden",
- "Error: Something went wrong": "Fehler: Etwas ist schiefgelaufen",
- "Explain": "Erklären",
- "Explain what the code means": "Erklären Sie, was der Code bedeutet",
- "Export": "Exportieren",
- "Export All": "Alle exportieren",
- "Failed to create team": "Team konnte nicht erstellt werden",
- "Failed to delete team": "Team konnte nicht gelöscht werden",
- "Failed to join team": "Beitritt zum Team fehlgeschlagen",
- "Failed to quit team": "Austritt aus dem Team fehlgeschlagen",
- "Failed to send email": "E-Mail konnte nicht gesendet werden",
- "Failed to update team": "Team konnte nicht aktualisiert werden",
- "File": "Datei",
- "File extension is not allowed": "Dateierweiterung ist nicht erlaubt",
- "File size must be less than 512KB": "Dateigröße darf nicht größer als 512 KB sein",
- "Full Name": "Vollständiger Name",
- "Goodwill Reminders": "Goodwill-Erinnerungen",
- "History": "Verlauf",
- "History deleted": "Verlauf gelöscht",
- "Home": "Startseite",
- "If you want to permanently remove your account": "Wenn Sie Ihr Konto dauerhaft entfernen möchten",
- "Import": "Importieren",
- "Imported history successfully!": "Verlauf erfolgreich importiert!",
- "Info": "Info",
- "Invalid API Endpoint": "Ungültiger API-Endpunkt",
- "Invalid email": "Ungültige E-Mail-Adresse",
- "Join": "Beitreten",
- "Join Team": "Team beitreten",
- "Joined team successfully": "Erfolgreich dem Team beigetreten",
- "Language": "Sprache",
- "Light": "Licht",
- "Log In": "Anmelden",
- "Login": "Anmelden",
- "Manage personal info for profile": "Persönliche Informationen für das Profil verwalten",
- "Name": "Name",
- "New Chat": "Neuer Chat",
- "New Code": "Neuer Code",
- "New Conversation": "Neue Unterhaltung",
- "New File": "Neue Datei",
- "New User?": "Neuer Benutzer?",
- "New Version Available": "Neue Version verfügbar",
- "No command found": "Kein Befehl gefunden",
- "OpenAI Endpoint is required": "OpenAI-Endpunkt ist erforderlich",
- "OpenAI Key is required": "OpenAI-Schlüssel ist erforderlich",
- "Overview": "Übersicht",
- "Planned": "Geplant",
- "Please click the button below, please note, This could not be undone": "Bitte klicken Sie auf die Schaltfläche unten, bitte beachten Sie, dass dies nicht rückgängig gemacht werden kann",
- "Please enter a valid URL": "Bitte geben Sie eine gültige URL ein",
- "Please enter something": "Bitte geben Sie etwas ein",
- "Please fill in all required fields": "Bitte füllen Sie alle erforderlichen Felder aus",
- "Please login to join a team": "Bitte melden Sie sich an, um einem Team beizutreten",
- "Please note: This could not be undone": "Bitte beachten Sie: Dies kann nicht rückgängig gemacht werden",
- "Please set up the search config first": "Bitte richten Sie die Suchkonfiguration zuerst ein",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "Bitte richten Sie Ihren Google Programmable Search Engine API-Schlüssel und die Suchmaschinen-ID auf der Einstellungsseite ein",
- "Please wait for the system response": "Bitte warten Sie auf die Systemantwort",
- "Plugins": "Plugins",
- "Process": "Verarbeiten",
- "Profile": "Profil",
- "Profile updated": "Profil aktualisiert",
- "Quit successfully": "Erfolgreich ausgetreten",
- "Record": "Aufzeichnung",
- "Regenerate": "Regenerieren",
- "Register": "Registrieren",
- "Render user message using Markdown": "Benutzernachricht mit Markdown rendern",
- "Reset": "Zurücksetzen",
- "Sample": "Beispiel",
- "Save": "Speichern",
- "Search Engine": "Suchmaschine",
- "Search History": "Suchverlauf",
- "Send Message using Enter Key": "Nachricht mit der Eingabetaste senden",
- "Send message key changed to": "Sendeschlüssel geändert auf",
- "Server-Sent Events (SSE)": "Server-Sent Events (SSE)",
- "Service Provider": "Dienstleister",
- "Settings": "Einstellungen",
- "Settings reset": "Einstellungen zurücksetzen",
- "Settings saved": "Einstellungen gespeichert",
- "Share": "Freigeben",
- "Sign In": "Anmelden",
- "Sign In With Email": "Mit E-Mail-Adresse anmelden",
- "Sign Out": "Abmelden",
- "Sign out": "Abmelden",
- "Sign up": "Registrieren",
- "Something went wrong, please try again later": "Etwas ist schiefgelaufen, bitte versuchen Sie es später erneut",
- "Speak": "Sprechen",
- "Speaking Speed": "Sprechgeschwindigkeit",
- "Speech": "Sprache",
- "Stable": "Stabil",
- "Standard": "Standard",
- "Stop": "Stop",
- "Stop Generating": "Generierung stoppen",
- "Stream Messages": "Nachrichten streamen",
- "Successfully deleted all records": "Alle Aufzeichnungen wurden erfolgreich gelöscht",
- "System": "System",
- "System Prompt": "Systemhinweis",
- "Team": "Team",
- "Team Overview": "Teamübersicht",
- "Team access code is required": "Zugangscode des Teams ist erforderlich",
- "Team access token is required": "Zugangstoken des Teams ist erforderlich",
- "Team created: ": "Team erstellt: ",
- "Team deleted": "Team gelöscht",
- "Team name is required": "Teamname ist erforderlich",
- "Team updated": "Team aktualisiert",
- "Temperature": "Temperatur",
- "Text To Speech": "Text in Sprache",
- "Text to Speech is not supported in your browser": "Text in Sprache wird in Ihrem Browser nicht unterstützt",
- "Theme": "Thema",
- "This URL already exists": "Diese URL existiert bereits",
- "This action cannot be undone": "Diese Aktion kann nicht rückgängig gemacht werden",
- "This will permanently delete your team and remove your data from our database": "Dies löscht Ihr Team dauerhaft und entfernt Ihre Daten aus unserer Datenbank",
- "Title changed": "Titel geändert",
- "Type / to see available commands": "Geben Sie / ein, um verfügbare Befehle anzuzeigen",
- "Type a command to search": "Geben Sie einen Befehl zum Suchen ein",
- "Unable to fetch content from the URL provided": "Inhalt von der angegebenen URL kann nicht abgerufen werden",
- "Unlock next-level conversations with AI": "Entsperren Sie Konversationen auf der nächsten Ebene mit AI",
- "Updated the previous share:": "Vorherige Freigabe aktualisiert:",
- "Use Cloud Settings": "Cloud-Einstellungen verwenden",
- "Voice": "Stimme",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "Wir fügen dem Dashboard kontinuierlich neue Funktionen hinzu, die sich auf Ihren Service und Ihre Erfahrung auswirken können, sowie auf die Datenbankarchitektur, und wenn Sie ein allgemeiner Benutzer sind, empfehlen wir Ihnen nicht, sich anzumelden oder zu registrieren, da es im Moment möglich ist, fast alle Funktionen ohne Anmeldung zu verwenden",
- "Web Search": "Web-Suche",
- "You": "Sie",
- "You are a teacher": "Sie sind ein Lehrer",
- "You are using": "Sie verwenden",
- "You can only add 3 files": "Sie können nur 3 Dateien hinzufügen",
- "Your account Conversation Record": "Ihre Aufzeichnung der Unterhaltungen",
- "Your browser does not support voice input": "Ihr Browser unterstützt keine Spracheingabe",
- "change send key in settings": "Sendeschlüssel in den Einstellungen ändern",
- "contexts": "Kontexte",
- "disabled": "deaktiviert",
- "enabled": "aktiviert",
- "file": "datei",
- "info": "info",
- "no context": "kein Kontext",
- "or drag and drop a file": "oder ziehen Sie eine Datei hierhin",
- "overview": "übersicht",
- "plugins": "Plugins",
- "profile": "profil",
- "record": "aufzeichnung",
- "settings": "einstellungen",
- "system prompt": "Systemhinweis",
- "team": "team",
- "History Record": "Geschichtsaufzeichnung",
- "AutoScroll to end of message": "AutoScroll bis zum Ende der Nachricht",
- "AutoScroll": "Auto Scroll",
- "Hello": {
- " I am your virtual AI assistant": "Hallo, ich bin Ihr virtueller KI-Assistent"
- }
+ "good_morning": "Guten Morgen!",
+ "open_source": "Open Source",
+ "privacy_policy": "Datenschutzrichtlinie",
+ "cookies": "Kekse",
+ "new_version_available": "Neue Version verfügbar",
+ "good_afternoon": "Guten Tag!",
+ "input_box_placeholder": "Schreiben Sie ihre Nachricht hier...",
+ "system": "System",
+ "dark": "Dunkel",
+ "light": "Licht",
+ "send_message": "Nachricht senden",
+ "new_conversation": "Neues Gespräch",
+ "share_conversation": "Gespräch teilen",
+ "recent_used": "Kürzlich verwendet",
+ "more_providers": "Weitere Anbieter",
+ "provider_not_configured": "Anbieter nicht konfiguriert",
+ "go_to_settings": "Gehe zu den Einstellungen",
+ "preferences": "Präferenzen",
+ "save": "Speichern",
+ "provider_settings": "Anbietereinstellungen",
+ "provider": "Anbieter",
+ "advanced": "Fortschrittlich",
+ "general": "Allgemein",
+ "settings_saved": "Einstellungen gespeichert",
+ "open_source_message": "Open Source, Einhaltung von {license}",
+ "made_by_author": "Erstellt von {author}",
+ "good_evening": "Guten Abend!",
+ "upload_file": "Datei hochladen",
+ "copy": "Kopieren",
+ "resend": "Erneut senden",
+ "copied": "Kopiert",
+ "conversation": "Gespräch",
+ "all_conversations_deleted": "Alle Gespräche gelöscht!",
+ "send_message_with_enter": "Nachricht mit Enter senden",
+ "message_to_speech": "Botschaft zur Rede",
+ "render_message_with_markdown": "Nachricht mit Markdown rendern",
+ "auto_scroll_to_end_of_conversation": "Automatisches Scrollen zum Ende des Gesprächs",
+ "conversation_records": "Gesprächsaufzeichnungen",
+ "export": "Export",
+ "delete": "Löschen",
+ "use_unified_endpoint": "Verwenden Sie Unified Endpoint",
+ "stream_messages": "Nachrichten streamen",
+ "may_not_works_for_some_models": "Funktioniert möglicherweise bei einigen Modellen nicht",
+ "number_of_context": "Anzahl der Kontexte",
+ "no_limit": "Keine Begrenzung",
+ "default_system_prompt": "Standard-Systemaufforderung",
+ "system_prompt": "Systemaufforderung",
+ "custom_system_prompt": "Benutzerdefinierte Systemaufforderung",
+ "based_provider": "Basierender Anbieter",
+ "custom": "Brauch",
+ "saved_custom_model": "Gespeichertes Konfigurationsmodell",
+ "add_mode_custom_provider": "Fügen Sie weitere benutzerdefinierte Anbieter hinzu",
+ "image": "Bild",
+ "custom_api_endpoint": "Benutzerdefinierter API-Endpunkt",
+ "custom_api_key": "Benutzerdefinierter API-Schlüssel",
+ "custom_model": "Benutzerdefiniertes Modell",
+ "conversation_not_found": "Konversation nicht gefunden",
+ "stop_message": "Stoppmeldung",
+ "system_prompt_may_not_works_for_some_models": "Bei einigen Modellen funktioniert die Systemaufforderung möglicherweise nicht",
+ "ask_anything_here": "Fragen Sie hier alles",
+ "send_question": "Frage senden",
+ "enter_something_to_send": "Geben Sie etwas zum Senden ein",
+ "chat": "Plaudern",
+ "search": "Suchen",
+ "confirm": "Bestätigen",
+ "ask_follow_up_question": "Stellen Sie eine Folgefrage",
+ "search_slogan": "Ihre Frage endet hier.",
+ "answer": "Antwort",
+ "images": "Bilder",
+ "related": "Verwandt",
+ "sources": "Quellen",
+ "no_idea": "Keine Ahnung",
+ "your_additions": "Ihre Ergänzungen",
+ "your_question": "Ihre Frage",
+ "try_asking": "Versuchen Sie zu fragen",
+ "searching": "Suchen",
+ "searching_slogan": "Das System versucht, Ihre Frage zu verschlucken und möchte sich so schnell wie möglich bei Ihnen melden.",
+ "error": "Fehler",
+ "show_less_resources": "Weniger Ressourcen anzeigen",
+ "show_all_resources": "Alle Ressourcen anzeigen",
+ "show_more_images": "Weitere Bilder anzeigen",
+ "show_less_images": "Weniger Bilder anzeigen",
+ "no_image_found": "Kein Bild gefunden",
+ "pro": "Profi",
+ "enhanced_search_ability": "Verbesserte Suchfunktion",
+ "provider_not_supported": "Anbieter wird bisher nicht unterstützt.",
+ "search_engine_not_configured": "Suchmaschine nicht konfiguriert",
+ "search_engine_configured_globally": "Global konfigurierte Suchmaschine",
+ "provider_configured_globally": "Global konfigurierter Anbieter",
+ "focus_on": "Konzentrieren Sie sich auf",
+ "and": "Und",
+ "docs": "Dokumente"
}
diff --git a/locales/en.json b/locales/en.json
index 8437028c..67aaaa50 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "AI Service Provider",
- "Access Code": "Access Code",
- "Account deleted": "Account deleted",
- "Advanced": "Advanced",
- "Advanced Conversation Settings": "Advanced Conversation Settings",
- "Advanced configuration for your account": "Advanced configuration for your account",
- "Allow you to create your own custom rule": "Allow you to create your own custom rule",
- "Already have an account with us?": "Already have an account with us?",
- "Any file but images": "Any file but images",
- "App Settings": "App Settings",
- "Are you sure you want to delete all records?": "Are you sure you want to delete all records?",
- "Auto Speech": "Auto Speech",
- "Auto read out all replies": "Auto read out all replies",
- "Auto upload your records to the cloud": "Auto upload your records to the cloud",
- "Avatar": "Avatar",
- "Azure Deployment Name is required": "Azure Deployment Name is required",
- "Azure Endpoint is required": "Azure Endpoint is required",
- "Azure Key is required": "Azure Key is required",
- "Back": "Back",
- "Beta": "Beta",
- "Beta Notice": "Beta Notice",
- "Cancel": "Cancel",
- "Chat": "Chat",
- "Claude Key is required": "Claude Key is required",
- "Clear": "Clear",
- "Cleared history successfully!": "Cleared history successfully!",
- "Click to upload": "Click to upload",
- "Code": "Code",
- "Confirm": "Confirm",
- "Confirm to delete Team": "Confirm to delete Team",
- "Confirm to quit Team": "Confirm to quit Team",
- "Confirming Deletion": "Confirming Deletion",
- "Context Mode": "Context Mode",
- "Continue this Conversation": "Continue this Conversation",
- "Conversation": "Conversation",
- "Conversation Settings": "Conversation Settings",
- "Conversation context length": "Conversation context length",
- "Conversation with files": "Conversation with files",
- "Convert": "Convert",
- "Convert the code to a different language": "Convert the code to a different language",
- "Copied": "Copied",
- "Copied share link:": "Copied share link:",
- "Copied to clipboard": "Copied to clipboard",
- "Copy": "Copy",
- "Copy share link": "Copy share link",
- "Create": "Create",
- "Create Team": "Create Team",
- "Create new conversation next time": "Create new conversation next time",
- "Creative": "Creative",
- "Current Model": "Current Model",
- "Custom": "Custom",
- "Customize the roles of your conversations": "Customize the roles of your conversations",
- "Danger Zoom": "Danger Zoom",
- "Dark": "Dark",
- "Delete Account": "Delete Account",
- "Delete All": "Delete All",
- "Deleted record:": "Deleted record:",
- "Edit": "Edit",
- "Edit Team": "Edit Team",
- "Edit message:": "Edit message:",
- "Email Address": "Email Address",
- "Email is required": "Email is required",
- "Email sent, please check your inbox": "Email sent, please check your inbox",
- "Enable plugins for improved AI conversation": "Enable plugins for improved AI conversation",
- "Enter new title": "Enter new title",
- "Entry Point": "Entry Point",
- "Error when uploading file: ": "Error when uploading file: ",
- "Error: Conversation not found": "Error: Conversation not found",
- "Error: Something went wrong": "Error: Something went wrong",
- "Explain": "Explain",
- "Explain what the code means": "Explain what the code means",
- "Export": "Export",
- "Export All": "Export All",
- "Failed to create team": "Failed to create team",
- "Failed to delete team": "Failed to delete team",
- "Failed to join team": "Failed to join team",
- "Failed to quit team": "Failed to quit team",
- "Failed to send email": "Failed to send email",
- "Failed to update team": "Failed to update team",
- "File": "File",
- "File extension is not allowed": "File extension is not allowed",
- "File size must be less than 512KB": "File size must be less than 512KB",
- "Full Name": "Full Name",
- "Goodwill Reminders": "Goodwill Reminders",
- "History": "History",
- "History deleted": "History deleted",
- "Home": "Home",
- "If you want to permanently remove your account": "If you want to permanently remove your account",
- "Import": "Import",
- "Imported history successfully!": "Imported history successfully!",
- "Info": "Info",
- "Invalid API Endpoint": "Invalid API Endpoint",
- "Invalid email": "Invalid email",
- "Join": "Join",
- "Join Team": "Join Team",
- "Joined team successfully": "Joined team successfully",
- "Language": "Language",
- "Light": "Light",
- "Log In": "Log In",
- "Login": "Login",
- "Manage personal info for profile": "Manage personal info for profile",
- "Name": "Name",
- "New Chat": "New Chat",
- "New Code": "New Code",
- "New Conversation": "New Conversation",
- "New File": "New File",
- "New User?": "New User?",
- "New Version Available": "New Version Available",
- "No command found": "No command found",
- "OpenAI Endpoint is required": "OpenAI Endpoint is required",
- "OpenAI Key is required": "OpenAI Key is required",
- "Overview": "Overview",
- "Planned": "Planned",
- "Please click the button below, please note, This could not be undone": "Please click the button below, please note, This could not be undone",
- "Please enter a valid URL": "Please enter a valid URL",
- "Please enter something": "Please enter something",
- "Please fill in all required fields": "Please fill in all required fields",
- "Please login to join a team": "Please login to join a team",
- "Please note: This could not be undone": "Please note: This could not be undone",
- "Please set up the search config first": "Please set up the search config first",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page",
- "Please wait for the system response": "Please wait for the system response",
- "Plugins": "Plugins",
- "Process": "Process",
- "Profile": "Profile",
- "Profile updated": "Profile updated",
- "Quit successfully": "Quit successfully",
- "Record": "Record",
- "Regenerate": "Regenerate",
- "Register": "Register",
- "Render user message using Markdown": "Render user message using Markdown",
- "Reset": "Reset",
- "Sample": "Sample",
- "Save": "Save",
- "Search Engine": "Search Engine",
- "Search History": "Search History",
- "Send Message using Enter Key": "Send Message using Enter Key",
- "Send message key changed to": "Send message key changed to",
- "Server-Sent Events (SSE)": "Server-Sent Events (SSE)",
- "Service Provider": "Service Provider",
- "Settings": "Settings",
- "Settings reset": "Settings reset",
- "Settings saved": "Settings saved",
- "Share": "Share",
- "Sign In": "Sign In",
- "Sign In With Email": "Sign In With Email",
- "Sign Out": "Sign Out",
- "Sign out": "Sign out",
- "Sign up": "Sign up",
- "Something went wrong, please try again later": "Something went wrong, please try again later",
- "Speak": "Speak",
- "Speaking Speed": "Speaking Speed",
- "Speech": "Speech",
- "Stable": "Stable",
- "Standard": "Standard",
- "Stop": "Stop",
- "Stop Generating": "Stop Generating",
- "Stream Messages": "Stream Messages",
- "Successfully deleted all records": "Successfully deleted all records",
- "System": "System",
- "System Prompt": "System Prompt",
- "Team": "Team",
- "Team Overview": "Team Overview",
- "Team access code is required": "Team access code is required",
- "Team access token is required": "Team access token is required",
- "Team created: ": "Team created: ",
- "Team deleted": "Team deleted",
- "Team name is required": "Team name is required",
- "Team updated": "Team updated",
- "Temperature": "Temperature",
- "Text To Speech": "Text To Speech",
- "Text to Speech is not supported in your browser": "Text to Speech is not supported in your browser",
- "Theme": "Theme",
- "This URL already exists": "This URL already exists",
- "This action cannot be undone": "This action cannot be undone",
- "This will permanently delete your team and remove your data from our database": "This will permanently delete your team and remove your data from our database",
- "Title changed": "Title changed",
- "Type / to see available commands": "Type / to see available commands",
- "Type a command to search": "Type a command to search",
- "Unable to fetch content from the URL provided": "Unable to fetch content from the URL provided",
- "Unlock next-level conversations with AI": "Unlock next-level conversations with AI",
- "Updated the previous share:": "Updated the previous share:",
- "Use Cloud Settings": "Use Cloud Settings",
- "Voice": "Voice",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in",
- "Web Search": "Web Search",
- "You": "You",
- "You are a teacher": "You are a teacher",
- "You are using": "You are using",
- "You can only add 3 files": "You can only add 3 files",
- "Your account Conversation Record": "Your account Conversation Record",
- "Your browser does not support voice input": "Your browser does not support voice input",
- "change send key in settings": "change send key in settings",
- "contexts": "contexts",
- "disabled": "disabled",
- "enabled": "enabled",
- "file": "file",
- "info": "info",
- "no context": "no context",
- "or drag and drop a file": "or drag and drop a file",
- "overview": "overview",
- "plugins": "plugins",
- "profile": "profile",
- "record": "record",
- "settings": "settings",
- "system prompt": "system prompt",
- "team": "team",
- "History Record": "History Record",
- "AutoScroll to end of message": "AutoScroll to end of message",
- "AutoScroll": "AutoScroll",
- "Hello": {
- " I am your virtual AI assistant": "Hello, I am your virtual AI assistant"
- }
-}
+ "cookies": "Cookies",
+ "good_afternoon": "Good Afternoon!",
+ "good_morning": "Good Morning!",
+ "good_evening": "Good Evening!",
+ "input_box_placeholder": "Type your message here...",
+ "new_version_available": "New version available",
+ "open_source": "Open Source",
+ "open_source_message": "Open Source, compliance with {license}",
+ "made_by_author": "Made by {author}",
+ "privacy_policy": "Privacy Policy",
+ "system": "System",
+ "dark": "Dark",
+ "light": "Light",
+ "send_message": "Send Message",
+ "new_conversation": "New Conversation",
+ "share_conversation": "Share Conversation",
+ "recent_used": "Recent Used",
+ "more_providers": "More Providers",
+ "provider_not_configured": "Provider not configured",
+ "go_to_settings": "Go to settings",
+ "preferences": "Preferences",
+ "save": "Save",
+ "provider_settings": "Provider Settings",
+ "advanced": "Advanced",
+ "provider": "Provider",
+ "general": "General",
+ "settings_saved": "Settings Saved",
+ "upload_file": "Upload File",
+ "copy": "Copy",
+ "resend": "Resend",
+ "copied": "Copied",
+ "conversation": "Conversation",
+ "all_conversations_deleted": "All conversations deleted!",
+ "send_message_with_enter": "Send Message with Enter",
+ "message_to_speech": "Message to Speech",
+ "render_message_with_markdown": "Render Message with Markdown",
+ "auto_scroll_to_end_of_conversation": "Auto Scroll to End of Conversation",
+ "conversation_records": "Conversation Records",
+ "export": "Export",
+ "delete": "Delete",
+ "use_unified_endpoint": "Use Unified Endpoint",
+ "stream_messages": "Stream Messages",
+ "may_not_works_for_some_models": "May not works for some models",
+ "number_of_context": "Number of Context",
+ "no_limit": "No Limit",
+ "default_system_prompt": "Default System Prompt",
+ "system_prompt": "System Prompt",
+ "custom_system_prompt": "Custom System Prompt",
+ "based_provider": "Based Provider",
+ "custom": "Custom",
+ "saved_custom_model": "Saved Config Model",
+ "add_mode_custom_provider": "Add More Custom Provider",
+ "image": "Image",
+ "custom_api_key": "Custom API Key",
+ "custom_api_endpoint": "Custom API Endpoint",
+ "custom_model": "Custom Model",
+ "conversation_not_found": "Conversation not found",
+ "stop_message": "Stop Message",
+ "enter_something_to_send": "Enter something to send",
+ "system_prompt_may_not_works_for_some_models": "System Prompt may not works for some models",
+ "ask_anything_here": "Ask anything here",
+ "send_question": "Send Question",
+ "chat": "Chat",
+ "search": "Search",
+ "confirm": "Confirm",
+ "ask_follow_up_question": "Ask follow-up question",
+ "search_slogan": "Your question, ends here.",
+ "answer": "Answer",
+ "images": "Images",
+ "related": "Related",
+ "sources": "Sources",
+ "no_idea": "No idea",
+ "your_question": "Your Question",
+ "your_additions": "Your additions",
+ "try_asking": "Try asking",
+ "searching": "Searching",
+ "searching_slogan": "The system is trying to swallow your question and wants to get back to you as soon as possible.",
+ "error": "Error",
+ "show_all_resources": "Show All Resources",
+ "show_less_resources": "Show Less Resources",
+ "show_more_images": "View More Images",
+ "show_less_images": "Show Less Images",
+ "no_image_found": "No Image Found",
+ "pro": "Pro",
+ "enhanced_search_ability": "Enhanced Search Ability",
+ "provider_not_supported": "Provider is not supported so far.",
+ "search_engine_not_configured": "Search Engine not configured",
+ "search_engine_configured_globally": "Search Engine configured globally",
+ "provider_configured_globally": "Provider configured globally",
+ "focus_on": "Focus on",
+ "and": "and",
+ "docs": "Docs"
+}
\ No newline at end of file
diff --git a/locales/es.json b/locales/es.json
index 03cee0fe..5a925b60 100644
--- a/locales/es.json
+++ b/locales/es.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "Proveedor de Servicios de IA",
- "Access Code": "Código de Acceso",
- "Account deleted": "Cuenta eliminada",
- "Advanced": "Avanzado",
- "Advanced Conversation Settings": "Configuración Avanzada de Conversación",
- "Advanced configuration for your account": "Configuración avanzada para tu cuenta",
- "Allow you to create your own custom rule": "Permitirte crear tu propia regla personalizada",
- "Already have an account with us?": "¿Ya tienes una cuenta con nosotros?",
- "Any file but images": "Cualquier archivo menos imágenes",
- "App Settings": "Configuración de la Aplicación",
- "Are you sure you want to delete all records?": "¿Estás seguro de que deseas eliminar todos los registros?",
- "Auto Speech": "Auto Habla",
- "Auto read out all replies": "Leer automáticamente todas las respuestas",
- "Auto upload your records to the cloud": "Sube automáticamente tus registros a la nube",
- "Avatar": "Avatar",
- "Azure Deployment Name is required": "Se requiere el Nombre de Implementación de Azure",
- "Azure Endpoint is required": "Se requiere el Endpoint de Azure",
- "Azure Key is required": "Se requiere la Clave de Azure",
- "Back": "Volver",
- "Beta": "Beta",
- "Beta Notice": "Aviso Beta",
- "Cancel": "Cancelar",
- "Chat": "Chat",
- "Claude Key is required": "Se requiere la Clave de Claude",
- "Clear": "Borrar",
- "Cleared history successfully!": "¡Historial borrado exitosamente!",
- "Click to upload": "Clic para cargar",
- "Code": "Código",
- "Confirm": "Confirmar",
- "Confirm to delete Team": "Confirmar para eliminar el Equipo",
- "Confirm to quit Team": "Confirmar para salir del Equipo",
- "Confirming Deletion": "Confirmando Eliminación",
- "Context Mode": "Modo de Contexto",
- "Continue this Conversation": "Continuar esta Conversación",
- "Conversation": "Conversación",
- "Conversation Settings": "Configuración de Conversación",
- "Conversation context length": "Longitud del contexto de la conversación",
- "Conversation with files": "Conversación con archivos",
- "Convert": "Convertir",
- "Convert the code to a different language": "Convertir el código a un lenguaje diferente",
- "Copied": "Copiado",
- "Copied share link:": "Enlace de compartición copiado:",
- "Copied to clipboard": "Copiado al portapapeles",
- "Copy": "Copiar",
- "Copy share link": "Copiar enlace de compartición",
- "Create": "Crear",
- "Create Team": "Crear Equipo",
- "Create new conversation next time": "Crear nueva conversación la próxima vez",
- "Creative": "Creativo",
- "Current Model": "Modelo Actual",
- "Custom": "Personalizado",
- "Customize the roles of your conversations": "Personaliza los roles de tus conversaciones",
- "Danger Zoom": "Operaciones peligrosas",
- "Dark": "Oscuro",
- "Delete Account": "Eliminar cuenta",
- "Delete All": "Borrar Todo",
- "Deleted record:": "Registro eliminado:",
- "Edit": "Editar",
- "Edit Team": "Editar Equipo",
- "Edit message:": "Editar mensaje:",
- "Email Address": "Dirección de correo electrónico",
- "Email is required": "Se requiere correo electrónico",
- "Email sent, please check your inbox": "Correo electrónico enviado, por favor revisa tu bandeja de entrada",
- "Enable plugins for improved AI conversation": "Habilita plugins para mejorar la conversación con IA",
- "Enter new title": "Ingresa un nuevo título",
- "Entry Point": "Punto de entrada",
- "Error when uploading file: ": "Error al cargar el archivo: ",
- "Error: Conversation not found": "Error: Conversación no encontrada",
- "Error: Something went wrong": "Error: Algo salió mal",
- "Explain": "Explicar",
- "Explain what the code means": "Explicar qué significa el código",
- "Export": "Exportar",
- "Export All": "Exportar Todo",
- "Failed to create team": "Error al crear el equipo",
- "Failed to delete team": "Error al eliminar el equipo",
- "Failed to join team": "Error al unirse al equipo",
- "Failed to quit team": "Error al salir del equipo",
- "Failed to send email": "No se pudo enviar el correo electrónico",
- "Failed to update team": "Error al actualizar el equipo",
- "File": "Archivo",
- "File extension is not allowed": "La extensión del archivo no está permitida",
- "File size must be less than 512KB": "El tamaño del archivo debe ser menor a 512KB",
- "Full Name": "Nombre completo",
- "Goodwill Reminders": "Recordatorios de Buena Voluntad",
- "History": "Historial",
- "History deleted": "Historial borrado",
- "Home": "Inicio",
- "If you want to permanently remove your account": "Si quieres eliminar permanentemente tu cuenta",
- "Import": "Importar",
- "Imported history successfully!": "¡Historial importado exitosamente!",
- "Info": "Información",
- "Invalid API Endpoint": "Punto de Acceso a la API Inválido",
- "Invalid email": "Correo electrónico inválido",
- "Join": "Unirse",
- "Join Team": "Unirse al Equipo",
- "Joined team successfully": "Unido al equipo exitosamente",
- "Language": "Idioma",
- "Light": "Claro",
- "Log In": "Iniciar Sesión",
- "Login": "Iniciar sesión",
- "Manage personal info for profile": "Administra la información personal para el perfil",
- "Name": "Nombre",
- "New Chat": "Nueva Conversación",
- "New Code": "Nuevo Código",
- "New Conversation": "Nueva Conversación",
- "New File": "Nuevo Archivo",
- "New User?": "¿Nuevo Usuario?",
- "New Version Available": "Nueva Versión Disponible",
- "No command found": "No se encontró ningún comando",
- "OpenAI Endpoint is required": "Se requiere el Endpoint de OpenAI",
- "OpenAI Key is required": "Se requiere la Clave de OpenAI",
- "Overview": "Resumen",
- "Planned": "Planificado",
- "Please click the button below, please note, This could not be undone": "Por favor, haz clic en el botón de abajo, ten en cuenta que esto no puede deshacerse",
- "Please enter a valid URL": "Por favor, ingresa una URL válida",
- "Please enter something": "Por favor, ingresa algo",
- "Please fill in all required fields": "Por favor, completa todos los campos requeridos",
- "Please login to join a team": "Por favor, inicia sesión para unirte a un equipo",
- "Please note: This could not be undone": "Ten en cuenta: Esto no puede deshacerse",
- "Please set up the search config first": "Por favor, configura la configuración de búsqueda primero",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "Por favor, configura tu Clave de API de Google Programmable Search Engine y el ID del Motor de Búsqueda en la página de configuración",
- "Please wait for the system response": "Por favor, espera la respuesta del sistema",
- "Plugins": "Plugins",
- "Process": "Procesar",
- "Profile": "Perfil",
- "Profile updated": "Perfil actualizado",
- "Quit successfully": "Salida exitosa",
- "Record": "Registro",
- "Regenerate": "Regenerar",
- "Register": "Registrar",
- "Render user message using Markdown": "Renderizar mensaje de usuario usando Markdown",
- "Reset": "Reiniciar",
- "Sample": "Ejemplo",
- "Save": "Guardar",
- "Search Engine": "Motor de Búsqueda",
- "Search History": "Historial de Búsqueda",
- "Send Message using Enter Key": "Enviar Mensaje Usando la Tecla Enter",
- "Send message key changed to": "La tecla para enviar mensajes ha sido cambiada a",
- "Server-Sent Events (SSE)": "Eventos Enviados por el Servidor (SSE)",
- "Service Provider": "Proveedor de Servicios",
- "Settings": "Configuración",
- "Settings reset": "Configuración reiniciada",
- "Settings saved": "Configuración guardada",
- "Share": "Compartir",
- "Sign In": "Iniciar Sesión",
- "Sign In With Email": "Iniciar Sesión con Correo Electrónico",
- "Sign Out": "Cerrar Sesión",
- "Sign out": "Cerrar sesión",
- "Sign up": "Regístrate",
- "Something went wrong, please try again later": "Algo salió mal, por favor inténtalo de nuevo más tarde",
- "Speak": "Hablar",
- "Speaking Speed": "Velocidad de Habla",
- "Speech": "Habla",
- "Stable": "Estable",
- "Standard": "Estándar",
- "Stop": "Detener",
- "Stop Generating": "Detener Generación",
- "Stream Messages": "Mensajes de Transmisión",
- "Successfully deleted all records": "Registros eliminados exitosamente",
- "System": "Sistema",
- "System Prompt": "Promt de Sistema",
- "Team": "Equipo",
- "Team Overview": "Resumen del Equipo",
- "Team access code is required": "Se requiere el código de acceso del equipo",
- "Team access token is required": "Se requiere el token de acceso del equipo",
- "Team created: ": "Equipo creado:",
- "Team deleted": "Equipo eliminado",
- "Team name is required": "Se requiere el nombre del equipo",
- "Team updated": "Equipo actualizado",
- "Temperature": "Temperatura",
- "Text To Speech": "Texto a Voz",
- "Text to Speech is not supported in your browser": "El Texto a Voz no está soportado en tu navegador",
- "Theme": "Tema",
- "This URL already exists": "Esta URL ya existe",
- "This action cannot be undone": "Esta acción no puede deshacerse",
- "This will permanently delete your team and remove your data from our database": "Esto eliminará permanentemente tu equipo y eliminará tus datos de nuestra base de datos",
- "Title changed": "Título cambiado",
- "Type / to see available commands": "Escribe / para ver los comandos disponibles",
- "Type a command to search": "Escribe un comando para buscar",
- "Unable to fetch content from the URL provided": "No se pudo obtener el contenido de la URL proporcionada",
- "Unlock next-level conversations with AI": "Desbloquea conversaciones de siguiente nivel con IA",
- "Updated the previous share:": "Compartición anterior actualizada:",
- "Use Cloud Settings": "Usar Configuración en la Nube",
- "Voice": "Voz",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "Continuamente estamos añadiendo nuevas funciones al panel de control que pueden afectar tu servicio y experiencia, así como también impactando la arquitectura de la base de datos, y si eres un usuario general, no recomendamos que inicies sesión o te registres, ya que en este momento es posible utilizar casi todas las funciones sin iniciar sesión",
- "Web Search": "Búsqueda en la Web",
- "You": "Tú",
- "You are a teacher": "Eres un profesor",
- "You are using": "Estás usando",
- "You can only add 3 files": "Solo puedes agregar 3 archivos",
- "Your account Conversation Record": "Registro de Conversaciones de tu cuenta",
- "Your browser does not support voice input": "Tu navegador no soporta entrada de voz",
- "change send key in settings": "cambiar la tecla de envío en la configuración",
- "contexts": "contextos",
- "disabled": "deshabilitado",
- "enabled": "habilitado",
- "file": "archivo",
- "info": "información",
- "no context": "sin contexto",
- "or drag and drop a file": "o arrastra y suelta un archivo",
- "overview": "resumen",
- "plugins": "plugins",
- "profile": "perfil",
- "record": "registro",
- "settings": "configuración",
- "system prompt": "promt de sistema",
- "team": "equipo",
- "History Record": "Registro histórico",
- "AutoScroll to end of message": "Desplazamiento automático hasta el final del mensaje",
- "AutoScroll": "Desplazamiento automático",
- "Hello": {
- " I am your virtual AI assistant": "Hola, soy tu asistente virtual de IA."
- }
+ "good_morning": "¡Buen día!",
+ "open_source": "Fuente abierta",
+ "privacy_policy": "política de privacidad",
+ "cookies": "Galletas",
+ "new_version_available": "Nueva versión disponible",
+ "good_afternoon": "¡Buenas tardes!",
+ "input_box_placeholder": "Escribe tu mensaje aquí...",
+ "system": "Sistema",
+ "dark": "Oscuro",
+ "light": "Luz",
+ "send_message": "Enviar mensaje",
+ "new_conversation": "Nueva conversación",
+ "share_conversation": "Compartir conversación",
+ "recent_used": "Usado reciente",
+ "more_providers": "Más proveedores",
+ "provider_not_configured": "Proveedor no configurado",
+ "go_to_settings": "Ir a la configuración",
+ "preferences": "Preferencias",
+ "save": "Ahorrar",
+ "provider_settings": "Configuración del proveedor",
+ "provider": "Proveedor",
+ "advanced": "Avanzado",
+ "general": "General",
+ "settings_saved": "Ajustes guardados",
+ "open_source_message": "Código abierto, cumplimiento de {license}",
+ "made_by_author": "Hecho por {author}",
+ "good_evening": "¡Buenas noches!",
+ "upload_file": "Subir archivo",
+ "copy": "Copiar",
+ "resend": "Reenviar",
+ "copied": "Copiado",
+ "conversation": "Conversación",
+ "all_conversations_deleted": "¡Todas las conversaciones eliminadas!",
+ "send_message_with_enter": "Enviar mensaje con Enter",
+ "message_to_speech": "Mensaje a discurso",
+ "render_message_with_markdown": "Representar mensaje con Markdown",
+ "auto_scroll_to_end_of_conversation": "Desplazamiento automático hasta el final de la conversación",
+ "conversation_records": "Registros de conversación",
+ "export": "Exportar",
+ "delete": "Borrar",
+ "use_unified_endpoint": "Utilice un punto final unificado",
+ "stream_messages": "Transmitir mensajes",
+ "may_not_works_for_some_models": "Puede que no funcione para algunos modelos.",
+ "number_of_context": "Número de contexto",
+ "no_limit": "Sin límite",
+ "default_system_prompt": "Mensaje predeterminado del sistema",
+ "system_prompt": "Aviso del sistema",
+ "custom_system_prompt": "Aviso del sistema personalizado",
+ "based_provider": "Proveedor basado",
+ "custom": "Costumbre",
+ "saved_custom_model": "Modelo de configuración guardado",
+ "add_mode_custom_provider": "Agregar más proveedor personalizado",
+ "image": "Imagen",
+ "custom_api_endpoint": "Punto final API personalizado",
+ "custom_api_key": "Clave API personalizada",
+ "custom_model": "Modelo personalizado",
+ "conversation_not_found": "Conversación no encontrada",
+ "stop_message": "Detener mensaje",
+ "system_prompt_may_not_works_for_some_models": "Es posible que el mensaje del sistema no funcione en algunos modelos",
+ "ask_anything_here": "pregunta cualquier cosa aqui",
+ "send_question": "Enviar pregunta",
+ "enter_something_to_send": "Introduce algo para enviar",
+ "chat": "Charlar",
+ "search": "Buscar",
+ "confirm": "Confirmar",
+ "ask_follow_up_question": "Haga una pregunta de seguimiento",
+ "search_slogan": "Tu pregunta termina aquí.",
+ "answer": "Respuesta",
+ "images": "Imágenes",
+ "related": "Relacionado",
+ "sources": "Fuentes",
+ "no_idea": "Ni idea",
+ "your_additions": "Tus adiciones",
+ "your_question": "tu pregunta",
+ "try_asking": "Intenta preguntar",
+ "searching": "buscando",
+ "searching_slogan": "El sistema está intentando asimilar su pregunta y quiere responderle lo antes posible.",
+ "error": "Error",
+ "show_less_resources": "Mostrar menos recursos",
+ "show_all_resources": "Mostrar todos los recursos",
+ "show_more_images": "Ver más imágenes",
+ "show_less_images": "Mostrar menos imágenes",
+ "no_image_found": "No se encontró ninguna imagen",
+ "pro": "Pro",
+ "enhanced_search_ability": "Capacidad de búsqueda mejorada",
+ "provider_not_supported": "El proveedor no es compatible hasta el momento.",
+ "search_engine_not_configured": "Motor de búsqueda no configurado",
+ "search_engine_configured_globally": "Motor de búsqueda configurado globalmente",
+ "provider_configured_globally": "Proveedor configurado globalmente",
+ "focus_on": "Concentrarse en",
+ "and": "y",
+ "docs": "Documentos"
}
diff --git a/locales/fr.json b/locales/fr.json
index 5986ef5a..7b4c6f6d 100644
--- a/locales/fr.json
+++ b/locales/fr.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "Fournisseur de Services d'IA",
- "Access Code": "Code d'Accès",
- "Account deleted": "Compte supprimé",
- "Advanced": "Avancé",
- "Advanced Conversation Settings": "Paramètres de Conversation Avancés",
- "Advanced configuration for your account": "Configuration avancée pour votre compte",
- "Allow you to create your own custom rule": "Vous permet de créer votre propre règle personnalisée",
- "Already have an account with us?": "Vous avez déjà un compte chez nous?",
- "Any file but images": "Tout fichier sauf des images",
- "App Settings": "Paramètres de l'Application",
- "Are you sure you want to delete all records?": "Etes-vous sûr de vouloir supprimer tous les enregistrements?",
- "Auto Speech": "Parole Automatique",
- "Auto read out all replies": "Lire automatiquement toutes les réponses",
- "Auto upload your records to the cloud": "Téléchargez automatiquement vos enregistrements dans le cloud",
- "Avatar": "Avatar",
- "Azure Deployment Name is required": "Le nom du déploiement Azure est requis",
- "Azure Endpoint is required": "Le point de terminaison Azure est requis",
- "Azure Key is required": "La clé Azure est requise",
- "Back": "Retour",
- "Beta": "Bêta",
- "Beta Notice": "Avis Bêta",
- "Cancel": "Annuler",
- "Chat": "Chat",
- "Claude Key is required": "La clé Claude est requise",
- "Clear": "Effacer",
- "Cleared history successfully!": "Historique effacé avec succès!",
- "Click to upload": "Cliquez pour télécharger",
- "Code": "Code",
- "Confirm": "Confirmer",
- "Confirm to delete Team": "Confirmer la suppression de l'équipe",
- "Confirm to quit Team": "Confirmer pour quitter l'équipe",
- "Confirming Deletion": "Confirmation de la suppression",
- "Context Mode": "Mode Contexte",
- "Continue this Conversation": "Continuer cette conversation",
- "Conversation": "Conversation",
- "Conversation Settings": "Paramètres de Conversation",
- "Conversation context length": "Longueur du contexte de conversation",
- "Conversation with files": "Conversation avec des fichiers",
- "Convert": "Convertir",
- "Convert the code to a different language": "Convertir le code dans une autre langue",
- "Copied": "Copié",
- "Copied share link:": "Lien de partage copié:",
- "Copied to clipboard": "Copié dans le presse-papiers",
- "Copy": "Copier",
- "Copy share link": "Copier le lien de partage",
- "Create": "Créer",
- "Create Team": "Créer une équipe",
- "Create new conversation next time": "Créer une nouvelle conversation la prochaine fois",
- "Creative": "Créatif",
- "Current Model": "Modèle Actuel",
- "Custom": "Personnalisé",
- "Customize the roles of your conversations": "Personnalisez les rôles de vos conversations",
- "Danger Zoom": "Opérations dangereuses",
- "Dark": "Foncé",
- "Delete Account": "Supprimer le Compte",
- "Delete All": "Tout Supprimer",
- "Deleted record:": "Enregistrement supprimé:",
- "Edit": "Modifier",
- "Edit Team": "Modifier l'équipe",
- "Edit message:": "Modifier le message:",
- "Email Address": "Adresse E-mail",
- "Email is required": "L'email est obligatoire",
- "Email sent, please check your inbox": "E-mail envoyé, veuillez vérifier votre boîte de réception",
- "Enable plugins for improved AI conversation": "Activez les plugins pour améliorer la conversation avec l'IA",
- "Enter new title": "Entrez un nouveau titre",
- "Entry Point": "Point d'accès",
- "Error when uploading file: ": "Erreur lors du téléchargement du fichier: ",
- "Error: Conversation not found": "Erreur: Conversation non trouvée",
- "Error: Something went wrong": "Erreur: Quelque chose s'est mal passé",
- "Explain": "Expliquer",
- "Explain what the code means": "Expliquer ce que signifie le code",
- "Export": "Exporter",
- "Export All": "Exporter Tout",
- "Failed to create team": "Echec de création de l'équipe",
- "Failed to delete team": "Echec de suppression de l'équipe",
- "Failed to join team": "Echec de rejoindre l'équipe",
- "Failed to quit team": "Echec de quitter l'équipe",
- "Failed to send email": "Echec d'envoi d'email",
- "Failed to update team": "Echec de mise à jour de l'équipe",
- "File": "Fichier",
- "File extension is not allowed": "L'extension de fichier n'est pas autorisée",
- "File size must be less than 512KB": "La taille du fichier doit être inférieure à 512 Ko",
- "Full Name": "Nom Complet",
- "Goodwill Reminders": "Rappels de Bonne Volonté",
- "History": "Historique",
- "History deleted": "Historique supprimé",
- "Home": "Accueil",
- "If you want to permanently remove your account": "Si vous souhaitez supprimer définitivement votre compte",
- "Import": "Importer",
- "Imported history successfully!": "Historique importé avec succès!",
- "Info": "Infos",
- "Invalid API Endpoint": "Point d'extrémité API invalide",
- "Invalid email": "E-mail invalide",
- "Join": "Rejoindre",
- "Join Team": "Rejoindre une équipe",
- "Joined team successfully": "Rejoint l'équipe avec succès",
- "Language": "Langue",
- "Light": "Clair",
- "Log In": "Connexion",
- "Login": "Connexion",
- "Manage personal info for profile": "Gérer les informations personnelles du profil",
- "Name": "Nom",
- "New Chat": "Nouveau Chat",
- "New Code": "Nouveau Code",
- "New Conversation": "Nouvelle Conversation",
- "New File": "Nouveau Fichier",
- "New User?": "Nouvel Utilisateur?",
- "New Version Available": "Nouvelle Version Disponible",
- "No command found": "Aucune commande trouvée",
- "OpenAI Endpoint is required": "Le point de terminaison OpenAI est requis",
- "OpenAI Key is required": "La clé OpenAI est requise",
- "Overview": "Vue d'ensemble",
- "Planned": "Planifié",
- "Please click the button below, please note, This could not be undone": "Veuillez cliquer sur le bouton ci-dessous, veuillez noter que cela ne peut pas être annulé",
- "Please enter a valid URL": "Veuillez entrer une URL valide",
- "Please enter something": "Veuillez entrer quelque chose",
- "Please fill in all required fields": "Veuillez remplir tous les champs requis",
- "Please login to join a team": "Veuillez vous connecter pour rejoindre une équipe",
- "Please note: This could not be undone": "Veuillez noter: cela ne peut pas être annulé",
- "Please set up the search config first": "Veuillez d'abord configurer la recherche",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "Veuillez configurer votre clé API de moteur de recherche programmable de Google et l'identifiant de moteur de recherche sur la page des paramètres",
- "Please wait for the system response": "Veuillez attendre la réponse du système",
- "Plugins": "Plugins",
- "Process": "Traiter",
- "Profile": "Profil",
- "Profile updated": "Profil mis à jour",
- "Quit successfully": "Quitter avec succès",
- "Record": "Enregistrement",
- "Regenerate": "Regénérer",
- "Register": "S'inscrire",
- "Render user message using Markdown": "Rendre le message de l'utilisateur en utilisant Markdown",
- "Reset": "Réinitialiser",
- "Sample": "Échantillon",
- "Save": "Enregistrer",
- "Search Engine": "Moteur de Recherche",
- "Search History": "Historique de Recherche",
- "Send Message using Enter Key": "Envoyer le Message en utilisant la touche Entrée",
- "Send message key changed to": "La touche d'envoi de message a été modifiée en",
- "Server-Sent Events (SSE)": "Événements Serveur-Envoyés (SSE)",
- "Service Provider": "Fournisseur de services",
- "Settings": "Paramètres",
- "Settings reset": "Paramètres réinitialisés",
- "Settings saved": "Paramètres enregistrés",
- "Share": "Partager",
- "Sign In": "Se Connecter",
- "Sign In With Email": "Se Connecter avec E-mail",
- "Sign Out": "Déconnexion",
- "Sign out": "Déconnexion",
- "Sign up": "S'inscrire",
- "Something went wrong, please try again later": "Quelque chose s'est mal passé, veuillez réessayer plus tard",
- "Speak": "Parler",
- "Speaking Speed": "Vitesse de Parole",
- "Speech": "Parole",
- "Stable": "Stable",
- "Standard": "Standard",
- "Stop": "Arrêter",
- "Stop Generating": "Arrêter la Génération",
- "Stream Messages": "Flux de Messages",
- "Successfully deleted all records": "Tous les enregistrements ont été supprimés avec succès",
- "System": "Système",
- "System Prompt": "Invite Système",
- "Team": "Equipe",
- "Team Overview": "Vue d'ensemble de l'équipe",
- "Team access code is required": "Le code d'accès de l'équipe est requis",
- "Team access token is required": "Le jeton d'accès de l'équipe est requis",
- "Team created: ": "Equipe créée: ",
- "Team deleted": "Equipe supprimée",
- "Team name is required": "Le nom de l'équipe est requis",
- "Team updated": "Equipe mise à jour",
- "Temperature": "Température",
- "Text To Speech": "Texte vers Parole",
- "Text to Speech is not supported in your browser": "Le Texte vers la Parole n'est pas supporté par votre navigateur",
- "Theme": "Thème",
- "This URL already exists": "Cette URL existe déjà",
- "This action cannot be undone": "Cette action ne peut pas être annulée",
- "This will permanently delete your team and remove your data from our database": "Cela supprimera définitivement votre équipe et supprimera vos données de notre base de données",
- "Title changed": "Titre modifié",
- "Type / to see available commands": "Tapez / pour voir les commandes disponibles",
- "Type a command to search": "Tapez une commande pour rechercher",
- "Unable to fetch content from the URL provided": "Impossible de récupérer le contenu de l'URL fournie",
- "Unlock next-level conversations with AI": "Débloquez des conversations de niveau supérieur avec l'IA",
- "Updated the previous share:": "Partage précédent mis à jour:",
- "Use Cloud Settings": "Utiliser les Paramètres Cloud",
- "Voice": "Voix",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "Nous ajoutons continuellement de nouvelles fonctionnalités au tableau de bord qui peuvent affecter votre service et votre expérience, ainsi que ré-impacter l'architecture de la base de données, et si vous êtes un utilisateur général, nous ne vous recommandons pas de vous connecter ou de vous inscrire, car il est actuellement possible d'utiliser presque toutes les fonctionnalités sans se connecter",
- "Web Search": "Recherche Web",
- "You": "Vous",
- "You are a teacher": "Vous êtes un enseignant",
- "You are using": "Vous utilisez",
- "You can only add 3 files": "Vous ne pouvez ajouter que 3 fichiers",
- "Your account Conversation Record": "L'historique des conversations de votre compte",
- "Your browser does not support voice input": "Votre navigateur ne prend pas en charge l'entrée vocale",
- "change send key in settings": "changer la touche d'envoi dans les paramètres",
- "contexts": "contextes",
- "disabled": "désactivé",
- "enabled": "activé",
- "file": "fichier",
- "info": "informations",
- "no context": "pas de contexte",
- "or drag and drop a file": "ou faites glisser et déposez un fichier",
- "overview": "aperçu",
- "plugins": "plugins",
- "profile": "profil",
- "record": "enregistrement",
- "settings": "paramètres",
- "system prompt": "invite système",
- "team": "équipe",
- "History Record": "Enregistrement historique",
- "AutoScroll to end of message": "Défilement automatique jusqu'à la fin du message",
- "AutoScroll": "Défilement automatique",
- "Hello": {
- " I am your virtual AI assistant": "Bonjour, je suis votre assistant virtuel IA"
- }
+ "cookies": "Cookies",
+ "good_afternoon": "Bonjour !",
+ "good_morning": "Bonjour !",
+ "good_evening": "Bonsoir !",
+ "input_box_placeholder": "Tapez votre message ici...",
+ "new_version_available": "Nouvelle version disponible",
+ "open_source": "Open Source",
+ "open_source_message": "Open Source, conforme à {license}",
+ "made_by_author": "Créé par {author}",
+ "privacy_policy": "Politique de confidentialité",
+ "system": "Système",
+ "dark": "Thème sombre",
+ "light": "Thème clair",
+ "send_message": "Envoyer le message",
+ "new_conversation": "Nouvelle conversation",
+ "share_conversation": "Partager la conversation",
+ "recent_used": "Récemment utilisé",
+ "more_providers": "Autres fournisseurs",
+ "provider_not_configured": "Fournisseur non configuré",
+ "go_to_settings": "Aller aux paramètres",
+ "preferences": "Préférences",
+ "save": "Enregistrer",
+ "provider_settings": "Paramètres du fournisseur",
+ "advanced": "Avancé",
+ "provider": "Fournisseur",
+ "general": "Général",
+ "settings_saved": "Paramètres enregistrés",
+ "upload_file": "Télécharger un fichier",
+ "copy": "Copier",
+ "resend": "Renvoyer",
+ "copied": "Copié",
+ "conversation": "Conversation",
+ "all_conversations_deleted": "Toutes les conversations ont été supprimées !",
+ "send_message_with_enter": "Envoyer le message avec Entrée",
+ "message_to_speech": "Convertir le message en voix",
+ "render_message_with_markdown": "Afficher le message avec Markdown",
+ "auto_scroll_to_end_of_conversation": "Défiler automatiquement jusqu'à la fin de la conversation",
+ "conversation_records": "Historique des conversations",
+ "export": "Exporter",
+ "delete": "Supprimer",
+ "use_unified_endpoint": "Utiliser un point de terminaison unique",
+ "stream_messages": "Messages en flux continu",
+ "may_not_works_for_some_models": "Peut ne pas fonctionner pour certains modèles",
+ "number_of_context": "Nombre de contexte",
+ "no_limit": "Pas de limite",
+ "default_system_prompt": "Invite système par défaut",
+ "system_prompt": "Invite système",
+ "custom_system_prompt": "Invite système personnalisée",
+ "based_provider": "Basé sur le fournisseur",
+ "custom": "Personnalisé",
+ "saved_custom_model": "Modèle personnalisé enregistré",
+ "add_mode_custom_provider": "Ajouter d'autres fournisseurs personnalisés",
+ "image": "Image",
+ "custom_api_key": "Clé API personnalisée",
+ "custom_api_endpoint": "Point de terminaison API personnalisé",
+ "custom_model": "Modèle personnalisé",
+ "conversation_not_found": "Conversation introuvable",
+ "stop_message": "Arrêter le message",
+ "enter_something_to_send": "Entrez quelque chose à envoyer",
+ "system_prompt_may_not_works_for_some_models": "L'invite système peut ne pas fonctionner pour certains modèles",
+ "ask_anything_here": "Posez votre question ici",
+ "send_question": "Envoyer la question",
+ "chat": "Discuter",
+ "search": "Rechercher",
+ "confirm": "Confirmer",
+ "ask_follow_up_question": "Poser une question de suivi",
+ "search_slogan": "Votre question, c'est ici que ça se termine.",
+ "answer": "Réponse",
+ "images": "Images",
+ "related": "Connexes",
+ "sources": "Sources",
+ "no_idea": "Je ne sais pas",
+ "your_question": "Votre question",
+ "your_additions": "Vos ajouts",
+ "try_asking": "Essayez de demander",
+ "searching": "Recherche",
+ "searching_slogan": "Le système essaie de comprendre votre question et va vous répondre dès que possible.",
+ "error": "Erreur",
+ "show_all_resources": "Afficher toutes les ressources",
+ "show_less_resources": "Afficher moins de ressources",
+ "show_more_images": "Voir plus d'images",
+ "show_less_images": "Afficher moins d'images",
+ "no_image_found": "Aucune image trouvée",
+ "pro": "Pro",
+ "enhanced_search_ability": "Capacités de recherche améliorées",
+ "provider_not_supported": "Ce fournisseur n'est pas encore pris en charge.",
+ "search_engine_not_configured": "Moteur de recherche non configuré",
+ "search_engine_configured_globally": "Moteur de recherche configuré globalement",
+ "provider_configured_globally": "Fournisseur configuré globalement",
+ "focus_on": "Se concentrer sur",
+ "and": "et",
+ "docs": "Documents"
}
diff --git a/locales/it.json b/locales/it.json
new file mode 100644
index 00000000..a93c9dec
--- /dev/null
+++ b/locales/it.json
@@ -0,0 +1,94 @@
+{
+ "good_morning": "Buongiorno!",
+ "open_source": "Open Source",
+ "privacy_policy": "politica sulla riservatezza",
+ "cookies": "Biscotti",
+ "new_version_available": "Nuova versione disponibile",
+ "good_afternoon": "Buon pomeriggio!",
+ "input_box_placeholder": "Scrivi qui il tuo messaggio...",
+ "system": "Sistema",
+ "dark": "Buio",
+ "light": "Leggero",
+ "send_message": "Invia messaggio",
+ "new_conversation": "Nuova conversazione",
+ "share_conversation": "Condividi conversazione",
+ "recent_used": "Usato recente",
+ "more_providers": "Più fornitori",
+ "provider_not_configured": "Fornitore non configurato",
+ "go_to_settings": "Vai alle impostazioni",
+ "preferences": "Preferenze",
+ "save": "Salva",
+ "provider_settings": "Impostazioni del fornitore",
+ "provider": "Fornitore",
+ "advanced": "Avanzate",
+ "general": "Generale",
+ "settings_saved": "impostazioni salvate",
+ "open_source_message": "Open Source, conformità con {license}",
+ "made_by_author": "Realizzato da {author}",
+ "good_evening": "Buonasera!",
+ "upload_file": "Caricare un file",
+ "copy": "copia",
+ "resend": "Invia nuovamente",
+ "copied": "Copiato",
+ "conversation": "Conversazione",
+ "all_conversations_deleted": "Tutte le conversazioni cancellate!",
+ "send_message_with_enter": "Invia messaggio con Invio",
+ "message_to_speech": "Messaggio al discorso",
+ "render_message_with_markdown": "Visualizza il messaggio con Markdown",
+ "auto_scroll_to_end_of_conversation": "Scorrimento automatico fino alla fine della conversazione",
+ "conversation_records": "Registrazioni di conversazione",
+ "export": "Esportare",
+ "delete": "Eliminare",
+ "use_unified_endpoint": "Utilizza endpoint unificato",
+ "stream_messages": "Messaggi in streaming",
+ "may_not_works_for_some_models": "Potrebbe non funzionare per alcuni modelli",
+ "number_of_context": "Numero di contesto",
+ "no_limit": "Senza limiti",
+ "default_system_prompt": "Prompt di sistema predefinito",
+ "system_prompt": "Richiesta di sistema",
+ "custom_system_prompt": "Prompt di sistema personalizzato",
+ "based_provider": "Fornitore basato",
+ "custom": "Costume",
+ "saved_custom_model": "Modello di configurazione salvato",
+ "add_mode_custom_provider": "Aggiungi altro provider personalizzato",
+ "image": "Immagine",
+ "custom_api_endpoint": "Endpoint API personalizzato",
+ "custom_api_key": "Chiave API personalizzata",
+ "custom_model": "Modello personalizzato",
+ "conversation_not_found": "Conversazione non trovata",
+ "stop_message": "Interrompi messaggio",
+ "system_prompt_may_not_works_for_some_models": "Il prompt del sistema potrebbe non funzionare per alcuni modelli",
+ "ask_anything_here": "Chiedi qualsiasi cosa qui",
+ "send_question": "Invia domanda",
+ "enter_something_to_send": "Inserisci qualcosa da inviare",
+ "chat": "Chiacchierata",
+ "search": "Ricerca",
+ "confirm": "Confermare",
+ "ask_follow_up_question": "Fai una domanda di follow-up",
+ "search_slogan": "La tua domanda finisce qui.",
+ "answer": "Risposta",
+ "sources": "Fonti",
+ "images": "immagini",
+ "related": "Imparentato",
+ "no_idea": "Nessuna idea",
+ "your_additions": "Le tue aggiunte",
+ "your_question": "la tua domanda",
+ "try_asking": "Prova a chiedere",
+ "searching": "Ricerca",
+ "searching_slogan": "Il sistema sta cercando di ingoiare la tua domanda e vuole risponderti il prima possibile.",
+ "error": "Errore",
+ "show_less_resources": "Mostra meno risorse",
+ "show_all_resources": "Mostra tutte le risorse",
+ "show_more_images": "Visualizza più immagini",
+ "show_less_images": "Mostra meno immagini",
+ "no_image_found": "Nessuna immagine trovata",
+ "pro": "Pro",
+ "enhanced_search_ability": "Capacità di ricerca migliorata",
+ "provider_not_supported": "Il provider non è supportato finora.",
+ "search_engine_not_configured": "Motore di ricerca non configurato",
+ "search_engine_configured_globally": "Motore di ricerca configurato a livello globale",
+ "provider_configured_globally": "Provider configurato a livello globale",
+ "focus_on": "Concentrarsi su",
+ "and": "E",
+ "docs": "Documenti"
+}
diff --git a/locales/ja.json b/locales/ja.json
index 9cedb11a..58bc2e3d 100644
--- a/locales/ja.json
+++ b/locales/ja.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "AIサービスプロバイダー",
- "Access Code": "アクセスコード",
- "Account deleted": "アカウントが削除されました",
- "Advanced": "高度な設定",
- "Advanced Conversation Settings": "高度な会話の設定",
- "Advanced configuration for your account": "アカウントの高度な設定",
- "Allow you to create your own custom rule": "独自のカスタムルールを作成できます",
- "Already have an account with us?": "既にアカウントをお持ちですか?",
- "Any file but images": "画像以外のファイル",
- "App Settings": "アプリの設定",
- "Are you sure you want to delete all records?": "すべてのレコードを削除してもよろしいですか?",
- "Auto Speech": "自動音声",
- "Auto read out all replies": "すべての返信を自動的に読み上げる",
- "Auto upload your records to the cloud": "自動的にレコードをクラウドにアップロードする",
- "Avatar": "アバター",
- "Azure Deployment Name is required": "Azureデプロイメント名が必要です",
- "Azure Endpoint is required": "Azureエンドポイントが必要です",
- "Azure Key is required": "Azureキーが必要です",
- "Back": "戻る",
- "Beta": "ベータ版",
- "Beta Notice": "ベータ版のお知らせ",
- "Cancel": "キャンセル",
- "Chat": "チャット",
- "Claude Key is required": "Claudeキーが必要です",
- "Clear": "クリア",
- "Cleared history successfully!": "履歴のクリアに成功しました!",
- "Click to upload": "クリックしてアップロード",
- "Code": "コード",
- "Confirm": "確認",
- "Confirm to delete Team": "チームを削除することを確認します",
- "Confirm to quit Team": "チームから退出することを確認します",
- "Confirming Deletion": "削除の確認",
- "Context Mode": "コンテキストモード",
- "Continue this Conversation": "この会話を続ける",
- "Conversation": "会話",
- "Conversation Settings": "会話の設定",
- "Conversation context length": "会話コンテキストの長さ",
- "Conversation with files": "ファイル付きの会話",
- "Convert": "変換する",
- "Convert the code to a different language": "コードを別の言語に変換する",
- "Copied": "再現された",
- "Copied share link:": "共有リンクをコピーしました:",
- "Copied to clipboard": "クリップボードにコピーしました",
- "Copy": "コピー",
- "Copy share link": "共有リンクをコピー",
- "Create": "作成する",
- "Create Team": "チームを作成",
- "Create new conversation next time": "次回は新しい会話を作成する",
- "Creative": "クリエイティブ",
- "Current Model": "現在のモデル",
- "Custom": "カスタム",
- "Customize the roles of your conversations": "会話の役割をカスタマイズする",
- "Danger Zoom": "危険な作業",
- "Dark": "ダーク",
- "Delete Account": "アカウントを削除",
- "Delete All": "すべて削除",
- "Deleted record:": "レコードを削除しました:",
- "Edit": "編集",
- "Edit Team": "チームを編集",
- "Edit message:": "メッセージを編集:",
- "Email Address": "メールアドレス",
- "Email is required": "メールアドレスが必要です",
- "Email sent, please check your inbox": "メールが送信されました、受信トレイを確認してください",
- "Enable plugins for improved AI conversation": "プラグインを有効にしてAI会話を改善する",
- "Enter new title": "新しいタイトルを入力",
- "Entry Point": "エントリーポイント",
- "Error when uploading file: ": "ファイルをアップロードする際のエラー:",
- "Error: Conversation not found": "エラー:会話が見つかりません",
- "Error: Something went wrong": "エラー:何か問題が発生しました",
- "Explain": "説明する",
- "Explain what the code means": "コードの意味を説明する",
- "Export": "エクスポート",
- "Export All": "すべてエクスポート",
- "Failed to create team": "チームの作成に失敗しました",
- "Failed to delete team": "チームの削除に失敗しました",
- "Failed to join team": "チームに参加できませんでした",
- "Failed to quit team": "チームの退出に失敗しました",
- "Failed to send email": "メールの送信に失敗しました",
- "Failed to update team": "チームの更新に失敗しました",
- "File": "ファイル",
- "File extension is not allowed": "ファイル拡張子は許可されていません",
- "File size must be less than 512KB": "ファイルサイズは512KB未満である必要があります",
- "Full Name": "フルネーム",
- "Goodwill Reminders": "親切なリマインダー",
- "History": "履歴",
- "History deleted": "履歴が削除されました",
- "Home": "ホーム",
- "If you want to permanently remove your account": "アカウントを永久に削除したい場合",
- "Import": "インポート",
- "Imported history successfully!": "履歴のインポートに成功しました!",
- "Info": "情報",
- "Invalid API Endpoint": "無効なAPIエンドポイント",
- "Invalid email": "無効なメールアドレスです",
- "Join": "参加する",
- "Join Team": "チームに参加",
- "Joined team successfully": "チームに参加しました",
- "Language": "言語",
- "Light": "ライト",
- "Log In": "ログイン",
- "Login": "ログイン",
- "Manage personal info for profile": "プロフィールの個人情報を管理する",
- "Name": "名前",
- "New Chat": "新しいチャット",
- "New Code": "新しいコード",
- "New Conversation": "新しい会話",
- "New File": "新しいファイル",
- "New User?": "新しいユーザー?",
- "New Version Available": "新しいバージョンが利用可能です",
- "No command found": "コマンドが見つかりません",
- "OpenAI Endpoint is required": "OpenAIエンドポイントが必要です",
- "OpenAI Key is required": "OpenAIキーが必要です",
- "Overview": "概要",
- "Planned": "計画中",
- "Please click the button below, please note, This could not be undone": "以下のボタンをクリックしてください、ご注意ください、これは元に戻せません",
- "Please enter a valid URL": "有効なURLを入力してください",
- "Please enter something": "何か入力してください",
- "Please fill in all required fields": "必須項目をすべて入力してください",
- "Please login to join a team": "チームに参加するにはログインしてください",
- "Please note: This could not be undone": "ご注意:これは元に戻せません",
- "Please set up the search config first": "まず検索構成を設定してください",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "設定ページでGoogleプログラマブル検索エンジンAPIキーと検索エンジンIDを設定してください",
- "Please wait for the system response": "システムの応答をお待ちください",
- "Plugins": "プラグイン",
- "Process": "プロセス",
- "Profile": "プロフィール",
- "Profile updated": "プロフィールが更新されました",
- "Quit successfully": "正常に終了しました",
- "Record": "記録",
- "Regenerate": "再生成",
- "Register": "登録",
- "Render user message using Markdown": "Markdownを使用してユーザーメッセージをレンダリングする",
- "Reset": "リセット",
- "Sample": "サンプル",
- "Save": "保存",
- "Search Engine": "検索エンジン",
- "Search History": "検索履歴",
- "Send Message using Enter Key": "Enterキーでメッセージを送信する",
- "Send message key changed to": "メッセージ送信キーが変更されました",
- "Server-Sent Events (SSE)": "Server-Sent Events(SSE)",
- "Service Provider": "サービスプロバイダー",
- "Settings": "設定",
- "Settings reset": "設定がリセットされました",
- "Settings saved": "設定が保存されました",
- "Share": "共有",
- "Sign In": "サインイン",
- "Sign In With Email": "メールアドレスでサインイン",
- "Sign Out": "ログアウト",
- "Sign out": "ログアウト",
- "Sign up": "サインアップ",
- "Something went wrong, please try again later": "何か問題が発生しました。後でもう一度お試しください。",
- "Speak": "話す",
- "Speaking Speed": "話す速度",
- "Speech": "スピーチ",
- "Stable": "ステーブル",
- "Standard": "標準",
- "Stop": "停止",
- "Stop Generating": "生成を停止する",
- "Stream Messages": "メッセージをストリームで表示する",
- "Successfully deleted all records": "すべてのレコードを正常に削除しました",
- "System": "システム",
- "System Prompt": "システムプロンプト",
- "Team": "チーム",
- "Team Overview": "チームの概要",
- "Team access code is required": "チームアクセスコードが必要です",
- "Team access token is required": "チームアクセストークンが必要です",
- "Team created: ": "チームが作成されました:",
- "Team deleted": "チームが削除されました",
- "Team name is required": "チーム名が必要です",
- "Team updated": "チームが更新されました",
- "Temperature": "温度",
- "Text To Speech": "テキスト読み上げ",
- "Text to Speech is not supported in your browser": "テキスト読み上げは、お使いのブラウザではサポートされていません",
- "Theme": "テーマ",
- "This URL already exists": "このURLはすでに存在します",
- "This action cannot be undone": "この操作は元に戻せません",
- "This will permanently delete your team and remove your data from our database": "これにより、チームが永久に削除され、データがデータベースから削除されます",
- "Title changed": "タイトルが変更されました",
- "Type / to see available commands": "利用可能なコマンドを表示するには/を入力してください",
- "Type a command to search": "検索するにはコマンドを入力してください",
- "Unable to fetch content from the URL provided": "指定されたURLからコンテンツを取得できません",
- "Unlock next-level conversations with AI": "AIによる次世代の会話を解除する",
- "Updated the previous share:": "以前の共有を更新しました:",
- "Use Cloud Settings": "クラウド設定を使用する",
- "Voice": "音声",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "私たちは、サービスとエクスペリエンスに影響を与える可能性があるダッシュボードに新しい機能を継続的に追加しています。また、データベースアーキテクチャに再度影響を与えています。一般ユーザーの場合、ログインや登録をお勧めしません。現時点では、ログインせずにほぼすべての機能を使用することができます",
- "Web Search": "Web検索",
- "You": "あなた",
- "You are a teacher": "あなたは先生です",
- "You are using": "あなたは使っています",
- "You can only add 3 files": "ファイルは3つしか追加できません",
- "Your account Conversation Record": "あなたのアカウントの会話履歴",
- "Your browser does not support voice input": "お使いのブラウザは音声入力に対応していません",
- "change send key in settings": "設定で送信キーを変更する",
- "contexts": "コンテキスト",
- "disabled": "無効になっています",
- "enabled": "有効になっています",
- "file": "ファイル",
- "info": "情報",
- "no context": "コンテキストなし",
- "or drag and drop a file": "またはファイルをドラッグしてここに置く",
- "overview": "概要",
- "plugins": "プラグイン",
- "profile": "プロフィール",
- "record": "記録",
- "settings": "設定",
- "system prompt": "システムプロンプト",
- "team": "チーム",
- "History Record": "歴史の記録",
- "AutoScroll to end of message": "メッセージの最後まで自動スクロール",
- "AutoScroll": "自動スクロール",
- "Hello": {
- " I am your virtual AI assistant": "こんにちは、私はあなたの仮想 AI アシスタントです"
- }
+ "cookies": "クッキー",
+ "good_afternoon": "こんにちは!",
+ "good_morning": "おはようございます!",
+ "good_evening": "こんばんは!",
+ "input_box_placeholder": "ここにメッセージを入力...",
+ "new_version_available": "新しいバージョンがあります",
+ "open_source": "オープンソース",
+ "open_source_message": "オープンソース、{license}に準拠",
+ "made_by_author": "{author}制作",
+ "privacy_policy": "プライバシーポリシー",
+ "system": "システム",
+ "dark": "ダークモード",
+ "light": "ライトモード",
+ "send_message": "メッセージを送信",
+ "new_conversation": "新規会話",
+ "share_conversation": "会話を共有",
+ "recent_used": "最近使用したもの",
+ "more_providers": "他のプロバイダ",
+ "provider_not_configured": "プロバイダが設定されていません",
+ "go_to_settings": "設定に移動",
+ "preferences": "設定",
+ "save": "保存",
+ "provider_settings": "プロバイダ設定",
+ "advanced": "詳細設定",
+ "provider": "プロバイダ",
+ "general": "一般",
+ "settings_saved": "設定を保存しました",
+ "upload_file": "ファイルをアップロード",
+ "copy": "コピー",
+ "resend": "再送信",
+ "copied": "コピーしました",
+ "conversation": "会話",
+ "all_conversations_deleted": "すべての会話を削除しました!",
+ "send_message_with_enter": "Enterキーでメッセージを送信",
+ "message_to_speech": "メッセージを音声で再生",
+ "render_message_with_markdown": "Markdownを使ってメッセージを表示",
+ "auto_scroll_to_end_of_conversation": "会話の最後までスクロールする",
+ "conversation_records": "会話の履歴",
+ "export": "エクスポート",
+ "delete": "削除",
+ "use_unified_endpoint": "統一エンドポイントを使用",
+ "stream_messages": "メッセージをストリーミング",
+ "may_not_works_for_some_models": "一部のモデルでは使用できない可能性があります",
+ "number_of_context": "コンテキストの数",
+ "no_limit": "制限なし",
+ "default_system_prompt": "デフォルトのシステムプロンプト",
+ "system_prompt": "システムプロンプト",
+ "custom_system_prompt": "カスタムシステムプロンプト",
+ "based_provider": "ベースのプロバイダ",
+ "custom": "カスタム",
+ "saved_custom_model": "保存されたカスタムモデル",
+ "add_mode_custom_provider": "他のカスタムプロバイダを追加",
+ "image": "画像",
+ "custom_api_key": "カスタムAPIキー",
+ "custom_api_endpoint": "カスタムAPIエンドポイント",
+ "custom_model": "カスタムモデル",
+ "conversation_not_found": "会話が見つかりません",
+ "stop_message": "メッセージを停止",
+ "enter_something_to_send": "送信するメッセージを入力",
+ "system_prompt_may_not_works_for_some_models": "システムプロンプトは一部のモデルで使用できない可能性があります",
+ "ask_anything_here": "ここで何でも質問してください",
+ "send_question": "質問を送信",
+ "chat": "チャット",
+ "search": "検索",
+ "confirm": "確認",
+ "ask_follow_up_question": "フォローアップの質問をする",
+ "search_slogan": "あなたの質問、ここで終わります。",
+ "answer": "回答",
+ "images": "画像",
+ "related": "関連情報",
+ "sources": "情報源",
+ "no_idea": "わかりません",
+ "your_question": "あなたの質問",
+ "your_additions": "あなたの補足",
+ "try_asking": "質問してみてください",
+ "searching": "検索中",
+ "searching_slogan": "システムはあなたの質問を理解しようと努めており、できるだけ早く回答します。",
+ "error": "エラー",
+ "show_all_resources": "すべてのリソースを表示",
+ "show_less_resources": "リソースを少なく表示",
+ "show_more_images": "より多くの画像を表示",
+ "show_less_images": "画像を少なく表示",
+ "no_image_found": "画像が見つかりませんでした",
+ "pro": "プロ版",
+ "enhanced_search_ability": "強化された検索機能",
+ "provider_not_supported": "そのプロバイダはまだサポートされていません。",
+ "search_engine_not_configured": "検索エンジンが設定されていません",
+ "search_engine_configured_globally": "グローバルに設定された検索エンジン",
+ "provider_configured_globally": "グローバルに構成されたプロバイダー",
+ "focus_on": "焦点を当てる",
+ "and": "そして",
+ "docs": "ドキュメント"
}
diff --git a/locales/ko.json b/locales/ko.json
index 7a53360f..4bea3a72 100644
--- a/locales/ko.json
+++ b/locales/ko.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "AI 서비스 제공자",
- "Access Code": "액세스 코드",
- "Account deleted": "계정이 삭제되었습니다",
- "Advanced": "고급 설정",
- "Advanced Conversation Settings": "고급 대화 설정",
- "Advanced configuration for your account": "계정의 고급 설정",
- "Allow you to create your own custom rule": "사용자 정의 규칙을 만들 수 있도록 합니다",
- "Already have an account with us?": "이미 계정이 있으신가요?",
- "Any file but images": "이미지를 제외한 모든 파일",
- "App Settings": "앱 설정",
- "Are you sure you want to delete all records?": "모든 기록을 삭제하시겠습니까?",
- "Auto Speech": "자동 음성",
- "Auto read out all replies": "모든 응답을 자동으로 읽어줍니다",
- "Auto upload your records to the cloud": "기록을 자동으로 클라우드에 업로드하세요",
- "Avatar": "아바타",
- "Azure Deployment Name is required": "Azure 배포 이름은 필수 입력사항입니다",
- "Azure Endpoint is required": "Azure 엔드포인트는 필수 입력사항입니다",
- "Azure Key is required": "Azure 키는 필수 입력사항입니다",
- "Back": "뒤로",
- "Beta": "베타",
- "Beta Notice": "베타 안내",
- "Cancel": "취소",
- "Chat": "채팅",
- "Claude Key is required": "Claude 키는 필수 입력사항입니다",
- "Clear": "Clear",
- "Cleared history successfully!": "대화 기록이 성공적으로 지워졌습니다!",
- "Click to upload": "클릭해서 업로드",
- "Code": "코드",
- "Confirm": "확인",
- "Confirm to delete Team": "팀 삭제 확인",
- "Confirm to quit Team": "팀에서 나가시겠나요?",
- "Confirming Deletion": "삭제 확인",
- "Context Mode": "컨텍스트 모드",
- "Continue this Conversation": "이 대화 계속하기",
- "Conversation": "대화",
- "Conversation Settings": "대화 설정",
- "Conversation context length": "대화 컨텍스트 길이",
- "Conversation with files": "파일이 포함된 대화",
- "Convert": "변환",
- "Convert the code to a different language": "코드를 다른 언어로 변환하세요",
- "Copied": "복사됨",
- "Copied share link:": "공유 링크를 복사했습니다:",
- "Copied to clipboard": "클립보드에 복사되었습니다",
- "Copy": "복사",
- "Copy share link": "공유 링크 복사",
- "Create": "생성",
- "Create Team": "팀 생성",
- "Create new conversation next time": "다음에 새 대화 생성",
- "Creative": "창의적인",
- "Current Model": "현재 모델",
- "Custom": "사용자 정의",
- "Customize the roles of your conversations": "대화의 역할을 사용자 정의하세요",
- "Danger Zoom": "위험한 작업",
- "Dark": "어두운 테마",
- "Delete Account": "계정 삭제",
- "Delete All": "전체 삭제",
- "Deleted record:": "기록이 삭제되었습니다:",
- "Edit": "편집",
- "Edit Team": "팀 수정",
- "Edit message:": "메시지 편집:",
- "Email Address": "이메일 주소",
- "Email is required": "이메일은 필수 입력사항입니다",
- "Email sent, please check your inbox": "이메일이 전송되었습니다. 받은 편지함을 확인해주세요",
- "Enable plugins for improved AI conversation": "AI 대화 향상을 위해 플러그인을 활성화하세요",
- "Enter new title": "새 제목 입력",
- "Entry Point": "진입 지점",
- "Error when uploading file: ": "파일 업로드 중 오류 발생: ",
- "Error: Conversation not found": "오류: 대화를 찾을 수 없습니다",
- "Error: Something went wrong": "오류: 문제가 발생했습니다",
- "Explain": "설명",
- "Explain what the code means": "코드의 의미를 설명하세요",
- "Export": "내보내기",
- "Export All": "전체 내보내기",
- "Failed to create team": "팀생성에 실패했습니다",
- "Failed to delete team": "팀 삭제에 실패했습니다",
- "Failed to join team": "팀 가입에 실패했습니다",
- "Failed to quit team": "팀 나가기에 실패했습니다",
- "Failed to send email": "이메일 전송에 실패했습니다",
- "Failed to update team": "팀 업데이트에 실패했습니다",
- "File": "파일",
- "File extension is not allowed": "허용되지 않는 파일 확장자입니다",
- "File size must be less than 512KB": "파일 크기는 512KB보다 작아야 합니다",
- "Full Name": "성명",
- "Goodwill Reminders": "친절한 알림",
- "History": "대화 기록",
- "History deleted": "기록이 삭제되었습니다",
- "Home": "홈",
- "If you want to permanently remove your account": "계정을 영구적으로 삭제하려면",
- "Import": "가져오기",
- "Imported history successfully!": "대화 기록이 성공적으로 가져와졌습니다!",
- "Info": "정보",
- "Invalid API Endpoint": "잘못된 API Endpoint입니다",
- "Invalid email": "유효하지 않은 이메일입니다",
- "Join": "가입",
- "Join Team": "팀 가입",
- "Joined team successfully": "팀 가입이 성공적으로 완료되었습니다",
- "Language": "언어",
- "Light": "밝은 테마",
- "Log In": "로그인 중",
- "Login": "로그인",
- "Manage personal info for profile": "프로필의 개인정보 관리",
- "Name": "이름",
- "New Chat": "새 대화",
- "New Code": "새 코드",
- "New Conversation": "새 대화 시작",
- "New File": "새 파일",
- "New User?": "새 사용자?",
- "New Version Available": "새 버전이 있습니다",
- "No command found": "찾을 수 없는 명령입니다",
- "OpenAI Endpoint is required": "OpenAI 엔드포인트는 필수 입력사항입니다",
- "OpenAI Key is required": "OpenAI 키는 필수 입력사항입니다",
- "Overview": "개요",
- "Planned": "계획된",
- "Please click the button below, please note, This could not be undone": "아래 버튼을 클릭하세요. 주의: 이 작업은 되돌릴 수 없습니다",
- "Please enter a valid URL": "유효한 URL을 입력해주세요",
- "Please enter something": "내용을 입력해주세요",
- "Please fill in all required fields": "모든 필수 필드를 작성해주세요",
- "Please login to join a team": "팀 가입을 위해 로그인해주세요",
- "Please note: This could not be undone": "주의: 이 작업은 되돌릴 수 없습니다",
- "Please set up the search config first": "먼저 검색 구성을 설정해주세요",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "설정 페이지에서 Google 프로그램 가능한 검색 엔진 API 키와 검색 엔진 ID를 설정해주세요",
- "Please wait for the system response": "시스템 응답을 기다려주세요",
- "Plugins": "플러그인",
- "Process": "처리",
- "Profile": "프로필",
- "Profile updated": "프로필이 업데이트되었습니다",
- "Quit successfully": "성공적으로 나갔습니다",
- "Record": "기록",
- "Regenerate": "재생성",
- "Register": "등록",
- "Render user message using Markdown": "마크다운을 사용하여 사용자 메시지 렌더링",
- "Reset": "초기화",
- "Sample": "샘플",
- "Save": "저장",
- "Search Engine": "검색 엔진",
- "Search History": "대화 기록 검색",
- "Send Message using Enter Key": "Enter 키로 메시지 보내기",
- "Send message key changed to": "메시지 보내기 키가 변경되었습니다:",
- "Server-Sent Events (SSE)": "서버 전송 이벤트 (SSE)",
- "Service Provider": "서비스 제공자",
- "Settings": "설정",
- "Settings reset": "설정 초기화",
- "Settings saved": "설정이 저장되었습니다",
- "Share": "공유",
- "Sign In": "로그인",
- "Sign In With Email": "이메일로 로그인",
- "Sign Out": "로그아웃",
- "Sign out": "로그아웃",
- "Sign up": "가입하기",
- "Something went wrong, please try again later": "문제가 발생했습니다. 나중에 다시 시도해주세요",
- "Speak": "말하기",
- "Speaking Speed": "말하는 속도",
- "Speech": "음성",
- "Stable": "안정적인 버전",
- "Standard": "표준",
- "Stop": "정지",
- "Stop Generating": "생성 중지",
- "Stream Messages": "메시지 스트리밍",
- "Successfully deleted all records": "모든 기록이 성공적으로 삭제되었습니다",
- "System": "시스템",
- "System Prompt": "시스템 프롬프트",
- "Team": "팀",
- "Team Overview": "팀 개요",
- "Team access code is required": "팀 액세스 코드는 필수 입력사항입니다",
- "Team access token is required": "팀 액세스 토큰은 필수 입력사항입니다",
- "Team created: ": "팀이 생성되었습니다:",
- "Team deleted": "팀이 삭제되었습니다",
- "Team name is required": "팀 이름은 필수 입력사항입니다",
- "Team updated": "팀이 업데이트되었습니다",
- "Temperature": "온도",
- "Text To Speech": "텍스트 음성 변환",
- "Text to Speech is not supported in your browser": "당신의 브라우저는 텍스트 음성 변환이 지원되지 않습니다",
- "Theme": "테마",
- "This URL already exists": "이 URL은 이미 존재합니다",
- "This action cannot be undone": "이 작업은 되돌릴 수 없습니다",
- "This will permanently delete your team and remove your data from our database": "팀을 영구적으로 삭제하고 데이터를 데이터베이스에서 제거합니다",
- "Title changed": "제목이 변경되었습니다",
- "Type / to see available commands": "사용 가능한 명령어를 보려면 /를 입력하세요",
- "Type a command to search": "검색할 명령을 입력하세요",
- "Unable to fetch content from the URL provided": "제공된 URL에서 내용을 가져올 수 없습니다",
- "Unlock next-level conversations with AI": "AI와 함께하는 차세대 대화 경험",
- "Updated the previous share:": "이전 공유를 업데이트했습니다:",
- "Use Cloud Settings": "클라우드 설정 사용",
- "Voice": "음성",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "대시보드에 지속적으로 새로운 기능이 추가되어 서비스 및 사용 경험에 영향을 미칠 수 있으며 데이터베이스 아키텍처에도 영향을 미칠 수 있습니다. 일반 사용자의 경우 로그인이나 등록하지 않아도 거의 모든 기능을 사용할 수 있으므로 로그인이나 등록을 권장하지 않습니다.",
- "Web Search": "웹 검색",
- "You": "나",
- "You are a teacher": "당신은 교사입니다",
- "You are using": "사용 중인",
- "You can only add 3 files": "파일은 최대 3개까지만 추가할 수 있습니다",
- "Your account Conversation Record": "계정 대화 기록",
- "Your browser does not support voice input": "음성 입력이 지원되지 않는 브라우저입니다",
- "change send key in settings": "설정에서 보내기 키 변경",
- "contexts": "컨텍스트",
- "disabled": "비활성화됨",
- "enabled": "활성화됨",
- "file": "파일",
- "info": "정보",
- "no context": "컨텍스트 없음",
- "or drag and drop a file": "또는 파일을 끌어다 놓으세요",
- "overview": "개요",
- "plugins": "플러그인",
- "profile": "프로필",
- "record": "기록",
- "settings": "설정",
- "system prompt": "시스템 프롬프트",
- "team": "팀",
- "History Record": "연혁기록",
- "AutoScroll to end of message": "메시지 끝으로 자동스크롤",
- "AutoScroll": "자동 스크롤",
- "Hello": {
- " I am your virtual AI assistant": "안녕하세요, 저는 여러분의 가상 AI 비서입니다."
- }
+ "cookies": "쿠키",
+ "good_afternoon": "안녕하세요!",
+ "good_morning": "좋은 아침입니다!",
+ "good_evening": "안녕하세요!",
+ "input_box_placeholder": "메시지를 여기에 입력하세요...",
+ "new_version_available": "새 버전이 출시되었습니다",
+ "open_source": "오픈 소스",
+ "open_source_message": "오픈 소스, {license} 준수",
+ "made_by_author": "{author}에 의해 제작됨",
+ "privacy_policy": "개인정보 보호정책",
+ "system": "시스템",
+ "dark": "다크 모드",
+ "light": "라이트 모드",
+ "send_message": "메시지 보내기",
+ "new_conversation": "새 대화",
+ "share_conversation": "대화 공유",
+ "recent_used": "최근 사용된 것",
+ "more_providers": "더 많은 공급자",
+ "provider_not_configured": "공급자가 구성되지 않음",
+ "go_to_settings": "설정으로 이동",
+ "preferences": "환경설정",
+ "save": "저장",
+ "provider_settings": "공급자 설정",
+ "advanced": "고급",
+ "provider": "공급자",
+ "general": "일반",
+ "settings_saved": "설정이 저장되었습니다",
+ "upload_file": "파일 업로드",
+ "copy": "복사",
+ "resend": "다시 보내기",
+ "copied": "복사됨",
+ "conversation": "대화",
+ "all_conversations_deleted": "모든 대화가 삭제되었습니다!",
+ "send_message_with_enter": "Enter 키로 메시지 보내기",
+ "message_to_speech": "메시지를 음성으로 전환",
+ "render_message_with_markdown": "Markdown으로 메시지 렌더링",
+ "auto_scroll_to_end_of_conversation": "대화 끝까지 자동 스크롤",
+ "conversation_records": "대화 기록",
+ "export": "내보내기",
+ "delete": "삭제",
+ "use_unified_endpoint": "통합 엔드포인트 사용",
+ "stream_messages": "메시지 스트리밍",
+ "may_not_works_for_some_models": "일부 모델에서는 작동하지 않을 수 있습니다",
+ "number_of_context": "컨텍스트 수",
+ "no_limit": "제한 없음",
+ "default_system_prompt": "기본 시스템 프롬프트",
+ "system_prompt": "시스템 프롬프트",
+ "custom_system_prompt": "사용자 정의 시스템 프롬프트",
+ "based_provider": "기반 공급자",
+ "custom": "사용자 정의",
+ "saved_custom_model": "저장된 사용자 정의 모델",
+ "add_mode_custom_provider": "더 많은 사용자 정의 공급자 추가",
+ "image": "이미지",
+ "custom_api_key": "사용자 정의 API 키",
+ "custom_api_endpoint": "사용자 정의 API 엔드포인트",
+ "custom_model": "사용자 정의 모델",
+ "conversation_not_found": "대화를 찾을 수 없습니다",
+ "stop_message": "메시지 중지",
+ "enter_something_to_send": "보낼 내용을 입력하세요",
+ "system_prompt_may_not_works_for_some_models": "시스템 프롬프트가 일부 모델에서 작동하지 않을 수 있습니다",
+ "ask_anything_here": "여기서 무엇이든 물어보세요",
+ "send_question": "질문 보내기",
+ "chat": "채팅",
+ "search": "검색",
+ "confirm": "확인",
+ "ask_follow_up_question": "후속 질문하기",
+ "search_slogan": "당신의 질문, 여기서 끝납니다.",
+ "answer": "답변",
+ "images": "이미지",
+ "related": "관련",
+ "sources": "출처",
+ "no_idea": "모르겠습니다",
+ "your_question": "당신의 질문",
+ "your_additions": "당신의 추가 사항",
+ "try_asking": "질문해 보세요",
+ "searching": "검색 중",
+ "searching_slogan": "시스템이 귀하의 질문을 이해하려 노력하고 있으며 가능한 빨리 답변드리겠습니다.",
+ "error": "오류",
+ "show_all_resources": "모든 리소스 표시",
+ "show_less_resources": "리소스 적게 표시",
+ "show_more_images": "더 많은 이미지 보기",
+ "show_less_images": "이미지 적게 표시",
+ "no_image_found": "이미지를 찾을 수 없습니다",
+ "pro": "프로",
+ "enhanced_search_ability": "향상된 검색 기능",
+ "provider_not_supported": "아직 해당 공급자를 지원하지 않습니다.",
+ "search_engine_not_configured": "검색 엔진이 구성되지 않았습니다.",
+ "search_engine_configured_globally": "전역적으로 구성된 검색 엔진",
+ "provider_configured_globally": "전역적으로 구성된 공급자",
+ "focus_on": "집중하다",
+ "and": "그리고",
+ "docs": "문서"
}
diff --git a/locales/nl.json b/locales/nl.json
new file mode 100644
index 00000000..d6e62c63
--- /dev/null
+++ b/locales/nl.json
@@ -0,0 +1,94 @@
+{
+ "good_morning": "Goedemorgen!",
+ "open_source": "Open source",
+ "privacy_policy": "Privacybeleid",
+ "cookies": "Koekjes",
+ "new_version_available": "Nieuwe versie beschikbaar",
+ "good_afternoon": "Goedemiddag!",
+ "input_box_placeholder": "Schrijf je bericht hier...",
+ "system": "Systeem",
+ "dark": "Donker",
+ "light": "Licht",
+ "send_message": "Bericht versturen",
+ "new_conversation": "Nieuw gesprek",
+ "share_conversation": "Deel een gesprek",
+ "recent_used": "Recent gebruikt",
+ "more_providers": "Meer aanbieders",
+ "provider_not_configured": "Provider niet geconfigureerd",
+ "go_to_settings": "Ga naar Instellingen",
+ "preferences": "Voorkeuren",
+ "save": "Redden",
+ "provider_settings": "Providerinstellingen",
+ "provider": "Aanbieder",
+ "advanced": "Geavanceerd",
+ "general": "Algemeen",
+ "settings_saved": "instellingen opgeslagen",
+ "open_source_message": "Open source, naleving van {license}",
+ "made_by_author": "Gemaakt door {author}",
+ "good_evening": "Goedeavond!",
+ "upload_file": "Upload bestand",
+ "copy": "Kopiëren",
+ "resend": "Opnieuw versturen",
+ "copied": "Gekopieerd",
+ "conversation": "Gesprek",
+ "all_conversations_deleted": "Alle gesprekken verwijderd!",
+ "send_message_with_enter": "Bericht verzenden met Enter",
+ "message_to_speech": "Bericht naar spraak",
+ "render_message_with_markdown": "Render bericht met prijsverlaging",
+ "auto_scroll_to_end_of_conversation": "Automatisch scrollen naar einde van gesprek",
+ "conversation_records": "Gespreksverslagen",
+ "export": "Exporteren",
+ "delete": "Verwijderen",
+ "use_unified_endpoint": "Gebruik Unified Endpoint",
+ "stream_messages": "Stream berichten",
+ "may_not_works_for_some_models": "Werkt mogelijk niet voor sommige modellen",
+ "number_of_context": "Aantal context",
+ "no_limit": "Geen limiet",
+ "default_system_prompt": "Standaard systeemprompt",
+ "system_prompt": "Systeemprompt",
+ "custom_system_prompt": "Aangepaste systeemprompt",
+ "based_provider": "Gebaseerde aanbieder",
+ "custom": "Aangepast",
+ "saved_custom_model": "Opgeslagen configuratiemodel",
+ "add_mode_custom_provider": "Voeg meer aangepaste provider toe",
+ "image": "Afbeelding",
+ "custom_api_endpoint": "Aangepast API-eindpunt",
+ "custom_api_key": "Aangepaste API-sleutel",
+ "custom_model": "Aangepast model",
+ "conversation_not_found": "Gesprek niet gevonden",
+ "stop_message": "Stop bericht",
+ "system_prompt_may_not_works_for_some_models": "Systeemprompt werkt mogelijk niet voor sommige modellen",
+ "ask_anything_here": "Vraag hier alles",
+ "send_question": "Vraag verzenden",
+ "enter_something_to_send": "Voer iets in om te verzenden",
+ "chat": "Chatten",
+ "search": "Zoekopdracht",
+ "confirm": "Bevestigen",
+ "ask_follow_up_question": "Stel een vervolgvraag",
+ "search_slogan": "Uw vraag eindigt hier.",
+ "answer": "Antwoord",
+ "sources": "Bronnen",
+ "images": "Afbeeldingen",
+ "related": "Verwant",
+ "no_idea": "Geen idee",
+ "your_additions": "Jouw toevoegingen",
+ "your_question": "jouw vraag",
+ "try_asking": "Probeer het te vragen",
+ "searching": "Zoeken",
+ "searching_slogan": "Het systeem probeert uw vraag in te slikken en wil zo snel mogelijk contact met u opnemen.",
+ "error": "Fout",
+ "show_less_resources": "Toon minder bronnen",
+ "show_all_resources": "Toon alle bronnen",
+ "show_more_images": "Bekijk meer afbeeldingen",
+ "show_less_images": "Toon minder afbeeldingen",
+ "no_image_found": "Geen afbeelding gevonden",
+ "pro": "Pro",
+ "enhanced_search_ability": "Verbeterde zoekmogelijkheden",
+ "provider_not_supported": "Provider wordt tot nu toe niet ondersteund.",
+ "search_engine_not_configured": "Zoekmachine niet geconfigureerd",
+ "search_engine_configured_globally": "Zoekmachine globaal geconfigureerd",
+ "provider_configured_globally": "Provider globaal geconfigureerd",
+ "focus_on": "Concentreer op",
+ "and": "En",
+ "docs": "Documenten"
+}
diff --git a/locales/pt.json b/locales/pt.json
new file mode 100644
index 00000000..5bc9707c
--- /dev/null
+++ b/locales/pt.json
@@ -0,0 +1,94 @@
+{
+ "good_morning": "Bom dia!",
+ "open_source": "Código aberto",
+ "privacy_policy": "política de Privacidade",
+ "cookies": "Biscoitos",
+ "new_version_available": "Nova versão disponível",
+ "good_afternoon": "Boa tarde!",
+ "input_box_placeholder": "Digite sua mensagem aqui...",
+ "system": "Sistema",
+ "dark": "Escuro",
+ "light": "Luz",
+ "send_message": "Enviar mensagem",
+ "new_conversation": "Nova conversa",
+ "share_conversation": "Compartilhar conversa",
+ "recent_used": "Usado recentemente",
+ "more_providers": "Mais provedores",
+ "provider_not_configured": "Provedor não configurado",
+ "go_to_settings": "Vá para as configurações",
+ "preferences": "Preferências",
+ "save": "Salvar",
+ "provider_settings": "Configurações do provedor",
+ "provider": "Fornecedor",
+ "advanced": "Avançado",
+ "general": "Em geral",
+ "settings_saved": "Configurações salvas",
+ "open_source_message": "Código aberto, conformidade com {license}",
+ "made_by_author": "Feito por {author}",
+ "good_evening": "Boa noite!",
+ "upload_file": "Subir arquivo",
+ "copy": "cópia de",
+ "resend": "Reenviar",
+ "copied": "Copiado",
+ "conversation": "Conversação",
+ "all_conversations_deleted": "Todas as conversas excluídas!",
+ "send_message_with_enter": "Enviar mensagem com Enter",
+ "message_to_speech": "Mensagem para fala",
+ "render_message_with_markdown": "Renderizar mensagem com Markdown",
+ "auto_scroll_to_end_of_conversation": "Rolagem automática até o final da conversa",
+ "conversation_records": "Registros de conversas",
+ "export": "Exportar",
+ "delete": "Excluir",
+ "use_unified_endpoint": "Usar endpoint unificado",
+ "stream_messages": "Transmitir mensagens",
+ "may_not_works_for_some_models": "Pode não funcionar para alguns modelos",
+ "number_of_context": "Número de Contexto",
+ "no_limit": "Sem limite",
+ "default_system_prompt": "Prompt padrão do sistema",
+ "system_prompt": "Alerta do sistema",
+ "custom_system_prompt": "Prompt de sistema personalizado",
+ "based_provider": "Provedor Baseado",
+ "custom": "Personalizado",
+ "saved_custom_model": "Modelo de configuração salvo",
+ "add_mode_custom_provider": "Adicionar mais provedor personalizado",
+ "image": "Imagem",
+ "custom_api_endpoint": "Terminal de API personalizado",
+ "custom_api_key": "Chave de API personalizada",
+ "custom_model": "Modelo personalizado",
+ "conversation_not_found": "Conversa não encontrada",
+ "stop_message": "Mensagem de parada",
+ "system_prompt_may_not_works_for_some_models": "O prompt do sistema pode não funcionar para alguns modelos",
+ "ask_anything_here": "Pergunte qualquer coisa aqui",
+ "send_question": "Enviar pergunta",
+ "enter_something_to_send": "Digite algo para enviar",
+ "chat": "Bater papo",
+ "search": "Procurar",
+ "confirm": "confirme",
+ "ask_follow_up_question": "Faça uma pergunta de acompanhamento",
+ "search_slogan": "Sua pergunta termina aqui.",
+ "answer": "Responder",
+ "sources": "Fontes",
+ "images": "Imagens",
+ "related": "Relacionado",
+ "no_idea": "Nenhuma idéia",
+ "your_additions": "Suas adições",
+ "your_question": "sua pergunta",
+ "try_asking": "Tente perguntar",
+ "searching": "Procurando",
+ "searching_slogan": "O sistema está tentando engolir sua pergunta e quer entrar em contato com você o mais rápido possível.",
+ "error": "Erro",
+ "show_less_resources": "Mostrar menos recursos",
+ "show_all_resources": "Mostrar todos os recursos",
+ "show_more_images": "Ver mais imagens",
+ "show_less_images": "Mostrar menos imagens",
+ "no_image_found": "Nenhuma imagem encontrada",
+ "pro": "Pró",
+ "enhanced_search_ability": "Capacidade de pesquisa aprimorada",
+ "provider_not_supported": "O provedor não é compatível até o momento.",
+ "search_engine_not_configured": "Mecanismo de pesquisa não configurado",
+ "search_engine_configured_globally": "Mecanismo de pesquisa configurado globalmente",
+ "provider_configured_globally": "Provedor configurado globalmente",
+ "focus_on": "Focar em",
+ "and": "e",
+ "docs": "Documentos"
+}
diff --git a/locales/ru.json b/locales/ru.json
index a2dc6635..12226350 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "Провайдер ИИ-сервисов",
- "Access Code": "Код доступа",
- "Account deleted": "Аккаунт удален",
- "Advanced": "Расширенный",
- "Advanced Conversation Settings": "Расширенные настройки разговора",
- "Advanced configuration for your account": "Расширенная конфигурация для вашего аккаунта",
- "Allow you to create your own custom rule": "Позволяет создавать собственные правила",
- "Already have an account with us?": "Уже есть аккаунт?",
- "Any file but images": "Любой файл, кроме изображений",
- "App Settings": "Настройки приложения",
- "Are you sure you want to delete all records?": "Вы уверены, что хотите удалить все записи?",
- "Auto Speech": "Авто речь",
- "Auto read out all replies": "Автоматически прочитать все ответы",
- "Auto upload your records to the cloud": "Автоматически загружать записи в облако",
- "Avatar": "Аватар",
- "Azure Deployment Name is required": "Требуется имя развертывания Azure",
- "Azure Endpoint is required": "Требуется конечная точка Azure",
- "Azure Key is required": "Требуется ключ Azure",
- "Back": "Назад",
- "Beta": "Бета",
- "Beta Notice": "Уведомление о бета-версии",
- "Cancel": "Отмена",
- "Chat": "Чат",
- "Claude Key is required": "Требуется ключ Claude",
- "Clear": "Очистить",
- "Cleared history successfully!": "История успешно очищена!",
- "Click to upload": "Нажмите, чтобы загрузить",
- "Code": "Код",
- "Confirm": "Подтвердить",
- "Confirm to delete Team": "Подтвердите удаление команды",
- "Confirm to quit Team": "Подтвердите выход из команды",
- "Confirming Deletion": "Подтверждение удаления",
- "Context Mode": "Режим контекста",
- "Continue this Conversation": "Продолжить этот разговор",
- "Conversation": "Разговор",
- "Conversation Settings": "Настройки разговора",
- "Conversation context length": "Длина контекста разговора",
- "Conversation with files": "Разговор с файлами",
- "Convert": "Преобразовать",
- "Convert the code to a different language": "Преобразовать код на другой язык",
- "Copied": "Скопировано",
- "Copied share link:": "Скопирована ссылка на обмен:",
- "Copied to clipboard": "Скопировано в буфер обмена",
- "Copy": "Копировать",
- "Copy share link": "Скопировать ссылку для обмена",
- "Create": "Создать",
- "Create Team": "Создать команду",
- "Create new conversation next time": "Создать новый разговор в следующий раз",
- "Creative": "Креативный",
- "Current Model": "Текущая модель",
- "Custom": "Пользовательский",
- "Customize the roles of your conversations": "Настройте роли ваших разговоров",
- "Danger Zoom": "Опасные операции",
- "Dark": "Тёмный",
- "Delete Account": "Удалить аккаунт",
- "Delete All": "Удалить все",
- "Deleted record:": "Удаленная запись:",
- "Edit": "Редактировать",
- "Edit Team": "Редактировать команду",
- "Edit message:": "Изменить сообщение:",
- "Email Address": "Адрес электронной почты",
- "Email is required": "Требуется адрес электронной почты",
- "Email sent, please check your inbox": "Электронное письмо отправлено, пожалуйста, проверьте свой почтовый ящик",
- "Enable plugins for improved AI conversation": "Включить плагины для улучшения AI-разговора",
- "Enter new title": "Введите новое название",
- "Entry Point": "Входная точка",
- "Error when uploading file: ": "Ошибка при загрузке файла: ",
- "Error: Conversation not found": "Ошибка: разговор не найден",
- "Error: Something went wrong": "Ошибка: что-то пошло не так",
- "Explain": "Объяснить",
- "Explain what the code means": "Объясните, что означает код",
- "Export": "Экспортировать",
- "Export All": "Экспортировать все",
- "Failed to create team": "Не удалось создать команду",
- "Failed to delete team": "Не удалось удалить команду",
- "Failed to join team": "Не удалось присоединиться к команде",
- "Failed to quit team": "Не удалось выйти из команды",
- "Failed to send email": "Не удалось отправить электронное письмо",
- "Failed to update team": "Не удалось обновить команду",
- "File": "Файл",
- "File extension is not allowed": "Расширение файла не разрешено",
- "File size must be less than 512KB": "Размер файла должен быть меньше 512 КБ",
- "Full Name": "Полное имя",
- "Goodwill Reminders": "Напоминания о доброжелательности",
- "History": "История",
- "History deleted": "История удалена",
- "Home": "Главная",
- "If you want to permanently remove your account": "Если вы хотите навсегда удалить свой аккаунт",
- "Import": "Импортировать",
- "Imported history successfully!": "История успешно импортирована!",
- "Info": "Информация",
- "Invalid API Endpoint": "Недействительный конечный API-точка",
- "Invalid email": "Недопустимый адрес электронной почты",
- "Join": "Присоединиться",
- "Join Team": "Присоединиться к команде",
- "Joined team successfully": "Успешно присоединились к команде",
- "Language": "Язык",
- "Light": "Светлый",
- "Log In": "Вход",
- "Login": "Войти",
- "Manage personal info for profile": "Управление личной информацией для профиля",
- "Name": "Имя",
- "New Chat": "Новый чат",
- "New Code": "Новый код",
- "New Conversation": "Новый разговор",
- "New File": "Новый файл",
- "New User?": "Новый пользователь?",
- "New Version Available": "Доступна новая версия",
- "No command found": "Команда не найдена",
- "OpenAI Endpoint is required": "Требуется конечная точка OpenAI",
- "OpenAI Key is required": "Требуется ключ OpenAI",
- "Overview": "Обзор",
- "Planned": "Запланированный",
- "Please click the button below, please note, This could not be undone": "Пожалуйста, нажмите на кнопку ниже, обратите внимание, что это нельзя будет отменить",
- "Please enter a valid URL": "Пожалуйста, введите действительный URL",
- "Please enter something": "Пожалуйста, введите что-нибудь",
- "Please fill in all required fields": "Пожалуйста, заполните все обязательные поля",
- "Please login to join a team": "Пожалуйста, войдите, чтобы присоединиться к команде",
- "Please note: This could not be undone": "Обратите внимание: это нельзя отменить",
- "Please set up the search config first": "Сначала настройте конфигурацию поиска",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "Пожалуйста, настройте свой API-ключ и идентификатор поисковой системы Google Programmable в разделе настроек",
- "Please wait for the system response": "Пожалуйста, дождитесь ответа системы",
- "Plugins": "Плагины",
- "Process": "Обработать",
- "Profile": "Профиль",
- "Profile updated": "Профиль обновлен",
- "Quit successfully": "Успешно вышли из команды",
- "Record": "Запись",
- "Regenerate": "Сгенерировать заново",
- "Register": "Зарегистрироваться",
- "Render user message using Markdown": "Отображать сообщение пользователя с помощью Markdown",
- "Reset": "Сброс",
- "Sample": "Пример",
- "Save": "Сохранить",
- "Search Engine": "Поисковая система",
- "Search History": "История поиска",
- "Send Message using Enter Key": "Отправлять сообщения с помощью клавиши Enter",
- "Send message key changed to": "Ключ отправки сообщения изменен на",
- "Server-Sent Events (SSE)": "События, отправленные сервером (SSE)",
- "Service Provider": "Поставщик услуг",
- "Settings": "Настройки",
- "Settings reset": "Настройки сброшены",
- "Settings saved": "Настройки сохранены",
- "Share": "Обмен",
- "Sign In": "Войти",
- "Sign In With Email": "Войти с помощью электронной почты",
- "Sign Out": "Выйти",
- "Sign out": "Выход",
- "Sign up": "Зарегистрироваться",
- "Something went wrong, please try again later": "Что-то пошло не так, попробуйте позже",
- "Speak": "Говорить",
- "Speaking Speed": "Скорость речи",
- "Speech": "Речь",
- "Stable": "Стабильный",
- "Standard": "Стандартный",
- "Stop": "Остановить",
- "Stop Generating": "Остановить генерацию",
- "Stream Messages": "Поток сообщений",
- "Successfully deleted all records": "Все записи успешно удалены",
- "System": "Система",
- "System Prompt": "Системное предложение",
- "Team": "Команда",
- "Team Overview": "Обзор команды",
- "Team access code is required": "Требуется код доступа к команде",
- "Team access token is required": "Требуется токен доступа к команде",
- "Team created: ": "Команда создана: ",
- "Team deleted": "Команда удалена",
- "Team name is required": "Требуется имя команды",
- "Team updated": "Команда обновлена",
- "Temperature": "Температура",
- "Text To Speech": "Текст в речь",
- "Text to Speech is not supported in your browser": "Текст в речь не поддерживается вашим браузером",
- "Theme": "Тема",
- "This URL already exists": "Этот URL уже существует",
- "This action cannot be undone": "Это действие нельзя отменить",
- "This will permanently delete your team and remove your data from our database": "Это навсегда удалит вашу команду и удалит ваши данные из нашей базы данных",
- "Title changed": "Название изменено",
- "Type / to see available commands": "Введите /, чтобы увидеть доступные команды",
- "Type a command to search": "Введите команду для поиска",
- "Unable to fetch content from the URL provided": "Не удалось получить содержимое из предоставленного URL",
- "Unlock next-level conversations with AI": "Разблокируйте разговоры на следующем уровне с ИИ",
- "Updated the previous share:": "Обновлено предыдущее обменное сообщение:",
- "Use Cloud Settings": "Использовать облачные настройки",
- "Voice": "Голос",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "Мы постоянно добавляем новые функции в панель инструментов, которые могут повлиять на ваш сервис и опыт использования, а также повлиять на архитектуру базы данных, и если вы обычный пользователь, мы не рекомендуем вам входить или регистрироваться, поскольку практически все функции можно использовать без входа",
- "Web Search": "Поиск в Интернете",
- "You": "Вы",
- "You are a teacher": "Вы учитель",
- "You are using": "Вы используете",
- "You can only add 3 files": "Вы можете добавить только 3 файла",
- "Your account Conversation Record": "Записи ваших разговоров",
- "Your browser does not support voice input": "Ваш браузер не поддерживает голосовой ввод",
- "change send key in settings": "изменить ключ отправки в настройках",
- "contexts": "контексты",
- "disabled": "отключено",
- "enabled": "включено",
- "file": "файл",
- "info": "информация",
- "no context": "нет контекста",
- "or drag and drop a file": "или перетащите файл",
- "overview": "обзор",
- "plugins": "плагины",
- "profile": "профиль",
- "record": "запись",
- "settings": "настройки",
- "system prompt": "системное предложение",
- "team": "команда",
- "History Record": "Запись истории",
- "AutoScroll to end of message": "Автопрокрутка до конца сообщения",
- "AutoScroll": "Автопрокрутка",
- "Hello": {
- " I am your virtual AI assistant": "Здравствуйте, я ваш виртуальный ИИ-помощник"
- }
+ "cookies": "Куки",
+ "good_afternoon": "Добрый день!",
+ "good_morning": "Доброе утро!",
+ "good_evening": "Добрый вечер!",
+ "input_box_placeholder": "Введите ваше сообщение здесь...",
+ "new_version_available": "Доступна новая версия",
+ "open_source": "Открытый исходный код",
+ "open_source_message": "Открытый исходный код, соответствует {license}",
+ "made_by_author": "Разработано {author}",
+ "privacy_policy": "Политика конфиденциальности",
+ "system": "Система",
+ "dark": "Темная тема",
+ "light": "Светлая тема",
+ "send_message": "Отправить сообщение",
+ "new_conversation": "Новый диалог",
+ "share_conversation": "Поделиться диалогом",
+ "recent_used": "Недавно использованное",
+ "more_providers": "Больше провайдеров",
+ "provider_not_configured": "Провайдер не настроен",
+ "go_to_settings": "Перейти к настройкам",
+ "preferences": "Настройки",
+ "save": "Сохранить",
+ "provider_settings": "Настройки провайдера",
+ "advanced": "Расширенные",
+ "provider": "Провайдер",
+ "general": "Общие",
+ "settings_saved": "Настройки сохранены",
+ "upload_file": "Загрузить файл",
+ "copy": "Копировать",
+ "resend": "Отправить повторно",
+ "copied": "Скопировано",
+ "conversation": "Диалог",
+ "all_conversations_deleted": "Все диалоги удалены!",
+ "send_message_with_enter": "Отправлять сообщение с помощью клавиши Enter",
+ "message_to_speech": "Озвучить сообщение",
+ "render_message_with_markdown": "Отображать сообщение с использованием Markdown",
+ "auto_scroll_to_end_of_conversation": "Автопрокрутка до конца диалога",
+ "conversation_records": "Записи диалогов",
+ "export": "Экспортировать",
+ "delete": "Удалить",
+ "use_unified_endpoint": "Использовать единую конечную точку",
+ "stream_messages": "Потоковая передача сообщений",
+ "may_not_works_for_some_models": "Может не работать для некоторых моделей",
+ "number_of_context": "Количество контекста",
+ "no_limit": "Без ограничений",
+ "default_system_prompt": "Системный запрос по умолчанию",
+ "system_prompt": "Системный запрос",
+ "custom_system_prompt": "Пользовательский системный запрос",
+ "based_provider": "На основе провайдера",
+ "custom": "Пользовательский",
+ "saved_custom_model": "Сохраненная пользовательская модель",
+ "add_mode_custom_provider": "Добавить другого пользовательского провайдера",
+ "image": "Изображение",
+ "custom_api_key": "Пользовательский API-ключ",
+ "custom_api_endpoint": "Пользовательская API-конечная точка",
+ "custom_model": "Пользовательская модель",
+ "conversation_not_found": "Диалог не найден",
+ "stop_message": "Остановить сообщение",
+ "enter_something_to_send": "Введите текст для отправки",
+ "system_prompt_may_not_works_for_some_models": "Системный запрос может не работать для некоторых моделей",
+ "ask_anything_here": "Задайте здесь любой вопрос",
+ "send_question": "Отправить вопрос",
+ "chat": "Чат",
+ "search": "Поиск",
+ "confirm": "Подтвердить",
+ "ask_follow_up_question": "Задать уточняющий вопрос",
+ "search_slogan": "Ваш вопрос, на этом всё.",
+ "answer": "Ответ",
+ "images": "Изображения",
+ "related": "Связанные",
+ "sources": "Источники",
+ "no_idea": "Нет идей",
+ "your_question": "Ваш вопрос",
+ "your_additions": "Ваши дополнения",
+ "try_asking": "Попробуйте спросить",
+ "searching": "Поиск",
+ "searching_slogan": "Система пытается понять ваш вопрос и ответит вам как можно скорее.",
+ "error": "Ошибка",
+ "show_all_resources": "Показать все ресурсы",
+ "show_less_resources": "Показать меньше ресурсов",
+ "show_more_images": "Просмотреть больше изображений",
+ "show_less_images": "Показать меньше изображений",
+ "no_image_found": "Изображения не найдены",
+ "pro": "Про",
+ "enhanced_search_ability": "Улучшенные поисковые возможности",
+ "provider_not_supported": "Данный провайдер пока не поддерживается.",
+ "search_engine_not_configured": "Поисковая система не настроена",
+ "search_engine_configured_globally": "Поисковая система настроена глобально",
+ "provider_configured_globally": "Поставщик настроен глобально",
+ "focus_on": "Сосредоточиться на",
+ "and": "и",
+ "docs": "Документы"
}
diff --git a/locales/zh-CN.json b/locales/zh-CN.json
index eb50da37..023ab479 100644
--- a/locales/zh-CN.json
+++ b/locales/zh-CN.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "人工智能服务提供商",
- "Access Code": "访问码",
- "Account deleted": "账户已删除",
- "Advanced": "高级",
- "Advanced Conversation Settings": "高级对话设置",
- "Advanced configuration for your account": "账户的高级配置",
- "Allow you to create your own custom rule": "允许您创建自己的自定义规则",
- "Already have an account with us?": "已经有账户了?",
- "Any file but images": "除图像外的任何文件",
- "App Settings": "应用设置",
- "Are you sure you want to delete all records?": "您确定要删除所有记录吗?",
- "Auto Speech": "自动语音",
- "Auto read out all replies": "自动朗读所有回复",
- "Auto upload your records to the cloud": "自动将您的记录上传到云端",
- "Avatar": "头像",
- "Azure Deployment Name is required": "必须提供 Azure Deployment Name",
- "Azure Endpoint is required": "必须提供 Azure Endpoint",
- "Azure Key is required": "必须提供 Azure Key",
- "Back": "返回",
- "Beta": "测试版",
- "Beta Notice": "测试版通知",
- "Cancel": "取消",
- "Chat": "聊天",
- "Claude Key is required": "必须提供 Claude Key",
- "Clear": "清除",
- "Cleared history successfully!": "历史记录清除成功!",
- "Click to upload": "点击上传",
- "Code": "代码",
- "Confirm": "确认",
- "Confirm to delete Team": "确认删除团队",
- "Confirm to quit Team": "确认退出团队",
- "Confirming Deletion": "确认删除",
- "Context Mode": "上下文模式",
- "Continue this Conversation": "继续此对话",
- "Conversation": "对话",
- "Conversation Settings": "对话设置",
- "Conversation context length": "对话上下文长度",
- "Conversation with files": "带有文件的对话",
- "Convert": "转换",
- "Convert the code to a different language": "将代码转换为其他语言",
- "Copied": "已复制",
- "Copied share link:": "已复制分享链接:",
- "Copied to clipboard": "已复制到剪贴板",
- "Copy": "复制",
- "Copy share link": "复制分享链接",
- "Create": "创建",
- "Create Team": "创建团队",
- "Create new conversation next time": "下次创建新对话",
- "Creative": "创意",
- "Current Model": "当前模型",
- "Custom": "自定义",
- "Customize the roles of your conversations": "自定义对话的角色",
- "Danger Zoom": "危险操作",
- "Dark": "深色",
- "Delete Account": "删除账户",
- "Delete All": "删除全部",
- "Deleted record:": "已删除记录:",
- "Edit": "编辑",
- "Edit Team": "编辑团队",
- "Edit message:": "编辑消息:",
- "Email Address": "电子邮件地址",
- "Email is required": "必须填写电子邮件",
- "Email sent, please check your inbox": "电子邮件已发送,请查看收件箱",
- "Enable plugins for improved AI conversation": "启用插件以改进人工智能对话",
- "Enter new title": "输入新标题",
- "Entry Point": "入口点",
- "Error when uploading file: ": "上传文件时出错:",
- "Error: Conversation not found": "错误:未找到对话",
- "Error: Something went wrong": "错误:出了些问题",
- "Explain": "解释",
- "Explain what the code means": "解释代码的含义",
- "Export": "导出",
- "Export All": "导出全部",
- "Failed to create team": "创建团队失败",
- "Failed to delete team": "删除团队失败",
- "Failed to join team": "加入团队失败",
- "Failed to quit team": "退出团队失败",
- "Failed to send email": "发送电子邮件失败",
- "Failed to update team": "更新团队失败",
- "File": "文件",
- "File extension is not allowed": "不允许使用该文件扩展名",
- "File size must be less than 512KB": "文件大小必须小于 512KB",
- "Full Name": "全名",
- "Goodwill Reminders": "善意提醒",
- "History": "历史",
- "History deleted": "历史已删除",
- "Home": "主页",
- "If you want to permanently remove your account": "如果您想永久删除您的账户",
- "Import": "导入",
- "Imported history successfully!": "历史记录导入成功!",
- "Info": "信息",
- "Invalid API Endpoint": "API端点无效",
- "Invalid email": "无效的电子邮件",
- "Join": "加入",
- "Join Team": "加入团队",
- "Joined team successfully": "成功加入团队",
- "Language": "语言",
- "Light": "浅色",
- "Log In": "登录",
- "Login": "登录",
- "Manage personal info for profile": "管理个人资料信息",
- "Name": "名称",
- "New Chat": "新聊天",
- "New Code": "新代码",
- "New Conversation": "新对话",
- "New File": "新文件",
- "New User?": "新用户?",
- "New Version Available": "新版本可用",
- "No command found": "未找到命令",
- "OpenAI Endpoint is required": "必须提供 OpenAI Endpoint",
- "OpenAI Key is required": "必须提供 OpenAI Key",
- "Overview": "概述",
- "Planned": "计划中",
- "Please click the button below, please note, This could not be undone": "请点击下面的按钮,注意,此操作无法撤销",
- "Please enter a valid URL": "请输入有效的 URL",
- "Please enter something": "请输入内容",
- "Please fill in all required fields": "请填写所有必填字段",
- "Please login to join a team": "请登录以加入团队",
- "Please note: This could not be undone": "请注意:此操作无法撤销",
- "Please set up the search config first": "请先设置搜索配置",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "请在设置页面设置您的 Google Programmable Search Engine API 密钥和 Search Engine ID",
- "Please wait for the system response": "请等待系统响应",
- "Plugins": "插件",
- "Process": "处理",
- "Profile": "个人资料",
- "Profile updated": "个人资料已更新",
- "Quit successfully": "成功退出",
- "Record": "记录",
- "Regenerate": "重新生成",
- "Register": "注册",
- "Render user message using Markdown": "使用 Markdown 渲染用户消息",
- "Reset": "重置",
- "Sample": "示例",
- "Save": "保存",
- "Search Engine": "搜索引擎",
- "Search History": "搜索历史",
- "Send Message using Enter Key": "使用回车键发送消息",
- "Send message key changed to": "消息发送键已更改为",
- "Server-Sent Events (SSE)": "Server-Sent Events(SSE)",
- "Service Provider": "服务提供商",
- "Settings": "设置",
- "Settings reset": "设置已重置",
- "Settings saved": "设置已保存",
- "Share": "分享",
- "Sign In": "登录",
- "Sign In With Email": "使用电子邮件登录",
- "Sign Out": "退出登录",
- "Sign out": "退出",
- "Sign up": "注册",
- "Something went wrong, please try again later": "出了些问题,请稍后再试",
- "Speak": "朗读",
- "Speaking Speed": "语速",
- "Speech": "语音",
- "Stable": "稳定",
- "Standard": "标准",
- "Stop": "停止",
- "Stop Generating": "停止生成",
- "Stream Messages": "实时消息",
- "Successfully deleted all records": "已成功删除所有记录",
- "System": "系统",
- "System Prompt": "系统提示",
- "Team": "团队",
- "Team Overview": "团队概述",
- "Team access code is required": "必须提供团队访问码",
- "Team access token is required": "必须提供团队访问令牌",
- "Team created: ": "已创建团队:",
- "Team deleted": "团队已删除",
- "Team name is required": "必须填写团队名称",
- "Team updated": "团队已更新",
- "Temperature": "温度",
- "Text To Speech": "文字转语音",
- "Text to Speech is not supported in your browser": "您的浏览器不支持文字转语音",
- "Theme": "主题",
- "This URL already exists": "此 URL 已存在",
- "This action cannot be undone": "此操作无法撤销",
- "This will permanently delete your team and remove your data from our database": "此操作将永久删除您的团队并从我们的数据库中删除您的数据",
- "Title changed": "标题已更改",
- "Type / to see available commands": "键入 / 查看可用命令",
- "Type a command to search": "输入命令进行搜索",
- "Unable to fetch content from the URL provided": "无法从提供的 URL 获取内容",
- "Unlock next-level conversations with AI": "与人工智能解锁下一级别的对话",
- "Updated the previous share:": "已更新先前的分享:",
- "Use Cloud Settings": "使用云端设置",
- "Voice": "声音",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "我们正在不断为仪表板添加新功能,这可能会影响您的服务和体验,以及重新影响数据库架构,如果您是一般用户,我们不建议您登录或注册,因为目前几乎可以使用所有功能而无需登录",
- "Web Search": "网络搜索",
- "You": "您",
- "You are a teacher": "您是一位老师",
- "You are using": "您正在使用",
- "You can only add 3 files": "您只能添加 3 个文件",
- "Your account Conversation Record": "您的账户对话记录",
- "Your browser does not support voice input": "您的浏览器不支持语音输入",
- "change send key in settings": "在设置中更改发送键",
- "contexts": "上下文",
- "disabled": "已禁用",
- "enabled": "已启用",
- "file": "文件",
- "info": "信息",
- "no context": "无上下文",
- "or drag and drop a file": "或拖拽文件",
- "overview": "概述",
- "plugins": "插件",
- "profile": "个人资料",
- "record": "记录",
- "settings": "设置",
- "system prompt": "系统提示",
- "team": "团队",
- "History Record": "历史记录",
- "AutoScroll to end of message": "自动滚动到消息末尾",
- "AutoScroll": "自动滚屏",
- "Hello": {
- " I am your virtual AI assistant": "你好,我是你的虚拟AI助手"
- }
+ "cookies": "饼干",
+ "good_afternoon": "下午好!",
+ "good_morning": "早上好!",
+ "good_evening": "晚上好!",
+ "input_box_placeholder": "在此输入您的消息...",
+ "new_version_available": "有新版本可用",
+ "open_source": "开源",
+ "open_source_message": "开源, 符合{license}",
+ "made_by_author": "由{author}制作",
+ "privacy_policy": "隐私政策",
+ "system": "系统",
+ "dark": "深色",
+ "light": "浅色",
+ "send_message": "发送消息",
+ "new_conversation": "新对话",
+ "share_conversation": "分享对话",
+ "recent_used": "最近使用",
+ "more_providers": "更多提供商",
+ "provider_not_configured": "提供商未配置",
+ "go_to_settings": "进入设置",
+ "preferences": "偏好设置",
+ "save": "保存",
+ "provider_settings": "提供商设置",
+ "advanced": "高级",
+ "provider": "提供商",
+ "general": "常规",
+ "settings_saved": "设置已保存",
+ "upload_file": "上传文件",
+ "copy": "复制",
+ "resend": "重发",
+ "copied": "已复制",
+ "conversation": "对话",
+ "all_conversations_deleted": "所有对话已删除!",
+ "send_message_with_enter": "使用回车发送消息",
+ "message_to_speech": "消息转语音",
+ "render_message_with_markdown": "使用Markdown渲染消息",
+ "auto_scroll_to_end_of_conversation": "自动滚动到对话结尾",
+ "conversation_records": "对话记录",
+ "export": "导出",
+ "delete": "删除",
+ "use_unified_endpoint": "使用统一端点",
+ "stream_messages": "流式消息",
+ "may_not_works_for_some_models": "部分模型可能无法使用",
+ "number_of_context": "上下文数量",
+ "no_limit": "无限制",
+ "default_system_prompt": "默认系统提示",
+ "system_prompt": "系统提示",
+ "custom_system_prompt": "自定义系统提示",
+ "based_provider": "基于提供商",
+ "custom": "自定义",
+ "saved_custom_model": "已保存的自定义模型",
+ "add_mode_custom_provider": "添加更多自定义提供商",
+ "image": "图像",
+ "custom_api_key": "自定义API密钥",
+ "custom_api_endpoint": "自定义API端点",
+ "custom_model": "自定义模型",
+ "conversation_not_found": "找不到对话",
+ "stop_message": "停止消息",
+ "enter_something_to_send": "输入要发送的内容",
+ "system_prompt_may_not_works_for_some_models": "系统提示可能无法用于某些模型",
+ "ask_anything_here": "在这里问任何问题",
+ "send_question": "发送问题",
+ "chat": "聊天",
+ "search": "搜索",
+ "confirm": "确认",
+ "ask_follow_up_question": "提出后续问题",
+ "search_slogan": "您的问题,到此为止。",
+ "answer": "答案",
+ "images": "图像",
+ "related": "相关",
+ "sources": "来源",
+ "no_idea": "无从知晓",
+ "your_question": "您的问题",
+ "your_additions": "您的补充",
+ "try_asking": "试着问问",
+ "searching": "正在搜索",
+ "searching_slogan": "系统正在努力理解您的问题,会尽快给您回复。",
+ "error": "错误",
+ "show_all_resources": "显示所有资源",
+ "show_less_resources": "显示较少资源",
+ "show_more_images": "查看更多图像",
+ "show_less_images": "显示较少图像",
+ "no_image_found": "未找到图像",
+ "pro": "专业版",
+ "enhanced_search_ability": "增强的搜索能力",
+ "provider_not_supported": "尚未支持该提供商。",
+ "search_engine_not_configured": "搜索引擎未配置",
+ "search_engine_configured_globally": "全局配置的搜索引擎",
+ "provider_configured_globally": "全局配置的提供者",
+ "focus_on": "专注于",
+ "and": "和",
+ "docs": "文档"
}
diff --git a/locales/zh-HK.json b/locales/zh-HK.json
index 2ab780e9..a9568b7c 100644
--- a/locales/zh-HK.json
+++ b/locales/zh-HK.json
@@ -1,215 +1,94 @@
{
- "AI Service Provider": "AI 服務提供者",
- "Access Code": "訪問代碼",
- "Account deleted": "已刪除帳號",
- "Advanced": "進階",
- "Advanced Conversation Settings": "高級對話設定",
- "Advanced configuration for your account": "帳戶的高級配置",
- "Allow you to create your own custom rule": "允許您創建自己的自定義規則",
- "Already have an account with us?": "已經有帳號了嗎?",
- "Any file but images": "任何檔案,但不包括圖像",
- "App Settings": "應用程式設定",
- "Are you sure you want to delete all records?": "確定要刪除所有記錄嗎?",
- "Auto Speech": "自動朗讀",
- "Auto read out all replies": "自動朗讀所有回覆",
- "Auto upload your records to the cloud": "自動上傳您的記錄到雲端",
- "Avatar": "頭像",
- "Azure Deployment Name is required": "需要Azure Deployment Name",
- "Azure Endpoint is required": "需要Azure Endpoint",
- "Azure Key is required": "需要Azure Key",
- "Back": "返回",
- "Beta": "測試版",
- "Beta Notice": "測試版通知",
- "Cancel": "取消",
- "Chat": "聊天",
- "Claude Key is required": "需要Claude Key",
- "Clear": "清除",
- "Cleared history successfully!": "已成功清除歷史!",
- "Click to upload": "點擊上傳",
- "Code": "程式碼",
- "Confirm": "確認",
- "Confirm to delete Team": "確認刪除團隊",
- "Confirm to quit Team": "確認退出團隊",
- "Confirming Deletion": "確認刪除",
- "Context Mode": "上下文模式",
- "Continue this Conversation": "繼續此對話",
- "Conversation": "對話",
- "Conversation Settings": "對話設定",
- "Conversation context length": "對話上下文長度",
- "Conversation with files": "帶有檔案的對話",
- "Convert": "轉換",
- "Convert the code to a different language": "將代碼轉換為其他語言",
- "Copied": "已複製",
- "Copied share link:": "已複製分享連結:",
- "Copied to clipboard": "已複製到剪貼簿",
- "Copy": "複製",
- "Copy share link": "複製分享連結",
- "Create": "建立",
- "Create Team": "建立團隊",
- "Create new conversation next time": "下次建立新對話",
- "Creative": "創意",
- "Current Model": "目前模型",
- "Custom": "自訂",
- "Customize the roles of your conversations": "自訂對話的角色",
- "Danger Zoom": "危險操作",
- "Dark": "深色",
- "Delete Account": "刪除帳號",
- "Delete All": "刪除全部",
- "Deleted record:": "已刪除記錄:",
- "Edit": "編輯",
- "Edit Team": "編輯團隊",
- "Edit message:": "編輯訊息:",
- "Email Address": "電子郵件地址",
- "Email is required": "請填寫電子郵件",
- "Email sent, please check your inbox": "電子郵件已發送,請檢查您的收件箱",
- "Enable plugins for improved AI conversation": "啟用插件以改善 AI 對話",
- "Enter new title": "輸入新標題",
- "Entry Point": "入口點",
- "Error when uploading file: ": "上傳檔案時出錯:",
- "Error: Conversation not found": "錯誤:找不到對話",
- "Error: Something went wrong": "錯誤:發生錯誤",
- "Explain": "解釋",
- "Explain what the code means": "解釋代碼的含義",
- "Export": "匯出",
- "Export All": "匯出全部",
- "Failed to create team": "無法建立團隊",
- "Failed to delete team": "無法刪除團隊",
- "Failed to join team": "無法加入團隊",
- "Failed to quit team": "無法退出團隊",
- "Failed to send email": "無法發送電子郵件",
- "Failed to update team": "無法更新團隊",
- "File": "檔案",
- "File extension is not allowed": "不允許使用此檔案副檔名",
- "File size must be less than 512KB": "檔案大小必須小於 512KB",
- "Full Name": "全名",
- "Goodwill Reminders": "友善提示",
- "History": "歷史",
- "History deleted": "歷史已刪除",
- "Home": "首頁",
- "If you want to permanently remove your account": "如果您想永久刪除您的帳號",
- "Import": "匯入",
- "Imported history successfully!": "已成功匯入歷史!",
- "Info": "資訊",
- "Invalid API Endpoint": "無效的 API 端點",
- "Invalid email": "電子郵件無效",
- "Join": "加入",
- "Join Team": "加入團隊",
- "Joined team successfully": "成功加入團隊",
- "Language": "語言",
- "Light": "淺色",
- "Log In": "登入",
- "Login": "登入",
- "Manage personal info for profile": "管理個人資料",
- "Name": "名稱",
- "New Chat": "新對話",
- "New Code": "新代碼",
- "New Conversation": "新對話",
- "New File": "新檔案",
- "New User?": "新用戶?",
- "New Version Available": "有新版本可用",
- "No command found": "找不到命令",
- "OpenAI Endpoint is required": "需要OpenAI端點",
- "OpenAI Key is required": "需要OpenAI金鑰",
- "Overview": "概述",
- "Planned": "已計劃",
- "Please click the button below, please note, This could not be undone": "請單擊下面的按鈕,請注意,此操作無法撤消",
- "Please enter a valid URL": "請輸入有效的 URL",
- "Please enter something": "請輸入內容",
- "Please fill in all required fields": "請填寫所有必填欄位",
- "Please login to join a team": "請登入以加入團隊",
- "Please note: This could not be undone": "請注意:此操作無法撤消",
- "Please set up the search config first": "請先設置搜尋配置",
- "Please set up your Google Programmable Search Engine API Key and Search Engine ID in the settings page": "請在設定頁面設置您的 Google Programmable Search Engine API 金鑰和 Search Engine ID",
- "Please wait for the system response": "請等待系統回應",
- "Plugins": "插件",
- "Process": "處理",
- "Profile": "個人資料",
- "Profile updated": "已更新個人資料",
- "Quit successfully": "成功退出",
- "Record": "記錄",
- "Regenerate": "重新生成",
- "Register": "註冊",
- "Render user message using Markdown": "使用 Markdown 渲染使用者訊息",
- "Reset": "重設",
- "Sample": "範例",
- "Save": "儲存",
- "Search Engine": "搜尋引擎",
- "Search History": "搜索歷史",
- "Send Message using Enter Key": "使用 Enter 鍵發送訊息",
- "Send message key changed to": "發送訊息的鍵已更改為",
- "Server-Sent Events (SSE)": "Server-Sent Events (SSE)",
- "Service Provider": "服務提供商",
- "Settings": "設定",
- "Settings reset": "設定已重設",
- "Settings saved": "設定已儲存",
- "Share": "分享",
- "Sign In": "登入",
- "Sign In With Email": "使用電子郵件登入",
- "Sign Out": "登出",
- "Sign out": "登出",
- "Sign up": "註冊",
- "Something went wrong, please try again later": "發生錯誤,請稍後重試",
- "Speak": "朗讀",
- "Speaking Speed": "語速",
- "Speech": "語音",
- "Stable": "穩定",
- "Standard": "標準",
- "Stop": "停止",
- "Stop Generating": "停止生成",
- "Stream Messages": "流訊息",
- "Successfully deleted all records": "已成功刪除所有記錄",
- "System": "系統",
- "System Prompt": "系統提示",
- "Team": "團隊",
- "Team Overview": "團隊概述",
- "Team access code is required": "需要團隊訪問代碼",
- "Team access token is required": "需要團隊訪問令牌",
- "Team created: ": "已建立團隊:",
- "Team deleted": "已刪除團隊",
- "Team name is required": "需要團隊名稱",
- "Team updated": "已更新團隊",
- "Temperature": "溫度",
- "Text To Speech": "文字轉語音",
- "Text to Speech is not supported in your browser": "您的瀏覽器不支援文字轉語音",
- "Theme": "主題",
- "This URL already exists": "此 URL 已存在",
- "This action cannot be undone": "此操作無法撤消",
- "This will permanently delete your team and remove your data from our database": "這將永久刪除您的團隊並從我們的數據庫中刪除您的數據",
- "Title changed": "標題已更改",
- "Type / to see available commands": "輸入 / 以查看可用命令",
- "Type a command to search": "輸入命令進行搜索",
- "Unable to fetch content from the URL provided": "無法從提供的 URL 獲取內容",
- "Unlock next-level conversations with AI": "解鎖與人工智能的下一級對話",
- "Updated the previous share:": "更新先前的分享:",
- "Use Cloud Settings": "使用雲端設定",
- "Voice": "聲音",
- "We are continually adding new features to the dashboard which may affect your service and experience, as well as re-impacting the database architecture, and if you are a general user, we do not recommend that you log in or register, as at the moment it is possible to use almost all features without logging in": "我們正在不斷為儀表板添加新功能,這可能會影響您的服務和體驗,以及重新影響數據庫架構,如果您是一般用戶,我們不建議您登入或註冊,因為目前幾乎可以在不登入的情況下使用所有功能",
- "Web Search": "網頁搜尋",
- "You": "您",
- "You are a teacher": "您是一位老師",
- "You are using": "您正在使用",
- "You can only add 3 files": "您只能添加 3 個檔案",
- "Your account Conversation Record": "您的對話記錄",
- "Your browser does not support voice input": "您的瀏覽器不支援語音輸入",
- "change send key in settings": "在設定中更改發送鍵",
- "contexts": "上下文",
- "disabled": "已停用",
- "enabled": "已啟用",
- "file": "檔案",
- "info": "資訊",
- "no context": "沒有上下文",
- "or drag and drop a file": "或拖放檔案",
- "overview": "總覽",
- "plugins": "插件",
- "profile": "個人資料",
- "record": "記錄",
- "settings": "設定",
- "system prompt": "系統提示",
- "team": "團隊",
- "History Record": "歷史記錄",
- "AutoScroll to end of message": "自動滾動到訊息末尾",
- "AutoScroll": "自動滾螢幕",
- "Hello": {
- " I am your virtual AI assistant": "你好,我是你的虛擬AI助手"
- }
+ "cookies": "曲奇餅",
+ "good_afternoon": "午安!",
+ "good_morning": "早晨!",
+ "good_evening": "晚安!",
+ "input_box_placeholder": "在此輸入您的訊息...",
+ "new_version_available": "有新版本可用",
+ "open_source": "開源",
+ "open_source_message": "開源, 符合{license}",
+ "made_by_author": "由{author}製作",
+ "privacy_policy": "私隱政策",
+ "system": "系統",
+ "dark": "深色",
+ "light": "淺色",
+ "send_message": "發送訊息",
+ "new_conversation": "新對話",
+ "share_conversation": "分享對話",
+ "recent_used": "最近使用",
+ "more_providers": "更多供應商",
+ "provider_not_configured": "供應商未配置",
+ "go_to_settings": "前往設置",
+ "preferences": "偏好設置",
+ "save": "儲存",
+ "provider_settings": "供應商設置",
+ "advanced": "進階",
+ "provider": "供應商",
+ "general": "一般",
+ "settings_saved": "設置已儲存",
+ "upload_file": "上傳檔案",
+ "copy": "複製",
+ "resend": "重發",
+ "copied": "已複製",
+ "conversation": "對話",
+ "all_conversations_deleted": "所有對話已刪除!",
+ "send_message_with_enter": "使用Enter鍵發送訊息",
+ "message_to_speech": "訊息轉語音",
+ "render_message_with_markdown": "使用Markdown渲染訊息",
+ "auto_scroll_to_end_of_conversation": "自動捲動至對話末尾",
+ "conversation_records": "對話記錄",
+ "export": "匯出",
+ "delete": "刪除",
+ "use_unified_endpoint": "使用統一端點",
+ "stream_messages": "串流訊息",
+ "may_not_works_for_some_models": "部分模型可能無法使用",
+ "number_of_context": "上下文數量",
+ "no_limit": "無限制",
+ "default_system_prompt": "預設系統提示",
+ "system_prompt": "系統提示",
+ "custom_system_prompt": "自訂系統提示",
+ "based_provider": "基於供應商",
+ "custom": "自訂",
+ "saved_custom_model": "已儲存的自訂模型",
+ "add_mode_custom_provider": "添加更多自訂供應商",
+ "image": "圖像",
+ "custom_api_key": "自訂API密鑰",
+ "custom_api_endpoint": "自訂API端點",
+ "custom_model": "自訂模型",
+ "conversation_not_found": "找不到對話",
+ "stop_message": "停止訊息",
+ "enter_something_to_send": "輸入要發送的內容",
+ "system_prompt_may_not_works_for_some_models": "系統提示可能無法用於某些模型",
+ "ask_anything_here": "在這裡問任何問題",
+ "send_question": "發送問題",
+ "chat": "聊天",
+ "search": "搜尋",
+ "confirm": "確認",
+ "ask_follow_up_question": "提出後續問題",
+ "search_slogan": "您的問題,到此為止。",
+ "answer": "答案",
+ "images": "圖像",
+ "related": "相關",
+ "sources": "來源",
+ "no_idea": "無從知曉",
+ "your_question": "您的問題",
+ "your_additions": "您的補充",
+ "try_asking": "試著問問",
+ "searching": "正在搜尋",
+ "searching_slogan": "系統正在努力理解您的問題,會盡快給您回覆。",
+ "error": "錯誤",
+ "show_all_resources": "顯示所有資源",
+ "show_less_resources": "顯示較少資源",
+ "show_more_images": "查看更多圖像",
+ "show_less_images": "顯示較少圖像",
+ "no_image_found": "未找到圖像",
+ "pro": "專業版",
+ "enhanced_search_ability": "增強的搜尋能力",
+ "provider_not_supported": "尚未支持該供應商。",
+ "search_engine_not_configured": "搜尋引擎未配置",
+ "search_engine_configured_globally": "全域配置的搜尋引擎",
+ "provider_configured_globally": "全域配置的提供者",
+ "focus_on": "專注於",
+ "and": "和",
+ "docs": "文件"
}
diff --git a/locales/zh-TW.json b/locales/zh-TW.json
new file mode 100644
index 00000000..7054a884
--- /dev/null
+++ b/locales/zh-TW.json
@@ -0,0 +1,94 @@
+{
+ "cookies": "餅乾",
+ "good_afternoon": "午安!",
+ "good_morning": "早安!",
+ "good_evening": "晚安!",
+ "input_box_placeholder": "在此輸入您的訊息...",
+ "new_version_available": "有新版本可用",
+ "open_source": "開源",
+ "open_source_message": "開源, 符合{license}",
+ "made_by_author": "由{author}製作",
+ "privacy_policy": "隱私權政策",
+ "system": "系統",
+ "dark": "深色",
+ "light": "淺色",
+ "send_message": "傳送訊息",
+ "new_conversation": "新對話",
+ "share_conversation": "分享對話",
+ "recent_used": "最近使用",
+ "more_providers": "更多提供者",
+ "provider_not_configured": "提供者未設定",
+ "go_to_settings": "前往設定",
+ "preferences": "偏好設定",
+ "save": "儲存",
+ "provider_settings": "提供者設定",
+ "advanced": "進階",
+ "provider": "提供者",
+ "general": "一般",
+ "settings_saved": "設定已儲存",
+ "upload_file": "上傳檔案",
+ "copy": "複製",
+ "resend": "重新傳送",
+ "copied": "已複製",
+ "conversation": "對話",
+ "all_conversations_deleted": "所有對話已刪除!",
+ "send_message_with_enter": "使用Enter鍵傳送訊息",
+ "message_to_speech": "訊息轉語音",
+ "render_message_with_markdown": "使用Markdown渲染訊息",
+ "auto_scroll_to_end_of_conversation": "自動捲動至對話結尾",
+ "conversation_records": "對話記錄",
+ "export": "匯出",
+ "delete": "刪除",
+ "use_unified_endpoint": "使用統一端點",
+ "stream_messages": "串流訊息",
+ "may_not_works_for_some_models": "部分模型可能無法使用",
+ "number_of_context": "上下文數量",
+ "no_limit": "無限制",
+ "default_system_prompt": "預設系統提示",
+ "system_prompt": "系統提示",
+ "custom_system_prompt": "自訂系統提示",
+ "based_provider": "基於提供者",
+ "custom": "自訂",
+ "saved_custom_model": "已儲存的自訂模型",
+ "add_mode_custom_provider": "新增更多自訂提供者",
+ "image": "圖像",
+ "custom_api_key": "自訂API金鑰",
+ "custom_api_endpoint": "自訂API端點",
+ "custom_model": "自訂模型",
+ "conversation_not_found": "找不到對話",
+ "stop_message": "停止訊息",
+ "enter_something_to_send": "輸入要傳送的內容",
+ "system_prompt_may_not_works_for_some_models": "系統提示可能無法用於某些模型",
+ "ask_anything_here": "在這裡問任何問題",
+ "send_question": "傳送問題",
+ "chat": "聊天",
+ "search": "搜尋",
+ "confirm": "確認",
+ "ask_follow_up_question": "提出後續問題",
+ "search_slogan": "您的問題,到此為止。",
+ "answer": "答案",
+ "images": "圖像",
+ "related": "相關",
+ "sources": "來源",
+ "no_idea": "無從知曉",
+ "your_question": "您的問題",
+ "your_additions": "您的補充",
+ "try_asking": "試著問問",
+ "searching": "正在搜尋",
+ "searching_slogan": "系統正在努力理解您的問題,會盡快給您回覆。",
+ "error": "錯誤",
+ "show_all_resources": "顯示所有資源",
+ "show_less_resources": "顯示較少資源",
+ "show_more_images": "查看更多圖像",
+ "show_less_images": "顯示較少圖像",
+ "no_image_found": "未找到圖像",
+ "pro": "專業版",
+ "enhanced_search_ability": "增強的搜尋能力",
+ "provider_not_supported": "尚未支援該提供者。",
+ "search_engine_not_configured": "搜尋引擎未配置",
+ "search_engine_configured_globally": "全域配置的搜尋引擎",
+ "provider_configured_globally": "全域配置的提供者",
+ "focus_on": "專注於",
+ "and": "和",
+ "docs": "文件"
+}
diff --git a/middleware.ts b/middleware.ts
index 84c9504c..87ee1177 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -1,11 +1,15 @@
import createMiddleware from 'next-intl/middleware';
+import { languageId } from '@/config/i18n';
+
export default createMiddleware({
- locales: ['en', 'zh-CN', 'zh-HK', 'ja', 'ko', 'ru', 'de', 'fr', 'es'],
+ locales: languageId,
defaultLocale: 'en',
+
+ localePrefix: 'never',
});
export const config = {
- matcher: ['/((?!api|_next|.*\\..*).*)'],
+ matcher: ['/', '/search', '/(de|en|es|fr|it|ja|ko|nl|pt|ru|zh-CN|zh-HK|zh-TW)/:path*'],
};
diff --git a/next.config.js b/next.config.js
deleted file mode 100644
index ca5d7449..00000000
--- a/next.config.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const withNextIntl = require('next-intl/plugin')('./i18n.ts');
-
-const withPWA = require('next-pwa')({
- dest: 'public',
- disable: process.env.NODE_ENV === 'development',
-});
-
-module.exports = withNextIntl(
- withPWA({
- experimental: {
- serverComponentsExternalPackages: ['prisma'],
- },
- images: {
- domains: ['avatars.githubusercontent.com'],
- },
- reactStrictMode: true,
- async redirects() {
- return [
- {
- source: '/dashboard/profile',
- destination: '/dashboard/profile/info',
- permanent: true,
- },
- {
- source: '/dashboard/team',
- destination: '/dashboard/team/info',
- permanent: true,
- },
- ];
- },
- })
-);
diff --git a/next.config.mjs b/next.config.mjs
new file mode 100644
index 00000000..00dc8ae2
--- /dev/null
+++ b/next.config.mjs
@@ -0,0 +1,8 @@
+import createNextIntlPlugin from 'next-intl/plugin';
+
+const withNextIntl = createNextIntlPlugin();
+
+/** @type {import('next').NextConfig} */
+const nextConfig = {};
+
+export default withNextIntl(nextConfig);
diff --git a/package.json b/package.json
index 60929594..e9e9b00c 100644
--- a/package.json
+++ b/package.json
@@ -1,95 +1,85 @@
{
"name": "chat-chat",
- "version": "0.0.68",
+ "version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
- "postinstall": "prisma generate",
- "db-pull": "prisma db pull",
- "db-push": "prisma db push",
- "update-db": "prisma migrate deploy",
- "prettier": "prettier ./app",
- "prettier:check": "prettier --check ./app",
- "prettier:write": "prettier --write ./app",
- "eslint": "eslint ./app",
- "eslint:debug": "eslint ./app --debug",
- "eslint:fix": "eslint ./app --fix"
+ "eslint:check": "eslint --ext .ts,.tsx .",
+ "eslint:fix": "eslint --ext .ts,.tsx --fix ."
},
"dependencies": {
- "@dqbd/tiktoken": "^1.0.7",
- "@next-auth/prisma-adapter": "^1.0.7",
- "@prisma/client": "^5.6.0",
- "@radix-ui/react-accordion": "^1.1.2",
- "@radix-ui/react-avatar": "^1.0.3",
+ "@anthropic-ai/sdk": "^0.18.0",
+ "@auth/drizzle-adapter": "^0.8.2",
+ "@aws-sdk/client-bedrock-runtime": "^3.549.0",
+ "@azure/openai": "^1.0.0-beta.12",
+ "@google/generative-ai": "^0.3.1",
+ "@huggingface/agents": "^0.0.5",
+ "@huggingface/hub": "^0.14.7",
+ "@huggingface/inference": "^2.6.6",
+ "@mistralai/mistralai": "^0.1.3",
+ "@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-checkbox": "^1.0.4",
- "@radix-ui/react-dialog": "^1.0.4",
- "@radix-ui/react-dropdown-menu": "^2.0.5",
+ "@radix-ui/react-dialog": "^1.0.5",
+ "@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-label": "^2.0.2",
- "@radix-ui/react-popover": "^1.0.6",
- "@radix-ui/react-select": "^1.2.2",
- "@radix-ui/react-separator": "^1.0.3",
- "@radix-ui/react-slider": "^1.1.2",
+ "@radix-ui/react-select": "^2.0.0",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-switch": "^1.0.3",
"@radix-ui/react-tabs": "^1.0.4",
"@tippyjs/react": "^4.2.6",
- "@vercel/analytics": "^1.1.1",
- "@vercel/speed-insights": "^1.0.1",
- "autoprefixer": "10.4.16",
- "axios": "^1.6.2",
+ "@types/file-saver": "^2.0.7",
+ "@vercel/analytics": "^1.2.2",
+ "@vercel/speed-insights": "^1.0.10",
+ "ai": "^3.0.21",
+ "bcrypt-ts": "^5.0.2",
"cheerio": "^1.0.0-rc.12",
"class-variance-authority": "^0.7.0",
- "clsx": "^2.0.0",
- "cmdk": "^0.2.0",
- "eslint": "^8.56.0",
- "eslint-config-next": "14.1.0",
- "eventsource-parser": "^1.0.0",
- "formidable": "^3.5.1",
- "jotai": "^2.6.0",
- "lucide-react": "^0.263.1",
- "next": "14.1.0",
- "next-auth": "^4.24.5",
- "next-intl": "^3.1.4",
- "next-pwa": "^5.6.0",
- "next-themes": "^0.2.1",
- "nodemailer": "^6.9.5",
- "pdf-parse": "^1.1.1",
- "postcss": "8.4.33",
- "react": "18.2.0",
- "react-dom": "18.2.0",
- "react-hot-toast": "^2.4.1",
- "react-icons": "^5.0.0",
- "react-markdown": "^8.0.7",
- "react-speech-recognition": "^3.10.0",
- "react-spinners": "^0.13.8",
- "react-syntax-highlighter": "^15.5.0",
- "react-textarea-autosize": "^8.5.3",
- "rehype-katex": "^6.0.3",
- "remark-gfm": "^3.0.1",
- "remark-math": "^5.1.1",
- "tailwind-merge": "^1.14.0",
- "tailwindcss": "3.4.1",
+ "clsx": "^2.1.0",
+ "cohere-ai": "^7.9.1",
+ "embla-carousel-react": "^8.0.1",
+ "file-saver": "^2.0.5",
+ "groq-sdk": "^0.3.2",
+ "jotai": "^2.8.0",
+ "lucide-react": "^0.363.0",
+ "next": "14.2.0",
+ "next-intl": "^3.11.1",
+ "next-themes": "^0.3.0",
+ "openai": "^4.33.0",
+ "pnpm": "^8.15.6",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-icons": "^5.0.1",
+ "react-markdown": "^9.0.1",
+ "react-mathjax": "^1.0.1",
+ "react-spring-lightbox": "^1.8.0",
+ "rehype-katex": "^7.0.0",
+ "remark-gfm": "^4.0.0",
+ "remark-math": "^6.0.0",
+ "sonner": "^1.4.41",
+ "tailwind-merge": "^2.2.2",
"tailwindcss-animate": "^1.0.7",
- "typescript": "5.3.3"
+ "vaul": "^0.9.0",
+ "zod": "^3.22.4"
},
"devDependencies": {
- "@tailwindcss/typography": "^0.5.10",
- "@types/formidable": "^3.4.3",
- "@types/node": "20.10.7",
- "@types/nodemailer": "^6.4.10",
- "@types/pdf-parse": "^1.1.1",
- "@types/react": "18.2.47",
- "@types/react-dom": "18.2.18",
- "@types/react-speech-recognition": "^3.9.2",
- "@types/react-syntax-highlighter": "^15.5.7",
- "@typescript-eslint/parser": "^6.19.1",
- "eslint-plugin-tailwindcss": "^3.14.1",
- "prettier": "^3.1.0",
- "prettier-plugin-tailwindcss": "^0.5.7",
- "prisma": "^5.6.0",
- "webpack": "^5.88.2"
- }
-}
+ "@types/node": "^20.12.5",
+ "@types/react": "^18.2.74",
+ "@types/react-dom": "^18.2.24",
+ "@typescript-eslint/parser": "^7.5.0",
+ "autoprefixer": "^10.4.19",
+ "eslint": "^8.57.0",
+ "eslint-config-next": "14.1.3",
+ "eslint-plugin-simple-import-sort": "^12.0.0",
+ "eslint-plugin-tailwindcss": "^3.15.1",
+ "eslint-plugin-unused-imports": "^3.1.0",
+ "postcss": "^8.4.38",
+ "prettier": "^3.2.5",
+ "prettier-plugin-tailwindcss": "^0.5.13",
+ "tailwindcss": "^3.4.3",
+ "typescript": "^5.4.4"
+ },
+ "packageManager": "pnpm@8.15.6"
+}
\ No newline at end of file
diff --git a/pages/api/app/latest.ts b/pages/api/app/latest.ts
deleted file mode 100644
index e6a7fb19..00000000
--- a/pages/api/app/latest.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getGitHubLatestVersion } from '@/utils/app/checkVersion';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const { owner, repo } = req.query as { owner: string; repo: string };
-
- if (typeof owner !== 'string' || typeof repo !== 'string') {
- return res.status(300).json(await getGitHubLatestVersion({ owner: 'okisdev', repo: 'ChatChat' }));
- }
-
- return res.status(200).json(await getGitHubLatestVersion({ owner, repo }));
-}
diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts
deleted file mode 100644
index 8abb6830..00000000
--- a/pages/api/auth/[...nextauth].ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import NextAuth from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-
-export default NextAuth(authOptions);
diff --git a/pages/api/message/file.ts b/pages/api/message/file.ts
deleted file mode 100644
index 48be5eb2..00000000
--- a/pages/api/message/file.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import formidable, { Files } from 'formidable';
-import pdf from 'pdf-parse';
-import fs from 'fs';
-
-import axios from 'axios';
-
-import { promisify } from 'util';
-
-const readFileAsync = promisify(fs.readFile);
-const writeFileAsync = promisify(fs.writeFile);
-
-export const config = {
- api: {
- bodyParser: false,
- },
-};
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- if (req.method === 'GET') {
- const { url } = req.query as { url: string };
-
- if (url) {
- try {
- const response = await axios.get(url, { responseType: 'arraybuffer' });
- const tempFilePath = `/tmp/${Date.now()}.pdf`;
- await writeFileAsync(tempFilePath, response.data);
-
- const fileContentBuffer = await readFileAsync(tempFilePath);
- const pdfData = await pdf(fileContentBuffer);
- return res.status(200).json({ url, text: pdfData.text });
- } catch (error) {
- return res.status(500).json({ error: 'Error processing the file' });
- }
- }
-
- return res.status(400).json({ error: 'Missing URL' });
- // } else if (req.method === 'POST') {
- // try {
- // const form = new formidable.IncomingForm();
- // const data = await new Promise((resolve, reject) => {
- // form.parse(req, (err, fields, files) => {
- // if (err) {
- // reject(err);
- // return;
- // } else {
- // resolve({
- // file: files.file,
- // });
- // }
- // });
- // });
-
- // const uploadedFile = data['file'];
-
- // if (Array.isArray(uploadedFile)) {
- // return res.status(400).json({ error: 'Multiple files not supported' });
- // } else if (uploadedFile.mimetype?.includes('pdf')) {
- // const fileContentBuffer = await readFileAsync(uploadedFile.filepath);
- // const pdfData = await pdf(fileContentBuffer);
- // return res.status(200).json({ text: pdfData.text });
- // } else {
- // const fileContent = await readFileAsync(uploadedFile.filepath, 'binary');
- // const fileContentStr = Buffer.from(fileContent, 'binary').toString('utf-8');
- // return res.status(200).json({ text: fileContentStr });
- // }
- // } catch (error) {
- // return res.status(500).json({ error: 'Error processing the file' });
- // }
- } else {
- return res.status(405).json({ error: 'Method not allowed' });
- }
-}
diff --git a/pages/api/message/tokens.ts b/pages/api/message/tokens.ts
deleted file mode 100644
index ab9a5054..00000000
--- a/pages/api/message/tokens.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { get_encoding } from '@dqbd/tiktoken';
-
-export default function handler(req: NextApiRequest, res: NextApiResponse) {
- const { message } = req.query as { message: string };
-
- const { messages } = req.body as { messages: OpenAIMessage[] };
-
- if (!message && !messages) {
- return res.status(400).json({ error: 'Missing message' });
- }
-
- const encoding = get_encoding('gpt2');
-
- if (messages) {
- let extraCount = messages.map((message) => {
- let count;
- switch (message.role) {
- default:
- case 'user':
- case 'system':
- count = 5;
- break;
- case 'assistant':
- count = 8;
- break;
- }
- return count;
- });
-
- let AllExtraCount = extraCount.reduce((a, b) => a + b, 0);
-
- // let roleContents = messages.map((message) => {
- // let roleContent;
- // switch (message.role) {
- // case 'system':
- // roleContent = '<|im_start|>system\n' + message.content + '<|im_end|>\n';
- // break;
- // case 'assistant':
- // roleContent = '<|im_start|>assistant\n' + message.content + '<|im_end|>\n';
- // break;
- // default:
- // case 'user':
- // roleContent = '<|im_start|>user\n' + message.content + '<|im_end|>\n';
- // break;
- // }
- // return roleContent;
- // });
-
- // let joinedRoleContents = roleContents.join('');
-
- let joinedRoleContents = messages.map((message) => message.content).join(' ');
-
- const tokens = encoding.encode(joinedRoleContents);
-
- encoding.free();
-
- const tokenCount = tokens.length + AllExtraCount;
-
- return res.status(200).json({ tokenCount });
- } else {
- const tokens = encoding.encode(message);
-
- encoding.free();
-
- const tokenCount = tokens.length;
-
- return res.status(200).json({ tokenCount });
- }
-}
diff --git a/pages/api/plugins/fetch.ts b/pages/api/plugins/fetch.ts
deleted file mode 100644
index 191735a8..00000000
--- a/pages/api/plugins/fetch.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { fetchContent } from '@/utils/plugins/fetch_content';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const { url } = req.query as {
- url: string;
- };
-
- if (!url) {
- return res.status(400).json({ status: 400, error: 'Missing URL' });
- }
-
- const content = await fetchContent(url);
-
- if (!content) {
- return res.status(404).json({ status: 404, error: 'No content found' });
- }
-
- return res.status(200).json({ status: 200, content });
-}
diff --git a/pages/api/plugins/search.ts b/pages/api/plugins/search.ts
deleted file mode 100644
index 50d9f6aa..00000000
--- a/pages/api/plugins/search.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getSearchFromGoogleProgrammableSearchEngine } from '@/utils/plugins/search';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const { searchAPIKey, searchEngineID, query } = req.query as {
- searchAPIKey: string;
- searchEngineID: string;
- query: string;
- };
-
- const search = await getSearchFromGoogleProgrammableSearchEngine(searchAPIKey, searchEngineID, query);
-
- return res.status(200).json({ search });
-}
diff --git a/pages/api/record/[id].ts b/pages/api/record/[id].ts
deleted file mode 100644
index c27a68a1..00000000
--- a/pages/api/record/[id].ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const session = await getServerSession(req, res, authOptions);
-
- const user = session?.user;
-
- if (!user) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const { id } = req.query as { id: string };
-
- if (req.method === 'DELETE') {
- await database.record.delete({
- where: {
- id: id,
- },
- });
-
- return res.status(200).json({ success: 'Success' });
- } else {
- return res.status(405).json({ error: 'Method not allowed' });
- }
-}
diff --git a/pages/api/record/delete.ts b/pages/api/record/delete.ts
deleted file mode 100644
index 9aa74434..00000000
--- a/pages/api/record/delete.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const session = await getServerSession(req, res, authOptions);
-
- const user = session?.user;
-
- if (!user) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- if (req.method === 'DELETE') {
- await database.record.deleteMany({
- where: {
- authorId: user.id,
- },
- });
-
- return res.status(200).json({ success: 'Success' });
- } else {
- return res.status(405).json({ error: 'Method not allowed' });
- }
-}
diff --git a/pages/api/share.ts b/pages/api/share.ts
deleted file mode 100644
index eb056813..00000000
--- a/pages/api/share.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- if (req.method === 'GET') {
- const { id } = req.query;
-
- if (!database) {
- return res.status(500).json({ error: 'Database not found' });
- }
-
- const share = await database.share.findUnique({
- where: {
- id: id as string,
- },
- });
-
- if (!share) {
- return res.status(404).json({ error: 'Share not found' });
- }
-
- return res.status(200).json({ success: 'Success', share });
- } else if (req.method === 'POST') {
- const body = req.body;
-
- const parseStory: HistoryProps = JSON.parse(body.story);
-
- if (!database) {
- return res.status(500).json({ error: 'Database not found' });
- }
-
- const existingShare = await database.share.findUnique({
- where: {
- id: parseStory.id,
- },
- });
-
- if (existingShare) {
- const updateShare = await database.share.update({
- where: {
- id: parseStory.id,
- },
- data: {
- id: parseStory.id,
- type: parseStory.type,
- title: parseStory.title,
- content: parseStory.messages,
- createdAt: new Date(parseStory.timestamp),
- share: true,
- },
- select: {
- id: true,
- },
- });
-
- return res.status(200).json({ success: 'Success', type: 'update', id: updateShare });
- }
-
- const createShare = await database.share.create({
- data: {
- id: parseStory.id,
- type: parseStory.type,
- title: parseStory.title,
- content: parseStory.messages,
- createdAt: new Date(parseStory.timestamp),
- share: true,
- },
- select: {
- id: true,
- },
- });
-
- return res.status(200).json({ success: 'Success', type: 'create', id: createShare });
- } else {
- return res.status(400).json({ error: 'Invalid request' });
- }
-}
diff --git a/pages/api/team/[id].ts b/pages/api/team/[id].ts
deleted file mode 100644
index 1f66e097..00000000
--- a/pages/api/team/[id].ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- if (req.method === 'PATCH') {
- const session = await getServerSession(req, res, authOptions);
-
- const user = session?.user;
-
- if (!user) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const checkIfUserIsInTeam = await database.teamMember.findUnique({
- where: {
- teamId_userId: {
- teamId: req.query.id as string,
- userId: user.id,
- },
- },
- });
-
- if (!checkIfUserIsInTeam) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const body = req.body;
-
- await database.team.update({
- where: {
- id: req.query.id as string,
- },
- data: {
- name: body.name,
- accessCode: body.accessCode,
- openAIKey: body.openAIKey,
- openAIEndpoint: body.openAIEndpoint,
- },
- });
-
- return res.status(200).json({ success: 'Success' });
- } else {
- return res.status(405).json({ error: 'Method not allowed' });
- }
-}
diff --git a/pages/api/team/create.ts b/pages/api/team/create.ts
deleted file mode 100644
index 281e7c08..00000000
--- a/pages/api/team/create.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const session = await getServerSession(req, res, authOptions);
-
- const body = req.body;
-
- if (!session) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const checkExists = await database.team.findUnique({
- where: {
- accessCode: body.accessCode,
- },
- select: {
- accessCode: true,
- },
- });
-
- if (checkExists) {
- return res.status(400).json({ error: 'Team already exists' });
- }
-
- if (req.method == 'POST') {
- const createTeam = await database.team.create({
- data: {
- name: body.name,
- accessCode: body.accessCode,
- openAIKey: body.openAIKey,
- openAIEndpoint: body.openAIEndpoint,
- azureAPIKey: body.azureAPIKey,
- azureAPIEndpoint: body.azureEndpoint,
- azureDeploymentName: body.azureDeploymentName,
- claudeAPIKey: body.claudeAPIKey,
- authorId: session.user.id,
- },
- select: {
- id: true,
- accessCode: true,
- },
- });
-
- const joinTeam = await database.teamMember.create({
- data: {
- teamId: createTeam.id,
- userId: session.user.id,
- },
- select: {
- id: true,
- },
- });
-
- return res.status(200).json({ success: 'Success', create_id: createTeam, join_id: joinTeam });
- }
-
- return res.status(400).json({ error: 'Invalid request' });
-}
diff --git a/pages/api/team/delete.ts b/pages/api/team/delete.ts
deleted file mode 100644
index 5c5aaa0b..00000000
--- a/pages/api/team/delete.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const session = await getServerSession(req, res, authOptions);
-
- const body = req.body;
-
- if (!session) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const checkExists = await database.team.findUnique({
- where: {
- id: body.id,
- },
- });
-
- if (!checkExists) {
- return res.status(400).json({ error: "Team doesn't exists." });
- }
-
- if (req.method == 'POST') {
- await database.teamMember.deleteMany({
- where: {
- teamId: body.id,
- },
- });
-
- await database.team.delete({
- where: {
- id: body.id,
- },
- });
-
- return res.status(200).json({ success: true });
- }
-
- return res.status(400).json({ error: 'Invalid request' });
-}
diff --git a/pages/api/team/info.ts b/pages/api/team/info.ts
deleted file mode 100644
index 6d252b6b..00000000
--- a/pages/api/team/info.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const session = await getServerSession(req, res, authOptions);
-
- // if (!session) {
- // return res.status(401).json({ error: 'Unauthorized' });
- // }
-
- // console.log(session);
-
- const accessCode = req.query.accessCode as string;
-
- if (!accessCode && accessCode == '') {
- return res.status(400).json({
- error: 'No access code provided',
- });
- }
-
- const team = await database.team.findUnique({
- where: {
- accessCode: accessCode,
- },
- select: {
- defaultServiceProvider: true,
- openAIKey: true,
- openAIEndpoint: true,
- azureAPIKey: true,
- azureAPIEndpoint: true,
- azureDeploymentName: true,
- claudeAPIKey: true,
- },
- });
-
- if (!team) {
- return res.status(400).json({ error: 'No record' });
- }
-
- return res.json({
- openAIKey: team.openAIKey,
- openAIEndpoint: team.openAIEndpoint,
- azureAPIKey: team.azureAPIKey,
- azureAPIEndpoint: team.azureAPIEndpoint,
- azureDeploymentName: team.azureDeploymentName,
- claudeAPIKey: team.claudeAPIKey,
- defaultServiceProvider: team.defaultServiceProvider,
- });
-}
diff --git a/pages/api/team/join.ts b/pages/api/team/join.ts
deleted file mode 100644
index 8fb18f2f..00000000
--- a/pages/api/team/join.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const session = await getServerSession(req, res, authOptions);
-
- const body = req.body;
-
- if (!session) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const checkTeamExists = await database.team.findUnique({
- where: {
- accessCode: body.accessCode,
- },
- select: {
- id: true,
- accessCode: true,
- },
- });
-
- if (!checkTeamExists) {
- return res.status(400).json({ error: 'Team does not exist' });
- }
-
- if (req.method == 'POST') {
- const checkMembership = await database.teamMember.findFirst({
- where: {
- teamId: checkTeamExists.id,
- userId: session.user.id,
- },
- });
-
- if (checkMembership) {
- return res.status(400).json({ error: 'User already a member of the team' });
- }
-
- const joinTeam = await database.teamMember.create({
- data: {
- teamId: checkTeamExists.id,
- userId: session.user.id,
- },
- select: {
- id: true,
- },
- });
-
- return res.status(200).json({ success: 'Success', id: joinTeam });
- }
-
- return res.status(400).json({ error: 'Invalid request' });
-}
diff --git a/pages/api/team/quit.ts b/pages/api/team/quit.ts
deleted file mode 100644
index a1663d4a..00000000
--- a/pages/api/team/quit.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- const session = await getServerSession(req, res, authOptions);
-
- const body = req.body;
-
- if (!session) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const checkTeamExists = await database.team.findUnique({
- where: {
- id: body.teamId,
- },
- select: {
- id: true,
- accessCode: true,
- },
- });
-
- if (!checkTeamExists) {
- return res.status(400).json({ error: 'Team does not exist' });
- }
-
- if (req.method == 'POST') {
- const checkMembership = await database.teamMember.findFirst({
- where: {
- teamId: checkTeamExists.id,
- userId: session.user.id,
- },
- });
-
- if (!checkMembership) {
- return res.status(400).json({ error: 'User is not a member of the team' });
- }
-
- const quitTeam = await database.teamMember.delete({
- where: {
- teamId_userId: {
- teamId: checkTeamExists.id,
- userId: session.user.id,
- },
- },
- select: {
- id: true,
- },
- });
-
- return res.status(200).json({ success: 'Success', id: quitTeam });
- }
-
- return res.status(400).json({ error: 'Invalid request' });
-}
diff --git a/pages/api/user/[id].ts b/pages/api/user/[id].ts
deleted file mode 100644
index 3d0dddc3..00000000
--- a/pages/api/user/[id].ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- if (req.method === 'PATCH') {
- const session = await getServerSession(req, res, authOptions);
-
- const user = session?.user;
-
- if (!user) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const body = req.body;
-
- await database.user.update({
- where: {
- id: user.id,
- },
- data: {
- name: body.name,
- email: body.email,
- image: body.image,
- openAIKey: body.openAIKey,
- allowRecordCloudSync: body.allowRecordCloudSync,
- },
- });
-
- return res.status(200).json({ success: 'Success' });
- } else {
- return res.status(405).json({ error: 'Method not allowed' });
- }
-}
diff --git a/pages/api/user/delete.ts b/pages/api/user/delete.ts
deleted file mode 100644
index 82f216ba..00000000
--- a/pages/api/user/delete.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- if (req.method === 'DELETE') {
- const session = await getServerSession(req, res, authOptions);
-
- const user = session?.user;
-
- if (!user) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const checkIfUserExist = await database.user.findUnique({
- where: {
- id: user.id,
- },
- select: {
- id: true,
- },
- });
-
- if (!checkIfUserExist) {
- return res.status(404).json({ error: 'User not found' });
- }
-
- // Delete all related data
- await database.record.deleteMany({
- where: {
- authorId: user.id,
- },
- });
-
- await database.share.deleteMany({
- where: {
- userId: user.id,
- },
- });
-
- await database.teamMember.deleteMany({
- where: {
- userId: user.id,
- },
- });
-
- await database.user.delete({
- where: {
- id: user.id,
- },
- });
-
- return res.status(200).json({ success: true });
- } else {
- res.setHeader('Allow', 'DELETE');
- res.status(405).end(`Method ${req.method} Not Allowed`);
- }
-}
diff --git a/pages/api/user/info.ts b/pages/api/user/info.ts
deleted file mode 100644
index ca776d2d..00000000
--- a/pages/api/user/info.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- if (req.method === 'GET') {
- const session = await getServerSession(req, res, authOptions);
-
- const user = session?.user;
-
- if (!user) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const userInfo = await database.user.findUnique({
- where: {
- id: user.id,
- },
- select: {
- id: true,
- name: true,
- email: true,
- image: true,
- openAIKey: true,
- allowRecordCloudSync: true,
- },
- });
-
- return res.status(200).json({ user: userInfo });
- }
-}
diff --git a/pages/api/user/record.ts b/pages/api/user/record.ts
deleted file mode 100644
index 01f39b1f..00000000
--- a/pages/api/user/record.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import { getServerSession } from 'next-auth';
-
-import { authOptions } from '@/lib/auth';
-import { database } from '@/lib/database';
-
-export default async function handler(req: NextApiRequest, res: NextApiResponse) {
- if (req.method === 'POST') {
- const session = await getServerSession(req, res, authOptions);
-
- const user = session?.user;
-
- if (!user) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const checkIfEnableSync = await database.user.findUnique({
- where: {
- id: user.id,
- },
- select: {
- allowRecordCloudSync: true,
- },
- });
-
- if (!checkIfEnableSync) {
- return res.status(401).json({ error: 'Unauthorized' });
- }
-
- const checkIfExist = await database.record.findUnique({
- where: {
- id: req.body.id,
- },
- select: {
- id: true,
- },
- });
-
- const body = req.body;
-
- if (checkIfExist) {
- const updateRecord = await database.record.update({
- where: {
- id: body.id,
- },
- data: {
- title: body.title,
- content: body.messages,
- share: false,
- updatedAt: new Date(body.timestamp),
- },
- select: {
- id: true,
- },
- });
-
- return res.status(200).json({ success: 'update', id: updateRecord });
- }
-
- const createRecord = await database.record.create({
- data: {
- id: body.id,
- type: body.type,
- title: body.title,
- content: body.messages,
- share: false,
- createdAt: new Date(body.timestamp),
- updatedAt: new Date(body.timestamp),
- authorId: user.id,
- },
- select: {
- id: true,
- },
- });
-
- return res.status(200).json({ success: 'create', id: createRecord });
- }
-}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 64bddf79..63e03e2b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,69 +5,78 @@ settings:
excludeLinksFromLockfile: false
dependencies:
- '@dqbd/tiktoken':
- specifier: ^1.0.7
- version: 1.0.7
- '@next-auth/prisma-adapter':
- specifier: ^1.0.7
- version: 1.0.7(@prisma/client@5.6.0)(next-auth@4.24.5)
- '@prisma/client':
- specifier: ^5.6.0
- version: 5.6.0(prisma@5.6.0)
- '@radix-ui/react-accordion':
- specifier: ^1.1.2
- version: 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ '@anthropic-ai/sdk':
+ specifier: ^0.18.0
+ version: 0.18.0
+ '@auth/drizzle-adapter':
+ specifier: ^0.8.2
+ version: 0.8.2
+ '@aws-sdk/client-bedrock-runtime':
+ specifier: ^3.549.0
+ version: 3.549.0
+ '@azure/openai':
+ specifier: ^1.0.0-beta.12
+ version: 1.0.0-beta.12
+ '@google/generative-ai':
+ specifier: ^0.3.1
+ version: 0.3.1
+ '@huggingface/agents':
+ specifier: ^0.0.5
+ version: 0.0.5
+ '@huggingface/hub':
+ specifier: ^0.14.7
+ version: 0.14.7
+ '@huggingface/inference':
+ specifier: ^2.6.6
+ version: 2.6.6
+ '@mistralai/mistralai':
+ specifier: ^0.1.3
+ version: 0.1.3
'@radix-ui/react-avatar':
- specifier: ^1.0.3
- version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.0.4
+ version: 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-checkbox':
specifier: ^1.0.4
- version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dialog':
- specifier: ^1.0.4
- version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.0.5
+ version: 1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dropdown-menu':
- specifier: ^2.0.5
- version: 2.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^2.0.6
+ version: 2.0.6(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-label':
specifier: ^2.0.2
- version: 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-popover':
- specifier: ^1.0.6
- version: 1.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ version: 2.0.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-select':
- specifier: ^1.2.2
- version: 1.2.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-separator':
- specifier: ^1.0.3
- version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slider':
- specifier: ^1.1.2
- version: 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^2.0.0
+ version: 2.0.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot':
specifier: ^1.0.2
- version: 1.0.2(@types/react@18.2.47)(react@18.2.0)
+ version: 1.0.2(@types/react@18.2.74)(react@18.2.0)
'@radix-ui/react-switch':
specifier: ^1.0.3
- version: 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-tabs':
specifier: ^1.0.4
- version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
+ version: 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
'@tippyjs/react':
specifier: ^4.2.6
version: 4.2.6(react-dom@18.2.0)(react@18.2.0)
+ '@types/file-saver':
+ specifier: ^2.0.7
+ version: 2.0.7
'@vercel/analytics':
- specifier: ^1.1.1
- version: 1.1.1
+ specifier: ^1.2.2
+ version: 1.2.2(next@14.2.0)(react@18.2.0)
'@vercel/speed-insights':
- specifier: ^1.0.1
- version: 1.0.1
- autoprefixer:
- specifier: 10.4.16
- version: 10.4.16(postcss@8.4.33)
- axios:
- specifier: ^1.6.2
- version: 1.6.2
+ specifier: ^1.0.10
+ version: 1.0.10(next@14.2.0)(react@18.2.0)(svelte@4.2.12)(vue@3.4.21)
+ ai:
+ specifier: ^3.0.21
+ version: 3.0.21(react@18.2.0)(solid-js@1.8.16)(svelte@4.2.12)(vue@3.4.21)(zod@3.22.4)
+ bcrypt-ts:
+ specifier: ^5.0.2
+ version: 5.0.2
cheerio:
specifier: ^1.0.0-rc.12
version: 1.0.0-rc.12
@@ -75,1561 +84,893 @@ dependencies:
specifier: ^0.7.0
version: 0.7.0
clsx:
- specifier: ^2.0.0
- version: 2.0.0
- cmdk:
- specifier: ^0.2.0
- version: 0.2.0(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- eslint:
- specifier: ^8.56.0
- version: 8.56.0
- eslint-config-next:
- specifier: 14.1.0
- version: 14.1.0(eslint@8.56.0)(typescript@5.3.3)
- eventsource-parser:
- specifier: ^1.0.0
- version: 1.0.0
- formidable:
- specifier: ^3.5.1
- version: 3.5.1
+ specifier: ^2.1.0
+ version: 2.1.0
+ cohere-ai:
+ specifier: ^7.9.1
+ version: 7.9.1
+ embla-carousel-react:
+ specifier: ^8.0.1
+ version: 8.0.1(react@18.2.0)
+ file-saver:
+ specifier: ^2.0.5
+ version: 2.0.5
+ groq-sdk:
+ specifier: ^0.3.2
+ version: 0.3.2
jotai:
- specifier: ^2.6.0
- version: 2.6.0(@types/react@18.2.47)(react@18.2.0)
+ specifier: ^2.8.0
+ version: 2.8.0(@types/react@18.2.74)(react@18.2.0)
lucide-react:
- specifier: ^0.263.1
- version: 0.263.1(react@18.2.0)
+ specifier: ^0.363.0
+ version: 0.363.0(react@18.2.0)
next:
- specifier: 14.1.0
- version: 14.1.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)
- next-auth:
- specifier: ^4.24.5
- version: 4.24.5(next@14.1.0)(nodemailer@6.9.5)(react-dom@18.2.0)(react@18.2.0)
+ specifier: 14.2.0
+ version: 14.2.0(react-dom@18.2.0)(react@18.2.0)
next-intl:
- specifier: ^3.1.4
- version: 3.1.4(next@14.1.0)(react@18.2.0)
- next-pwa:
- specifier: ^5.6.0
- version: 5.6.0(@babel/core@7.23.2)(next@14.1.0)(webpack@5.88.2)
+ specifier: ^3.11.1
+ version: 3.11.1(next@14.2.0)(react@18.2.0)
next-themes:
- specifier: ^0.2.1
- version: 0.2.1(next@14.1.0)(react-dom@18.2.0)(react@18.2.0)
- nodemailer:
- specifier: ^6.9.5
- version: 6.9.5
- pdf-parse:
- specifier: ^1.1.1
- version: 1.1.1
- postcss:
- specifier: 8.4.33
- version: 8.4.33
+ specifier: ^0.3.0
+ version: 0.3.0(react-dom@18.2.0)(react@18.2.0)
+ openai:
+ specifier: ^4.33.0
+ version: 4.33.0
+ pnpm:
+ specifier: ^8.15.6
+ version: 8.15.6
react:
- specifier: 18.2.0
+ specifier: ^18.2.0
version: 18.2.0
react-dom:
- specifier: 18.2.0
+ specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
- react-hot-toast:
- specifier: ^2.4.1
- version: 2.4.1(csstype@3.1.2)(react-dom@18.2.0)(react@18.2.0)
react-icons:
- specifier: ^5.0.0
- version: 5.0.0(react@18.2.0)
+ specifier: ^5.0.1
+ version: 5.0.1(react@18.2.0)
react-markdown:
- specifier: ^8.0.7
- version: 8.0.7(@types/react@18.2.47)(react@18.2.0)
- react-speech-recognition:
- specifier: ^3.10.0
- version: 3.10.0(react@18.2.0)
- react-spinners:
- specifier: ^0.13.8
- version: 0.13.8(react-dom@18.2.0)(react@18.2.0)
- react-syntax-highlighter:
- specifier: ^15.5.0
- version: 15.5.0(react@18.2.0)
- react-textarea-autosize:
- specifier: ^8.5.3
- version: 8.5.3(@types/react@18.2.47)(react@18.2.0)
+ specifier: ^9.0.1
+ version: 9.0.1(@types/react@18.2.74)(react@18.2.0)
+ react-mathjax:
+ specifier: ^1.0.1
+ version: 1.0.1(react@18.2.0)
+ react-spring-lightbox:
+ specifier: ^1.8.0
+ version: 1.8.0(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)
rehype-katex:
- specifier: ^6.0.3
- version: 6.0.3
+ specifier: ^7.0.0
+ version: 7.0.0
remark-gfm:
- specifier: ^3.0.1
- version: 3.0.1
+ specifier: ^4.0.0
+ version: 4.0.0
remark-math:
- specifier: ^5.1.1
- version: 5.1.1
+ specifier: ^6.0.0
+ version: 6.0.0
+ sonner:
+ specifier: ^1.4.41
+ version: 1.4.41(react-dom@18.2.0)(react@18.2.0)
tailwind-merge:
- specifier: ^1.14.0
- version: 1.14.0
- tailwindcss:
- specifier: 3.4.1
- version: 3.4.1
+ specifier: ^2.2.2
+ version: 2.2.2
tailwindcss-animate:
specifier: ^1.0.7
- version: 1.0.7(tailwindcss@3.4.1)
- typescript:
- specifier: 5.3.3
- version: 5.3.3
+ version: 1.0.7(tailwindcss@3.4.3)
+ vaul:
+ specifier: ^0.9.0
+ version: 0.9.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ zod:
+ specifier: ^3.22.4
+ version: 3.22.4
devDependencies:
- '@tailwindcss/typography':
- specifier: ^0.5.10
- version: 0.5.10(tailwindcss@3.4.1)
- '@types/formidable':
- specifier: ^3.4.3
- version: 3.4.3
'@types/node':
- specifier: 20.10.7
- version: 20.10.7
- '@types/nodemailer':
- specifier: ^6.4.10
- version: 6.4.10
- '@types/pdf-parse':
- specifier: ^1.1.1
- version: 1.1.1
+ specifier: ^20.12.5
+ version: 20.12.5
'@types/react':
- specifier: 18.2.47
- version: 18.2.47
+ specifier: ^18.2.74
+ version: 18.2.74
'@types/react-dom':
- specifier: 18.2.18
- version: 18.2.18
- '@types/react-speech-recognition':
- specifier: ^3.9.2
- version: 3.9.2
- '@types/react-syntax-highlighter':
- specifier: ^15.5.7
- version: 15.5.7
+ specifier: ^18.2.24
+ version: 18.2.24
'@typescript-eslint/parser':
- specifier: ^6.19.1
- version: 6.19.1(eslint@8.56.0)(typescript@5.3.3)
+ specifier: ^7.5.0
+ version: 7.5.0(eslint@8.57.0)(typescript@5.4.4)
+ autoprefixer:
+ specifier: ^10.4.19
+ version: 10.4.19(postcss@8.4.38)
+ eslint:
+ specifier: ^8.57.0
+ version: 8.57.0
+ eslint-config-next:
+ specifier: 14.1.3
+ version: 14.1.3(eslint@8.57.0)(typescript@5.4.4)
+ eslint-plugin-simple-import-sort:
+ specifier: ^12.0.0
+ version: 12.0.0(eslint@8.57.0)
eslint-plugin-tailwindcss:
- specifier: ^3.14.1
- version: 3.14.1(tailwindcss@3.4.1)
- prettier:
+ specifier: ^3.15.1
+ version: 3.15.1(tailwindcss@3.4.3)
+ eslint-plugin-unused-imports:
specifier: ^3.1.0
- version: 3.1.0
+ version: 3.1.0(eslint@8.57.0)
+ postcss:
+ specifier: ^8.4.38
+ version: 8.4.38
+ prettier:
+ specifier: ^3.2.5
+ version: 3.2.5
prettier-plugin-tailwindcss:
- specifier: ^0.5.7
- version: 0.5.7(prettier@3.1.0)
- prisma:
- specifier: ^5.6.0
- version: 5.6.0
- webpack:
- specifier: ^5.88.2
- version: 5.88.2
+ specifier: ^0.5.13
+ version: 0.5.13(prettier@3.2.5)
+ tailwindcss:
+ specifier: ^3.4.3
+ version: 3.4.3
+ typescript:
+ specifier: ^5.4.4
+ version: 5.4.4
packages:
/@aashutoshrathi/word-wrap@1.2.6:
resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
engines: {node: '>=0.10.0'}
+ dev: true
+
+ /@ai-sdk/provider@0.0.0:
+ resolution: {integrity: sha512-Gbl9Ei8NPtM85gB/o8cY7s7CLGxK/U6QVheVaI3viFn7o6IpTfy1Ja389e2FXVMNJ4WHK2qYWSp5fAFDuKulTA==}
+ engines: {node: '>=18'}
+ dependencies:
+ json-schema: 0.4.0
+ dev: false
/@alloc/quick-lru@5.2.0:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
- /@ampproject/remapping@2.2.1:
- resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
+ /@ampproject/remapping@2.3.0:
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.20
- dev: false
-
- /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0):
- resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==}
- engines: {node: '>=10'}
- peerDependencies:
- ajv: '>=8'
- dependencies:
- ajv: 8.12.0
- json-schema: 0.4.0
- jsonpointer: 5.0.1
- leven: 3.1.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
dev: false
- /@babel/code-frame@7.22.10:
- resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==}
- engines: {node: '>=6.9.0'}
+ /@anthropic-ai/sdk@0.18.0:
+ resolution: {integrity: sha512-3XsWEn/4nPGRd4AdSguugbSDFy6Z2AWTNOeI3iK+aV22+w23+vY9CEb3Hiy0kvKIQuxSmZz/+5WKC8nPWy8gVg==}
dependencies:
- '@babel/highlight': 7.22.10
- chalk: 2.4.2
+ '@types/node': 18.19.30
+ '@types/node-fetch': 2.6.11
+ abort-controller: 3.0.0
+ agentkeepalive: 4.5.0
+ digest-fetch: 1.3.0
+ form-data-encoder: 1.7.2
+ formdata-node: 4.4.1
+ node-fetch: 2.7.0
+ web-streams-polyfill: 3.3.3
+ transitivePeerDependencies:
+ - encoding
dev: false
- /@babel/code-frame@7.22.13:
- resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
- engines: {node: '>=6.9.0'}
+ /@auth/core@0.28.2:
+ resolution: {integrity: sha512-Rlvu6yKa4bKbhQESMaEm6jHOY5ncIrsrQkC8tcwVQmf+cBLk7ReI9DIJS2O/WkIDoOwvM9PHiXTi5b+b/eyXxw==}
+ peerDependencies:
+ '@simplewebauthn/browser': ^9.0.1
+ '@simplewebauthn/server': ^9.0.2
+ nodemailer: ^6.8.0
+ peerDependenciesMeta:
+ '@simplewebauthn/browser':
+ optional: true
+ '@simplewebauthn/server':
+ optional: true
+ nodemailer:
+ optional: true
dependencies:
- '@babel/highlight': 7.22.20
- chalk: 2.4.2
- dev: false
-
- /@babel/compat-data@7.22.9:
- resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==}
- engines: {node: '>=6.9.0'}
- dev: false
-
- /@babel/compat-data@7.23.2:
- resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==}
- engines: {node: '>=6.9.0'}
+ '@panva/hkdf': 1.1.1
+ '@types/cookie': 0.6.0
+ cookie: 0.6.0
+ jose: 5.2.4
+ oauth4webapi: 2.10.4
+ preact: 10.11.3
+ preact-render-to-string: 5.2.3(preact@10.11.3)
dev: false
- /@babel/core@7.22.11:
- resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==}
- engines: {node: '>=6.9.0'}
+ /@auth/drizzle-adapter@0.8.2:
+ resolution: {integrity: sha512-IrySrHLr427+J5CjiM5fI6XFDmH5R2G7wd4E26z+J64C3t2aegdZdlfMAUerLjeoxAXnMas7bECtOYRO33EfKA==}
dependencies:
- '@ampproject/remapping': 2.2.1
- '@babel/code-frame': 7.22.10
- '@babel/generator': 7.22.10
- '@babel/helper-compilation-targets': 7.22.10
- '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11)
- '@babel/helpers': 7.22.11
- '@babel/parser': 7.22.11
- '@babel/template': 7.22.5
- '@babel/traverse': 7.22.11
- '@babel/types': 7.22.11
- convert-source-map: 1.9.0
- debug: 4.3.4
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
+ '@auth/core': 0.28.2
transitivePeerDependencies:
- - supports-color
+ - '@simplewebauthn/browser'
+ - '@simplewebauthn/server'
+ - nodemailer
dev: false
- /@babel/core@7.23.2:
- resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==}
- engines: {node: '>=6.9.0'}
+ /@aws-crypto/crc32@3.0.0:
+ resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==}
dependencies:
- '@ampproject/remapping': 2.2.1
- '@babel/code-frame': 7.22.13
- '@babel/generator': 7.23.0
- '@babel/helper-compilation-targets': 7.22.15
- '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
- '@babel/helpers': 7.23.2
- '@babel/parser': 7.23.0
- '@babel/template': 7.22.15
- '@babel/traverse': 7.23.2
- '@babel/types': 7.23.0
- convert-source-map: 2.0.0
- debug: 4.3.4
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
+ '@aws-crypto/util': 3.0.0
+ '@aws-sdk/types': 3.535.0
+ tslib: 1.14.1
dev: false
- /@babel/generator@7.22.10:
- resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==}
- engines: {node: '>=6.9.0'}
+ /@aws-crypto/ie11-detection@3.0.0:
+ resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==}
dependencies:
- '@babel/types': 7.22.11
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.20
- jsesc: 2.5.2
+ tslib: 1.14.1
dev: false
- /@babel/generator@7.23.0:
- resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==}
- engines: {node: '>=6.9.0'}
+ /@aws-crypto/sha256-browser@3.0.0:
+ resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==}
dependencies:
- '@babel/types': 7.23.0
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.20
- jsesc: 2.5.2
+ '@aws-crypto/ie11-detection': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-crypto/supports-web-crypto': 3.0.0
+ '@aws-crypto/util': 3.0.0
+ '@aws-sdk/types': 3.535.0
+ '@aws-sdk/util-locate-window': 3.535.0
+ '@aws-sdk/util-utf8-browser': 3.259.0
+ tslib: 1.14.1
dev: false
- /@babel/helper-annotate-as-pure@7.22.5:
- resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
- engines: {node: '>=6.9.0'}
+ /@aws-crypto/sha256-js@3.0.0:
+ resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==}
dependencies:
- '@babel/types': 7.22.11
+ '@aws-crypto/util': 3.0.0
+ '@aws-sdk/types': 3.535.0
+ tslib: 1.14.1
dev: false
- /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10:
- resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==}
- engines: {node: '>=6.9.0'}
+ /@aws-crypto/supports-web-crypto@3.0.0:
+ resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==}
dependencies:
- '@babel/types': 7.22.11
+ tslib: 1.14.1
dev: false
- /@babel/helper-compilation-targets@7.22.10:
- resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==}
- engines: {node: '>=6.9.0'}
+ /@aws-crypto/util@3.0.0:
+ resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==}
dependencies:
- '@babel/compat-data': 7.22.9
- '@babel/helper-validator-option': 7.22.5
- browserslist: 4.21.10
- lru-cache: 5.1.1
- semver: 6.3.1
+ '@aws-sdk/types': 3.535.0
+ '@aws-sdk/util-utf8-browser': 3.259.0
+ tslib: 1.14.1
dev: false
- /@babel/helper-compilation-targets@7.22.15:
- resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/client-bedrock-runtime@3.549.0:
+ resolution: {integrity: sha512-29Qai+25vulsNo41P1JaOa1kVWoF2tI+W6YrGUf64M7Fxhe6MzI5kMM6PHHuOOOeBq6oiSxnpAjDpEWr9p1aDw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/compat-data': 7.23.2
- '@babel/helper-validator-option': 7.22.15
- browserslist: 4.22.1
- lru-cache: 5.1.1
- semver: 6.3.1
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/core': 3.549.0
+ '@aws-sdk/credential-provider-node': 3.549.0
+ '@aws-sdk/middleware-host-header': 3.535.0
+ '@aws-sdk/middleware-logger': 3.535.0
+ '@aws-sdk/middleware-recursion-detection': 3.535.0
+ '@aws-sdk/middleware-user-agent': 3.540.0
+ '@aws-sdk/region-config-resolver': 3.535.0
+ '@aws-sdk/types': 3.535.0
+ '@aws-sdk/util-endpoints': 3.540.0
+ '@aws-sdk/util-user-agent-browser': 3.535.0
+ '@aws-sdk/util-user-agent-node': 3.535.0
+ '@smithy/config-resolver': 2.2.0
+ '@smithy/core': 1.4.2
+ '@smithy/eventstream-serde-browser': 2.2.0
+ '@smithy/eventstream-serde-config-resolver': 2.2.0
+ '@smithy/eventstream-serde-node': 2.2.0
+ '@smithy/fetch-http-handler': 2.5.0
+ '@smithy/hash-node': 2.2.0
+ '@smithy/invalid-dependency': 2.2.0
+ '@smithy/middleware-content-length': 2.2.0
+ '@smithy/middleware-endpoint': 2.5.1
+ '@smithy/middleware-retry': 2.3.1
+ '@smithy/middleware-serde': 2.3.0
+ '@smithy/middleware-stack': 2.2.0
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/node-http-handler': 2.5.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ '@smithy/url-parser': 2.2.0
+ '@smithy/util-base64': 2.3.0
+ '@smithy/util-body-length-browser': 2.2.0
+ '@smithy/util-body-length-node': 2.3.0
+ '@smithy/util-defaults-mode-browser': 2.2.1
+ '@smithy/util-defaults-mode-node': 2.3.1
+ '@smithy/util-endpoints': 1.2.0
+ '@smithy/util-middleware': 2.2.0
+ '@smithy/util-retry': 2.2.0
+ '@smithy/util-stream': 2.2.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
dev: false
- /@babel/helper-create-class-features-plugin@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/client-sso-oidc@3.549.0(@aws-sdk/credential-provider-node@3.549.0):
+ resolution: {integrity: sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==}
+ engines: {node: '>=14.0.0'}
peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-function-name': 7.22.5
- '@babel/helper-member-expression-to-functions': 7.22.5
- '@babel/helper-optimise-call-expression': 7.22.5
- '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- semver: 6.3.1
+ '@aws-sdk/credential-provider-node': ^3.549.0
+ dependencies:
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/core': 3.549.0
+ '@aws-sdk/credential-provider-node': 3.549.0
+ '@aws-sdk/middleware-host-header': 3.535.0
+ '@aws-sdk/middleware-logger': 3.535.0
+ '@aws-sdk/middleware-recursion-detection': 3.535.0
+ '@aws-sdk/middleware-user-agent': 3.540.0
+ '@aws-sdk/region-config-resolver': 3.535.0
+ '@aws-sdk/types': 3.535.0
+ '@aws-sdk/util-endpoints': 3.540.0
+ '@aws-sdk/util-user-agent-browser': 3.535.0
+ '@aws-sdk/util-user-agent-node': 3.535.0
+ '@smithy/config-resolver': 2.2.0
+ '@smithy/core': 1.4.2
+ '@smithy/fetch-http-handler': 2.5.0
+ '@smithy/hash-node': 2.2.0
+ '@smithy/invalid-dependency': 2.2.0
+ '@smithy/middleware-content-length': 2.2.0
+ '@smithy/middleware-endpoint': 2.5.1
+ '@smithy/middleware-retry': 2.3.1
+ '@smithy/middleware-serde': 2.3.0
+ '@smithy/middleware-stack': 2.2.0
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/node-http-handler': 2.5.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ '@smithy/url-parser': 2.2.0
+ '@smithy/util-base64': 2.3.0
+ '@smithy/util-body-length-browser': 2.2.0
+ '@smithy/util-body-length-node': 2.3.0
+ '@smithy/util-defaults-mode-browser': 2.2.1
+ '@smithy/util-defaults-mode-node': 2.3.1
+ '@smithy/util-endpoints': 1.2.0
+ '@smithy/util-middleware': 2.2.0
+ '@smithy/util-retry': 2.2.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
dev: false
- /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.11):
- resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
+ /@aws-sdk/client-sso@3.549.0:
+ resolution: {integrity: sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-annotate-as-pure': 7.22.5
- regexpu-core: 5.3.2
- semver: 6.3.1
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/core': 3.549.0
+ '@aws-sdk/middleware-host-header': 3.535.0
+ '@aws-sdk/middleware-logger': 3.535.0
+ '@aws-sdk/middleware-recursion-detection': 3.535.0
+ '@aws-sdk/middleware-user-agent': 3.540.0
+ '@aws-sdk/region-config-resolver': 3.535.0
+ '@aws-sdk/types': 3.535.0
+ '@aws-sdk/util-endpoints': 3.540.0
+ '@aws-sdk/util-user-agent-browser': 3.535.0
+ '@aws-sdk/util-user-agent-node': 3.535.0
+ '@smithy/config-resolver': 2.2.0
+ '@smithy/core': 1.4.2
+ '@smithy/fetch-http-handler': 2.5.0
+ '@smithy/hash-node': 2.2.0
+ '@smithy/invalid-dependency': 2.2.0
+ '@smithy/middleware-content-length': 2.2.0
+ '@smithy/middleware-endpoint': 2.5.1
+ '@smithy/middleware-retry': 2.3.1
+ '@smithy/middleware-serde': 2.3.0
+ '@smithy/middleware-stack': 2.2.0
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/node-http-handler': 2.5.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ '@smithy/url-parser': 2.2.0
+ '@smithy/util-base64': 2.3.0
+ '@smithy/util-body-length-browser': 2.2.0
+ '@smithy/util-body-length-node': 2.3.0
+ '@smithy/util-defaults-mode-browser': 2.2.1
+ '@smithy/util-defaults-mode-node': 2.3.1
+ '@smithy/util-endpoints': 1.2.0
+ '@smithy/util-middleware': 2.2.0
+ '@smithy/util-retry': 2.2.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
dev: false
- /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.11):
- resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==}
+ /@aws-sdk/client-sts@3.549.0(@aws-sdk/credential-provider-node@3.549.0):
+ resolution: {integrity: sha512-63IreJ598Dzvpb+6sy81KfIX5iQxnrWSEtlyeCdC2GO6gmSQVwJzc9kr5pAC83lHmlZcm/Q3KZr3XBhRQqP0og==}
+ engines: {node: '>=14.0.0'}
peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-compilation-targets': 7.22.10
- '@babel/helper-plugin-utils': 7.22.5
- debug: 4.3.4
- lodash.debounce: 4.0.8
- resolve: 1.22.4
+ '@aws-sdk/credential-provider-node': ^3.549.0
+ dependencies:
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/core': 3.549.0
+ '@aws-sdk/credential-provider-node': 3.549.0
+ '@aws-sdk/middleware-host-header': 3.535.0
+ '@aws-sdk/middleware-logger': 3.535.0
+ '@aws-sdk/middleware-recursion-detection': 3.535.0
+ '@aws-sdk/middleware-user-agent': 3.540.0
+ '@aws-sdk/region-config-resolver': 3.535.0
+ '@aws-sdk/types': 3.535.0
+ '@aws-sdk/util-endpoints': 3.540.0
+ '@aws-sdk/util-user-agent-browser': 3.535.0
+ '@aws-sdk/util-user-agent-node': 3.535.0
+ '@smithy/config-resolver': 2.2.0
+ '@smithy/core': 1.4.2
+ '@smithy/fetch-http-handler': 2.5.0
+ '@smithy/hash-node': 2.2.0
+ '@smithy/invalid-dependency': 2.2.0
+ '@smithy/middleware-content-length': 2.2.0
+ '@smithy/middleware-endpoint': 2.5.1
+ '@smithy/middleware-retry': 2.3.1
+ '@smithy/middleware-serde': 2.3.0
+ '@smithy/middleware-stack': 2.2.0
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/node-http-handler': 2.5.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ '@smithy/url-parser': 2.2.0
+ '@smithy/util-base64': 2.3.0
+ '@smithy/util-body-length-browser': 2.2.0
+ '@smithy/util-body-length-node': 2.3.0
+ '@smithy/util-defaults-mode-browser': 2.2.1
+ '@smithy/util-defaults-mode-node': 2.3.1
+ '@smithy/util-endpoints': 1.2.0
+ '@smithy/util-middleware': 2.2.0
+ '@smithy/util-retry': 2.2.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.2
transitivePeerDependencies:
- - supports-color
- dev: false
-
- /@babel/helper-environment-visitor@7.22.20:
- resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
- engines: {node: '>=6.9.0'}
- dev: false
-
- /@babel/helper-environment-visitor@7.22.5:
- resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==}
- engines: {node: '>=6.9.0'}
+ - aws-crt
dev: false
- /@babel/helper-function-name@7.22.5:
- resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/core@3.549.0:
+ resolution: {integrity: sha512-jC61OxJn72r/BbuDRCcluiw05Xw9eVLG0CwxQpF3RocxfxyZqlrGYaGecZ8Wy+7g/3sqGRC/Ar5eUhU1YcLx7w==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/template': 7.22.5
- '@babel/types': 7.22.11
+ '@smithy/core': 1.4.2
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/signature-v4': 2.2.1
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ fast-xml-parser: 4.2.5
+ tslib: 2.6.2
dev: false
- /@babel/helper-function-name@7.23.0:
- resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/credential-provider-env@3.535.0:
+ resolution: {integrity: sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/template': 7.22.15
- '@babel/types': 7.23.0
+ '@aws-sdk/types': 3.535.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-hoist-variables@7.22.5:
- resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/credential-provider-http@3.535.0:
+ resolution: {integrity: sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/types': 7.22.11
+ '@aws-sdk/types': 3.535.0
+ '@smithy/fetch-http-handler': 2.5.0
+ '@smithy/node-http-handler': 2.5.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ '@smithy/util-stream': 2.2.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-member-expression-to-functions@7.22.5:
- resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/credential-provider-ini@3.549.0(@aws-sdk/credential-provider-node@3.549.0):
+ resolution: {integrity: sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/types': 7.22.11
+ '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/credential-provider-env': 3.535.0
+ '@aws-sdk/credential-provider-process': 3.535.0
+ '@aws-sdk/credential-provider-sso': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/credential-provider-web-identity': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/types': 3.535.0
+ '@smithy/credential-provider-imds': 2.3.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/shared-ini-file-loader': 2.4.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-provider-node'
+ - aws-crt
dev: false
- /@babel/helper-module-imports@7.22.15:
- resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/credential-provider-node@3.549.0:
+ resolution: {integrity: sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/types': 7.23.0
+ '@aws-sdk/credential-provider-env': 3.535.0
+ '@aws-sdk/credential-provider-http': 3.535.0
+ '@aws-sdk/credential-provider-ini': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/credential-provider-process': 3.535.0
+ '@aws-sdk/credential-provider-sso': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/credential-provider-web-identity': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/types': 3.535.0
+ '@smithy/credential-provider-imds': 2.3.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/shared-ini-file-loader': 2.4.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
dev: false
- /@babel/helper-module-imports@7.22.5:
- resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/credential-provider-process@3.535.0:
+ resolution: {integrity: sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/types': 7.22.11
+ '@aws-sdk/types': 3.535.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/shared-ini-file-loader': 2.4.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11):
- resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
+ /@aws-sdk/credential-provider-sso@3.549.0(@aws-sdk/credential-provider-node@3.549.0):
+ resolution: {integrity: sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-module-imports': 7.22.5
- '@babel/helper-simple-access': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/helper-validator-identifier': 7.22.5
+ '@aws-sdk/client-sso': 3.549.0
+ '@aws-sdk/token-providers': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/types': 3.535.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/shared-ini-file-loader': 2.4.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-provider-node'
+ - aws-crt
dev: false
- /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
+ /@aws-sdk/credential-provider-web-identity@3.549.0(@aws-sdk/credential-provider-node@3.549.0):
+ resolution: {integrity: sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-module-imports': 7.22.15
- '@babel/helper-simple-access': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/helper-validator-identifier': 7.22.20
+ '@aws-sdk/client-sts': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/types': 3.535.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-provider-node'
+ - aws-crt
dev: false
- /@babel/helper-optimise-call-expression@7.22.5:
- resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/middleware-host-header@3.535.0:
+ resolution: {integrity: sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/types': 7.22.11
- dev: false
-
- /@babel/helper-plugin-utils@7.22.5:
- resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
- engines: {node: '>=6.9.0'}
+ '@aws-sdk/types': 3.535.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.11):
- resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
+ /@aws-sdk/middleware-logger@3.535.0:
+ resolution: {integrity: sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-wrap-function': 7.22.10
+ '@aws-sdk/types': 3.535.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.11):
- resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
+ /@aws-sdk/middleware-recursion-detection@3.535.0:
+ resolution: {integrity: sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-member-expression-to-functions': 7.22.5
- '@babel/helper-optimise-call-expression': 7.22.5
+ '@aws-sdk/types': 3.535.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-simple-access@7.22.5:
- resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/middleware-user-agent@3.540.0:
+ resolution: {integrity: sha512-8Rd6wPeXDnOYzWj1XCmOKcx/Q87L0K1/EHqOBocGjLVbN3gmRxBvpmR1pRTjf7IsWfnnzN5btqtcAkfDPYQUMQ==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/types': 7.22.11
+ '@aws-sdk/types': 3.535.0
+ '@aws-sdk/util-endpoints': 3.540.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-skip-transparent-expression-wrappers@7.22.5:
- resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/region-config-resolver@3.535.0:
+ resolution: {integrity: sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/types': 7.22.11
+ '@aws-sdk/types': 3.535.0
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/types': 2.12.0
+ '@smithy/util-config-provider': 2.3.0
+ '@smithy/util-middleware': 2.2.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-split-export-declaration@7.22.6:
- resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/token-providers@3.549.0(@aws-sdk/credential-provider-node@3.549.0):
+ resolution: {integrity: sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/types': 7.22.11
- dev: false
-
- /@babel/helper-string-parser@7.22.5:
- resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
- engines: {node: '>=6.9.0'}
+ '@aws-sdk/client-sso-oidc': 3.549.0(@aws-sdk/credential-provider-node@3.549.0)
+ '@aws-sdk/types': 3.535.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/shared-ini-file-loader': 2.4.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-provider-node'
+ - aws-crt
dev: false
- /@babel/helper-validator-identifier@7.22.20:
- resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/types@3.535.0:
+ resolution: {integrity: sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-validator-identifier@7.22.5:
- resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/util-endpoints@3.540.0:
+ resolution: {integrity: sha512-1kMyQFAWx6f8alaI6UT65/5YW/7pDWAKAdNwL6vuJLea03KrZRX3PMoONOSJpAS5m3Ot7HlWZvf3wZDNTLELZw==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.535.0
+ '@smithy/types': 2.12.0
+ '@smithy/util-endpoints': 1.2.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-validator-option@7.22.15:
- resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/util-locate-window@3.535.0:
+ resolution: {integrity: sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ tslib: 2.6.2
dev: false
- /@babel/helper-validator-option@7.22.5:
- resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/util-user-agent-browser@3.535.0:
+ resolution: {integrity: sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==}
+ dependencies:
+ '@aws-sdk/types': 3.535.0
+ '@smithy/types': 2.12.0
+ bowser: 2.11.0
+ tslib: 2.6.2
dev: false
- /@babel/helper-wrap-function@7.22.10:
- resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/util-user-agent-node@3.535.0:
+ resolution: {integrity: sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ aws-crt: '>=1.0.0'
+ peerDependenciesMeta:
+ aws-crt:
+ optional: true
dependencies:
- '@babel/helper-function-name': 7.22.5
- '@babel/template': 7.22.5
- '@babel/types': 7.22.11
+ '@aws-sdk/types': 3.535.0
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@babel/helpers@7.22.11:
- resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==}
- engines: {node: '>=6.9.0'}
+ /@aws-sdk/util-utf8-browser@3.259.0:
+ resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==}
dependencies:
- '@babel/template': 7.22.5
- '@babel/traverse': 7.22.11
- '@babel/types': 7.22.11
- transitivePeerDependencies:
- - supports-color
+ tslib: 2.6.2
dev: false
- /@babel/helpers@7.23.2:
- resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==}
- engines: {node: '>=6.9.0'}
+ /@azure-rest/core-client@1.3.1:
+ resolution: {integrity: sha512-wyFZjWCZeHX7qiQRalDYHwRzgU/2wYuOCxnQjmCKy+Qt+KQZ12KlqM8DQcKi080yDrA94nx1HPA9695pc+p3lA==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/template': 7.22.15
- '@babel/traverse': 7.23.2
- '@babel/types': 7.23.0
+ '@azure/abort-controller': 2.1.1
+ '@azure/core-auth': 1.7.1
+ '@azure/core-rest-pipeline': 1.15.1
+ '@azure/core-tracing': 1.1.1
+ '@azure/core-util': 1.8.1
+ tslib: 2.6.2
transitivePeerDependencies:
- supports-color
dev: false
- /@babel/highlight@7.22.10:
- resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-validator-identifier': 7.22.5
- chalk: 2.4.2
- js-tokens: 4.0.0
- dev: false
-
- /@babel/highlight@7.22.20:
- resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
- engines: {node: '>=6.9.0'}
+ /@azure/abort-controller@2.1.1:
+ resolution: {integrity: sha512-NhzeNm5zu2fPlwGXPUjzsRCRuPx5demaZyNcyNYJDqpa/Sbxzvo/RYt9IwUaAOnDW5+r7J9UOE6f22TQnb9nhQ==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/helper-validator-identifier': 7.22.20
- chalk: 2.4.2
- js-tokens: 4.0.0
+ tslib: 2.6.2
dev: false
- /@babel/parser@7.22.11:
- resolution: {integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==}
- engines: {node: '>=6.0.0'}
- hasBin: true
+ /@azure/core-auth@1.7.1:
+ resolution: {integrity: sha512-dyeQwvgthqs/SlPVQbZQetpslXceHd4i5a7M/7z/lGEAVwnSluabnQOjF2/dk/hhWgMISusv1Ytp4mQ8JNy62A==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/types': 7.22.11
+ '@azure/abort-controller': 2.1.1
+ '@azure/core-util': 1.8.1
+ tslib: 2.6.2
dev: false
- /@babel/parser@7.23.0:
- resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==}
- engines: {node: '>=6.0.0'}
- hasBin: true
+ /@azure/core-rest-pipeline@1.15.1:
+ resolution: {integrity: sha512-ZxS6i3eHxh86u+1eWZJiYywoN2vxvsSoAUx60Mny8cZ4nTwvt7UzVVBJO+m2PW2KIJfNiXMt59xBa59htOWL4g==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/types': 7.23.0
+ '@azure/abort-controller': 2.1.1
+ '@azure/core-auth': 1.7.1
+ '@azure/core-tracing': 1.1.1
+ '@azure/core-util': 1.8.1
+ '@azure/logger': 1.1.1
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.4
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - supports-color
dev: false
- /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
+ /@azure/core-sse@2.1.1:
+ resolution: {integrity: sha512-serdWoBPogo/1r2JwDc+/wEflCri/d7DNy7IOh6iU9dCxlpbi8PrZEUFj33kl9KnGd0TzM6qniPJOYJ7VLj6Vg==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ tslib: 2.6.2
dev: false
- /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.13.0
+ /@azure/core-tracing@1.1.1:
+ resolution: {integrity: sha512-qPbYhN1pE5XQ2jPKIHP33x8l3oBu1UqIWnYqZZ3OYnYjzY0xqIHjn49C+ptsPD9yC7uyWI9Zm7iZUZLs2R4DhQ==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-transform-optional-chaining': 7.22.12(@babel/core@7.22.11)
+ tslib: 2.6.2
dev: false
- /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11):
- resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ /@azure/core-util@1.8.1:
+ resolution: {integrity: sha512-L3voj0StUdJ+YKomvwnTv7gHzguJO+a6h30pmmZdRprJCM+RJlGMPxzuh4R7lhQu1jNmEtaHX5wvTgWLDAmbGQ==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/core': 7.22.11
+ '@azure/abort-controller': 2.1.1
+ tslib: 2.6.2
dev: false
- /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11):
- resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ /@azure/logger@1.1.1:
+ resolution: {integrity: sha512-/+4TtokaGgC+MnThdf6HyIH9Wrjp+CnCn3Nx3ggevN7FFjjNyjqg0yLlc2i9S+Z2uAzI8GYOo35Nzb1MhQ89MA==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ tslib: 2.6.2
dev: false
- /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11):
- resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ /@azure/openai@1.0.0-beta.12:
+ resolution: {integrity: sha512-qKblxr6oVa8GsyNzY+/Ub9VmEsPYKhBrUrPaNEQiM+qrxnBPVm9kaeqGFFb/U78Q2zOabmhF9ctYt3xBW0nWnQ==}
+ engines: {node: '>=18.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ '@azure-rest/core-client': 1.3.1
+ '@azure/core-auth': 1.7.1
+ '@azure/core-rest-pipeline': 1.15.1
+ '@azure/core-sse': 2.1.1
+ '@azure/core-util': 1.8.1
+ '@azure/logger': 1.1.1
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - supports-color
dev: false
- /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ /@babel/helper-string-parser@7.24.1:
+ resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
dev: false
- /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.11):
- resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ /@babel/helper-validator-identifier@7.22.20:
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
dev: false
- /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.11):
- resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ /@babel/parser@7.24.4:
+ resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ '@babel/types': 7.24.0
dev: false
- /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==}
+ /@babel/runtime@7.24.4:
+ resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
+ regenerator-runtime: 0.14.1
- /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==}
+ /@babel/types@7.24.0:
+ resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-string-parser': 7.24.1
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
dev: false
- /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11):
- resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ /@emotion/is-prop-valid@1.2.1:
+ resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ '@emotion/memoize': 0.8.1
dev: false
- /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11):
- resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ /@emotion/memoize@0.8.1:
+ resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
dev: false
- /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11):
- resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
+ /@emotion/unitless@0.8.0:
+ resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==}
dev: false
- /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11):
- resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0):
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
- '@babel/core': ^7.0.0-0
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
+ eslint: 8.57.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
- /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11):
- resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
+ /@eslint-community/regexpp@4.10.0:
+ resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
- /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11):
- resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11):
- resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11):
- resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.11):
- resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-async-generator-functions@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-module-imports': 7.22.5
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.11):
- resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.12.0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.11):
- resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-compilation-targets': 7.22.10
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-function-name': 7.22.5
- '@babel/helper-optimise-call-expression': 7.22.5
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-split-export-declaration': 7.22.6
- globals: 11.12.0
- dev: false
-
- /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/template': 7.22.5
- dev: false
-
- /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.11):
- resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-compilation-targets': 7.22.10
- '@babel/helper-function-name': 7.22.5
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-modules-commonjs@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-simple-access': 7.22.5
- dev: false
-
- /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-validator-identifier': 7.22.5
- dev: false
-
- /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-object-rest-spread@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/compat-data': 7.22.9
- '@babel/core': 7.22.11
- '@babel/helper-compilation-targets': 7.22.10
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11)
- '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-optional-chaining@7.22.12(@babel/core@7.22.11):
- resolution: {integrity: sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.11):
- resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11)
- dev: false
-
- /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.11):
- resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- regenerator-transform: 0.15.2
- dev: false
-
- /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- dev: false
-
- /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.11):
- resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/preset-env@7.22.10(@babel/core@7.22.11):
- resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/compat-data': 7.22.9
- '@babel/core': 7.22.11
- '@babel/helper-compilation-targets': 7.22.10
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-validator-option': 7.22.5
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11)
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11)
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11)
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11)
- '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.11)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11)
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11)
- '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.11)
- '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-async-generator-functions': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-block-scoping': 7.22.10(@babel/core@7.22.11)
- '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.11)
- '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-destructuring': 7.22.10(@babel/core@7.22.11)
- '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-modules-commonjs': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-object-rest-spread': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-optional-chaining': 7.22.12(@babel/core@7.22.11)
- '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.22.11)
- '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.11)
- '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.11)
- '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.11)
- '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.11)
- '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.11)
- '@babel/types': 7.22.11
- babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.11)
- babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.11)
- babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.11)
- core-js-compat: 3.32.1
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: false
-
- /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.11):
- resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/types': 7.22.11
- esutils: 2.0.3
- dev: false
-
- /@babel/regjsgen@0.8.0:
- resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
- dev: false
-
- /@babel/runtime@7.22.11:
- resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.14.0
- dev: false
-
- /@babel/template@7.22.15:
- resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.13
- '@babel/parser': 7.23.0
- '@babel/types': 7.23.0
- dev: false
-
- /@babel/template@7.22.5:
- resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.10
- '@babel/parser': 7.22.11
- '@babel/types': 7.22.11
- dev: false
-
- /@babel/traverse@7.22.11:
- resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.10
- '@babel/generator': 7.22.10
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-function-name': 7.22.5
- '@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/parser': 7.22.11
- '@babel/types': 7.22.11
- debug: 4.3.4
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
- dev: false
-
- /@babel/traverse@7.23.2:
- resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
- engines: {node: '>=6.9.0'}
- 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.3.4
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
- dev: false
-
- /@babel/types@7.22.11:
- resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.22.5
- '@babel/helper-validator-identifier': 7.22.5
- to-fast-properties: 2.0.0
- dev: false
-
- /@babel/types@7.23.0:
- resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.22.5
- '@babel/helper-validator-identifier': 7.22.20
- to-fast-properties: 2.0.0
- dev: false
-
- /@dqbd/tiktoken@1.0.7:
- resolution: {integrity: sha512-bhR5k5W+8GLzysjk8zTMVygQZsgvf7W1F0IlL4ZQ5ugjo5rCyiwGM5d8DYriXspytfu98tv59niang3/T+FoDw==}
- dev: false
-
- /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
- resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- dependencies:
- eslint: 8.56.0
- eslint-visitor-keys: 3.4.3
-
- /@eslint-community/regexpp@4.8.0:
- resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-
- /@eslint/eslintrc@2.1.4:
- resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@eslint/eslintrc@2.1.4:
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
ajv: 6.12.6
debug: 4.3.4
espree: 9.6.1
- globals: 13.21.0
- ignore: 5.2.4
+ globals: 13.24.0
+ ignore: 5.3.1
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
+ dev: true
- /@eslint/js@8.56.0:
- resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
+ /@eslint/js@8.57.0:
+ resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
- /@floating-ui/core@1.4.1:
- resolution: {integrity: sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==}
+ /@floating-ui/core@1.6.0:
+ resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==}
dependencies:
- '@floating-ui/utils': 0.1.1
+ '@floating-ui/utils': 0.2.1
dev: false
- /@floating-ui/dom@1.5.1:
- resolution: {integrity: sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==}
+ /@floating-ui/dom@1.6.3:
+ resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==}
dependencies:
- '@floating-ui/core': 1.4.1
- '@floating-ui/utils': 0.1.1
+ '@floating-ui/core': 1.6.0
+ '@floating-ui/utils': 0.2.1
dev: false
- /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==}
+ /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==}
peerDependencies:
react: '>=16.8.0'
react-dom: '>=16.8.0'
dependencies:
- '@floating-ui/dom': 1.5.1
+ '@floating-ui/dom': 1.6.3
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@floating-ui/utils@0.1.1:
- resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==}
+ /@floating-ui/utils@0.2.1:
+ resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==}
dev: false
/@formatjs/ecma402-abstract@1.11.4:
@@ -1639,10 +980,10 @@ packages:
tslib: 2.6.2
dev: false
- /@formatjs/ecma402-abstract@1.17.0:
- resolution: {integrity: sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==}
+ /@formatjs/ecma402-abstract@1.18.2:
+ resolution: {integrity: sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==}
dependencies:
- '@formatjs/intl-localematcher': 0.4.0
+ '@formatjs/intl-localematcher': 0.5.4
tslib: 2.6.2
dev: false
@@ -1679,28 +1020,55 @@ packages:
tslib: 2.6.2
dev: false
- /@formatjs/intl-localematcher@0.4.0:
- resolution: {integrity: sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==}
+ /@formatjs/intl-localematcher@0.5.4:
+ resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==}
dependencies:
tslib: 2.6.2
dev: false
- /@humanwhocodes/config-array@0.11.13:
- resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==}
+ /@google/generative-ai@0.3.1:
+ resolution: {integrity: sha512-Zh1EK5nCWqIhxPm3K1KOM2mOwwgBvp6lkze74yTj6+Zqibtf55Db1q87cbbzWZeET3ZbNgHMYjVf2JyMM6pI7A==}
+ engines: {node: '>=18.0.0'}
+ dev: false
+
+ /@huggingface/agents@0.0.5:
+ resolution: {integrity: sha512-h3mutXX0sFg4o9ZDHh3gzsF+qydcrTW9MVll2g/IVrNiQ0pSfXZqOQPRnfd85XU49buY3Zd1oHUDI0Bz8PznJw==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@huggingface/inference': 2.6.6
+ dev: false
+
+ /@huggingface/hub@0.14.7:
+ resolution: {integrity: sha512-MJeGSNZlS2rGBeCcyyL8WDHBhYplonBGp3ULsCFk62HpKmrFTQ98BsG4H/csRvuCn5pFmOsnHzGbWoAaHA0Xxg==}
+ engines: {node: '>=18'}
+ dependencies:
+ hash-wasm: 4.11.0
+ dev: false
+
+ /@huggingface/inference@2.6.6:
+ resolution: {integrity: sha512-5VEsrKj/gQ0BViUHX43VFlgbVH5OR+w6/auTQkvMqnxF3e8yK2AqAVP+zoF4dcm1DEnxUkPGeNYrxOwIUFxjuw==}
+ engines: {node: '>=18'}
+ dev: false
+
+ /@humanwhocodes/config-array@0.11.14:
+ resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
engines: {node: '>=10.10.0'}
dependencies:
- '@humanwhocodes/object-schema': 2.0.1
+ '@humanwhocodes/object-schema': 2.0.3
debug: 4.3.4
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
+ dev: true
/@humanwhocodes/module-importer@1.0.1:
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
engines: {node: '>=12.22'}
+ dev: true
- /@humanwhocodes/object-schema@2.0.1:
- resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==}
+ /@humanwhocodes/object-schema@2.0.3:
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ dev: true
/@isaacs/cliui@8.0.2:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
@@ -1712,67 +1080,52 @@ packages:
strip-ansi-cjs: /strip-ansi@6.0.1
wrap-ansi: 8.1.0
wrap-ansi-cjs: /wrap-ansi@7.0.0
- dev: false
- /@jridgewell/gen-mapping@0.3.3:
- resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+ /@jridgewell/gen-mapping@0.3.5:
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
dependencies:
- '@jridgewell/set-array': 1.1.2
+ '@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.4.15
- '@jridgewell/trace-mapping': 0.3.20
+ '@jridgewell/trace-mapping': 0.3.25
- /@jridgewell/resolve-uri@3.1.1:
- resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+ /@jridgewell/resolve-uri@3.1.2:
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
- /@jridgewell/set-array@1.1.2:
- resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ /@jridgewell/set-array@1.2.1:
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
engines: {node: '>=6.0.0'}
- /@jridgewell/source-map@0.3.5:
- resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==}
- dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.20
-
/@jridgewell/sourcemap-codec@1.4.15:
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
- /@jridgewell/trace-mapping@0.3.19:
- resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==}
+ /@jridgewell/trace-mapping@0.3.25:
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
dependencies:
- '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.4.15
- /@jridgewell/trace-mapping@0.3.20:
- resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
+ /@mistralai/mistralai@0.1.3:
+ resolution: {integrity: sha512-WUHxC2xdeqX9PTXJEqdiNY54vT2ir72WSJrZTTBKRnkfhX6zIfCYA24faRlWjUB5WTpn+wfdGsTMl3ArijlXFA==}
dependencies:
- '@jridgewell/resolve-uri': 3.1.1
- '@jridgewell/sourcemap-codec': 1.4.15
-
- /@next-auth/prisma-adapter@1.0.7(@prisma/client@5.6.0)(next-auth@4.24.5):
- resolution: {integrity: sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==}
- peerDependencies:
- '@prisma/client': '>=2.26.0 || >=3'
- next-auth: ^4
- dependencies:
- '@prisma/client': 5.6.0(prisma@5.6.0)
- next-auth: 4.24.5(next@14.1.0)(nodemailer@6.9.5)(react-dom@18.2.0)(react@18.2.0)
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
dev: false
- /@next/env@14.1.0:
- resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==}
+ /@next/env@14.2.0:
+ resolution: {integrity: sha512-4+70ELtSbRtYUuyRpAJmKC8NHBW2x1HMje9KO2Xd7IkoyucmV9SjgO+qeWMC0JWkRQXgydv1O7yKOK8nu/rITQ==}
dev: false
- /@next/eslint-plugin-next@14.1.0:
- resolution: {integrity: sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q==}
+ /@next/eslint-plugin-next@14.1.3:
+ resolution: {integrity: sha512-VCnZI2cy77Yaj3L7Uhs3+44ikMM1VD/fBMwvTBb3hIaTIuqa+DmG4dhUDq+MASu3yx97KhgsVJbsas0XuiKyww==}
dependencies:
glob: 10.3.10
- dev: false
+ dev: true
- /@next/swc-darwin-arm64@14.1.0:
- resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==}
+ /@next/swc-darwin-arm64@14.2.0:
+ resolution: {integrity: sha512-kHktLlw0AceuDnkVljJ/4lTJagLzDiO3klR1Fzl2APDFZ8r+aTxNaNcPmpp0xLMkgRwwk6sggYeqq0Rz9K4zzA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
@@ -1780,8 +1133,8 @@ packages:
dev: false
optional: true
- /@next/swc-darwin-x64@14.1.0:
- resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==}
+ /@next/swc-darwin-x64@14.2.0:
+ resolution: {integrity: sha512-HFSDu7lb1U3RDxXNeKH3NGRR5KyTPBSUTuIOr9jXoAso7i76gNYvnTjbuzGVWt2X5izpH908gmOYWtI7un+JrA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
@@ -1789,8 +1142,8 @@ packages:
dev: false
optional: true
- /@next/swc-linux-arm64-gnu@14.1.0:
- resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==}
+ /@next/swc-linux-arm64-gnu@14.2.0:
+ resolution: {integrity: sha512-iQsoWziO5ZMxDWZ4ZTCAc7hbJ1C9UDj/gATSqTaMjW2bJFwAsvf9UM79AKnljBl73uPZ+V0kH4rvnHTco4Ps2w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@@ -1798,8 +1151,8 @@ packages:
dev: false
optional: true
- /@next/swc-linux-arm64-musl@14.1.0:
- resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==}
+ /@next/swc-linux-arm64-musl@14.2.0:
+ resolution: {integrity: sha512-0JOk2uzLUt8fJK5LpsKKZa74zAch7bJjjgJzR9aOMs231AlE4gPYzsSm430ckZitjPGKeH5bgDZjqwqJQKIS2w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@@ -1807,8 +1160,8 @@ packages:
dev: false
optional: true
- /@next/swc-linux-x64-gnu@14.1.0:
- resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==}
+ /@next/swc-linux-x64-gnu@14.2.0:
+ resolution: {integrity: sha512-uYHkuTzX0NM6biKNp7hdKTf+BF0iMV254SxO0B8PgrQkxUBKGmk5ysHKB+FYBfdf9xei/t8OIKlXJs9ckD943A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@@ -1816,8 +1169,8 @@ packages:
dev: false
optional: true
- /@next/swc-linux-x64-musl@14.1.0:
- resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==}
+ /@next/swc-linux-x64-musl@14.2.0:
+ resolution: {integrity: sha512-paN89nLs2dTBDtfXWty1/NVPit+q6ldwdktixYSVwiiAz647QDCd+EIYqoiS+/rPG3oXs/A7rWcJK9HVqfnMVg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@@ -1825,8 +1178,8 @@ packages:
dev: false
optional: true
- /@next/swc-win32-arm64-msvc@14.1.0:
- resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==}
+ /@next/swc-win32-arm64-msvc@14.2.0:
+ resolution: {integrity: sha512-j1oiidZisnymYjawFqEfeGNcE22ZQ7lGUaa4pGOCVWrWeIDkPSj8zYgS9TzMNlg17Q3wSWCQC/F5uJAhSh7qcA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
@@ -1834,8 +1187,8 @@ packages:
dev: false
optional: true
- /@next/swc-win32-ia32-msvc@14.1.0:
- resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==}
+ /@next/swc-win32-ia32-msvc@14.2.0:
+ resolution: {integrity: sha512-6ff6F4xb+QGD1jhx/dOT9Ot7PQ/GAYekV9ykwEh2EFS/cLTyU4Y3cXkX5cNtNIhpctS5NvyjW9gIksRNErYE0A==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
@@ -1843,8 +1196,8 @@ packages:
dev: false
optional: true
- /@next/swc-win32-x64-msvc@14.1.0:
- resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==}
+ /@next/swc-win32-x64-msvc@14.2.0:
+ resolution: {integrity: sha512-09DbG5vXAxz0eTFSf1uebWD36GF3D5toynRkgo2AlSrxwGZkWtJ1RhmrczRYQ17eD5bdo4FZ0ibiffdq5kc4vg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -1868,7 +1221,7 @@ packages:
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.scandir': 2.1.5
- fastq: 1.15.0
+ fastq: 1.17.1
/@panva/hkdf@1.1.1:
resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==}
@@ -1878,83 +1231,25 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
requiresBuild: true
- dev: false
optional: true
/@popperjs/core@2.11.8:
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
dev: false
- /@prisma/client@5.6.0(prisma@5.6.0):
- resolution: {integrity: sha512-mUDefQFa1wWqk4+JhKPYq8BdVoFk9NFMBXUI8jAkBfQTtgx8WPx02U2HB/XbAz3GSUJpeJOKJQtNvaAIDs6sug==}
- engines: {node: '>=16.13'}
- requiresBuild: true
- peerDependencies:
- prisma: '*'
- peerDependenciesMeta:
- prisma:
- optional: true
- dependencies:
- '@prisma/engines-version': 5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee
- prisma: 5.6.0
- dev: false
-
- /@prisma/engines-version@5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee:
- resolution: {integrity: sha512-UoFgbV1awGL/3wXuUK3GDaX2SolqczeeJ5b4FVec9tzeGbSWJboPSbT0psSrmgYAKiKnkOPFSLlH6+b+IyOwAw==}
- dev: false
-
- /@prisma/engines@5.6.0:
- resolution: {integrity: sha512-Mt2q+GNJpU2vFn6kif24oRSBQv1KOkYaterQsi0k2/lA+dLvhRX6Lm26gon6PYHwUM8/h8KRgXIUMU0PCLB6bw==}
- requiresBuild: true
-
/@radix-ui/number@1.0.1:
resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
dependencies:
- '@babel/runtime': 7.22.11
- dev: false
-
- /@radix-ui/primitive@1.0.0:
- resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==}
- dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
dev: false
/@radix-ui/primitive@1.0.1:
resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
dependencies:
- '@babel/runtime': 7.22.11
- dev: false
-
- /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
+ '@babel/runtime': 7.24.4
dev: false
- /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==}
peerDependencies:
'@types/react': '*'
@@ -1967,16 +1262,16 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-avatar@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-9ToF7YNex3Ste45LrAeTlKtONI9yVRt/zOS158iilIkW5K/Apeyb/TUQlcEFTEFvWr8Kzdi2ZYrm1/suiXPajQ==}
+ /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -1988,18 +1283,18 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==}
peerDependencies:
'@types/react': '*'
@@ -2012,50 +1307,22 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
- /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==}
peerDependencies:
'@types/react': '*'
@@ -2068,27 +1335,18 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-compose-refs@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
- dependencies:
- '@babel/runtime': 7.22.11
- react: 18.2.0
- dev: false
-
- /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.47)(react@18.2.0):
+ /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.74)(react@18.2.0):
resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
peerDependencies:
'@types/react': '*'
@@ -2097,21 +1355,12 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@types/react': 18.2.47
- react: 18.2.0
- dev: false
-
- /@radix-ui/react-context@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
- dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
+ '@types/react': 18.2.74
react: 18.2.0
dev: false
- /@radix-ui/react-context@1.0.1(@types/react@18.2.47)(react@18.2.0):
+ /@radix-ui/react-context@1.0.1(@types/react@18.2.74)(react@18.2.0):
resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==}
peerDependencies:
'@types/react': '*'
@@ -2120,40 +1369,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@types/react': 18.2.47
- react: 18.2.0
- dev: false
-
- /@radix-ui/react-dialog@1.0.0(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/primitive': 1.0.0
- '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
- '@radix-ui/react-context': 1.0.0(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.0(react@18.2.0)
- '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.0(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0)
- aria-hidden: 1.2.3
+ '@babel/runtime': 7.24.4
+ '@types/react': 18.2.74
react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.4(@types/react@18.2.47)(react@18.2.0)
- transitivePeerDependencies:
- - '@types/react'
dev: false
- /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==}
+ /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2165,28 +1387,28 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
- aria-hidden: 1.2.3
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
+ aria-hidden: 1.2.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
+ react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0)
dev: false
- /@radix-ui/react-direction@1.0.1(@types/react@18.2.47)(react@18.2.0):
+ /@radix-ui/react-direction@1.0.1(@types/react@18.2.74)(react@18.2.0):
resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==}
peerDependencies:
'@types/react': '*'
@@ -2195,29 +1417,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@types/react': 18.2.47
+ '@babel/runtime': 7.24.4
+ '@types/react': 18.2.74
react: 18.2.0
dev: false
- /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/primitive': 1.0.0
- '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
- '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0)
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
- /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==}
+ /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2229,20 +1435,20 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==}
+ /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2254,30 +1460,21 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-focus-guards@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
- dependencies:
- '@babel/runtime': 7.22.11
- react: 18.2.0
- dev: false
-
- /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.47)(react@18.2.0):
+ /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.74)(react@18.2.0):
resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
peerDependencies:
'@types/react': '*'
@@ -2286,27 +1483,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@types/react': 18.2.47
+ '@babel/runtime': 7.24.4
+ '@types/react': 18.2.74
react: 18.2.0
dev: false
- /@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
- /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==}
+ /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2318,27 +1501,17 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-id@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
- dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0)
- react: 18.2.0
- dev: false
-
- /@radix-ui/react-id@1.0.1(@types/react@18.2.47)(react@18.2.0):
+ /@radix-ui/react-id@1.0.1(@types/react@18.2.74)(react@18.2.0):
resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
peerDependencies:
'@types/react': '*'
@@ -2347,13 +1520,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
react: 18.2.0
dev: false
- /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
+ /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==}
peerDependencies:
'@types/react': '*'
@@ -2366,16 +1539,16 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==}
+ /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2387,33 +1560,33 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
- aria-hidden: 1.2.3
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
+ aria-hidden: 1.2.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
+ react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0)
dev: false
- /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==}
+ /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2425,30 +1598,25 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
- aria-hidden: 1.2.3
+ '@babel/runtime': 7.24.4
+ '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/rect': 1.0.1
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
dev: false
- /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==}
+ /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2460,37 +1628,38 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/rect': 1.0.1
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-portal@1.0.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==}
+ /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==}
+ /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2502,29 +1671,45 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==}
+ /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==}
peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0)
+ '@babel/runtime': 7.24.4
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
+ /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2536,29 +1721,51 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/number': 1.0.1
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
+ aria-hidden: 1.2.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
+ react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0)
dev: false
- /@radix-ui/react-primitive@1.0.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==}
+ /@radix-ui/react-slot@1.0.2(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
peerDependencies:
+ '@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-slot': 1.0.0(react@18.2.0)
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
+ /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2570,16 +1777,22 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==}
+ /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2591,127 +1804,81 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
'@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==}
+ /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
peerDependencies:
'@types/react': '*'
- '@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
peerDependenciesMeta:
'@types/react':
optional: true
- '@types/react-dom':
- optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/number': 1.0.1
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
- aria-hidden: 1.2.3
+ '@babel/runtime': 7.24.4
+ '@types/react': 18.2.74
react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0)
dev: false
- /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==}
+ /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==}
peerDependencies:
'@types/react': '*'
- '@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
peerDependenciesMeta:
'@types/react':
optional: true
- '@types/react-dom':
- optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-slider@1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw==}
+ /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
peerDependencies:
'@types/react': '*'
- '@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
peerDependenciesMeta:
'@types/react':
optional: true
- '@types/react-dom':
- optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/number': 1.0.1
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-slot@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==}
+ /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
peerDependencies:
+ '@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
+ '@babel/runtime': 7.24.4
+ '@types/react': 18.2.74
react: 18.2.0
dev: false
- /@radix-ui/react-slot@1.0.2(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
+ /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0
@@ -2719,41 +1886,43 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
+ '@babel/runtime': 7.24.4
+ '@types/react': 18.2.74
react: 18.2.0
dev: false
- /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==}
+ /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==}
peerDependencies:
'@types/react': '*'
- '@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
peerDependenciesMeta:
'@types/react':
optional: true
- '@types/react-dom':
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@radix-ui/rect': 1.0.1
+ '@types/react': 18.2.74
+ react: 18.2.0
+ dev: false
+
+ /@radix-ui/react-use-size@1.0.1(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==}
+ /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -2765,272 +1934,489 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
+ '@babel/runtime': 7.24.4
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.74
+ '@types/react-dom': 18.2.24
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==}
+ /@radix-ui/rect@1.0.1:
+ resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ dev: false
+
+ /@react-spring/animated@9.7.3(react@18.2.0):
+ resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==}
peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
- '@babel/runtime': 7.22.11
+ '@react-spring/shared': 9.7.3(react@18.2.0)
+ '@react-spring/types': 9.7.3
react: 18.2.0
dev: false
- /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
+ /@react-spring/core@9.7.3(react@18.2.0):
+ resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@react-spring/animated': 9.7.3(react@18.2.0)
+ '@react-spring/shared': 9.7.3(react@18.2.0)
+ '@react-spring/types': 9.7.3
+ react: 18.2.0
+ dev: false
+
+ /@react-spring/shared@9.7.3(react@18.2.0):
+ resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@react-spring/types': 9.7.3
+ react: 18.2.0
+ dev: false
+
+ /@react-spring/types@9.7.3:
+ resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==}
+ dev: false
+
+ /@react-spring/web@9.7.3(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
- '@babel/runtime': 7.22.11
- '@types/react': 18.2.47
+ '@react-spring/animated': 9.7.3(react@18.2.0)
+ '@react-spring/core': 9.7.3(react@18.2.0)
+ '@react-spring/shared': 9.7.3(react@18.2.0)
+ '@react-spring/types': 9.7.3
react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@rushstack/eslint-patch@1.10.1:
+ resolution: {integrity: sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==}
+ dev: true
+
+ /@smithy/abort-controller@2.2.0:
+ resolution: {integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/config-resolver@2.2.0:
+ resolution: {integrity: sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/types': 2.12.0
+ '@smithy/util-config-provider': 2.3.0
+ '@smithy/util-middleware': 2.2.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/core@1.4.2:
+ resolution: {integrity: sha512-2fek3I0KZHWJlRLvRTqxTEri+qV0GRHrJIoLFuBMZB4EMg4WgeBGfF0X6abnrNYpq55KJ6R4D6x4f0vLnhzinA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/middleware-endpoint': 2.5.1
+ '@smithy/middleware-retry': 2.3.1
+ '@smithy/middleware-serde': 2.3.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ '@smithy/util-middleware': 2.2.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/credential-provider-imds@2.3.0:
+ resolution: {integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/types': 2.12.0
+ '@smithy/url-parser': 2.2.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/eventstream-codec@2.2.0:
+ resolution: {integrity: sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==}
+ dependencies:
+ '@aws-crypto/crc32': 3.0.0
+ '@smithy/types': 2.12.0
+ '@smithy/util-hex-encoding': 2.2.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/eventstream-serde-browser@2.2.0:
+ resolution: {integrity: sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/eventstream-serde-universal': 2.2.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/eventstream-serde-config-resolver@2.2.0:
+ resolution: {integrity: sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/eventstream-serde-node@2.2.0:
+ resolution: {integrity: sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/eventstream-serde-universal': 2.2.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/eventstream-serde-universal@2.2.0:
+ resolution: {integrity: sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/eventstream-codec': 2.2.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/fetch-http-handler@2.5.0:
+ resolution: {integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==}
+ dependencies:
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/querystring-builder': 2.2.0
+ '@smithy/types': 2.12.0
+ '@smithy/util-base64': 2.3.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/hash-node@2.2.0:
+ resolution: {integrity: sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ '@smithy/util-buffer-from': 2.2.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/invalid-dependency@2.2.0:
+ resolution: {integrity: sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/is-array-buffer@2.2.0:
+ resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/middleware-content-length@2.2.0:
+ resolution: {integrity: sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/middleware-endpoint@2.5.1:
+ resolution: {integrity: sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/middleware-serde': 2.3.0
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/shared-ini-file-loader': 2.4.0
+ '@smithy/types': 2.12.0
+ '@smithy/url-parser': 2.2.0
+ '@smithy/util-middleware': 2.2.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/middleware-retry@2.3.1:
+ resolution: {integrity: sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/service-error-classification': 2.1.5
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ '@smithy/util-middleware': 2.2.0
+ '@smithy/util-retry': 2.2.0
+ tslib: 2.6.2
+ uuid: 9.0.1
+ dev: false
+
+ /@smithy/middleware-serde@2.3.0:
+ resolution: {integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/middleware-stack@2.2.0:
+ resolution: {integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/node-config-provider@2.3.0:
+ resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/property-provider': 2.2.0
+ '@smithy/shared-ini-file-loader': 2.4.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/node-http-handler@2.5.0:
+ resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/abort-controller': 2.2.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/querystring-builder': 2.2.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/property-provider@2.2.0:
+ resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/protocol-http@3.3.0:
+ resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/querystring-builder@2.2.0:
+ resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ '@smithy/util-uri-escape': 2.2.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/querystring-parser@2.2.0:
+ resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
+ dev: false
+
+ /@smithy/service-error-classification@2.1.5:
+ resolution: {integrity: sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ dev: false
+
+ /@smithy/shared-ini-file-loader@2.4.0:
+ resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
+ /@smithy/signature-v4@2.2.1:
+ resolution: {integrity: sha512-j5fHgL1iqKTsKJ1mTcw88p0RUcidDu95AWSeZTgiYJb+QcfwWU/UpBnaqiB59FNH5MiAZuSbOBnZlwzeeY2tIw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
- react: 18.2.0
+ '@smithy/is-array-buffer': 2.2.0
+ '@smithy/types': 2.12.0
+ '@smithy/util-hex-encoding': 2.2.0
+ '@smithy/util-middleware': 2.2.0
+ '@smithy/util-uri-escape': 2.2.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ /@smithy/smithy-client@2.5.1:
+ resolution: {integrity: sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- react: 18.2.0
+ '@smithy/middleware-endpoint': 2.5.1
+ '@smithy/middleware-stack': 2.2.0
+ '@smithy/protocol-http': 3.3.0
+ '@smithy/types': 2.12.0
+ '@smithy/util-stream': 2.2.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-escape-keydown@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
+ /@smithy/types@2.12.0:
+ resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
- react: 18.2.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ /@smithy/url-parser@2.2.0:
+ resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==}
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- react: 18.2.0
+ '@smithy/querystring-parser': 2.2.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0
+ /@smithy/util-base64@2.3.0:
+ resolution: {integrity: sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
- react: 18.2.0
+ '@smithy/util-buffer-from': 2.2.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ /@smithy/util-body-length-browser@2.2.0:
+ resolution: {integrity: sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==}
dependencies:
- '@babel/runtime': 7.22.11
- '@types/react': 18.2.47
- react: 18.2.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ /@smithy/util-body-length-node@2.3.0:
+ resolution: {integrity: sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
- '@types/react': 18.2.47
- react: 18.2.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ /@smithy/util-buffer-from@2.2.0:
+ resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/rect': 1.0.1
- '@types/react': 18.2.47
- react: 18.2.0
+ '@smithy/is-array-buffer': 2.2.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-use-size@1.0.1(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ /@smithy/util-config-provider@2.3.0:
+ resolution: {integrity: sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0)
- '@types/react': 18.2.47
- react: 18.2.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ /@smithy/util-defaults-mode-browser@2.2.1:
+ resolution: {integrity: sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==}
+ engines: {node: '>= 10.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.47
- '@types/react-dom': 18.2.18
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
+ '@smithy/property-provider': 2.2.0
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ bowser: 2.11.0
+ tslib: 2.6.2
dev: false
- /@radix-ui/rect@1.0.1:
- resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
+ /@smithy/util-defaults-mode-node@2.3.1:
+ resolution: {integrity: sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==}
+ engines: {node: '>= 10.0.0'}
dependencies:
- '@babel/runtime': 7.22.11
+ '@smithy/config-resolver': 2.2.0
+ '@smithy/credential-provider-imds': 2.3.0
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/property-provider': 2.2.0
+ '@smithy/smithy-client': 2.5.1
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(rollup@2.79.1):
- resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==}
- engines: {node: '>= 10.0.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- '@types/babel__core': ^7.1.9
- rollup: ^1.20.0||^2.0.0
- peerDependenciesMeta:
- '@types/babel__core':
- optional: true
+ /@smithy/util-endpoints@1.2.0:
+ resolution: {integrity: sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==}
+ engines: {node: '>= 14.0.0'}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-module-imports': 7.22.5
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
- rollup: 2.79.1
+ '@smithy/node-config-provider': 2.3.0
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1):
- resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==}
- engines: {node: '>= 10.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0
+ /@smithy/util-hex-encoding@2.2.0:
+ resolution: {integrity: sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
- '@types/resolve': 1.17.1
- builtin-modules: 3.3.0
- deepmerge: 4.3.1
- is-module: 1.0.0
- resolve: 1.22.4
- rollup: 2.79.1
+ tslib: 2.6.2
dev: false
- /@rollup/plugin-replace@2.4.2(rollup@2.79.1):
- resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==}
- peerDependencies:
- rollup: ^1.20.0 || ^2.0.0
+ /@smithy/util-middleware@2.2.0:
+ resolution: {integrity: sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==}
+ engines: {node: '>=14.0.0'}
dependencies:
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
- magic-string: 0.25.9
- rollup: 2.79.1
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@rollup/pluginutils@3.1.0(rollup@2.79.1):
- resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
- engines: {node: '>= 8.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0
+ /@smithy/util-retry@2.2.0:
+ resolution: {integrity: sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==}
+ engines: {node: '>= 14.0.0'}
dependencies:
- '@types/estree': 0.0.39
- estree-walker: 1.0.1
- picomatch: 2.3.1
- rollup: 2.79.1
+ '@smithy/service-error-classification': 2.1.5
+ '@smithy/types': 2.12.0
+ tslib: 2.6.2
dev: false
- /@rushstack/eslint-patch@1.3.3:
- resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==}
+ /@smithy/util-stream@2.2.0:
+ resolution: {integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/fetch-http-handler': 2.5.0
+ '@smithy/node-http-handler': 2.5.0
+ '@smithy/types': 2.12.0
+ '@smithy/util-base64': 2.3.0
+ '@smithy/util-buffer-from': 2.2.0
+ '@smithy/util-hex-encoding': 2.2.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.2
dev: false
- /@surma/rollup-plugin-off-main-thread@2.2.3:
- resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
+ /@smithy/util-uri-escape@2.2.0:
+ resolution: {integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==}
+ engines: {node: '>=14.0.0'}
dependencies:
- ejs: 3.1.9
- json5: 2.2.3
- magic-string: 0.25.9
- string.prototype.matchall: 4.0.8
+ tslib: 2.6.2
dev: false
- /@swc/helpers@0.5.2:
- resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==}
+ /@smithy/util-utf8@2.3.0:
+ resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==}
+ engines: {node: '>=14.0.0'}
dependencies:
+ '@smithy/util-buffer-from': 2.2.0
tslib: 2.6.2
dev: false
- /@tailwindcss/typography@0.5.10(tailwindcss@3.4.1):
- resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==}
- peerDependencies:
- tailwindcss: '>=3.0.0 || insiders'
+ /@swc/counter@0.1.3:
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+ dev: false
+
+ /@swc/helpers@0.5.5:
+ resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==}
dependencies:
- lodash.castarray: 4.4.0
- lodash.isplainobject: 4.0.6
- lodash.merge: 4.6.2
- postcss-selector-parser: 6.0.10
- tailwindcss: 3.4.1
- dev: true
+ '@swc/counter': 0.1.3
+ tslib: 2.6.2
+ dev: false
/@tippyjs/react@4.2.6(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==}
@@ -3043,144 +2429,104 @@ packages:
tippy.js: 6.3.7
dev: false
- /@types/debug@4.1.8:
- resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==}
- dependencies:
- '@types/ms': 0.7.31
+ /@types/cookie@0.6.0:
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
dev: false
- /@types/dom-speech-recognition@0.0.1:
- resolution: {integrity: sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==}
- dev: true
-
- /@types/eslint-scope@3.7.4:
- resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==}
- dependencies:
- '@types/eslint': 8.44.2
- '@types/estree': 1.0.1
-
- /@types/eslint@8.44.2:
- resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==}
+ /@types/debug@4.1.12:
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
dependencies:
- '@types/estree': 1.0.1
- '@types/json-schema': 7.0.12
-
- /@types/estree@0.0.39:
- resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
+ '@types/ms': 0.7.34
dev: false
- /@types/estree@1.0.1:
- resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==}
+ /@types/diff-match-patch@1.0.36:
+ resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==}
+ dev: false
- /@types/formidable@3.4.3:
- resolution: {integrity: sha512-FRB5KNIYgCLDvw/ho7daBVqdQRG9Ptk1tMlZ2B5ibAjxDfXFkO6fJaP+ojmS8ljqmnC5If9u24WdWcVPaN3thg==}
+ /@types/estree-jsx@1.0.5:
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
dependencies:
- '@types/node': 20.10.7
- dev: true
+ '@types/estree': 1.0.5
+ dev: false
- /@types/glob@7.2.0:
- resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
- dependencies:
- '@types/minimatch': 5.1.2
- '@types/node': 20.10.7
+ /@types/estree@1.0.5:
+ resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
dev: false
- /@types/hast@2.3.5:
- resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==}
- dependencies:
- '@types/unist': 2.0.7
+ /@types/file-saver@2.0.7:
+ resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==}
dev: false
- /@types/json-schema@7.0.12:
- resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==}
+ /@types/hast@3.0.4:
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+ dependencies:
+ '@types/unist': 3.0.2
+ dev: false
/@types/json5@0.0.29:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
- dev: false
-
- /@types/katex@0.14.0:
- resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==}
- dev: false
+ dev: true
- /@types/katex@0.16.2:
- resolution: {integrity: sha512-dHsSjSlU/EWEEbeNADr3FtZZOAXPkFPUO457QCnoNqcZQXNqNEu/svQd0Nritvd3wNff4vvC/f4e6xgX3Llt8A==}
+ /@types/katex@0.16.7:
+ resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
dev: false
- /@types/mdast@3.0.12:
- resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==}
+ /@types/mdast@4.0.3:
+ resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==}
dependencies:
- '@types/unist': 2.0.7
+ '@types/unist': 3.0.2
dev: false
- /@types/minimatch@5.1.2:
- resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
+ /@types/ms@0.7.34:
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
dev: false
- /@types/ms@0.7.31:
- resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
+ /@types/node-fetch@2.6.11:
+ resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==}
+ dependencies:
+ '@types/node': 20.12.5
+ form-data: 4.0.0
dev: false
- /@types/node@20.10.7:
- resolution: {integrity: sha512-fRbIKb8C/Y2lXxB5eVMj4IU7xpdox0Lh8bUPEdtLysaylsml1hOOx1+STloRs/B9nf7C6kPRmmg/V7aQW7usNg==}
+ /@types/node@18.19.30:
+ resolution: {integrity: sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg==}
dependencies:
undici-types: 5.26.5
+ dev: false
- /@types/nodemailer@6.4.10:
- resolution: {integrity: sha512-oPW/IdhkU3FyZc1dzeqmS+MBjrjZNiiINnrEOrWALzccJlP5xTlbkNr2YnTnnyj9Eqm5ofjRoASEbrCYpA7BrA==}
- dependencies:
- '@types/node': 20.10.7
- dev: true
-
- /@types/pdf-parse@1.1.1:
- resolution: {integrity: sha512-lDBKAslCwvfK2uvS1Uk+UCpGvw+JRy5vnBFANPKFSY92n/iEnunXi0KVBjPJXhsM4jtdcPnS7tuZ0zjA9x6piQ==}
- dev: true
-
- /@types/prop-types@15.7.5:
- resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
-
- /@types/react-dom@18.2.18:
- resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==}
+ /@types/node@20.12.5:
+ resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==}
dependencies:
- '@types/react': 18.2.47
+ undici-types: 5.26.5
- /@types/react-speech-recognition@3.9.2:
- resolution: {integrity: sha512-LS13Z4A8nluGWyT1NQncWoyaWARJdEojxmcRvaFDT9nTHpRkMgPjaYBJIc/9GBRYYFy8TQGaiCmUdH2g4M9INg==}
- dependencies:
- '@types/dom-speech-recognition': 0.0.1
- dev: true
+ /@types/prop-types@15.7.12:
+ resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
- /@types/react-syntax-highlighter@15.5.7:
- resolution: {integrity: sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ==}
+ /@types/react-dom@18.2.24:
+ resolution: {integrity: sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==}
dependencies:
- '@types/react': 18.2.47
- dev: true
+ '@types/react': 18.2.74
- /@types/react@18.2.47:
- resolution: {integrity: sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==}
+ /@types/react@18.2.74:
+ resolution: {integrity: sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==}
dependencies:
- '@types/prop-types': 15.7.5
- '@types/scheduler': 0.16.3
- csstype: 3.1.2
+ '@types/prop-types': 15.7.12
+ csstype: 3.1.3
- /@types/resolve@1.17.1:
- resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
- dependencies:
- '@types/node': 20.10.7
+ /@types/stylis@4.2.0:
+ resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==}
dev: false
- /@types/scheduler@0.16.3:
- resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
-
- /@types/trusted-types@2.0.3:
- resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==}
+ /@types/unist@2.0.10:
+ resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
dev: false
- /@types/unist@2.0.7:
- resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==}
+ /@types/unist@3.0.2:
+ resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==}
dev: false
- /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3):
- resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==}
+ /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
@@ -3189,29 +2535,66 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/scope-manager': 6.19.1
- '@typescript-eslint/types': 6.19.1
- '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
- '@typescript-eslint/visitor-keys': 6.19.1
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.4)
+ '@typescript-eslint/visitor-keys': 6.21.0
+ debug: 4.3.4
+ eslint: 8.57.0
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ eslint: ^8.56.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 7.5.0
+ '@typescript-eslint/types': 7.5.0
+ '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.4)
+ '@typescript-eslint/visitor-keys': 7.5.0
debug: 4.3.4
- eslint: 8.56.0
- typescript: 5.3.3
+ eslint: 8.57.0
+ typescript: 5.4.4
transitivePeerDependencies:
- supports-color
+ dev: true
- /@typescript-eslint/scope-manager@6.19.1:
- resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==}
+ /@typescript-eslint/scope-manager@6.21.0:
+ resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
- '@typescript-eslint/types': 6.19.1
- '@typescript-eslint/visitor-keys': 6.19.1
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
+ dev: true
+
+ /@typescript-eslint/scope-manager@7.5.0:
+ resolution: {integrity: sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dependencies:
+ '@typescript-eslint/types': 7.5.0
+ '@typescript-eslint/visitor-keys': 7.5.0
+ dev: true
- /@typescript-eslint/types@6.19.1:
- resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==}
+ /@typescript-eslint/types@6.21.0:
+ resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
engines: {node: ^16.0.0 || >=18.0.0}
+ dev: true
+
+ /@typescript-eslint/types@7.5.0:
+ resolution: {integrity: sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dev: true
- /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3):
- resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==}
+ /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.4):
+ resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
typescript: '*'
@@ -3219,161 +2602,254 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/types': 6.19.1
- '@typescript-eslint/visitor-keys': 6.19.1
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
- semver: 7.5.4
- ts-api-utils: 1.0.3(typescript@5.3.3)
- typescript: 5.3.3
+ semver: 7.6.0
+ ts-api-utils: 1.3.0(typescript@5.4.4)
+ typescript: 5.4.4
transitivePeerDependencies:
- supports-color
+ dev: true
+
+ /@typescript-eslint/typescript-estree@7.5.0(typescript@5.4.4):
+ resolution: {integrity: sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 7.5.0
+ '@typescript-eslint/visitor-keys': 7.5.0
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ minimatch: 9.0.3
+ semver: 7.6.0
+ ts-api-utils: 1.3.0(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
- /@typescript-eslint/visitor-keys@6.19.1:
- resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==}
+ /@typescript-eslint/visitor-keys@6.21.0:
+ resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
- '@typescript-eslint/types': 6.19.1
+ '@typescript-eslint/types': 6.21.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@typescript-eslint/visitor-keys@7.5.0:
+ resolution: {integrity: sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dependencies:
+ '@typescript-eslint/types': 7.5.0
eslint-visitor-keys: 3.4.3
+ dev: true
/@ungap/structured-clone@1.2.0:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
- /@vercel/analytics@1.1.1:
- resolution: {integrity: sha512-+NqgNmSabg3IFfxYhrWCfB/H+RCUOCR5ExRudNG2+pcRehq628DJB5e1u1xqwpLtn4pAYii4D98w7kofORAGQA==}
+ /@vercel/analytics@1.2.2(next@14.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==}
+ peerDependencies:
+ next: '>= 13'
+ react: ^18 || ^19
+ peerDependenciesMeta:
+ next:
+ optional: true
+ react:
+ optional: true
dependencies:
+ next: 14.2.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
server-only: 0.0.1
dev: false
- /@vercel/speed-insights@1.0.1:
- resolution: {integrity: sha512-cm8KTTsDgS1AbWsgIEZuMoyPUjclzeqJihyLp0tnA21B/x9iTE8hu2S5zM+/DBzihuHxWL1dx9pCWk22ctMFWQ==}
+ /@vercel/speed-insights@1.0.10(next@14.2.0)(react@18.2.0)(svelte@4.2.12)(vue@3.4.21):
+ resolution: {integrity: sha512-4uzdKB0RW6Ff2FkzshzjZ+RlJfLPxgm/00i0XXgxfMPhwnnsk92YgtqsxT9OcPLdJUyVU1DqFlSWWjIQMPkh0g==}
requiresBuild: true
- dev: false
-
- /@webassemblyjs/ast@1.11.6:
- resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==}
- dependencies:
- '@webassemblyjs/helper-numbers': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
-
- /@webassemblyjs/floating-point-hex-parser@1.11.6:
- resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==}
-
- /@webassemblyjs/helper-api-error@1.11.6:
- resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==}
-
- /@webassemblyjs/helper-buffer@1.11.6:
- resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==}
-
- /@webassemblyjs/helper-numbers@1.11.6:
- resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==}
+ peerDependencies:
+ '@sveltejs/kit': ^1 || ^2
+ next: '>= 13'
+ react: ^18 || ^19
+ svelte: ^4
+ vue: ^3
+ vue-router: ^4
+ peerDependenciesMeta:
+ '@sveltejs/kit':
+ optional: true
+ next:
+ optional: true
+ react:
+ optional: true
+ svelte:
+ optional: true
+ vue:
+ optional: true
+ vue-router:
+ optional: true
dependencies:
- '@webassemblyjs/floating-point-hex-parser': 1.11.6
- '@webassemblyjs/helper-api-error': 1.11.6
- '@xtuc/long': 4.2.2
-
- /@webassemblyjs/helper-wasm-bytecode@1.11.6:
- resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==}
+ next: 14.2.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ svelte: 4.2.12
+ vue: 3.4.21(typescript@5.4.4)
+ dev: false
- /@webassemblyjs/helper-wasm-section@1.11.6:
- resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==}
+ /@vue/compiler-core@3.4.21:
+ resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==}
dependencies:
- '@webassemblyjs/ast': 1.11.6
- '@webassemblyjs/helper-buffer': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/wasm-gen': 1.11.6
+ '@babel/parser': 7.24.4
+ '@vue/shared': 3.4.21
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.0
+ dev: false
- /@webassemblyjs/ieee754@1.11.6:
- resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==}
+ /@vue/compiler-dom@3.4.21:
+ resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==}
dependencies:
- '@xtuc/ieee754': 1.2.0
+ '@vue/compiler-core': 3.4.21
+ '@vue/shared': 3.4.21
+ dev: false
- /@webassemblyjs/leb128@1.11.6:
- resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==}
+ /@vue/compiler-sfc@3.4.21:
+ resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==}
dependencies:
- '@xtuc/long': 4.2.2
-
- /@webassemblyjs/utf8@1.11.6:
- resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==}
+ '@babel/parser': 7.24.4
+ '@vue/compiler-core': 3.4.21
+ '@vue/compiler-dom': 3.4.21
+ '@vue/compiler-ssr': 3.4.21
+ '@vue/shared': 3.4.21
+ estree-walker: 2.0.2
+ magic-string: 0.30.9
+ postcss: 8.4.38
+ source-map-js: 1.2.0
+ dev: false
- /@webassemblyjs/wasm-edit@1.11.6:
- resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==}
+ /@vue/compiler-ssr@3.4.21:
+ resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==}
dependencies:
- '@webassemblyjs/ast': 1.11.6
- '@webassemblyjs/helper-buffer': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/helper-wasm-section': 1.11.6
- '@webassemblyjs/wasm-gen': 1.11.6
- '@webassemblyjs/wasm-opt': 1.11.6
- '@webassemblyjs/wasm-parser': 1.11.6
- '@webassemblyjs/wast-printer': 1.11.6
+ '@vue/compiler-dom': 3.4.21
+ '@vue/shared': 3.4.21
+ dev: false
- /@webassemblyjs/wasm-gen@1.11.6:
- resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==}
+ /@vue/reactivity@3.4.21:
+ resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==}
dependencies:
- '@webassemblyjs/ast': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/ieee754': 1.11.6
- '@webassemblyjs/leb128': 1.11.6
- '@webassemblyjs/utf8': 1.11.6
+ '@vue/shared': 3.4.21
+ dev: false
- /@webassemblyjs/wasm-opt@1.11.6:
- resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==}
+ /@vue/runtime-core@3.4.21:
+ resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==}
dependencies:
- '@webassemblyjs/ast': 1.11.6
- '@webassemblyjs/helper-buffer': 1.11.6
- '@webassemblyjs/wasm-gen': 1.11.6
- '@webassemblyjs/wasm-parser': 1.11.6
+ '@vue/reactivity': 3.4.21
+ '@vue/shared': 3.4.21
+ dev: false
- /@webassemblyjs/wasm-parser@1.11.6:
- resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==}
+ /@vue/runtime-dom@3.4.21:
+ resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==}
dependencies:
- '@webassemblyjs/ast': 1.11.6
- '@webassemblyjs/helper-api-error': 1.11.6
- '@webassemblyjs/helper-wasm-bytecode': 1.11.6
- '@webassemblyjs/ieee754': 1.11.6
- '@webassemblyjs/leb128': 1.11.6
- '@webassemblyjs/utf8': 1.11.6
+ '@vue/runtime-core': 3.4.21
+ '@vue/shared': 3.4.21
+ csstype: 3.1.3
+ dev: false
- /@webassemblyjs/wast-printer@1.11.6:
- resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==}
+ /@vue/server-renderer@3.4.21(vue@3.4.21):
+ resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==}
+ peerDependencies:
+ vue: 3.4.21
dependencies:
- '@webassemblyjs/ast': 1.11.6
- '@xtuc/long': 4.2.2
-
- /@xtuc/ieee754@1.2.0:
- resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+ '@vue/compiler-ssr': 3.4.21
+ '@vue/shared': 3.4.21
+ vue: 3.4.21(typescript@5.4.4)
+ dev: false
- /@xtuc/long@4.2.2:
- resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+ /@vue/shared@3.4.21:
+ resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==}
+ dev: false
- /acorn-import-assertions@1.9.0(acorn@8.10.0):
- resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==}
- peerDependencies:
- acorn: ^8
+ /abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
dependencies:
- acorn: 8.10.0
+ event-target-shim: 5.0.1
+ dev: false
- /acorn-jsx@5.3.2(acorn@8.10.0):
+ /acorn-jsx@5.3.2(acorn@8.11.3):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
- acorn: 8.10.0
+ acorn: 8.11.3
+ dev: true
- /acorn@8.10.0:
- resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
+ /acorn@8.11.3:
+ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
engines: {node: '>=0.4.0'}
hasBin: true
- /ajv-keywords@3.5.2(ajv@6.12.6):
- resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+ /agent-base@7.1.1:
+ resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
+ engines: {node: '>= 14'}
+ dependencies:
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /agentkeepalive@4.5.0:
+ resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
+ engines: {node: '>= 8.0.0'}
+ dependencies:
+ humanize-ms: 1.2.1
+ dev: false
+
+ /ai@3.0.21(react@18.2.0)(solid-js@1.8.16)(svelte@4.2.12)(vue@3.4.21)(zod@3.22.4):
+ resolution: {integrity: sha512-ieWylO8pnrIO7tuGMEBUpa1rC+kFdnsdjM1qgO0nAi3INa+5lCB2iLJdTQSnhSZbmWQx3wDlnToaXSZRiZvc+Q==}
+ engines: {node: '>=14.6'}
peerDependencies:
- ajv: ^6.9.1
+ react: ^18.2.0
+ solid-js: ^1.7.7
+ svelte: ^3.0.0 || ^4.0.0
+ vue: ^3.3.4
+ zod: ^3.0.0
+ peerDependenciesMeta:
+ react:
+ optional: true
+ solid-js:
+ optional: true
+ svelte:
+ optional: true
+ vue:
+ optional: true
+ zod:
+ optional: true
dependencies:
- ajv: 6.12.6
+ '@ai-sdk/provider': 0.0.0
+ eventsource-parser: 1.1.2
+ json-schema: 0.4.0
+ jsondiffpatch: 0.6.0
+ nanoid: 3.3.6
+ react: 18.2.0
+ secure-json-parse: 2.7.0
+ solid-js: 1.8.16
+ solid-swr-store: 0.10.7(solid-js@1.8.16)(swr-store@0.10.6)
+ sswr: 2.0.0(svelte@4.2.12)
+ svelte: 4.2.12
+ swr: 2.2.0(react@18.2.0)
+ swr-store: 0.10.6
+ swrv: 1.0.4(vue@3.4.21)
+ vue: 3.4.21(typescript@5.4.4)
+ zod: 3.22.4
+ zod-to-json-schema: 3.22.5(zod@3.22.4)
+ dev: false
/ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@@ -3382,15 +2858,7 @@ packages:
fast-json-stable-stringify: 2.1.0
json-schema-traverse: 0.4.1
uri-js: 4.4.1
-
- /ajv@8.12.0:
- resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
- dependencies:
- fast-deep-equal: 3.1.3
- json-schema-traverse: 1.0.0
- require-from-string: 2.0.2
- uri-js: 4.4.1
- dev: false
+ dev: true
/ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
@@ -3399,14 +2867,6 @@ packages:
/ansi-regex@6.0.1:
resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
engines: {node: '>=12'}
- dev: false
-
- /ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
- dependencies:
- color-convert: 1.9.3
- dev: false
/ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
@@ -3417,7 +2877,6 @@ packages:
/ansi-styles@6.2.1:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
- dev: false
/any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
@@ -3434,9 +2893,10 @@ packages:
/argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
- /aria-hidden@1.2.3:
- resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==}
+ /aria-hidden@1.2.4:
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
engines: {node: '>=10'}
dependencies:
tslib: 2.6.2
@@ -3446,213 +2906,155 @@ packages:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
dependencies:
dequal: 2.0.3
- dev: false
- /array-buffer-byte-length@1.0.0:
- resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+ /array-buffer-byte-length@1.0.1:
+ resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- is-array-buffer: 3.0.2
- dev: false
+ call-bind: 1.0.7
+ is-array-buffer: 3.0.4
+ dev: true
- /array-includes@3.1.6:
- resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
+ /array-includes@3.1.8:
+ resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
is-string: 1.0.7
- dev: false
-
- /array-union@1.0.2:
- resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==}
- engines: {node: '>=0.10.0'}
- dependencies:
- array-uniq: 1.0.3
- dev: false
+ dev: true
/array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
+ dev: true
- /array-uniq@1.0.3:
- resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==}
- engines: {node: '>=0.10.0'}
- dev: false
-
- /array.prototype.findlastindex@1.2.2:
- resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==}
+ /array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- es-shim-unscopables: 1.0.0
- get-intrinsic: 1.2.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
+ dev: true
- /array.prototype.flat@1.3.1:
- resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
+ /array.prototype.findlastindex@1.2.5:
+ resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- es-shim-unscopables: 1.0.0
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
+ dev: true
- /array.prototype.flatmap@1.3.1:
- resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
+ /array.prototype.flat@1.3.2:
+ resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- es-shim-unscopables: 1.0.0
- dev: false
-
- /array.prototype.tosorted@1.1.1:
- resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- es-shim-unscopables: 1.0.0
- get-intrinsic: 1.2.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+ dev: true
- /arraybuffer.prototype.slice@1.0.1:
- resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==}
+ /array.prototype.flatmap@1.3.2:
+ resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
engines: {node: '>= 0.4'}
dependencies:
- array-buffer-byte-length: 1.0.0
- call-bind: 1.0.2
- define-properties: 1.2.0
- get-intrinsic: 1.2.1
- is-array-buffer: 3.0.2
- is-shared-array-buffer: 1.0.2
- dev: false
-
- /asap@2.0.6:
- resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+ dev: true
- /ast-types-flow@0.0.7:
- resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
- dev: false
+ /array.prototype.toreversed@1.1.2:
+ resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+ dev: true
- /async@3.2.4:
- resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
- dev: false
+ /array.prototype.tosorted@1.1.3:
+ resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.0.2
+ dev: true
- /asynciterator.prototype@1.0.0:
- resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==}
+ /arraybuffer.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+ engines: {node: '>= 0.4'}
dependencies:
- has-symbols: 1.0.3
- dev: false
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ is-array-buffer: 3.0.4
+ is-shared-array-buffer: 1.0.3
+ dev: true
+
+ /ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+ dev: true
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
- /at-least-node@1.0.0:
- resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
- engines: {node: '>= 4.0.0'}
- dev: false
-
- /autoprefixer@10.4.16(postcss@8.4.33):
- resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==}
+ /autoprefixer@10.4.19(postcss@8.4.38):
+ resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
postcss: ^8.1.0
dependencies:
- browserslist: 4.21.10
- caniuse-lite: 1.0.30001541
- fraction.js: 4.3.6
+ browserslist: 4.23.0
+ caniuse-lite: 1.0.30001606
+ fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
- postcss: 8.4.33
+ postcss: 8.4.38
postcss-value-parser: 4.2.0
- dev: false
+ dev: true
- /available-typed-arrays@1.0.5:
- resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
+ /available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- dev: false
+ dependencies:
+ possible-typed-array-names: 1.0.0
+ dev: true
- /axe-core@4.7.2:
- resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==}
+ /axe-core@4.7.0:
+ resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==}
engines: {node: '>=4'}
- dev: false
-
- /axios@1.6.2:
- resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==}
- dependencies:
- follow-redirects: 1.15.2
- form-data: 4.0.0
- proxy-from-env: 1.1.0
- transitivePeerDependencies:
- - debug
- dev: false
+ dev: true
/axobject-query@3.2.1:
resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
dependencies:
dequal: 2.0.3
- dev: false
-
- /babel-loader@8.3.0(@babel/core@7.23.2)(webpack@5.88.2):
- resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==}
- engines: {node: '>= 8.9'}
- peerDependencies:
- '@babel/core': ^7.0.0
- webpack: '>=2'
- dependencies:
- '@babel/core': 7.23.2
- find-cache-dir: 3.3.2
- loader-utils: 2.0.4
- make-dir: 3.1.0
- schema-utils: 2.7.1
- webpack: 5.88.2
- dev: false
-
- /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.11):
- resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/compat-data': 7.22.9
- '@babel/core': 7.22.11
- '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11)
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: false
-
- /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.11):
- resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11)
- core-js-compat: 3.32.1
- transitivePeerDependencies:
- - supports-color
- dev: false
+ dev: true
- /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.11):
- resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ /axobject-query@4.0.0:
+ resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==}
dependencies:
- '@babel/core': 7.22.11
- '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11)
- transitivePeerDependencies:
- - supports-color
+ dequal: 2.0.3
dev: false
/bail@2.0.2:
@@ -3662,23 +3064,33 @@ packages:
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- /big.js@5.2.2:
- resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+ /base-64@0.1.0:
+ resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==}
+ dev: false
+
+ /bcrypt-ts@5.0.2:
+ resolution: {integrity: sha512-gDwQ5784AkkfhHACh3jGcg1hUubyZyeq9AtVd5gXkcyHGVOC+mORjRIHSj+fHfqwY5vxwyBLXQpcfk8MpK0ROg==}
+ engines: {node: '>=18'}
dev: false
- /binary-extensions@2.2.0:
- resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ /binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
/boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
dev: false
+ /bowser@2.11.0:
+ resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
+ dev: false
+
/brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
+ dev: true
/brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
@@ -3691,34 +3103,16 @@ packages:
dependencies:
fill-range: 7.0.1
- /browserslist@4.21.10:
- resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
- dependencies:
- caniuse-lite: 1.0.30001558
- electron-to-chromium: 1.4.503
- node-releases: 2.0.13
- update-browserslist-db: 1.0.11(browserslist@4.21.10)
-
- /browserslist@4.22.1:
- resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
+ /browserslist@4.23.0:
+ resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
- caniuse-lite: 1.0.30001579
- electron-to-chromium: 1.4.569
- node-releases: 2.0.13
- update-browserslist-db: 1.0.13(browserslist@4.22.1)
- dev: false
-
- /buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-
- /builtin-modules@3.3.0:
- resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
- engines: {node: '>=6'}
- dev: false
+ caniuse-lite: 1.0.30001606
+ electron-to-chromium: 1.4.729
+ node-releases: 2.0.14
+ update-browserslist-db: 1.0.13(browserslist@4.23.0)
+ dev: true
/busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
@@ -3727,66 +3121,67 @@ packages:
streamsearch: 1.1.0
dev: false
- /call-bind@1.0.2:
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ /call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
dependencies:
- function-bind: 1.1.1
- get-intrinsic: 1.2.1
- dev: false
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ set-function-length: 1.2.2
/callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
+ dev: true
/camelcase-css@2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
- /caniuse-lite@1.0.30001541:
- resolution: {integrity: sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==}
+ /camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
dev: false
- /caniuse-lite@1.0.30001558:
- resolution: {integrity: sha512-/Et7DwLqpjS47JPEcz6VnxU9PwcIdVi0ciLXRWBQdj1XFye68pSQYpV0QtPTfUKWuOaEig+/Vez2l74eDc1tPQ==}
-
- /caniuse-lite@1.0.30001579:
- resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==}
- dev: false
+ /caniuse-lite@1.0.30001606:
+ resolution: {integrity: sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==}
/ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
dev: false
- /chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
- dev: false
-
/chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
+ dev: true
+
+ /chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: false
- /character-entities-legacy@1.1.4:
- resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
+ /character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
dev: false
- /character-entities@1.2.4:
- resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
+ /character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
dev: false
/character-entities@2.0.2:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
dev: false
- /character-reference-invalid@1.1.4:
- resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
+ /character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+ dev: false
+
+ /charenc@0.0.2:
+ resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
dev: false
/cheerio-select@2.1.0:
@@ -3813,8 +3208,8 @@ packages:
parse5-htmlparser2-tree-adapter: 7.0.0
dev: false
- /chokidar@3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ /chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
dependencies:
anymatch: 3.1.3
@@ -3827,26 +3222,12 @@ packages:
optionalDependencies:
fsevents: 2.3.3
- /chrome-trace-event@1.0.3:
- resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==}
- engines: {node: '>=6.0'}
-
/class-variance-authority@0.7.0:
resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
dependencies:
clsx: 2.0.0
dev: false
- /clean-webpack-plugin@4.0.0(webpack@5.88.2):
- resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- webpack: '>=4.0.0 <6.0.0'
- dependencies:
- del: 4.1.1
- webpack: 5.88.2
- dev: false
-
/client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
dev: false
@@ -3856,24 +3237,31 @@ packages:
engines: {node: '>=6'}
dev: false
- /cmdk@0.2.0(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw==}
- peerDependencies:
- react: ^18.0.0
- react-dom: ^18.0.0
+ /clsx@2.1.0:
+ resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /code-red@1.0.4:
+ resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
dependencies:
- '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0)
- command-score: 0.1.2
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- transitivePeerDependencies:
- - '@types/react'
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@types/estree': 1.0.5
+ acorn: 8.11.3
+ estree-walker: 3.0.3
+ periscopic: 3.1.0
dev: false
- /color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ /cohere-ai@7.9.1:
+ resolution: {integrity: sha512-shMz0Bs3p6/Nw5Yi+6Wc9tZ7DCGTtEnf1eAcuesnlyeKoFuZ7+bzeiHkt5E8SvTgAHxN1GCP3UkIoW85QhHKTA==}
dependencies:
- color-name: 1.1.3
+ form-data: 4.0.0
+ js-base64: 3.7.2
+ node-fetch: 2.7.0
+ qs: 6.11.2
+ url-join: 4.0.1
+ transitivePeerDependencies:
+ - encoding
dev: false
/color-convert@2.0.1:
@@ -3882,10 +3270,6 @@ packages:
dependencies:
color-name: 1.1.4
- /color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
- dev: false
-
/color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
@@ -3896,21 +3280,10 @@ packages:
delayed-stream: 1.0.0
dev: false
- /comma-separated-tokens@1.0.8:
- resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
- dev: false
-
/comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
dev: false
- /command-score@0.1.2:
- resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==}
- dev: false
-
- /commander@2.20.3:
- resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
-
/commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
@@ -3920,37 +3293,15 @@ packages:
engines: {node: '>= 12'}
dev: false
- /common-tags@1.8.2:
- resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
- engines: {node: '>=4.0.0'}
- dev: false
-
- /commondir@1.0.1:
- resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
- dev: false
-
/concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
- /convert-source-map@1.9.0:
- resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
- dev: false
-
- /convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
- dev: false
-
- /cookie@0.5.0:
- resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ /cookie@0.6.0:
+ resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
engines: {node: '>= 0.6'}
dev: false
- /core-js-compat@3.32.1:
- resolution: {integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==}
- dependencies:
- browserslist: 4.21.10
- dev: false
-
/cross-spawn@7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'}
@@ -3959,9 +3310,13 @@ packages:
shebang-command: 2.0.0
which: 2.0.2
- /crypto-random-string@2.0.0:
- resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
- engines: {node: '>=8'}
+ /crypt@0.0.2:
+ resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
+ dev: false
+
+ /css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
dev: false
/css-select@5.1.0:
@@ -3974,6 +3329,22 @@ packages:
nth-check: 2.1.1
dev: false
+ /css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+ dependencies:
+ camelize: 1.0.1
+ css-color-keywords: 1.0.0
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.2.0
+ dev: false
+
/css-what@6.1.0:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
engines: {node: '>= 6'}
@@ -3986,10 +3357,41 @@ packages:
/csstype@3.1.2:
resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
+ dev: false
+
+ /csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
/damerau-levenshtein@1.0.8:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
- dev: false
+ dev: true
+
+ /data-view-buffer@1.0.1:
+ resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /data-view-byte-length@1.0.1:
+ resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /data-view-byte-offset@1.0.0:
+ resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
/debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
@@ -4000,7 +3402,7 @@ packages:
optional: true
dependencies:
ms: 2.1.3
- dev: false
+ dev: true
/debug@4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
@@ -4021,32 +3423,24 @@ packages:
/deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
- /deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
- dev: false
-
- /define-properties@1.2.0:
- resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
+ /define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
dependencies:
- has-property-descriptors: 1.0.0
- object-keys: 1.1.1
- dev: false
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ gopd: 1.0.1
- /del@4.1.1:
- resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==}
- engines: {node: '>=6'}
+ /define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
dependencies:
- '@types/glob': 7.2.0
- globby: 6.1.0
- is-path-cwd: 2.2.0
- is-path-in-cwd: 2.1.0
- p-map: 2.1.0
- pify: 4.0.1
- rimraf: 2.7.1
- dev: false
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+ dev: true
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
@@ -4056,25 +3450,29 @@ packages:
/dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
- dev: false
/detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
dev: false
- /dezalgo@1.0.4:
- resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==}
+ /devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
dependencies:
- asap: 2.0.6
- wrappy: 1.0.2
+ dequal: 2.0.3
dev: false
/didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
- /diff@5.1.0:
- resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
- engines: {node: '>=0.3.1'}
+ /diff-match-patch@1.0.5:
+ resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==}
+ dev: false
+
+ /digest-fetch@1.3.0:
+ resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==}
+ dependencies:
+ base-64: 0.1.0
+ md5: 2.3.0
dev: false
/dir-glob@3.0.1:
@@ -4082,6 +3480,7 @@ packages:
engines: {node: '>=8'}
dependencies:
path-type: 4.0.0
+ dev: true
/dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
@@ -4091,13 +3490,14 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
esutils: 2.0.3
- dev: false
+ dev: true
/doctrine@3.0.0:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
engines: {node: '>=6.0.0'}
dependencies:
esutils: 2.0.3
+ dev: true
/dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
@@ -4128,129 +3528,155 @@ packages:
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
- dev: false
- /ejs@3.1.9:
- resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==}
- engines: {node: '>=0.10.0'}
- hasBin: true
+ /electron-to-chromium@1.4.729:
+ resolution: {integrity: sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==}
+ dev: true
+
+ /embla-carousel-react@8.0.1(react@18.2.0):
+ resolution: {integrity: sha512-cpFQ/HwCsjBjzpu9Z9IHmZ9DaCSf/wo4q+qUTcRW3SsNv+1Q8IY7Y8J2QIyTmz0vOWY7tliu3uE2gqRH7ZDwOQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.1 || ^18.0.0
dependencies:
- jake: 10.8.7
+ embla-carousel: 8.0.1
+ embla-carousel-reactive-utils: 8.0.1(embla-carousel@8.0.1)
+ react: 18.2.0
dev: false
- /electron-to-chromium@1.4.503:
- resolution: {integrity: sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==}
+ /embla-carousel-reactive-utils@8.0.1(embla-carousel@8.0.1):
+ resolution: {integrity: sha512-KBSkz2h9LwVFkOrwzIJKgXbmEDlIShkreeOHnV8Cph09AdBMzb412nRkcctbeDcuG9x3CVsqLzJrSXnZeYhFPQ==}
+ peerDependencies:
+ embla-carousel: 8.0.1
+ dependencies:
+ embla-carousel: 8.0.1
+ dev: false
- /electron-to-chromium@1.4.569:
- resolution: {integrity: sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==}
+ /embla-carousel@8.0.1:
+ resolution: {integrity: sha512-RsaMRyBCd144N95gb3XoI+H9zj3RI4y0qcfvKYEh2tIAIEenL9CW9vwzltCeoYkWYipGdkvup+HGT9ewG1YTEw==}
dev: false
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
- dev: false
/emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
- dev: false
-
- /emojis-list@3.0.0:
- resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
- engines: {node: '>= 4'}
- dev: false
- /enhanced-resolve@5.15.0:
- resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==}
+ /enhanced-resolve@5.16.0:
+ resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==}
engines: {node: '>=10.13.0'}
dependencies:
graceful-fs: 4.2.11
tapable: 2.2.1
+ dev: true
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
dev: false
- /es-abstract@1.22.1:
- resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==}
+ /es-abstract@1.23.3:
+ resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
engines: {node: '>= 0.4'}
dependencies:
- array-buffer-byte-length: 1.0.0
- arraybuffer.prototype.slice: 1.0.1
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- es-set-tostringtag: 2.0.1
+ array-buffer-byte-length: 1.0.1
+ arraybuffer.prototype.slice: 1.0.3
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ data-view-buffer: 1.0.1
+ data-view-byte-length: 1.0.1
+ data-view-byte-offset: 1.0.0
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-set-tostringtag: 2.0.3
es-to-primitive: 1.2.1
- function.prototype.name: 1.1.5
- get-intrinsic: 1.2.1
- get-symbol-description: 1.0.0
+ function.prototype.name: 1.1.6
+ get-intrinsic: 1.2.4
+ get-symbol-description: 1.0.2
globalthis: 1.0.3
gopd: 1.0.1
- has: 1.0.3
- has-property-descriptors: 1.0.0
- has-proto: 1.0.1
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
has-symbols: 1.0.3
- internal-slot: 1.0.5
- is-array-buffer: 3.0.2
+ hasown: 2.0.2
+ internal-slot: 1.0.7
+ is-array-buffer: 3.0.4
is-callable: 1.2.7
- is-negative-zero: 2.0.2
+ is-data-view: 1.0.1
+ is-negative-zero: 2.0.3
is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
+ is-shared-array-buffer: 1.0.3
is-string: 1.0.7
- is-typed-array: 1.1.12
+ is-typed-array: 1.1.13
is-weakref: 1.0.2
- object-inspect: 1.12.3
+ object-inspect: 1.13.1
object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.5.0
- safe-array-concat: 1.0.0
- safe-regex-test: 1.0.0
- string.prototype.trim: 1.2.7
- string.prototype.trimend: 1.0.6
- string.prototype.trimstart: 1.0.6
- typed-array-buffer: 1.0.0
- typed-array-byte-length: 1.0.0
- typed-array-byte-offset: 1.0.0
- typed-array-length: 1.0.4
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.2
+ safe-array-concat: 1.1.2
+ safe-regex-test: 1.0.3
+ string.prototype.trim: 1.2.9
+ string.prototype.trimend: 1.0.8
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.2
+ typed-array-byte-length: 1.0.1
+ typed-array-byte-offset: 1.0.2
+ typed-array-length: 1.0.6
unbox-primitive: 1.0.2
- which-typed-array: 1.1.11
- dev: false
+ which-typed-array: 1.1.15
+ dev: true
+
+ /es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+
+ /es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
- /es-iterator-helpers@1.0.13:
- resolution: {integrity: sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==}
+ /es-iterator-helpers@1.0.18:
+ resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==}
+ engines: {node: '>= 0.4'}
dependencies:
- asynciterator.prototype: 1.0.0
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- es-set-tostringtag: 2.0.1
- function-bind: 1.1.1
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.0.3
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
globalthis: 1.0.3
- has-property-descriptors: 1.0.0
- has-proto: 1.0.1
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
has-symbols: 1.0.3
- internal-slot: 1.0.5
- iterator.prototype: 1.1.0
- safe-array-concat: 1.0.0
- dev: false
+ internal-slot: 1.0.7
+ iterator.prototype: 1.1.2
+ safe-array-concat: 1.1.2
+ dev: true
- /es-module-lexer@1.3.0:
- resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==}
+ /es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ dev: true
- /es-set-tostringtag@2.0.1:
- resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
+ /es-set-tostringtag@2.0.3:
+ resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
engines: {node: '>= 0.4'}
dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.3
- has-tostringtag: 1.0.0
- dev: false
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: true
- /es-shim-unscopables@1.0.0:
- resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ /es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
dependencies:
- has: 1.0.3
- dev: false
+ hasown: 2.0.2
+ dev: true
/es-to-primitive@1.2.1:
resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
@@ -4259,28 +3685,25 @@ packages:
is-callable: 1.2.7
is-date-object: 1.0.5
is-symbol: 1.0.4
- dev: false
+ dev: true
- /escalade@3.1.1:
- resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ /escalade@3.1.2:
+ resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
engines: {node: '>=6'}
-
- /escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
- dev: false
+ dev: true
/escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
+ dev: true
/escape-string-regexp@5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
dev: false
- /eslint-config-next@14.1.0(eslint@8.56.0)(typescript@5.3.3):
- resolution: {integrity: sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg==}
+ /eslint-config-next@14.1.3(eslint@8.57.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-sUCpWlGuHpEhI0pIT0UtdSLJk5Z8E2DYinPTwsBiWaSYQomchdl0i60pjynY48+oXvtyWMQ7oE+G3m49yrfacg==}
peerDependencies:
eslint: ^7.23.0 || ^8.0.0
typescript: '>=3.3.1'
@@ -4288,57 +3711,57 @@ packages:
typescript:
optional: true
dependencies:
- '@next/eslint-plugin-next': 14.1.0
- '@rushstack/eslint-patch': 1.3.3
- '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
- eslint: 8.56.0
+ '@next/eslint-plugin-next': 14.1.3
+ '@rushstack/eslint-patch': 1.10.1
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.4)
+ eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.56.0)
- eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.0)(eslint@8.56.0)
- eslint-plugin-jsx-a11y: 6.7.1(eslint@8.56.0)
- eslint-plugin-react: 7.33.2(eslint@8.56.0)
- eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.56.0)
- typescript: 5.3.3
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.5.0)(eslint@8.57.0)
+ eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0)
+ eslint-plugin-react: 7.34.1(eslint@8.57.0)
+ eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0)
+ typescript: 5.4.4
transitivePeerDependencies:
- eslint-import-resolver-webpack
- supports-color
- dev: false
+ dev: true
/eslint-import-resolver-node@0.3.9:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
dependencies:
debug: 3.2.7
- is-core-module: 2.13.0
- resolve: 1.22.4
+ is-core-module: 2.13.1
+ resolve: 1.22.8
transitivePeerDependencies:
- supports-color
- dev: false
+ dev: true
- /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.56.0):
- resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==}
+ /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0):
+ resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
eslint: '*'
eslint-plugin-import: '*'
dependencies:
debug: 4.3.4
- enhanced-resolve: 5.15.0
- eslint: 8.56.0
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.56.0)
- eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.0)(eslint@8.56.0)
- fast-glob: 3.3.1
- get-tsconfig: 4.7.0
- is-core-module: 2.13.0
+ enhanced-resolve: 5.16.0
+ eslint: 8.57.0
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.5.0)(eslint@8.57.0)
+ fast-glob: 3.3.2
+ get-tsconfig: 4.7.3
+ is-core-module: 2.13.1
is-glob: 4.0.3
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
- dev: false
+ dev: true
- /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.56.0):
- resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
+ /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0):
+ resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
@@ -4358,17 +3781,46 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
- '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.4)
debug: 3.2.7
- eslint: 8.56.0
+ eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.56.0)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
transitivePeerDependencies:
- supports-color
- dev: false
+ dev: true
+
+ /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
+ resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.4.4)
+ debug: 3.2.7
+ eslint: 8.57.0
+ eslint-import-resolver-node: 0.3.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
- /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.0)(eslint@8.56.0):
- resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==}
+ /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.5.0)(eslint@8.57.0):
+ resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
@@ -4377,107 +3829,129 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
- '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
- array-includes: 3.1.6
- array.prototype.findlastindex: 1.2.2
- array.prototype.flat: 1.3.1
- array.prototype.flatmap: 1.3.1
+ '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.4.4)
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.5
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
debug: 3.2.7
doctrine: 2.1.0
- eslint: 8.56.0
+ eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.56.0)
- has: 1.0.3
- is-core-module: 2.13.0
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
+ hasown: 2.0.2
+ is-core-module: 2.13.1
is-glob: 4.0.3
minimatch: 3.1.2
- object.fromentries: 2.0.6
- object.groupby: 1.0.0
- object.values: 1.1.6
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.0
semver: 6.3.1
- tsconfig-paths: 3.14.2
+ tsconfig-paths: 3.15.0
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- dev: false
+ dev: true
- /eslint-plugin-jsx-a11y@6.7.1(eslint@8.56.0):
- resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==}
+ /eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0):
+ resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==}
engines: {node: '>=4.0'}
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
dependencies:
- '@babel/runtime': 7.22.11
+ '@babel/runtime': 7.24.4
aria-query: 5.3.0
- array-includes: 3.1.6
- array.prototype.flatmap: 1.3.1
- ast-types-flow: 0.0.7
- axe-core: 4.7.2
+ array-includes: 3.1.8
+ array.prototype.flatmap: 1.3.2
+ ast-types-flow: 0.0.8
+ axe-core: 4.7.0
axobject-query: 3.2.1
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
- eslint: 8.56.0
- has: 1.0.3
+ es-iterator-helpers: 1.0.18
+ eslint: 8.57.0
+ hasown: 2.0.2
jsx-ast-utils: 3.3.5
- language-tags: 1.0.5
+ language-tags: 1.0.9
minimatch: 3.1.2
- object.entries: 1.1.6
- object.fromentries: 2.0.6
- semver: 6.3.1
- dev: false
+ object.entries: 1.1.8
+ object.fromentries: 2.0.8
+ dev: true
- /eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.56.0):
- resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==}
+ /eslint-plugin-react-hooks@4.6.0(eslint@8.57.0):
+ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
engines: {node: '>=10'}
peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
dependencies:
- eslint: 8.56.0
- dev: false
+ eslint: 8.57.0
+ dev: true
- /eslint-plugin-react@7.33.2(eslint@8.56.0):
- resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==}
+ /eslint-plugin-react@7.34.1(eslint@8.57.0):
+ resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==}
engines: {node: '>=4'}
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
dependencies:
- array-includes: 3.1.6
- array.prototype.flatmap: 1.3.1
- array.prototype.tosorted: 1.1.1
+ array-includes: 3.1.8
+ array.prototype.findlast: 1.2.5
+ array.prototype.flatmap: 1.3.2
+ array.prototype.toreversed: 1.1.2
+ array.prototype.tosorted: 1.1.3
doctrine: 2.1.0
- es-iterator-helpers: 1.0.13
- eslint: 8.56.0
+ es-iterator-helpers: 1.0.18
+ eslint: 8.57.0
estraverse: 5.3.0
jsx-ast-utils: 3.3.5
minimatch: 3.1.2
- object.entries: 1.1.6
- object.fromentries: 2.0.6
- object.hasown: 1.1.2
- object.values: 1.1.6
+ object.entries: 1.1.8
+ object.fromentries: 2.0.8
+ object.hasown: 1.1.4
+ object.values: 1.2.0
prop-types: 15.8.1
- resolve: 2.0.0-next.4
+ resolve: 2.0.0-next.5
semver: 6.3.1
- string.prototype.matchall: 4.0.8
- dev: false
+ string.prototype.matchall: 4.0.11
+ dev: true
+
+ /eslint-plugin-simple-import-sort@12.0.0(eslint@8.57.0):
+ resolution: {integrity: sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==}
+ peerDependencies:
+ eslint: '>=5.0.0'
+ dependencies:
+ eslint: 8.57.0
+ dev: true
- /eslint-plugin-tailwindcss@3.14.1(tailwindcss@3.4.1):
- resolution: {integrity: sha512-orNkVzJ1fdCkj5d8AHE3tAbixNpMJRoKoHPnxZbZ6iBHTsNvOEmeBz62C3THPhFnXCXaD55SRbNjqGzMEXRoZA==}
+ /eslint-plugin-tailwindcss@3.15.1(tailwindcss@3.4.3):
+ resolution: {integrity: sha512-4RXRMIaMG07C2TBEW1k0VM4+dDazz1kxcZhkK4zirvmHGZTA4jnlSO2kq5mamuSPi+Wo17dh2SlC8IyFBuCd7Q==}
engines: {node: '>=12.13.0'}
peerDependencies:
tailwindcss: ^3.4.0
dependencies:
- fast-glob: 3.3.1
- postcss: 8.4.33
- tailwindcss: 3.4.1
+ fast-glob: 3.3.2
+ postcss: 8.4.38
+ tailwindcss: 3.4.3
dev: true
- /eslint-scope@5.1.1:
- resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
- engines: {node: '>=8.0.0'}
+ /eslint-plugin-unused-imports@3.1.0(eslint@8.57.0):
+ resolution: {integrity: sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': 6 - 7
+ eslint: '8'
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
dependencies:
- esrecurse: 4.3.0
- estraverse: 4.3.0
+ eslint: 8.57.0
+ eslint-rule-composer: 0.3.0
+ dev: true
+
+ /eslint-rule-composer@0.3.0:
+ resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==}
+ engines: {node: '>=4.0.0'}
+ dev: true
/eslint-scope@7.2.2:
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
@@ -4485,21 +3959,23 @@ packages:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
+ dev: true
/eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
- /eslint@8.56.0:
- resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
+ /eslint@8.57.0:
+ resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
- '@eslint-community/regexpp': 4.8.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+ '@eslint-community/regexpp': 4.10.0
'@eslint/eslintrc': 2.1.4
- '@eslint/js': 8.56.0
- '@humanwhocodes/config-array': 0.11.13
+ '@eslint/js': 8.57.0
+ '@humanwhocodes/config-array': 0.11.14
'@humanwhocodes/module-importer': 1.0.1
'@nodelib/fs.walk': 1.2.8
'@ungap/structured-clone': 1.2.0
@@ -4518,9 +3994,9 @@ packages:
file-entry-cache: 6.0.1
find-up: 5.0.0
glob-parent: 6.0.2
- globals: 13.21.0
+ globals: 13.24.0
graphemer: 1.4.0
- ignore: 5.2.4
+ ignore: 5.3.1
imurmurhash: 0.1.4
is-glob: 4.0.3
is-path-inside: 3.0.3
@@ -4535,49 +4011,62 @@ packages:
text-table: 0.2.0
transitivePeerDependencies:
- supports-color
+ dev: true
/espree@9.6.1:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- acorn: 8.10.0
- acorn-jsx: 5.3.2(acorn@8.10.0)
+ acorn: 8.11.3
+ acorn-jsx: 5.3.2(acorn@8.11.3)
eslint-visitor-keys: 3.4.3
+ dev: true
/esquery@1.5.0:
resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
engines: {node: '>=0.10'}
dependencies:
estraverse: 5.3.0
+ dev: true
/esrecurse@4.3.0:
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
engines: {node: '>=4.0'}
dependencies:
estraverse: 5.3.0
-
- /estraverse@4.3.0:
- resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
- engines: {node: '>=4.0'}
+ dev: true
/estraverse@5.3.0:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
+ dev: true
+
+ /estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+ dev: false
+
+ /estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ dev: false
- /estree-walker@1.0.1:
- resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
+ /estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ dependencies:
+ '@types/estree': 1.0.5
dev: false
/esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
+ dev: true
- /events@3.3.0:
- resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
- engines: {node: '>=0.8.x'}
+ /event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+ dev: false
- /eventsource-parser@1.0.0:
- resolution: {integrity: sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==}
+ /eventsource-parser@1.1.2:
+ resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==}
engines: {node: '>=14.18'}
dev: false
@@ -4587,9 +4076,10 @@ packages:
/fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
- /fast-glob@3.3.1:
- resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+ /fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
engines: {node: '>=8.6.0'}
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -4600,31 +4090,33 @@ packages:
/fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
/fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
- /fastq@1.15.0:
- resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ /fast-xml-parser@4.2.5:
+ resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==}
+ hasBin: true
dependencies:
- reusify: 1.0.4
+ strnum: 1.0.5
+ dev: false
- /fault@1.0.4:
- resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==}
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
dependencies:
- format: 0.2.2
- dev: false
+ reusify: 1.0.4
/file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
dependencies:
- flat-cache: 3.1.0
+ flat-cache: 3.2.0
+ dev: true
- /filelist@1.0.4:
- resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
- dependencies:
- minimatch: 5.1.6
+ /file-saver@2.0.5:
+ resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
dev: false
/fill-range@7.0.1:
@@ -4633,56 +4125,32 @@ packages:
dependencies:
to-regex-range: 5.0.1
- /find-cache-dir@3.3.2:
- resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
- engines: {node: '>=8'}
- dependencies:
- commondir: 1.0.1
- make-dir: 3.1.0
- pkg-dir: 4.2.0
- dev: false
-
- /find-up@4.1.0:
- resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
- engines: {node: '>=8'}
- dependencies:
- locate-path: 5.0.0
- path-exists: 4.0.0
- dev: false
-
/find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
dependencies:
locate-path: 6.0.0
path-exists: 4.0.0
+ dev: true
- /flat-cache@3.1.0:
- resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==}
- engines: {node: '>=12.0.0'}
+ /flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
dependencies:
- flatted: 3.2.7
- keyv: 4.5.3
+ flatted: 3.3.1
+ keyv: 4.5.4
rimraf: 3.0.2
+ dev: true
- /flatted@3.2.7:
- resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
-
- /follow-redirects@1.15.2:
- resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
- engines: {node: '>=4.0'}
- peerDependencies:
- debug: '*'
- peerDependenciesMeta:
- debug:
- optional: true
- dev: false
+ /flatted@3.3.1:
+ resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+ dev: true
/for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
dependencies:
is-callable: 1.2.7
- dev: false
+ dev: true
/foreground-child@3.1.1:
resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
@@ -4690,6 +4158,9 @@ packages:
dependencies:
cross-spawn: 7.0.3
signal-exit: 4.1.0
+
+ /form-data-encoder@1.7.2:
+ resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==}
dev: false
/form-data@4.0.0:
@@ -4701,35 +4172,21 @@ packages:
mime-types: 2.1.35
dev: false
- /format@0.2.2:
- resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
- engines: {node: '>=0.4.x'}
- dev: false
-
- /formidable@3.5.1:
- resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==}
+ /formdata-node@4.4.1:
+ resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==}
+ engines: {node: '>= 12.20'}
dependencies:
- dezalgo: 1.0.4
- hexoid: 1.0.0
- once: 1.4.0
- dev: false
-
- /fraction.js@4.3.6:
- resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==}
+ node-domexception: 1.0.0
+ web-streams-polyfill: 4.0.0-beta.3
dev: false
- /fs-extra@9.1.0:
- resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
- engines: {node: '>=10'}
- dependencies:
- at-least-node: 1.0.0
- graceful-fs: 4.2.11
- jsonfile: 6.1.0
- universalify: 2.0.0
- dev: false
+ /fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+ dev: true
/fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
/fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
@@ -4738,59 +4195,52 @@ packages:
requiresBuild: true
optional: true
- /function-bind@1.1.1:
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- /function.prototype.name@1.1.5:
- resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
+ /function.prototype.name@1.1.6:
+ resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
functions-have-names: 1.2.3
- dev: false
+ dev: true
/functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
- dev: false
-
- /gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
- dev: false
+ dev: true
- /get-intrinsic@1.2.1:
- resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
+ /get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.4'}
dependencies:
- function-bind: 1.1.1
- has: 1.0.3
- has-proto: 1.0.1
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ has-proto: 1.0.3
has-symbols: 1.0.3
- dev: false
+ hasown: 2.0.2
/get-nonce@1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
dev: false
- /get-own-enumerable-property-symbols@3.0.2:
- resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
- dev: false
-
- /get-symbol-description@1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+ /get-symbol-description@1.0.2:
+ resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- dev: false
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ dev: true
- /get-tsconfig@4.7.0:
- resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==}
+ /get-tsconfig@4.7.3:
+ resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==}
dependencies:
resolve-pkg-maps: 1.0.0
- dev: false
+ dev: true
/glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -4804,9 +4254,6 @@ packages:
dependencies:
is-glob: 4.0.3
- /glob-to-regexp@0.4.1:
- resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
-
/glob@10.3.10:
resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -4814,20 +4261,21 @@ packages:
dependencies:
foreground-child: 3.1.1
jackspeak: 2.3.6
- minimatch: 9.0.3
+ minimatch: 9.0.4
minipass: 7.0.4
- path-scurry: 1.10.1
- dev: false
+ path-scurry: 1.10.2
+ dev: true
- /glob@7.1.6:
- resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
+ /glob@10.3.12:
+ resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
+ foreground-child: 3.1.1
+ jackspeak: 2.3.6
+ minimatch: 9.0.4
+ minipass: 7.0.4
+ path-scurry: 1.10.2
/glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
@@ -4838,24 +4286,21 @@ packages:
minimatch: 3.1.2
once: 1.4.0
path-is-absolute: 1.0.1
+ dev: true
- /globals@11.12.0:
- resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
- engines: {node: '>=4'}
- dev: false
-
- /globals@13.21.0:
- resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==}
+ /globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
engines: {node: '>=8'}
dependencies:
type-fest: 0.20.2
+ dev: true
/globalthis@1.0.3:
resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
engines: {node: '>= 0.4'}
dependencies:
- define-properties: 1.2.0
- dev: false
+ define-properties: 1.2.1
+ dev: true
/globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
@@ -4863,179 +4308,181 @@ packages:
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
- fast-glob: 3.3.1
- ignore: 5.2.4
+ fast-glob: 3.3.2
+ ignore: 5.3.1
merge2: 1.4.1
slash: 3.0.0
-
- /globby@6.1.0:
- resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==}
- engines: {node: '>=0.10.0'}
- dependencies:
- array-union: 1.0.2
- glob: 7.2.3
- object-assign: 4.1.1
- pify: 2.3.0
- pinkie-promise: 2.0.1
- dev: false
-
- /goober@2.1.13(csstype@3.1.2):
- resolution: {integrity: sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==}
- peerDependencies:
- csstype: ^3.0.10
- dependencies:
- csstype: 3.1.2
- dev: false
+ dev: true
/gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies:
- get-intrinsic: 1.2.1
- dev: false
+ get-intrinsic: 1.2.4
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
/graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ dev: true
- /has-bigints@1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ /groq-sdk@0.3.2:
+ resolution: {integrity: sha512-Xp1xOea7nqUcTMndpiA8VkjZ05jM/eUUeCILxhRF+c2etBz/myQwRcUrr5lpWc0euIt96AiBMa9aYa0Iqrh13g==}
+ dependencies:
+ '@types/node': 18.19.30
+ '@types/node-fetch': 2.6.11
+ abort-controller: 3.0.0
+ agentkeepalive: 4.5.0
+ digest-fetch: 1.3.0
+ form-data-encoder: 1.7.2
+ formdata-node: 4.4.1
+ node-fetch: 2.7.0
+ web-streams-polyfill: 3.3.3
+ transitivePeerDependencies:
+ - encoding
dev: false
- /has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
- dev: false
+ /has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: true
/has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
+ dev: true
- /has-property-descriptors@1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ /has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
dependencies:
- get-intrinsic: 1.2.1
- dev: false
+ es-define-property: 1.0.0
- /has-proto@1.0.1:
- resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
+ /has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
engines: {node: '>= 0.4'}
- dev: false
/has-symbols@1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
- dev: false
- /has-tostringtag@1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+ /has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
+ dev: true
+
+ /hash-wasm@4.11.0:
+ resolution: {integrity: sha512-HVusNXlVqHe0fzIzdQOGolnFN6mX/fqcrSAOcTBXdvzrXVHwTz11vXeKRmkR5gTuwVpvHZEIyKoePDvuAR+XwQ==}
dev: false
- /has@1.0.3:
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
- engines: {node: '>= 0.4.0'}
+ /hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
dependencies:
- function-bind: 1.1.1
+ function-bind: 1.1.2
- /hast-util-from-dom@4.2.0:
- resolution: {integrity: sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==}
+ /hast-util-from-dom@5.0.0:
+ resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==}
dependencies:
- hastscript: 7.2.0
+ '@types/hast': 3.0.4
+ hastscript: 8.0.0
web-namespaces: 2.0.1
dev: false
- /hast-util-from-html-isomorphic@1.0.0:
- resolution: {integrity: sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==}
+ /hast-util-from-html-isomorphic@2.0.0:
+ resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==}
dependencies:
- '@types/hast': 2.3.5
- hast-util-from-dom: 4.2.0
- hast-util-from-html: 1.0.2
- unist-util-remove-position: 4.0.2
+ '@types/hast': 3.0.4
+ hast-util-from-dom: 5.0.0
+ hast-util-from-html: 2.0.1
+ unist-util-remove-position: 5.0.0
dev: false
- /hast-util-from-html@1.0.2:
- resolution: {integrity: sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==}
+ /hast-util-from-html@2.0.1:
+ resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==}
dependencies:
- '@types/hast': 2.3.5
- hast-util-from-parse5: 7.1.2
+ '@types/hast': 3.0.4
+ devlop: 1.1.0
+ hast-util-from-parse5: 8.0.1
parse5: 7.1.2
- vfile: 5.3.7
- vfile-message: 3.1.4
+ vfile: 6.0.1
+ vfile-message: 4.0.2
dev: false
- /hast-util-from-parse5@7.1.2:
- resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==}
+ /hast-util-from-parse5@8.0.1:
+ resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
dependencies:
- '@types/hast': 2.3.5
- '@types/unist': 2.0.7
- hastscript: 7.2.0
- property-information: 6.2.0
- vfile: 5.3.7
- vfile-location: 4.1.0
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.2
+ devlop: 1.1.0
+ hastscript: 8.0.0
+ property-information: 6.5.0
+ vfile: 6.0.1
+ vfile-location: 5.0.2
web-namespaces: 2.0.1
dev: false
- /hast-util-is-element@2.1.3:
- resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==}
+ /hast-util-is-element@3.0.0:
+ resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
dependencies:
- '@types/hast': 2.3.5
- '@types/unist': 2.0.7
- dev: false
-
- /hast-util-parse-selector@2.2.5:
- resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
+ '@types/hast': 3.0.4
dev: false
- /hast-util-parse-selector@3.1.1:
- resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==}
+ /hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
dependencies:
- '@types/hast': 2.3.5
+ '@types/hast': 3.0.4
dev: false
- /hast-util-to-text@3.1.2:
- resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==}
+ /hast-util-to-jsx-runtime@2.3.0:
+ resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==}
dependencies:
- '@types/hast': 2.3.5
- '@types/unist': 2.0.7
- hast-util-is-element: 2.1.3
- unist-util-find-after: 4.0.1
+ '@types/estree': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.2
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.0
+ mdast-util-mdx-jsx: 3.1.2
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 1.0.6
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
dev: false
- /hast-util-whitespace@2.0.1:
- resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
+ /hast-util-to-text@4.0.0:
+ resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==}
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.2
+ hast-util-is-element: 3.0.0
+ unist-util-find-after: 5.0.0
dev: false
- /hastscript@6.0.0:
- resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
+ /hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
dependencies:
- '@types/hast': 2.3.5
- comma-separated-tokens: 1.0.8
- hast-util-parse-selector: 2.2.5
- property-information: 5.6.0
- space-separated-tokens: 1.1.5
+ '@types/hast': 3.0.4
dev: false
- /hastscript@7.2.0:
- resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==}
+ /hastscript@8.0.0:
+ resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
dependencies:
- '@types/hast': 2.3.5
+ '@types/hast': 3.0.4
comma-separated-tokens: 2.0.3
- hast-util-parse-selector: 3.1.1
- property-information: 6.2.0
+ hast-util-parse-selector: 4.0.0
+ property-information: 6.5.0
space-separated-tokens: 2.0.2
dev: false
- /hexoid@1.0.0:
- resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==}
- engines: {node: '>=8'}
- dev: false
-
- /highlight.js@10.7.3:
- resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+ /html-url-attributes@3.0.0:
+ resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==}
dev: false
/htmlparser2@8.0.2:
@@ -5047,13 +4494,36 @@ packages:
entities: 4.5.0
dev: false
- /idb@7.1.1:
- resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
+ /http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /https-proxy-agent@7.0.4:
+ resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /humanize-ms@1.2.1:
+ resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
+ dependencies:
+ ms: 2.1.3
dev: false
- /ignore@5.2.4:
- resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
+ /ignore@5.3.1:
+ resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
engines: {node: '>= 4'}
+ dev: true
/import-fresh@3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
@@ -5061,32 +4531,36 @@ packages:
dependencies:
parent-module: 1.0.1
resolve-from: 4.0.0
+ dev: true
/imurmurhash@0.1.4:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
+ dev: true
/inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
dependencies:
once: 1.4.0
wrappy: 1.0.2
+ dev: true
/inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: true
- /inline-style-parser@0.1.1:
- resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
+ /inline-style-parser@0.2.3:
+ resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==}
dev: false
- /internal-slot@1.0.5:
- resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
+ /internal-slot@1.0.7:
+ resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
engines: {node: '>= 0.4'}
dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.3
- side-channel: 1.0.4
- dev: false
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.0.6
+ dev: true
/intl-messageformat@9.13.0:
resolution: {integrity: sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==}
@@ -5103,76 +4577,82 @@ packages:
loose-envify: 1.4.0
dev: false
- /is-alphabetical@1.0.4:
- resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
+ /is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
dev: false
- /is-alphanumerical@1.0.4:
- resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
+ /is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
dependencies:
- is-alphabetical: 1.0.4
- is-decimal: 1.0.4
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
dev: false
- /is-array-buffer@3.0.2:
- resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
+ /is-array-buffer@3.0.4:
+ resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- is-typed-array: 1.1.12
- dev: false
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ dev: true
/is-async-function@2.0.0:
resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
engines: {node: '>= 0.4'}
dependencies:
- has-tostringtag: 1.0.0
- dev: false
+ has-tostringtag: 1.0.2
+ dev: true
/is-bigint@1.0.4:
resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
dependencies:
has-bigints: 1.0.2
- dev: false
+ dev: true
/is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
dependencies:
- binary-extensions: 2.2.0
+ binary-extensions: 2.3.0
/is-boolean-object@1.1.2:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: false
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: true
- /is-buffer@2.0.5:
- resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
- engines: {node: '>=4'}
+ /is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
dev: false
/is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
- dev: false
+ dev: true
+
+ /is-core-module@2.13.1:
+ resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+ dependencies:
+ hasown: 2.0.2
- /is-core-module@2.13.0:
- resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
+ /is-data-view@1.0.1:
+ resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ engines: {node: '>= 0.4'}
dependencies:
- has: 1.0.3
+ is-typed-array: 1.1.13
+ dev: true
/is-date-object@1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
engines: {node: '>= 0.4'}
dependencies:
- has-tostringtag: 1.0.0
- dev: false
+ has-tostringtag: 1.0.2
+ dev: true
- /is-decimal@1.0.4:
- resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
+ /is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
dev: false
/is-extglob@2.1.1:
@@ -5182,20 +4662,19 @@ packages:
/is-finalizationregistry@1.0.2:
resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
dependencies:
- call-bind: 1.0.2
- dev: false
+ call-bind: 1.0.7
+ dev: true
/is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
- dev: false
/is-generator-function@1.0.10:
resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
engines: {node: '>= 0.4'}
dependencies:
- has-tostringtag: 1.0.0
- dev: false
+ has-tostringtag: 1.0.2
+ dev: true
/is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
@@ -5203,149 +4682,123 @@ packages:
dependencies:
is-extglob: 2.1.1
- /is-hexadecimal@1.0.4:
- resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
- dev: false
-
- /is-map@2.0.2:
- resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
+ /is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
dev: false
- /is-module@1.0.0:
- resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
- dev: false
+ /is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+ dev: true
- /is-negative-zero@2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+ /is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
engines: {node: '>= 0.4'}
- dev: false
+ dev: true
/is-number-object@1.0.7:
resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: false
-
- /is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
-
- /is-obj@1.0.1:
- resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
- engines: {node: '>=0.10.0'}
- dev: false
-
- /is-path-cwd@2.2.0:
- resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
- engines: {node: '>=6'}
- dev: false
-
- /is-path-in-cwd@2.1.0:
- resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==}
- engines: {node: '>=6'}
+ engines: {node: '>= 0.4'}
dependencies:
- is-path-inside: 2.1.0
- dev: false
+ has-tostringtag: 1.0.2
+ dev: true
- /is-path-inside@2.1.0:
- resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==}
- engines: {node: '>=6'}
- dependencies:
- path-is-inside: 1.0.2
- dev: false
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
/is-path-inside@3.0.3:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
+ dev: true
/is-plain-obj@4.1.0:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
dev: false
+ /is-reference@3.0.2:
+ resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
+ dependencies:
+ '@types/estree': 1.0.5
+ dev: false
+
/is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: false
-
- /is-regexp@1.0.0:
- resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
- engines: {node: '>=0.10.0'}
- dev: false
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: true
- /is-set@2.0.2:
- resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
- dev: false
+ /is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+ dev: true
- /is-shared-array-buffer@1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ /is-shared-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- dev: false
-
- /is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
- dev: false
+ call-bind: 1.0.7
+ dev: true
/is-string@1.0.7:
resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
engines: {node: '>= 0.4'}
dependencies:
- has-tostringtag: 1.0.0
- dev: false
+ has-tostringtag: 1.0.2
+ dev: true
/is-symbol@1.0.4:
resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
- dev: false
+ dev: true
- /is-typed-array@1.1.12:
- resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
+ /is-typed-array@1.1.13:
+ resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
engines: {node: '>= 0.4'}
dependencies:
- which-typed-array: 1.1.11
- dev: false
+ which-typed-array: 1.1.15
+ dev: true
- /is-weakmap@2.0.1:
- resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
- dev: false
+ /is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+ dev: true
/is-weakref@1.0.2:
resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
dependencies:
- call-bind: 1.0.2
- dev: false
+ call-bind: 1.0.7
+ dev: true
- /is-weakset@2.0.2:
- resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
+ /is-weakset@2.0.3:
+ resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- dev: false
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ dev: true
/isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
- dev: false
+ dev: true
/isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- /iterator.prototype@1.1.0:
- resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==}
+ /iterator.prototype@1.1.2:
+ resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
dependencies:
- define-properties: 1.2.0
- get-intrinsic: 1.2.1
+ define-properties: 1.2.1
+ get-intrinsic: 1.2.4
has-symbols: 1.0.3
- has-tostringtag: 1.0.0
- reflect.getprototypeof: 1.0.3
- dev: false
+ reflect.getprototypeof: 1.0.6
+ set-function-name: 2.0.2
+ dev: true
/jackspeak@2.3.6:
resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
@@ -5354,46 +4807,17 @@ packages:
'@isaacs/cliui': 8.0.2
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
- dev: false
-
- /jake@10.8.7:
- resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
- engines: {node: '>=10'}
- hasBin: true
- dependencies:
- async: 3.2.4
- chalk: 4.1.2
- filelist: 1.0.4
- minimatch: 3.1.2
- dev: false
-
- /jest-worker@26.6.2:
- resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
- engines: {node: '>= 10.13.0'}
- dependencies:
- '@types/node': 20.10.7
- merge-stream: 2.0.0
- supports-color: 7.2.0
- dev: false
-
- /jest-worker@27.5.1:
- resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
- engines: {node: '>= 10.13.0'}
- dependencies:
- '@types/node': 20.10.7
- merge-stream: 2.0.0
- supports-color: 8.1.1
- /jiti@1.19.3:
- resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==}
+ /jiti@1.21.0:
+ resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
hasBin: true
- /jose@4.14.4:
- resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==}
+ /jose@5.2.4:
+ resolution: {integrity: sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==}
dev: false
- /jotai@2.6.0(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-Vt6hsc04Km4j03l+Ax+Sc+FVft5cRJhqgxt6GTz6GM2eM3DyX3CdBdzcG0z2FrlZToL1/0OAkqDghIyARWnSuQ==}
+ /jotai@2.8.0(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-yZNMC36FdLOksOr8qga0yLf14miCJlEThlp5DeFJNnqzm2+ZG7wLcJzoOyij5K6U6Xlc5ljQqPDlJRgqW0Y18g==}
engines: {node: '>=12.20.0'}
peerDependencies:
'@types/react': '>=17.0.0'
@@ -5404,43 +4828,31 @@ packages:
react:
optional: true
dependencies:
- '@types/react': 18.2.47
+ '@types/react': 18.2.74
react: 18.2.0
dev: false
+ /js-base64@3.7.2:
+ resolution: {integrity: sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==}
+ dev: false
+
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
- dev: false
/js-yaml@4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
dependencies:
argparse: 2.0.1
-
- /jsesc@0.5.0:
- resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
- hasBin: true
- dev: false
-
- /jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
- hasBin: true
- dev: false
+ dev: true
/json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
-
- /json-parse-even-better-errors@2.3.1:
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ dev: true
/json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-
- /json-schema-traverse@1.0.0:
- resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
- dev: false
+ dev: true
/json-schema@0.4.0:
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
@@ -5448,74 +4860,58 @@ packages:
/json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
/json5@1.0.2:
resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
hasBin: true
dependencies:
minimist: 1.2.8
- dev: false
+ dev: true
- /json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
+ /jsondiffpatch@0.6.0:
+ resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
- dev: false
-
- /jsonfile@6.1.0:
- resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
dependencies:
- universalify: 2.0.0
- optionalDependencies:
- graceful-fs: 4.2.11
- dev: false
-
- /jsonpointer@5.0.1:
- resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
- engines: {node: '>=0.10.0'}
+ '@types/diff-match-patch': 1.0.36
+ chalk: 5.3.0
+ diff-match-patch: 1.0.5
dev: false
/jsx-ast-utils@3.3.5:
resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
engines: {node: '>=4.0'}
dependencies:
- array-includes: 3.1.6
- array.prototype.flat: 1.3.1
- object.assign: 4.1.4
- object.values: 1.1.6
- dev: false
+ array-includes: 3.1.8
+ array.prototype.flat: 1.3.2
+ object.assign: 4.1.5
+ object.values: 1.2.0
+ dev: true
- /katex@0.16.8:
- resolution: {integrity: sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==}
+ /katex@0.16.10:
+ resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==}
hasBin: true
dependencies:
commander: 8.3.0
dev: false
- /keyv@4.5.3:
- resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==}
+ /keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
dependencies:
json-buffer: 3.0.1
-
- /kleur@4.1.5:
- resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
- engines: {node: '>=6'}
- dev: false
+ dev: true
/language-subtag-registry@0.3.22:
resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
- dev: false
+ dev: true
- /language-tags@1.0.5:
- resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
+ /language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
dependencies:
language-subtag-registry: 0.3.22
- dev: false
-
- /leven@3.1.0:
- resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
- engines: {node: '>=6'}
- dev: false
+ dev: true
/levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
@@ -5523,32 +4919,25 @@ packages:
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
+ dev: true
/lilconfig@2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
+ /lilconfig@3.1.1:
+ resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==}
+ engines: {node: '>=14'}
+
/lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- /loader-runner@4.3.0:
- resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
- engines: {node: '>=6.11.5'}
-
- /loader-utils@2.0.4:
- resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
- engines: {node: '>=8.9.0'}
- dependencies:
- big.js: 5.2.2
- emojis-list: 3.0.0
- json5: 2.2.3
+ /load-script@1.0.0:
+ resolution: {integrity: sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==}
dev: false
- /locate-path@5.0.0:
- resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
- engines: {node: '>=8'}
- dependencies:
- p-locate: 4.1.0
+ /locate-character@3.0.0:
+ resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
dev: false
/locate-path@6.0.0:
@@ -5556,29 +4945,11 @@ packages:
engines: {node: '>=10'}
dependencies:
p-locate: 5.0.0
-
- /lodash.castarray@4.4.0:
- resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
- dev: true
-
- /lodash.debounce@4.0.8:
- resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
- dev: false
-
- /lodash.isplainobject@4.0.6:
- resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
dev: true
/lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
-
- /lodash.sortby@4.7.0:
- resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
- dev: false
-
- /lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
- dev: false
+ dev: true
/longest-streak@3.1.0:
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
@@ -5589,458 +4960,505 @@ packages:
hasBin: true
dependencies:
js-tokens: 4.0.0
- dev: false
-
- /lowlight@1.20.0:
- resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==}
- dependencies:
- fault: 1.0.4
- highlight.js: 10.7.3
- dev: false
- /lru-cache@10.1.0:
- resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==}
+ /lru-cache@10.2.0:
+ resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
engines: {node: 14 || >=16.14}
- dev: false
-
- /lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- dependencies:
- yallist: 3.1.1
- dev: false
/lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
dependencies:
yallist: 4.0.0
+ dev: true
- /lucide-react@0.263.1(react@18.2.0):
- resolution: {integrity: sha512-keqxAx97PlaEN89PXZ6ki1N8nRjGWtDa4021GFYLNj0RgruM5odbpl8GHTExj0hhPq3sF6Up0gnxt6TSHu+ovw==}
+ /lucide-react@0.363.0(react@18.2.0):
+ resolution: {integrity: sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0
dependencies:
react: 18.2.0
dev: false
- /magic-string@0.25.9:
- resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
- dependencies:
- sourcemap-codec: 1.4.8
- dev: false
-
- /make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
+ /magic-string@0.30.9:
+ resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==}
+ engines: {node: '>=12'}
dependencies:
- semver: 6.3.1
+ '@jridgewell/sourcemap-codec': 1.4.15
dev: false
/markdown-table@3.0.3:
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
dev: false
- /mdast-util-definitions@5.1.2:
- resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
+ /md5@2.3.0:
+ resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
dependencies:
- '@types/mdast': 3.0.12
- '@types/unist': 2.0.7
- unist-util-visit: 4.1.2
+ charenc: 0.0.2
+ crypt: 0.0.2
+ is-buffer: 1.1.6
dev: false
- /mdast-util-find-and-replace@2.2.2:
- resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==}
+ /mdast-util-find-and-replace@3.0.1:
+ resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
dependencies:
- '@types/mdast': 3.0.12
+ '@types/mdast': 4.0.3
escape-string-regexp: 5.0.0
- unist-util-is: 5.2.1
- unist-util-visit-parents: 5.1.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
dev: false
- /mdast-util-from-markdown@1.3.1:
- resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==}
+ /mdast-util-from-markdown@2.0.0:
+ resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==}
dependencies:
- '@types/mdast': 3.0.12
- '@types/unist': 2.0.7
+ '@types/mdast': 4.0.3
+ '@types/unist': 3.0.2
decode-named-character-reference: 1.0.2
- mdast-util-to-string: 3.2.0
- micromark: 3.2.0
- micromark-util-decode-numeric-character-reference: 1.1.0
- micromark-util-decode-string: 1.1.0
- micromark-util-normalize-identifier: 1.1.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- unist-util-stringify-position: 3.0.3
- uvu: 0.5.6
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-decode-string: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ unist-util-stringify-position: 4.0.0
transitivePeerDependencies:
- supports-color
dev: false
- /mdast-util-gfm-autolink-literal@1.0.3:
- resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==}
+ /mdast-util-gfm-autolink-literal@2.0.0:
+ resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==}
dependencies:
- '@types/mdast': 3.0.12
+ '@types/mdast': 4.0.3
ccount: 2.0.1
- mdast-util-find-and-replace: 2.2.2
- micromark-util-character: 1.2.0
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.1
+ micromark-util-character: 2.1.0
dev: false
- /mdast-util-gfm-footnote@1.0.2:
- resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==}
+ /mdast-util-gfm-footnote@2.0.0:
+ resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
dependencies:
- '@types/mdast': 3.0.12
- mdast-util-to-markdown: 1.5.0
- micromark-util-normalize-identifier: 1.1.0
+ '@types/mdast': 4.0.3
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ micromark-util-normalize-identifier: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
dev: false
- /mdast-util-gfm-strikethrough@1.0.3:
- resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==}
+ /mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
dependencies:
- '@types/mdast': 3.0.12
- mdast-util-to-markdown: 1.5.0
+ '@types/mdast': 4.0.3
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
dev: false
- /mdast-util-gfm-table@1.0.7:
- resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==}
+ /mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
dependencies:
- '@types/mdast': 3.0.12
+ '@types/mdast': 4.0.3
+ devlop: 1.1.0
markdown-table: 3.0.3
- mdast-util-from-markdown: 1.3.1
- mdast-util-to-markdown: 1.5.0
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
dev: false
- /mdast-util-gfm-task-list-item@1.0.2:
- resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==}
+ /mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
dependencies:
- '@types/mdast': 3.0.12
- mdast-util-to-markdown: 1.5.0
+ '@types/mdast': 4.0.3
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
dev: false
- /mdast-util-gfm@2.0.2:
- resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==}
+ /mdast-util-gfm@3.0.0:
+ resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
dependencies:
- mdast-util-from-markdown: 1.3.1
- mdast-util-gfm-autolink-literal: 1.0.3
- mdast-util-gfm-footnote: 1.0.2
- mdast-util-gfm-strikethrough: 1.0.3
- mdast-util-gfm-table: 1.0.7
- mdast-util-gfm-task-list-item: 1.0.2
- mdast-util-to-markdown: 1.5.0
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-gfm-autolink-literal: 2.0.0
+ mdast-util-gfm-footnote: 2.0.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
dev: false
- /mdast-util-math@2.0.2:
- resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==}
+ /mdast-util-math@3.0.0:
+ resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==}
dependencies:
- '@types/mdast': 3.0.12
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.3
+ devlop: 1.1.0
longest-streak: 3.1.0
- mdast-util-to-markdown: 1.5.0
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ unist-util-remove-position: 5.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-mdx-expression@2.0.0:
+ resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.3
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-mdx-jsx@3.1.2:
+ resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.3
+ '@types/unist': 3.0.2
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ parse-entities: 4.0.1
+ stringify-entities: 4.0.4
+ unist-util-remove-position: 5.0.0
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
dev: false
- /mdast-util-phrasing@3.0.1:
- resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==}
+ /mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
dependencies:
- '@types/mdast': 3.0.12
- unist-util-is: 5.2.1
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.3
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+ dependencies:
+ '@types/mdast': 4.0.3
+ unist-util-is: 6.0.0
dev: false
- /mdast-util-to-hast@12.3.0:
- resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
+ /mdast-util-to-hast@13.1.0:
+ resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==}
dependencies:
- '@types/hast': 2.3.5
- '@types/mdast': 3.0.12
- mdast-util-definitions: 5.1.2
- micromark-util-sanitize-uri: 1.2.0
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.3
+ '@ungap/structured-clone': 1.2.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.0
trim-lines: 3.0.1
- unist-util-generated: 2.0.1
- unist-util-position: 4.0.4
- unist-util-visit: 4.1.2
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.1
dev: false
- /mdast-util-to-markdown@1.5.0:
- resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==}
+ /mdast-util-to-markdown@2.1.0:
+ resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
dependencies:
- '@types/mdast': 3.0.12
- '@types/unist': 2.0.7
+ '@types/mdast': 4.0.3
+ '@types/unist': 3.0.2
longest-streak: 3.1.0
- mdast-util-phrasing: 3.0.1
- mdast-util-to-string: 3.2.0
- micromark-util-decode-string: 1.1.0
- unist-util-visit: 4.1.2
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-decode-string: 2.0.0
+ unist-util-visit: 5.0.0
zwitch: 2.0.4
dev: false
- /mdast-util-to-string@3.2.0:
- resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==}
+ /mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
dependencies:
- '@types/mdast': 3.0.12
+ '@types/mdast': 4.0.3
dev: false
- /merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ /mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+ dev: false
/merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
- /micromark-core-commonmark@1.1.0:
- resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==}
+ /micromark-core-commonmark@2.0.0:
+ resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==}
dependencies:
decode-named-character-reference: 1.0.2
- micromark-factory-destination: 1.1.0
- micromark-factory-label: 1.1.0
- micromark-factory-space: 1.1.0
- micromark-factory-title: 1.1.0
- micromark-factory-whitespace: 1.1.0
- micromark-util-character: 1.2.0
- micromark-util-chunked: 1.1.0
- micromark-util-classify-character: 1.1.0
- micromark-util-html-tag-name: 1.2.0
- micromark-util-normalize-identifier: 1.1.0
- micromark-util-resolve-all: 1.1.0
- micromark-util-subtokenize: 1.1.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.0
+ micromark-factory-label: 2.0.0
+ micromark-factory-space: 2.0.0
+ micromark-factory-title: 2.0.0
+ micromark-factory-whitespace: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-html-tag-name: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-subtokenize: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-extension-gfm-autolink-literal@1.0.5:
- resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==}
+ /micromark-extension-gfm-autolink-literal@2.0.0:
+ resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==}
dependencies:
- micromark-util-character: 1.2.0
- micromark-util-sanitize-uri: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-extension-gfm-footnote@1.1.2:
- resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==}
+ /micromark-extension-gfm-footnote@2.0.0:
+ resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==}
dependencies:
- micromark-core-commonmark: 1.1.0
- micromark-factory-space: 1.1.0
- micromark-util-character: 1.2.0
- micromark-util-normalize-identifier: 1.1.0
- micromark-util-sanitize-uri: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-extension-gfm-strikethrough@1.0.7:
- resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==}
+ /micromark-extension-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==}
dependencies:
- micromark-util-chunked: 1.1.0
- micromark-util-classify-character: 1.1.0
- micromark-util-resolve-all: 1.1.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-extension-gfm-table@1.0.7:
- resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==}
+ /micromark-extension-gfm-table@2.0.0:
+ resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==}
dependencies:
- micromark-factory-space: 1.1.0
- micromark-util-character: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-extension-gfm-tagfilter@1.0.2:
- resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==}
+ /micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
dependencies:
- micromark-util-types: 1.1.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-extension-gfm-task-list-item@1.0.5:
- resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==}
+ /micromark-extension-gfm-task-list-item@2.0.1:
+ resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==}
dependencies:
- micromark-factory-space: 1.1.0
- micromark-util-character: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-extension-gfm@2.0.3:
- resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==}
+ /micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
dependencies:
- micromark-extension-gfm-autolink-literal: 1.0.5
- micromark-extension-gfm-footnote: 1.1.2
- micromark-extension-gfm-strikethrough: 1.0.7
- micromark-extension-gfm-table: 1.0.7
- micromark-extension-gfm-tagfilter: 1.0.2
- micromark-extension-gfm-task-list-item: 1.0.5
- micromark-util-combine-extensions: 1.1.0
- micromark-util-types: 1.1.0
+ micromark-extension-gfm-autolink-literal: 2.0.0
+ micromark-extension-gfm-footnote: 2.0.0
+ micromark-extension-gfm-strikethrough: 2.0.0
+ micromark-extension-gfm-table: 2.0.0
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.0.1
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-extension-math@2.1.2:
- resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==}
+ /micromark-extension-math@3.0.0:
+ resolution: {integrity: sha512-iJ2Q28vBoEovLN5o3GO12CpqorQRYDPT+p4zW50tGwTfJB+iv/VnB6Ini+gqa24K97DwptMBBIvVX6Bjk49oyQ==}
dependencies:
- '@types/katex': 0.16.2
- katex: 0.16.8
- micromark-factory-space: 1.1.0
- micromark-util-character: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ '@types/katex': 0.16.7
+ devlop: 1.1.0
+ katex: 0.16.10
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-factory-destination@1.1.0:
- resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==}
+ /micromark-factory-destination@2.0.0:
+ resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
dependencies:
- micromark-util-character: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-factory-label@1.1.0:
- resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==}
+ /micromark-factory-label@2.0.0:
+ resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
dependencies:
- micromark-util-character: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ devlop: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-factory-space@1.1.0:
- resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==}
+ /micromark-factory-space@2.0.0:
+ resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
dependencies:
- micromark-util-character: 1.2.0
- micromark-util-types: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-factory-title@1.1.0:
- resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==}
+ /micromark-factory-title@2.0.0:
+ resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
dependencies:
- micromark-factory-space: 1.1.0
- micromark-util-character: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-factory-whitespace@1.1.0:
- resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==}
+ /micromark-factory-whitespace@2.0.0:
+ resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
dependencies:
- micromark-factory-space: 1.1.0
- micromark-util-character: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-util-character@1.2.0:
- resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
+ /micromark-util-character@2.1.0:
+ resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
dependencies:
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-util-chunked@1.1.0:
- resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==}
+ /micromark-util-chunked@2.0.0:
+ resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
dependencies:
- micromark-util-symbol: 1.1.0
+ micromark-util-symbol: 2.0.0
dev: false
- /micromark-util-classify-character@1.1.0:
- resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==}
+ /micromark-util-classify-character@2.0.0:
+ resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
dependencies:
- micromark-util-character: 1.2.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-util-combine-extensions@1.1.0:
- resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==}
+ /micromark-util-combine-extensions@2.0.0:
+ resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
dependencies:
- micromark-util-chunked: 1.1.0
- micromark-util-types: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-util-decode-numeric-character-reference@1.1.0:
- resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==}
+ /micromark-util-decode-numeric-character-reference@2.0.1:
+ resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
dependencies:
- micromark-util-symbol: 1.1.0
+ micromark-util-symbol: 2.0.0
dev: false
- /micromark-util-decode-string@1.1.0:
- resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==}
+ /micromark-util-decode-string@2.0.0:
+ resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
dependencies:
decode-named-character-reference: 1.0.2
- micromark-util-character: 1.2.0
- micromark-util-decode-numeric-character-reference: 1.1.0
- micromark-util-symbol: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-symbol: 2.0.0
dev: false
- /micromark-util-encode@1.1.0:
- resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
+ /micromark-util-encode@2.0.0:
+ resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
dev: false
- /micromark-util-html-tag-name@1.2.0:
- resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==}
+ /micromark-util-html-tag-name@2.0.0:
+ resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
dev: false
- /micromark-util-normalize-identifier@1.1.0:
- resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==}
+ /micromark-util-normalize-identifier@2.0.0:
+ resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
dependencies:
- micromark-util-symbol: 1.1.0
+ micromark-util-symbol: 2.0.0
dev: false
- /micromark-util-resolve-all@1.1.0:
- resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==}
+ /micromark-util-resolve-all@2.0.0:
+ resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
dependencies:
- micromark-util-types: 1.1.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-util-sanitize-uri@1.2.0:
- resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
+ /micromark-util-sanitize-uri@2.0.0:
+ resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
dependencies:
- micromark-util-character: 1.2.0
- micromark-util-encode: 1.1.0
- micromark-util-symbol: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-encode: 2.0.0
+ micromark-util-symbol: 2.0.0
dev: false
- /micromark-util-subtokenize@1.1.0:
- resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==}
+ /micromark-util-subtokenize@2.0.0:
+ resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==}
dependencies:
- micromark-util-chunked: 1.1.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
dev: false
- /micromark-util-symbol@1.1.0:
- resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
+ /micromark-util-symbol@2.0.0:
+ resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
dev: false
- /micromark-util-types@1.1.0:
- resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
+ /micromark-util-types@2.0.0:
+ resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
dev: false
- /micromark@3.2.0:
- resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
+ /micromark@4.0.0:
+ resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
dependencies:
- '@types/debug': 4.1.8
+ '@types/debug': 4.1.12
debug: 4.3.4
decode-named-character-reference: 1.0.2
- micromark-core-commonmark: 1.1.0
- micromark-factory-space: 1.1.0
- micromark-util-character: 1.2.0
- micromark-util-chunked: 1.1.0
- micromark-util-combine-extensions: 1.1.0
- micromark-util-decode-numeric-character-reference: 1.1.0
- micromark-util-encode: 1.1.0
- micromark-util-normalize-identifier: 1.1.0
- micromark-util-resolve-all: 1.1.0
- micromark-util-sanitize-uri: 1.2.0
- micromark-util-subtokenize: 1.1.0
- micromark-util-symbol: 1.1.0
- micromark-util-types: 1.1.0
- uvu: 0.5.6
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-encode: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-subtokenize: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
transitivePeerDependencies:
- supports-color
dev: false
@@ -6055,51 +5473,47 @@ packages:
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
+ dev: false
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
+ dev: false
/minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies:
brace-expansion: 1.1.11
+ dev: true
- /minimatch@5.1.6:
- resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
- engines: {node: '>=10'}
+ /minimatch@9.0.3:
+ resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+ engines: {node: '>=16 || 14 >=14.17'}
dependencies:
brace-expansion: 2.0.1
- dev: false
+ dev: true
- /minimatch@9.0.3:
- resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+ /minimatch@9.0.4:
+ resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
engines: {node: '>=16 || 14 >=14.17'}
dependencies:
brace-expansion: 2.0.1
/minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- dev: false
+ dev: true
/minipass@7.0.4:
resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
engines: {node: '>=16 || 14 >=14.17'}
- dev: false
-
- /mri@1.2.0:
- resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
- engines: {node: '>=4'}
- dev: false
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
/ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- dev: false
/mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
@@ -6108,6 +5522,12 @@ packages:
object-assign: 4.1.1
thenify-all: 1.6.0
+ /nanoid@3.3.6:
+ resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: false
+
/nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -6115,139 +5535,99 @@ packages:
/natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
/negotiator@0.6.3:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
engines: {node: '>= 0.6'}
dev: false
- /neo-async@2.6.2:
- resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
-
- /next-auth@4.24.5(next@14.1.0)(nodemailer@6.9.5)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==}
- peerDependencies:
- next: ^12.2.5 || ^13 || ^14
- nodemailer: ^6.6.5
- react: ^17.0.2 || ^18
- react-dom: ^17.0.2 || ^18
- peerDependenciesMeta:
- nodemailer:
- optional: true
- dependencies:
- '@babel/runtime': 7.22.11
- '@panva/hkdf': 1.1.1
- cookie: 0.5.0
- jose: 4.14.4
- next: 14.1.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)
- nodemailer: 6.9.5
- oauth: 0.9.15
- openid-client: 5.4.3
- preact: 10.17.1
- preact-render-to-string: 5.2.6(preact@10.17.1)
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- uuid: 8.3.2
- dev: false
-
- /next-intl@3.1.4(next@14.1.0)(react@18.2.0):
- resolution: {integrity: sha512-/mewUryIPdoZT7j+8ipN2rfWuuNGdl+xiwxWxYkYko0kGY/a2IlcgqaMBKwue5V5M17Vk9bwiydv/2wySJXG8w==}
+ /next-intl@3.11.1(next@14.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-KaMdMMTLJ8Qs15AfltKFTdzk3OjAEIKRGmRu6kpH5Mv3DPUoOX9sQ+fXvNlKmLzw+TeBt5yPCswzLZFmJMbsOA==}
peerDependencies:
next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@formatjs/intl-localematcher': 0.2.32
negotiator: 0.6.3
- next: 14.1.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)
+ next: 14.2.0(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
- use-intl: 3.1.4(react@18.2.0)
- dev: false
-
- /next-pwa@5.6.0(@babel/core@7.23.2)(next@14.1.0)(webpack@5.88.2):
- resolution: {integrity: sha512-XV8g8C6B7UmViXU8askMEYhWwQ4qc/XqJGnexbLV68hzKaGHZDMtHsm2TNxFcbR7+ypVuth/wwpiIlMwpRJJ5A==}
- peerDependencies:
- next: '>=9.0.0'
- dependencies:
- babel-loader: 8.3.0(@babel/core@7.23.2)(webpack@5.88.2)
- clean-webpack-plugin: 4.0.0(webpack@5.88.2)
- globby: 11.1.0
- next: 14.1.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)
- terser-webpack-plugin: 5.3.9(webpack@5.88.2)
- workbox-webpack-plugin: 6.6.0(webpack@5.88.2)
- workbox-window: 6.6.0
- transitivePeerDependencies:
- - '@babel/core'
- - '@swc/core'
- - '@types/babel__core'
- - esbuild
- - supports-color
- - uglify-js
- - webpack
+ use-intl: 3.11.1(react@18.2.0)
dev: false
- /next-themes@0.2.1(next@14.1.0)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==}
+ /next-themes@0.3.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==}
peerDependencies:
- next: '*'
- react: '*'
- react-dom: '*'
+ react: ^16.8 || ^17 || ^18
+ react-dom: ^16.8 || ^17 || ^18
dependencies:
- next: 14.1.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /next@14.1.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==}
+ /next@14.2.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-2T41HqJdKPqheR27ll7MFZ3gtTYvGew7cUc0PwPSyK9Ao5vvwpf9bYfP4V5YBGLckHF2kEGvrLte5BqLSv0s8g==}
engines: {node: '>=18.17.0'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.41.2
react: ^18.2.0
react-dom: ^18.2.0
sass: ^1.3.0
peerDependenciesMeta:
'@opentelemetry/api':
optional: true
+ '@playwright/test':
+ optional: true
sass:
optional: true
dependencies:
- '@next/env': 14.1.0
- '@swc/helpers': 0.5.2
+ '@next/env': 14.2.0
+ '@swc/helpers': 0.5.5
busboy: 1.6.0
- caniuse-lite: 1.0.30001579
+ caniuse-lite: 1.0.30001606
graceful-fs: 4.2.11
postcss: 8.4.31
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- styled-jsx: 5.1.1(@babel/core@7.23.2)(react@18.2.0)
+ styled-jsx: 5.1.1(react@18.2.0)
optionalDependencies:
- '@next/swc-darwin-arm64': 14.1.0
- '@next/swc-darwin-x64': 14.1.0
- '@next/swc-linux-arm64-gnu': 14.1.0
- '@next/swc-linux-arm64-musl': 14.1.0
- '@next/swc-linux-x64-gnu': 14.1.0
- '@next/swc-linux-x64-musl': 14.1.0
- '@next/swc-win32-arm64-msvc': 14.1.0
- '@next/swc-win32-ia32-msvc': 14.1.0
- '@next/swc-win32-x64-msvc': 14.1.0
+ '@next/swc-darwin-arm64': 14.2.0
+ '@next/swc-darwin-x64': 14.2.0
+ '@next/swc-linux-arm64-gnu': 14.2.0
+ '@next/swc-linux-arm64-musl': 14.2.0
+ '@next/swc-linux-x64-gnu': 14.2.0
+ '@next/swc-linux-x64-musl': 14.2.0
+ '@next/swc-win32-arm64-msvc': 14.2.0
+ '@next/swc-win32-ia32-msvc': 14.2.0
+ '@next/swc-win32-x64-msvc': 14.2.0
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
dev: false
- /node-ensure@0.0.0:
- resolution: {integrity: sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==}
+ /node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
dev: false
- /node-releases@2.0.13:
- resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
-
- /nodemailer@6.9.5:
- resolution: {integrity: sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==}
- engines: {node: '>=6.0.0'}
+ /node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
dev: false
+ /node-releases@2.0.14:
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+ dev: true
+
/normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -6255,7 +5635,7 @@ packages:
/normalize-range@0.1.2:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
- dev: false
+ dev: true
/nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
@@ -6263,102 +5643,102 @@ packages:
boolbase: 1.0.0
dev: false
- /oauth@0.9.15:
- resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==}
+ /oauth4webapi@2.10.4:
+ resolution: {integrity: sha512-DSoj8QoChzOCQlJkRmYxAJCIpnXFW32R0Uq7avyghIeB6iJq0XAblOD7pcq3mx4WEBDwMuKr0Y1qveCBleG2Xw==}
dev: false
/object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
- /object-hash@2.2.0:
- resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
- engines: {node: '>= 6'}
- dev: false
-
/object-hash@3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
- /object-inspect@1.12.3:
- resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
- dev: false
+ /object-inspect@1.13.1:
+ resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
/object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
- dev: false
+ dev: true
- /object.assign@4.1.4:
- resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
+ /object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
+ call-bind: 1.0.7
+ define-properties: 1.2.1
has-symbols: 1.0.3
object-keys: 1.1.1
- dev: false
+ dev: true
- /object.entries@1.1.6:
- resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
+ /object.entries@1.1.8:
+ resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
- /object.fromentries@2.0.6:
- resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
+ /object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
- /object.groupby@1.0.0:
- resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==}
+ /object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- get-intrinsic: 1.2.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ dev: true
- /object.hasown@1.1.2:
- resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==}
+ /object.hasown@1.1.4:
+ resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==}
+ engines: {node: '>= 0.4'}
dependencies:
- define-properties: 1.2.0
- es-abstract: 1.22.1
- dev: false
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
- /object.values@1.1.6:
- resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
+ /object.values@1.2.0:
+ resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- dev: false
-
- /oidc-token-hash@5.0.3:
- resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==}
- engines: {node: ^10.13.0 || >=12.0.0}
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
/once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies:
wrappy: 1.0.2
+ dev: true
- /openid-client@5.4.3:
- resolution: {integrity: sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ==}
+ /openai@4.33.0:
+ resolution: {integrity: sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg==}
+ hasBin: true
dependencies:
- jose: 4.14.4
- lru-cache: 6.0.0
- object-hash: 2.2.0
- oidc-token-hash: 5.0.3
+ '@types/node': 18.19.30
+ '@types/node-fetch': 2.6.11
+ abort-controller: 3.0.0
+ agentkeepalive: 4.5.0
+ form-data-encoder: 1.7.2
+ formdata-node: 4.4.1
+ node-fetch: 2.7.0
+ web-streams-polyfill: 3.3.3
+ transitivePeerDependencies:
+ - encoding
dev: false
/optionator@0.9.3:
@@ -6371,58 +5751,40 @@ packages:
levn: 0.4.1
prelude-ls: 1.2.1
type-check: 0.4.0
-
- /p-limit@2.3.0:
- resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
- engines: {node: '>=6'}
- dependencies:
- p-try: 2.2.0
- dev: false
+ dev: true
/p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
dependencies:
yocto-queue: 0.1.0
-
- /p-locate@4.1.0:
- resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
- engines: {node: '>=8'}
- dependencies:
- p-limit: 2.3.0
- dev: false
+ dev: true
/p-locate@5.0.0:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
dependencies:
- p-limit: 3.1.0
-
- /p-map@2.1.0:
- resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==}
- engines: {node: '>=6'}
- dev: false
-
- /p-try@2.2.0:
- resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
- engines: {node: '>=6'}
- dev: false
+ p-limit: 3.1.0
+ dev: true
/parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
dependencies:
callsites: 3.1.0
+ dev: true
- /parse-entities@2.0.0:
- resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
+ /parse-entities@4.0.1:
+ resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
dependencies:
- character-entities: 1.2.4
- character-entities-legacy: 1.1.4
- character-reference-invalid: 1.1.4
- is-alphanumerical: 1.0.4
- is-decimal: 1.0.4
- is-hexadecimal: 1.0.4
+ '@types/unist': 2.0.10
+ character-entities: 2.0.2
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.0.2
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
dev: false
/parse5-htmlparser2-tree-adapter@7.0.0:
@@ -6441,14 +5803,12 @@ packages:
/path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
+ dev: true
/path-is-absolute@1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
-
- /path-is-inside@1.0.2:
- resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
- dev: false
+ dev: true
/path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
@@ -6457,26 +5817,24 @@ packages:
/path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- /path-scurry@1.10.1:
- resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
+ /path-scurry@1.10.2:
+ resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==}
engines: {node: '>=16 || 14 >=14.17'}
dependencies:
- lru-cache: 10.1.0
+ lru-cache: 10.2.0
minipass: 7.0.4
- dev: false
/path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
+ dev: true
- /pdf-parse@1.1.1:
- resolution: {integrity: sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==}
- engines: {node: '>=6.8.1'}
+ /periscopic@3.1.0:
+ resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
dependencies:
- debug: 3.2.7
- node-ensure: 0.0.0
- transitivePeerDependencies:
- - supports-color
+ '@types/estree': 1.0.5
+ estree-walker: 3.0.3
+ is-reference: 3.0.2
dev: false
/picocolors@1.0.0:
@@ -6490,56 +5848,43 @@ packages:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
- /pify@4.0.1:
- resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
- engines: {node: '>=6'}
- dev: false
-
- /pinkie-promise@2.0.1:
- resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
- engines: {node: '>=0.10.0'}
- dependencies:
- pinkie: 2.0.4
- dev: false
-
- /pinkie@2.0.4:
- resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
- engines: {node: '>=0.10.0'}
- dev: false
-
/pirates@4.0.6:
resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
engines: {node: '>= 6'}
- /pkg-dir@4.2.0:
- resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
- engines: {node: '>=8'}
- dependencies:
- find-up: 4.1.0
+ /pnpm@8.15.6:
+ resolution: {integrity: sha512-d7iem+d6Kwatj0A6Gcrl4il29hAj+YrTI9XDAZSVjrwC7gpq5dE+5FT2E05OjK8poF8LGg4dKxe8prah8RWfhg==}
+ engines: {node: '>=16.14'}
+ hasBin: true
dev: false
- /postcss-import@15.1.0(postcss@8.4.33):
+ /possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /postcss-import@15.1.0(postcss@8.4.38):
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
peerDependencies:
postcss: ^8.0.0
dependencies:
- postcss: 8.4.33
+ postcss: 8.4.38
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.4
+ resolve: 1.22.8
- /postcss-js@4.0.1(postcss@8.4.33):
+ /postcss-js@4.0.1(postcss@8.4.38):
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
postcss: ^8.4.21
dependencies:
camelcase-css: 2.0.1
- postcss: 8.4.33
+ postcss: 8.4.38
- /postcss-load-config@4.0.1(postcss@8.4.33):
- resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
+ /postcss-load-config@4.0.2(postcss@8.4.38):
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
engines: {node: '>= 14'}
peerDependencies:
postcss: '>=8.0.9'
@@ -6550,29 +5895,21 @@ packages:
ts-node:
optional: true
dependencies:
- lilconfig: 2.1.0
- postcss: 8.4.33
- yaml: 2.3.1
+ lilconfig: 3.1.1
+ postcss: 8.4.38
+ yaml: 2.4.1
- /postcss-nested@6.0.1(postcss@8.4.33):
+ /postcss-nested@6.0.1(postcss@8.4.38):
resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
dependencies:
- postcss: 8.4.33
- postcss-selector-parser: 6.0.13
-
- /postcss-selector-parser@6.0.10:
- resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
- engines: {node: '>=4'}
- dependencies:
- cssesc: 3.0.0
- util-deprecate: 1.0.2
- dev: true
+ postcss: 8.4.38
+ postcss-selector-parser: 6.0.16
- /postcss-selector-parser@6.0.13:
- resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
+ /postcss-selector-parser@6.0.16:
+ resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==}
engines: {node: '>=4'}
dependencies:
cssesc: 3.0.0
@@ -6587,43 +5924,44 @@ packages:
dependencies:
nanoid: 3.3.7
picocolors: 1.0.0
- source-map-js: 1.0.2
+ source-map-js: 1.2.0
dev: false
- /postcss@8.4.33:
- resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==}
+ /postcss@8.4.38:
+ resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
picocolors: 1.0.0
- source-map-js: 1.0.2
+ source-map-js: 1.2.0
- /preact-render-to-string@5.2.6(preact@10.17.1):
- resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==}
+ /preact-render-to-string@5.2.3(preact@10.11.3):
+ resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==}
peerDependencies:
preact: '>=10'
dependencies:
- preact: 10.17.1
+ preact: 10.11.3
pretty-format: 3.8.0
dev: false
- /preact@10.17.1:
- resolution: {integrity: sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==}
+ /preact@10.11.3:
+ resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==}
dev: false
/prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
+ dev: true
- /prettier-plugin-tailwindcss@0.5.7(prettier@3.1.0):
- resolution: {integrity: sha512-4v6uESAgwCni6YF6DwJlRaDjg9Z+al5zM4JfngcazMy4WEf/XkPS5TEQjbD+DZ5iNuG6RrKQLa/HuX2SYzC3kQ==}
+ /prettier-plugin-tailwindcss@0.5.13(prettier@3.2.5):
+ resolution: {integrity: sha512-2tPWHCFNC+WRjAC4SIWQNSOdcL1NNkydXim8w7TDqlZi+/ulZYz2OouAI6qMtkggnPt7lGamboj6LcTMwcCvoQ==}
engines: {node: '>=14.21.3'}
peerDependencies:
'@ianvs/prettier-plugin-sort-imports': '*'
'@prettier/plugin-pug': '*'
'@shopify/prettier-plugin-liquid': '*'
- '@shufo/prettier-plugin-blade': '*'
'@trivago/prettier-plugin-sort-imports': '*'
+ '@zackad/prettier-plugin-twig-melody': '*'
prettier: ^3.0
prettier-plugin-astro: '*'
prettier-plugin-css-order: '*'
@@ -6632,9 +5970,9 @@ packages:
prettier-plugin-marko: '*'
prettier-plugin-organize-attributes: '*'
prettier-plugin-organize-imports: '*'
+ prettier-plugin-sort-imports: '*'
prettier-plugin-style-order: '*'
prettier-plugin-svelte: '*'
- prettier-plugin-twig-melody: '*'
peerDependenciesMeta:
'@ianvs/prettier-plugin-sort-imports':
optional: true
@@ -6642,10 +5980,10 @@ packages:
optional: true
'@shopify/prettier-plugin-liquid':
optional: true
- '@shufo/prettier-plugin-blade':
- optional: true
'@trivago/prettier-plugin-sort-imports':
optional: true
+ '@zackad/prettier-plugin-twig-melody':
+ optional: true
prettier-plugin-astro:
optional: true
prettier-plugin-css-order:
@@ -6660,83 +5998,53 @@ packages:
optional: true
prettier-plugin-organize-imports:
optional: true
+ prettier-plugin-sort-imports:
+ optional: true
prettier-plugin-style-order:
optional: true
prettier-plugin-svelte:
optional: true
- prettier-plugin-twig-melody:
- optional: true
dependencies:
- prettier: 3.1.0
+ prettier: 3.2.5
dev: true
- /prettier@3.1.0:
- resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==}
+ /prettier@3.2.5:
+ resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
engines: {node: '>=14'}
hasBin: true
dev: true
- /pretty-bytes@5.6.0:
- resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
- engines: {node: '>=6'}
- dev: false
-
/pretty-format@3.8.0:
resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
dev: false
- /prisma@5.6.0:
- resolution: {integrity: sha512-EEaccku4ZGshdr2cthYHhf7iyvCcXqwJDvnoQRAJg5ge2Tzpv0e2BaMCp+CbbDUwoVTzwgOap9Zp+d4jFa2O9A==}
- engines: {node: '>=16.13'}
- hasBin: true
- requiresBuild: true
- dependencies:
- '@prisma/engines': 5.6.0
-
- /prismjs@1.27.0:
- resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
- engines: {node: '>=6'}
- dev: false
-
- /prismjs@1.29.0:
- resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
- engines: {node: '>=6'}
- dev: false
-
/prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 16.13.1
- dev: false
+ dev: true
- /property-information@5.6.0:
- resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
- dependencies:
- xtend: 4.0.2
+ /property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
dev: false
- /property-information@6.2.0:
- resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==}
- dev: false
+ /punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+ dev: true
- /proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+ /qs@6.11.2:
+ resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ side-channel: 1.0.6
dev: false
- /punycode@2.3.0:
- resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
- engines: {node: '>=6'}
-
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- /randombytes@2.1.0:
- resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
- dependencies:
- safe-buffer: 5.2.1
-
/react-dom@18.2.0(react@18.2.0):
resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
peerDependencies:
@@ -6747,22 +6055,8 @@ packages:
scheduler: 0.23.0
dev: false
- /react-hot-toast@2.4.1(csstype@3.1.2)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==}
- engines: {node: '>=10'}
- peerDependencies:
- react: '>=16'
- react-dom: '>=16'
- dependencies:
- goober: 2.1.13(csstype@3.1.2)
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- transitivePeerDependencies:
- - csstype
- dev: false
-
- /react-icons@5.0.0(react@18.2.0):
- resolution: {integrity: sha512-8gBBjYRrO14BU9RuMEVptG5aB1gwNPAAgsKOuPggx2hg332pTky/r8FidEJW95cL6IG2mYCEHaYuAxw74wLefw==}
+ /react-icons@5.0.1(react@18.2.0):
+ resolution: {integrity: sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==}
peerDependencies:
react: '*'
dependencies:
@@ -6771,57 +6065,41 @@ packages:
/react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
- dev: false
-
- /react-is@18.2.0:
- resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
- dev: false
+ dev: true
- /react-markdown@8.0.7(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==}
+ /react-markdown@9.0.1(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==}
peerDependencies:
- '@types/react': '>=16'
- react: '>=16'
+ '@types/react': '>=18'
+ react: '>=18'
dependencies:
- '@types/hast': 2.3.5
- '@types/prop-types': 15.7.5
- '@types/react': 18.2.47
- '@types/unist': 2.0.7
- comma-separated-tokens: 2.0.3
- hast-util-whitespace: 2.0.1
- prop-types: 15.8.1
- property-information: 6.2.0
+ '@types/hast': 3.0.4
+ '@types/react': 18.2.74
+ devlop: 1.1.0
+ hast-util-to-jsx-runtime: 2.3.0
+ html-url-attributes: 3.0.0
+ mdast-util-to-hast: 13.1.0
react: 18.2.0
- react-is: 18.2.0
- remark-parse: 10.0.2
- remark-rehype: 10.1.0
- space-separated-tokens: 2.0.2
- style-to-object: 0.4.2
- unified: 10.1.2
- unist-util-visit: 4.1.2
- vfile: 5.3.7
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.0
+ unified: 11.0.4
+ unist-util-visit: 5.0.0
+ vfile: 6.0.1
transitivePeerDependencies:
- supports-color
dev: false
- /react-remove-scroll-bar@2.3.4(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==}
- engines: {node: '>=10'}
+ /react-mathjax@1.0.1(react@18.2.0):
+ resolution: {integrity: sha512-+mjFcciZY3GQoqiQm3aRTyDjgBKuoaXpY+SCONX00jScuPpTKwnASeFMS5+pbTIzDf5zPT2Y9ZZfQ9U/d4CKtQ==}
peerDependencies:
- '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ react: ^16.3.0
dependencies:
- '@types/react': 18.2.47
+ load-script: 1.0.0
react: 18.2.0
- react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.2.0)
- tslib: 2.6.2
dev: false
- /react-remove-scroll@2.5.4(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==}
+ /react-remove-scroll-bar@2.3.6(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
@@ -6830,16 +6108,13 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.47
+ '@types/react': 18.2.74
react: 18.2.0
- react-remove-scroll-bar: 2.3.4(@types/react@18.2.47)(react@18.2.0)
- react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.2.0)
+ react-style-singleton: 2.2.1(@types/react@18.2.74)(react@18.2.0)
tslib: 2.6.2
- use-callback-ref: 1.3.0(@types/react@18.2.47)(react@18.2.0)
- use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.2.0)
dev: false
- /react-remove-scroll@2.5.5(@types/react@18.2.47)(react@18.2.0):
+ /react-remove-scroll@2.5.5(@types/react@18.2.74)(react@18.2.0):
resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
engines: {node: '>=10'}
peerDependencies:
@@ -6849,34 +6124,32 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.47
+ '@types/react': 18.2.74
react: 18.2.0
- react-remove-scroll-bar: 2.3.4(@types/react@18.2.47)(react@18.2.0)
- react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.2.0)
+ react-remove-scroll-bar: 2.3.6(@types/react@18.2.74)(react@18.2.0)
+ react-style-singleton: 2.2.1(@types/react@18.2.74)(react@18.2.0)
tslib: 2.6.2
- use-callback-ref: 1.3.0(@types/react@18.2.47)(react@18.2.0)
- use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.2.0)
+ use-callback-ref: 1.3.2(@types/react@18.2.74)(react@18.2.0)
+ use-sidecar: 1.1.2(@types/react@18.2.74)(react@18.2.0)
dev: false
- /react-speech-recognition@3.10.0(react@18.2.0):
- resolution: {integrity: sha512-EVSr4Ik8l9urwdPiK2r0+ADrLyDDrjB0qBRdUWO+w2MfwEBrj6NuRmy1GD3x7BU/V6/hab0pl8Lupen0zwlJyw==}
+ /react-spring-lightbox@1.8.0(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8):
+ resolution: {integrity: sha512-vMYqr1Y8YR6hcT4XCeUglj/SAJ8xUU5ZdZX8td1ngACFf4lW/4WhSWlWTZ/8Bv6QGPRxlRAUR9V1fahsEfNTLg==}
+ engines: {node: '>=16', npm: '>=7'}
peerDependencies:
- react: '>=16.8.0'
- dependencies:
- react: 18.2.0
- dev: false
-
- /react-spinners@0.13.8(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==}
- peerDependencies:
- react: ^16.0.0 || ^17.0.0 || ^18.0.0
- react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
+ react: '>=16.8'
+ react-dom: '>=16.8'
+ styled-components: '>=5.X'
dependencies:
+ '@babel/runtime': 7.24.4
+ '@react-spring/web': 9.7.3(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
+ react-use-gesture: 9.1.3(react@18.2.0)
+ styled-components: 6.1.8(react-dom@18.2.0)(react@18.2.0)
dev: false
- /react-style-singleton@2.2.1(@types/react@18.2.47)(react@18.2.0):
+ /react-style-singleton@2.2.1(@types/react@18.2.74)(react@18.2.0):
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
engines: {node: '>=10'}
peerDependencies:
@@ -6886,38 +6159,20 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.47
+ '@types/react': 18.2.74
get-nonce: 1.0.1
invariant: 2.2.4
react: 18.2.0
tslib: 2.6.2
dev: false
- /react-syntax-highlighter@15.5.0(react@18.2.0):
- resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==}
+ /react-use-gesture@9.1.3(react@18.2.0):
+ resolution: {integrity: sha512-CdqA2SmS/fj3kkS2W8ZU8wjTbVBAIwDWaRprX7OKaj7HlGwBasGEFggmk5qNklknqk9zK/h8D355bEJFTpqEMg==}
+ deprecated: This package is no longer maintained. Please use @use-gesture/react instead
peerDependencies:
- react: '>= 0.14.0'
+ react: '>= 16.8.0'
dependencies:
- '@babel/runtime': 7.22.11
- highlight.js: 10.7.3
- lowlight: 1.20.0
- prismjs: 1.29.0
react: 18.2.0
- refractor: 3.6.0
- dev: false
-
- /react-textarea-autosize@8.5.3(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==}
- engines: {node: '>=10'}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- dependencies:
- '@babel/runtime': 7.22.11
- react: 18.2.0
- use-composed-ref: 1.3.0(react@18.2.0)
- use-latest: 1.2.1(@types/react@18.2.47)(react@18.2.0)
- transitivePeerDependencies:
- - '@types/react'
dev: false
/react@18.2.0:
@@ -6938,225 +6193,157 @@ packages:
dependencies:
picomatch: 2.3.1
- /reflect.getprototypeof@1.0.3:
- resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==}
+ /reflect.getprototypeof@1.0.6:
+ resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
globalthis: 1.0.3
which-builtin-type: 1.1.3
- dev: false
-
- /refractor@3.6.0:
- resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==}
- dependencies:
- hastscript: 6.0.0
- parse-entities: 2.0.0
- prismjs: 1.27.0
- dev: false
-
- /regenerate-unicode-properties@10.1.0:
- resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==}
- engines: {node: '>=4'}
- dependencies:
- regenerate: 1.4.2
- dev: false
-
- /regenerate@1.4.2:
- resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
- dev: false
-
- /regenerator-runtime@0.14.0:
- resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
- dev: false
+ dev: true
- /regenerator-transform@0.15.2:
- resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
- dependencies:
- '@babel/runtime': 7.22.11
- dev: false
+ /regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
- /regexp.prototype.flags@1.5.0:
- resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==}
+ /regexp.prototype.flags@1.5.2:
+ resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- functions-have-names: 1.2.3
- dev: false
-
- /regexpu-core@5.3.2:
- resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==}
- engines: {node: '>=4'}
- dependencies:
- '@babel/regjsgen': 0.8.0
- regenerate: 1.4.2
- regenerate-unicode-properties: 10.1.0
- regjsparser: 0.9.1
- unicode-match-property-ecmascript: 2.0.0
- unicode-match-property-value-ecmascript: 2.1.0
- dev: false
-
- /regjsparser@0.9.1:
- resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
- hasBin: true
- dependencies:
- jsesc: 0.5.0
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ set-function-name: 2.0.2
+ dev: true
- /rehype-katex@6.0.3:
- resolution: {integrity: sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==}
+ /rehype-katex@7.0.0:
+ resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==}
dependencies:
- '@types/hast': 2.3.5
- '@types/katex': 0.14.0
- hast-util-from-html-isomorphic: 1.0.0
- hast-util-to-text: 3.1.2
- katex: 0.16.8
- unist-util-visit: 4.1.2
+ '@types/hast': 3.0.4
+ '@types/katex': 0.16.7
+ hast-util-from-html-isomorphic: 2.0.0
+ hast-util-to-text: 4.0.0
+ katex: 0.16.10
+ unist-util-visit-parents: 6.0.1
+ vfile: 6.0.1
dev: false
- /remark-gfm@3.0.1:
- resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==}
+ /remark-gfm@4.0.0:
+ resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==}
dependencies:
- '@types/mdast': 3.0.12
- mdast-util-gfm: 2.0.2
- micromark-extension-gfm: 2.0.3
- unified: 10.1.2
+ '@types/mdast': 4.0.3
+ mdast-util-gfm: 3.0.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.4
transitivePeerDependencies:
- supports-color
dev: false
- /remark-math@5.1.1:
- resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==}
+ /remark-math@6.0.0:
+ resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==}
dependencies:
- '@types/mdast': 3.0.12
- mdast-util-math: 2.0.2
- micromark-extension-math: 2.1.2
- unified: 10.1.2
+ '@types/mdast': 4.0.3
+ mdast-util-math: 3.0.0
+ micromark-extension-math: 3.0.0
+ unified: 11.0.4
+ transitivePeerDependencies:
+ - supports-color
dev: false
- /remark-parse@10.0.2:
- resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==}
+ /remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
dependencies:
- '@types/mdast': 3.0.12
- mdast-util-from-markdown: 1.3.1
- unified: 10.1.2
+ '@types/mdast': 4.0.3
+ mdast-util-from-markdown: 2.0.0
+ micromark-util-types: 2.0.0
+ unified: 11.0.4
transitivePeerDependencies:
- supports-color
dev: false
- /remark-rehype@10.1.0:
- resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==}
+ /remark-rehype@11.1.0:
+ resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==}
dependencies:
- '@types/hast': 2.3.5
- '@types/mdast': 3.0.12
- mdast-util-to-hast: 12.3.0
- unified: 10.1.2
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.3
+ mdast-util-to-hast: 13.1.0
+ unified: 11.0.4
+ vfile: 6.0.1
dev: false
- /require-from-string@2.0.2:
- resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
- engines: {node: '>=0.10.0'}
+ /remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+ dependencies:
+ '@types/mdast': 4.0.3
+ mdast-util-to-markdown: 2.1.0
+ unified: 11.0.4
dev: false
/resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
+ dev: true
/resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
- dev: false
+ dev: true
- /resolve@1.22.4:
- resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==}
+ /resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
hasBin: true
dependencies:
- is-core-module: 2.13.0
+ is-core-module: 2.13.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- /resolve@2.0.0-next.4:
- resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
+ /resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
hasBin: true
dependencies:
- is-core-module: 2.13.0
+ is-core-module: 2.13.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- dev: false
+ dev: true
/reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
- /rimraf@2.7.1:
- resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
- hasBin: true
- dependencies:
- glob: 7.2.3
- dev: false
-
/rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
hasBin: true
dependencies:
glob: 7.2.3
-
- /rollup-plugin-terser@7.0.2(rollup@2.79.1):
- resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
- deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
- peerDependencies:
- rollup: ^2.0.0
- dependencies:
- '@babel/code-frame': 7.22.10
- jest-worker: 26.6.2
- rollup: 2.79.1
- serialize-javascript: 4.0.0
- terser: 5.19.2
- dev: false
-
- /rollup@2.79.1:
- resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==}
- engines: {node: '>=10.0.0'}
- hasBin: true
- optionalDependencies:
- fsevents: 2.3.3
- dev: false
+ dev: true
/run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
queue-microtask: 1.2.3
- /sade@1.8.1:
- resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
- engines: {node: '>=6'}
- dependencies:
- mri: 1.2.0
- dev: false
-
- /safe-array-concat@1.0.0:
- resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==}
+ /safe-array-concat@1.1.2:
+ resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
engines: {node: '>=0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
has-symbols: 1.0.3
isarray: 2.0.5
- dev: false
-
- /safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
- /safe-regex-test@1.0.0:
- resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ /safe-regex-test@1.0.3:
+ resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ es-errors: 1.3.0
is-regex: 1.1.4
- dev: false
+ dev: true
/scheduler@0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
@@ -7164,50 +6351,66 @@ packages:
loose-envify: 1.4.0
dev: false
- /schema-utils@2.7.1:
- resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==}
- engines: {node: '>= 8.9.0'}
- dependencies:
- '@types/json-schema': 7.0.12
- ajv: 6.12.6
- ajv-keywords: 3.5.2(ajv@6.12.6)
+ /secure-json-parse@2.7.0:
+ resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
dev: false
- /schema-utils@3.3.0:
- resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
- engines: {node: '>= 10.13.0'}
- dependencies:
- '@types/json-schema': 7.0.12
- ajv: 6.12.6
- ajv-keywords: 3.5.2(ajv@6.12.6)
-
/semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
- dev: false
+ dev: true
- /semver@7.5.4:
- resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ /semver@7.6.0:
+ resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
engines: {node: '>=10'}
hasBin: true
dependencies:
lru-cache: 6.0.0
+ dev: true
- /serialize-javascript@4.0.0:
- resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
+ /seroval-plugins@1.0.5(seroval@1.0.5):
+ resolution: {integrity: sha512-8+pDC1vOedPXjKG7oz8o+iiHrtF2WswaMQJ7CKFpccvSYfrzmvKY9zOJWCg+881722wIHfwkdnRmiiDm9ym+zQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ seroval: ^1.0
dependencies:
- randombytes: 2.1.0
+ seroval: 1.0.5
dev: false
- /serialize-javascript@6.0.1:
- resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==}
- dependencies:
- randombytes: 2.1.0
+ /seroval@1.0.5:
+ resolution: {integrity: sha512-TM+Z11tHHvQVQKeNlOUonOWnsNM+2IBwZ4vwoi4j3zKzIpc5IDw8WPwCfcc8F17wy6cBcJGbZbFOR0UCuTZHQA==}
+ engines: {node: '>=10'}
+ dev: false
/server-only@0.0.1:
resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
dev: false
+ /set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.2
+
+ /set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+ dev: false
+
/shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
@@ -7218,61 +6421,70 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
- /side-channel@1.0.4:
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ /side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- object-inspect: 1.12.3
- dev: false
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.1
/signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
- dev: false
/slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
+ dev: true
- /source-list-map@2.0.1:
- resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==}
- dev: false
-
- /source-map-js@1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
-
- /source-map-support@0.5.21:
- resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ /solid-js@1.8.16:
+ resolution: {integrity: sha512-rja94MNU9flF3qQRLNsu60QHKBDKBkVE1DldJZPIfn2ypIn3NV2WpSbGTQIvsyGPBo+9E2IMjwqnqpbgfWuzeg==}
dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
-
- /source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
+ csstype: 3.1.3
+ seroval: 1.0.5
+ seroval-plugins: 1.0.5(seroval@1.0.5)
+ dev: false
- /source-map@0.8.0-beta.0:
- resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
- engines: {node: '>= 8'}
+ /solid-swr-store@0.10.7(solid-js@1.8.16)(swr-store@0.10.6):
+ resolution: {integrity: sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ solid-js: ^1.2
+ swr-store: ^0.10
dependencies:
- whatwg-url: 7.1.0
+ solid-js: 1.8.16
+ swr-store: 0.10.6
dev: false
- /sourcemap-codec@1.4.8:
- resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
- deprecated: Please use @jridgewell/sourcemap-codec instead
+ /sonner@1.4.41(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-uG511ggnnsw6gcn/X+YKkWPo5ep9il9wYi3QJxHsYe7yTZ4+cOd1wuodOUmOpFuXL+/RE3R04LczdNCDygTDgQ==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
dev: false
- /space-separated-tokens@1.1.5:
- resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==}
- dev: false
+ /source-map-js@1.2.0:
+ resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ engines: {node: '>=0.10.0'}
/space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
dev: false
+ /sswr@2.0.0(svelte@4.2.12):
+ resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==}
+ peerDependencies:
+ svelte: ^4.0.0
+ dependencies:
+ svelte: 4.2.12
+ swrev: 4.0.0
+ dev: false
+
/streamsearch@1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'}
@@ -7285,7 +6497,6 @@ packages:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
- dev: false
/string-width@5.1.2:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
@@ -7294,53 +6505,57 @@ packages:
eastasianwidth: 0.2.0
emoji-regex: 9.2.2
strip-ansi: 7.1.0
- dev: false
- /string.prototype.matchall@4.0.8:
- resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
+ /string.prototype.matchall@4.0.11:
+ resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
has-symbols: 1.0.3
- internal-slot: 1.0.5
- regexp.prototype.flags: 1.5.0
- side-channel: 1.0.4
- dev: false
+ internal-slot: 1.0.7
+ regexp.prototype.flags: 1.5.2
+ set-function-name: 2.0.2
+ side-channel: 1.0.6
+ dev: true
- /string.prototype.trim@1.2.7:
- resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
+ /string.prototype.trim@1.2.9:
+ resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
- /string.prototype.trimend@1.0.6:
- resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
+ /string.prototype.trimend@1.0.8:
+ resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
- /string.prototype.trimstart@1.0.6:
- resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
+ /string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.1
- dev: false
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
- /stringify-object@3.3.0:
- resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
- engines: {node: '>=4'}
+ /stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
dependencies:
- get-own-enumerable-property-symbols: 3.0.2
- is-obj: 1.0.1
- is-regexp: 1.0.0
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
dev: false
/strip-ansi@6.0.1:
@@ -7354,29 +6569,48 @@ packages:
engines: {node: '>=12'}
dependencies:
ansi-regex: 6.0.1
- dev: false
/strip-bom@3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
- dev: false
-
- /strip-comments@2.0.1:
- resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==}
- engines: {node: '>=10'}
- dev: false
+ dev: true
/strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ dev: true
+
+ /strnum@1.0.5:
+ resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
+ dev: false
+
+ /style-to-object@1.0.6:
+ resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==}
+ dependencies:
+ inline-style-parser: 0.2.3
+ dev: false
- /style-to-object@0.4.2:
- resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==}
+ /styled-components@6.1.8(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ react: '>= 16.8.0'
+ react-dom: '>= 16.8.0'
dependencies:
- inline-style-parser: 0.1.1
+ '@emotion/is-prop-valid': 1.2.1
+ '@emotion/unitless': 0.8.0
+ '@types/stylis': 4.2.0
+ css-to-react-native: 3.2.0
+ csstype: 3.1.2
+ postcss: 8.4.31
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ shallowequal: 1.1.0
+ stylis: 4.3.1
+ tslib: 2.5.0
dev: false
- /styled-jsx@5.1.1(@babel/core@7.23.2)(react@18.2.0):
+ /styled-jsx@5.1.1(react@18.2.0):
resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
engines: {node: '>= 12.0.0'}
peerDependencies:
@@ -7389,143 +6623,138 @@ packages:
babel-plugin-macros:
optional: true
dependencies:
- '@babel/core': 7.23.2
client-only: 0.0.1
react: 18.2.0
dev: false
- /sucrase@3.34.0:
- resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==}
- engines: {node: '>=8'}
+ /stylis@4.3.1:
+ resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==}
+ dev: false
+
+ /sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
dependencies:
- '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/gen-mapping': 0.3.5
commander: 4.1.1
- glob: 7.1.6
+ glob: 10.3.12
lines-and-columns: 1.2.4
mz: 2.7.0
pirates: 4.0.6
- ts-interface-checker: 0.1.13
-
- /supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
- dependencies:
- has-flag: 3.0.0
- dev: false
+ ts-interface-checker: 0.1.13
/supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
dependencies:
has-flag: 4.0.0
-
- /supports-color@8.1.1:
- resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
- engines: {node: '>=10'}
- dependencies:
- has-flag: 4.0.0
+ dev: true
/supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- /tailwind-merge@1.14.0:
- resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==}
+ /svelte@4.2.12:
+ resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==}
+ engines: {node: '>=16'}
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.25
+ '@types/estree': 1.0.5
+ acorn: 8.11.3
+ aria-query: 5.3.0
+ axobject-query: 4.0.0
+ code-red: 1.0.4
+ css-tree: 2.3.1
+ estree-walker: 3.0.3
+ is-reference: 3.0.2
+ locate-character: 3.0.0
+ magic-string: 0.30.9
+ periscopic: 3.1.0
+ dev: false
+
+ /swr-store@0.10.6:
+ resolution: {integrity: sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw==}
+ engines: {node: '>=10'}
+ dependencies:
+ dequal: 2.0.3
+ dev: false
+
+ /swr@2.2.0(react@18.2.0):
+ resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==}
+ peerDependencies:
+ react: ^16.11.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ use-sync-external-store: 1.2.0(react@18.2.0)
+ dev: false
+
+ /swrev@4.0.0:
+ resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==}
+ dev: false
+
+ /swrv@1.0.4(vue@3.4.21):
+ resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==}
+ peerDependencies:
+ vue: '>=3.2.26 < 4'
+ dependencies:
+ vue: 3.4.21(typescript@5.4.4)
+ dev: false
+
+ /tailwind-merge@2.2.2:
+ resolution: {integrity: sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==}
+ dependencies:
+ '@babel/runtime': 7.24.4
dev: false
- /tailwindcss-animate@1.0.7(tailwindcss@3.4.1):
+ /tailwindcss-animate@1.0.7(tailwindcss@3.4.3):
resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
peerDependencies:
tailwindcss: '>=3.0.0 || insiders'
dependencies:
- tailwindcss: 3.4.1
+ tailwindcss: 3.4.3
dev: false
- /tailwindcss@3.4.1:
- resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==}
+ /tailwindcss@3.4.3:
+ resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==}
engines: {node: '>=14.0.0'}
hasBin: true
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
- chokidar: 3.5.3
+ chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
- fast-glob: 3.3.1
+ fast-glob: 3.3.2
glob-parent: 6.0.2
is-glob: 4.0.3
- jiti: 1.19.3
+ jiti: 1.21.0
lilconfig: 2.1.0
micromatch: 4.0.5
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.0.0
- postcss: 8.4.33
- postcss-import: 15.1.0(postcss@8.4.33)
- postcss-js: 4.0.1(postcss@8.4.33)
- postcss-load-config: 4.0.1(postcss@8.4.33)
- postcss-nested: 6.0.1(postcss@8.4.33)
- postcss-selector-parser: 6.0.13
- resolve: 1.22.4
- sucrase: 3.34.0
+ postcss: 8.4.38
+ postcss-import: 15.1.0(postcss@8.4.38)
+ postcss-js: 4.0.1(postcss@8.4.38)
+ postcss-load-config: 4.0.2(postcss@8.4.38)
+ postcss-nested: 6.0.1(postcss@8.4.38)
+ postcss-selector-parser: 6.0.16
+ resolve: 1.22.8
+ sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
/tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
-
- /temp-dir@2.0.0:
- resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
- engines: {node: '>=8'}
- dev: false
-
- /tempy@0.6.0:
- resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==}
- engines: {node: '>=10'}
- dependencies:
- is-stream: 2.0.1
- temp-dir: 2.0.0
- type-fest: 0.16.0
- unique-string: 2.0.0
- dev: false
-
- /terser-webpack-plugin@5.3.9(webpack@5.88.2):
- resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==}
- engines: {node: '>= 10.13.0'}
- peerDependencies:
- '@swc/core': '*'
- esbuild: '*'
- uglify-js: '*'
- webpack: ^5.1.0
- peerDependenciesMeta:
- '@swc/core':
- optional: true
- esbuild:
- optional: true
- uglify-js:
- optional: true
- dependencies:
- '@jridgewell/trace-mapping': 0.3.19
- jest-worker: 27.5.1
- schema-utils: 3.3.0
- serialize-javascript: 6.0.1
- terser: 5.19.2
- webpack: 5.88.2
-
- /terser@5.19.2:
- resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==}
- engines: {node: '>=10'}
- hasBin: true
- dependencies:
- '@jridgewell/source-map': 0.3.5
- acorn: 8.10.0
- commander: 2.20.3
- source-map-support: 0.5.21
+ dev: true
/text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
/thenify-all@1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
@@ -7555,38 +6784,45 @@ packages:
dependencies:
is-number: 7.0.0
- /tr46@1.0.1:
- resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
- dependencies:
- punycode: 2.3.0
+ /tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
dev: false
/trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
dev: false
- /trough@2.1.0:
- resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==}
+ /trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
dev: false
- /ts-api-utils@1.0.3(typescript@5.3.3):
- resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==}
- engines: {node: '>=16.13.0'}
+ /ts-api-utils@1.3.0(typescript@5.4.4):
+ resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
+ engines: {node: '>=16'}
peerDependencies:
typescript: '>=4.2.0'
dependencies:
- typescript: 5.3.3
+ typescript: 5.4.4
+ dev: true
/ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- /tsconfig-paths@3.14.2:
- resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==}
+ /tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
dependencies:
'@types/json5': 0.0.29
json5: 1.0.2
minimist: 1.2.8
strip-bom: 3.0.0
+ dev: true
+
+ /tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ dev: false
+
+ /tslib@2.5.0:
+ resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
dev: false
/tslib@2.6.2:
@@ -7598,202 +6834,156 @@ packages:
engines: {node: '>= 0.8.0'}
dependencies:
prelude-ls: 1.2.1
-
- /type-fest@0.16.0:
- resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==}
- engines: {node: '>=10'}
- dev: false
+ dev: true
/type-fest@0.20.2:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
+ dev: true
- /typed-array-buffer@1.0.0:
- resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
+ /typed-array-buffer@1.0.2:
+ resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- is-typed-array: 1.1.12
- dev: false
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-typed-array: 1.1.13
+ dev: true
- /typed-array-byte-length@1.0.0:
- resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
+ /typed-array-byte-length@1.0.1:
+ resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.12
- dev: false
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ dev: true
- /typed-array-byte-offset@1.0.0:
- resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
+ /typed-array-byte-offset@1.0.2:
+ resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
engines: {node: '>= 0.4'}
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.12
- dev: false
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ dev: true
- /typed-array-length@1.0.4:
- resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+ /typed-array-length@1.0.6:
+ resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
for-each: 0.3.3
- is-typed-array: 1.1.12
- dev: false
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ possible-typed-array-names: 1.0.0
+ dev: true
- /typescript@5.3.3:
- resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+ /typescript@5.4.4:
+ resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==}
engines: {node: '>=14.17'}
hasBin: true
/unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
has-bigints: 1.0.2
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
- dev: false
+ dev: true
/undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
- /unicode-canonical-property-names-ecmascript@2.0.0:
- resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
- engines: {node: '>=4'}
- dev: false
-
- /unicode-match-property-ecmascript@2.0.0:
- resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
- engines: {node: '>=4'}
- dependencies:
- unicode-canonical-property-names-ecmascript: 2.0.0
- unicode-property-aliases-ecmascript: 2.1.0
- dev: false
-
- /unicode-match-property-value-ecmascript@2.1.0:
- resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==}
- engines: {node: '>=4'}
- dev: false
-
- /unicode-property-aliases-ecmascript@2.1.0:
- resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
- engines: {node: '>=4'}
- dev: false
-
- /unified@10.1.2:
- resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
+ /unified@11.0.4:
+ resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==}
dependencies:
- '@types/unist': 2.0.7
+ '@types/unist': 3.0.2
bail: 2.0.2
+ devlop: 1.1.0
extend: 3.0.2
- is-buffer: 2.0.5
is-plain-obj: 4.1.0
- trough: 2.1.0
- vfile: 5.3.7
- dev: false
-
- /unique-string@2.0.0:
- resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
- engines: {node: '>=8'}
- dependencies:
- crypto-random-string: 2.0.0
+ trough: 2.2.0
+ vfile: 6.0.1
dev: false
- /unist-util-find-after@4.0.1:
- resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==}
+ /unist-util-find-after@5.0.0:
+ resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
dependencies:
- '@types/unist': 2.0.7
- unist-util-is: 5.2.1
+ '@types/unist': 3.0.2
+ unist-util-is: 6.0.0
dev: false
- /unist-util-generated@2.0.1:
- resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==}
- dev: false
-
- /unist-util-is@5.2.1:
- resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
+ /unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
dependencies:
- '@types/unist': 2.0.7
+ '@types/unist': 3.0.2
dev: false
- /unist-util-position@4.0.4:
- resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+ /unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
dependencies:
- '@types/unist': 2.0.7
+ '@types/unist': 3.0.2
dev: false
- /unist-util-remove-position@4.0.2:
- resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==}
+ /unist-util-remove-position@5.0.0:
+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
dependencies:
- '@types/unist': 2.0.7
- unist-util-visit: 4.1.2
+ '@types/unist': 3.0.2
+ unist-util-visit: 5.0.0
dev: false
- /unist-util-stringify-position@3.0.3:
- resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
+ /unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
dependencies:
- '@types/unist': 2.0.7
+ '@types/unist': 3.0.2
dev: false
- /unist-util-visit-parents@5.1.3:
- resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
+ /unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
dependencies:
- '@types/unist': 2.0.7
- unist-util-is: 5.2.1
+ '@types/unist': 3.0.2
+ unist-util-is: 6.0.0
dev: false
- /unist-util-visit@4.1.2:
- resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==}
+ /unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
dependencies:
- '@types/unist': 2.0.7
- unist-util-is: 5.2.1
- unist-util-visit-parents: 5.1.3
- dev: false
-
- /universalify@2.0.0:
- resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
- engines: {node: '>= 10.0.0'}
- dev: false
-
- /upath@1.2.0:
- resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
- engines: {node: '>=4'}
+ '@types/unist': 3.0.2
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
dev: false
- /update-browserslist-db@1.0.11(browserslist@4.21.10):
- resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
- dependencies:
- browserslist: 4.21.10
- escalade: 3.1.1
- picocolors: 1.0.0
-
- /update-browserslist-db@1.0.13(browserslist@4.22.1):
+ /update-browserslist-db@1.0.13(browserslist@4.23.0):
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
dependencies:
- browserslist: 4.22.1
- escalade: 3.1.1
+ browserslist: 4.23.0
+ escalade: 3.1.2
picocolors: 1.0.0
- dev: false
+ dev: true
/uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies:
- punycode: 2.3.0
+ punycode: 2.3.1
+ dev: true
+
+ /url-join@4.0.1:
+ resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==}
+ dev: false
- /use-callback-ref@1.3.0(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==}
+ /use-callback-ref@1.3.2(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
@@ -7802,185 +6992,128 @@ packages:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.47
+ '@types/react': 18.2.74
react: 18.2.0
tslib: 2.6.2
dev: false
- /use-composed-ref@1.3.0(react@18.2.0):
- resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- dependencies:
- react: 18.2.0
- dev: false
-
- /use-intl@3.1.4(react@18.2.0):
- resolution: {integrity: sha512-iBIHPetLeEdAuIhAXRI9ukfjjvadP2EWoAEl6IvbWojrwYgcP52A6Al1nyzIwZD7iWBU1T3Ri3Hg4HsV7cWlVA==}
+ /use-intl@3.11.1(react@18.2.0):
+ resolution: {integrity: sha512-pFfrQXa3LBHh2MairVFUEXp6BnVcqJno9wbHIEaH0n7ib2kNTMP8jjjuboLHEIphRHygEpbFAjKIr0glUHCytA==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
- '@formatjs/ecma402-abstract': 1.17.0
+ '@formatjs/ecma402-abstract': 1.18.2
intl-messageformat: 9.13.0
react: 18.2.0
dev: false
- /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@types/react': 18.2.47
- react: 18.2.0
- dev: false
-
- /use-latest@1.2.1(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==}
+ /use-sidecar@1.1.2(@types/react@18.2.74)(react@18.2.0):
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
+ engines: {node: '>=10'}
peerDependencies:
- '@types/react': '*'
+ '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
peerDependenciesMeta:
'@types/react':
optional: true
dependencies:
- '@types/react': 18.2.47
+ '@types/react': 18.2.74
+ detect-node-es: 1.1.0
react: 18.2.0
- use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.47)(react@18.2.0)
+ tslib: 2.6.2
dev: false
- /use-sidecar@1.1.2(@types/react@18.2.47)(react@18.2.0):
- resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
- engines: {node: '>=10'}
+ /use-sync-external-store@1.2.0(react@18.2.0):
+ resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
peerDependencies:
- '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
dependencies:
- '@types/react': 18.2.47
- detect-node-es: 1.1.0
react: 18.2.0
- tslib: 2.6.2
dev: false
/util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- /uuid@8.3.2:
- resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ /uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
hasBin: true
dev: false
- /uvu@0.5.6:
- resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
- engines: {node: '>=8'}
- hasBin: true
+ /vaul@0.9.0(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-bZSySGbAHiTXmZychprnX/dE0EsSige88xtyyL3/MCRbrFotRPQZo7UdydGXZWw+CKbNOw5Ow8gwAo93/nB/Cg==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
- dequal: 2.0.3
- diff: 5.1.0
- kleur: 4.1.5
- sade: 1.8.1
+ '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
dev: false
- /vfile-location@4.1.0:
- resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==}
+ /vfile-location@5.0.2:
+ resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==}
dependencies:
- '@types/unist': 2.0.7
- vfile: 5.3.7
+ '@types/unist': 3.0.2
+ vfile: 6.0.1
dev: false
- /vfile-message@3.1.4:
- resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
+ /vfile-message@4.0.2:
+ resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
dependencies:
- '@types/unist': 2.0.7
- unist-util-stringify-position: 3.0.3
+ '@types/unist': 3.0.2
+ unist-util-stringify-position: 4.0.0
dev: false
- /vfile@5.3.7:
- resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==}
+ /vfile@6.0.1:
+ resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==}
dependencies:
- '@types/unist': 2.0.7
- is-buffer: 2.0.5
- unist-util-stringify-position: 3.0.3
- vfile-message: 3.1.4
+ '@types/unist': 3.0.2
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.2
dev: false
- /watchpack@2.4.0:
- resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
- engines: {node: '>=10.13.0'}
+ /vue@3.4.21(typescript@5.4.4):
+ resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
dependencies:
- glob-to-regexp: 0.4.1
- graceful-fs: 4.2.11
+ '@vue/compiler-dom': 3.4.21
+ '@vue/compiler-sfc': 3.4.21
+ '@vue/runtime-dom': 3.4.21
+ '@vue/server-renderer': 3.4.21(vue@3.4.21)
+ '@vue/shared': 3.4.21
+ typescript: 5.4.4
+ dev: false
/web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
dev: false
- /webidl-conversions@4.0.2:
- resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
+ /web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
dev: false
- /webpack-sources@1.4.3:
- resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==}
- dependencies:
- source-list-map: 2.0.1
- source-map: 0.6.1
+ /web-streams-polyfill@4.0.0-beta.3:
+ resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==}
+ engines: {node: '>= 14'}
dev: false
- /webpack-sources@3.2.3:
- resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
- engines: {node: '>=10.13.0'}
-
- /webpack@5.88.2:
- resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==}
- engines: {node: '>=10.13.0'}
- hasBin: true
- peerDependencies:
- webpack-cli: '*'
- peerDependenciesMeta:
- webpack-cli:
- optional: true
- dependencies:
- '@types/eslint-scope': 3.7.4
- '@types/estree': 1.0.1
- '@webassemblyjs/ast': 1.11.6
- '@webassemblyjs/wasm-edit': 1.11.6
- '@webassemblyjs/wasm-parser': 1.11.6
- acorn: 8.10.0
- acorn-import-assertions: 1.9.0(acorn@8.10.0)
- browserslist: 4.21.10
- chrome-trace-event: 1.0.3
- enhanced-resolve: 5.15.0
- es-module-lexer: 1.3.0
- eslint-scope: 5.1.1
- events: 3.3.0
- glob-to-regexp: 0.4.1
- graceful-fs: 4.2.11
- json-parse-even-better-errors: 2.3.1
- loader-runner: 4.3.0
- mime-types: 2.1.35
- neo-async: 2.6.2
- schema-utils: 3.3.0
- tapable: 2.2.1
- terser-webpack-plugin: 5.3.9(webpack@5.88.2)
- watchpack: 2.4.0
- webpack-sources: 3.2.3
- transitivePeerDependencies:
- - '@swc/core'
- - esbuild
- - uglify-js
+ /webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+ dev: false
- /whatwg-url@7.1.0:
- resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
+ /whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies:
- lodash.sortby: 4.7.0
- tr46: 1.0.1
- webidl-conversions: 4.0.2
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
dev: false
/which-boxed-primitive@1.0.2:
@@ -7991,14 +7124,14 @@ packages:
is-number-object: 1.0.7
is-string: 1.0.7
is-symbol: 1.0.4
- dev: false
+ dev: true
/which-builtin-type@1.1.3:
resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==}
engines: {node: '>= 0.4'}
dependencies:
- function.prototype.name: 1.1.5
- has-tostringtag: 1.0.0
+ function.prototype.name: 1.1.6
+ has-tostringtag: 1.0.2
is-async-function: 2.0.0
is-date-object: 1.0.5
is-finalizationregistry: 1.0.2
@@ -8007,29 +7140,30 @@ packages:
is-weakref: 1.0.2
isarray: 2.0.5
which-boxed-primitive: 1.0.2
- which-collection: 1.0.1
- which-typed-array: 1.1.11
- dev: false
+ which-collection: 1.0.2
+ which-typed-array: 1.1.15
+ dev: true
- /which-collection@1.0.1:
- resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
+ /which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
dependencies:
- is-map: 2.0.2
- is-set: 2.0.2
- is-weakmap: 2.0.1
- is-weakset: 2.0.2
- dev: false
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.3
+ dev: true
- /which-typed-array@1.1.11:
- resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==}
+ /which-typed-array@1.1.15:
+ resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
engines: {node: '>= 0.4'}
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
for-each: 0.3.3
gopd: 1.0.1
- has-tostringtag: 1.0.0
- dev: false
+ has-tostringtag: 1.0.2
+ dev: true
/which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
@@ -8038,170 +7172,6 @@ packages:
dependencies:
isexe: 2.0.0
- /workbox-background-sync@6.6.0:
- resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==}
- dependencies:
- idb: 7.1.1
- workbox-core: 6.6.0
- dev: false
-
- /workbox-broadcast-update@6.6.0:
- resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==}
- dependencies:
- workbox-core: 6.6.0
- dev: false
-
- /workbox-build@6.6.0:
- resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==}
- engines: {node: '>=10.0.0'}
- dependencies:
- '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0)
- '@babel/core': 7.22.11
- '@babel/preset-env': 7.22.10(@babel/core@7.22.11)
- '@babel/runtime': 7.22.11
- '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.11)(rollup@2.79.1)
- '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1)
- '@rollup/plugin-replace': 2.4.2(rollup@2.79.1)
- '@surma/rollup-plugin-off-main-thread': 2.2.3
- ajv: 8.12.0
- common-tags: 1.8.2
- fast-json-stable-stringify: 2.1.0
- fs-extra: 9.1.0
- glob: 7.2.3
- lodash: 4.17.21
- pretty-bytes: 5.6.0
- rollup: 2.79.1
- rollup-plugin-terser: 7.0.2(rollup@2.79.1)
- source-map: 0.8.0-beta.0
- stringify-object: 3.3.0
- strip-comments: 2.0.1
- tempy: 0.6.0
- upath: 1.2.0
- workbox-background-sync: 6.6.0
- workbox-broadcast-update: 6.6.0
- workbox-cacheable-response: 6.6.0
- workbox-core: 6.6.0
- workbox-expiration: 6.6.0
- workbox-google-analytics: 6.6.0
- workbox-navigation-preload: 6.6.0
- workbox-precaching: 6.6.0
- workbox-range-requests: 6.6.0
- workbox-recipes: 6.6.0
- workbox-routing: 6.6.0
- workbox-strategies: 6.6.0
- workbox-streams: 6.6.0
- workbox-sw: 6.6.0
- workbox-window: 6.6.0
- transitivePeerDependencies:
- - '@types/babel__core'
- - supports-color
- dev: false
-
- /workbox-cacheable-response@6.6.0:
- resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==}
- deprecated: workbox-background-sync@6.6.0
- dependencies:
- workbox-core: 6.6.0
- dev: false
-
- /workbox-core@6.6.0:
- resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==}
- dev: false
-
- /workbox-expiration@6.6.0:
- resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==}
- dependencies:
- idb: 7.1.1
- workbox-core: 6.6.0
- dev: false
-
- /workbox-google-analytics@6.6.0:
- resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==}
- dependencies:
- workbox-background-sync: 6.6.0
- workbox-core: 6.6.0
- workbox-routing: 6.6.0
- workbox-strategies: 6.6.0
- dev: false
-
- /workbox-navigation-preload@6.6.0:
- resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==}
- dependencies:
- workbox-core: 6.6.0
- dev: false
-
- /workbox-precaching@6.6.0:
- resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==}
- dependencies:
- workbox-core: 6.6.0
- workbox-routing: 6.6.0
- workbox-strategies: 6.6.0
- dev: false
-
- /workbox-range-requests@6.6.0:
- resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==}
- dependencies:
- workbox-core: 6.6.0
- dev: false
-
- /workbox-recipes@6.6.0:
- resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==}
- dependencies:
- workbox-cacheable-response: 6.6.0
- workbox-core: 6.6.0
- workbox-expiration: 6.6.0
- workbox-precaching: 6.6.0
- workbox-routing: 6.6.0
- workbox-strategies: 6.6.0
- dev: false
-
- /workbox-routing@6.6.0:
- resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==}
- dependencies:
- workbox-core: 6.6.0
- dev: false
-
- /workbox-strategies@6.6.0:
- resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==}
- dependencies:
- workbox-core: 6.6.0
- dev: false
-
- /workbox-streams@6.6.0:
- resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==}
- dependencies:
- workbox-core: 6.6.0
- workbox-routing: 6.6.0
- dev: false
-
- /workbox-sw@6.6.0:
- resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==}
- dev: false
-
- /workbox-webpack-plugin@6.6.0(webpack@5.88.2):
- resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- webpack: ^4.4.0 || ^5.9.0
- dependencies:
- fast-json-stable-stringify: 2.1.0
- pretty-bytes: 5.6.0
- upath: 1.2.0
- webpack: 5.88.2
- webpack-sources: 1.4.3
- workbox-build: 6.6.0
- transitivePeerDependencies:
- - '@types/babel__core'
- - supports-color
- dev: false
-
- /workbox-window@6.6.0:
- resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==}
- dependencies:
- '@types/trusted-types': 2.0.3
- workbox-core: 6.6.0
- dev: false
-
/wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
@@ -8209,7 +7179,6 @@ packages:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
- dev: false
/wrap-ansi@8.1.0:
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
@@ -8218,30 +7187,36 @@ packages:
ansi-styles: 6.2.1
string-width: 5.1.2
strip-ansi: 7.1.0
- dev: false
/wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
- /xtend@4.0.2:
- resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
- engines: {node: '>=0.4'}
- dev: false
-
- /yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
- dev: false
+ dev: true
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
- /yaml@2.3.1:
- resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
+ /yaml@2.4.1:
+ resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==}
engines: {node: '>= 14'}
+ hasBin: true
/yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ dev: true
+
+ /zod-to-json-schema@3.22.5(zod@3.22.4):
+ resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==}
+ peerDependencies:
+ zod: ^3.22.4
+ dependencies:
+ zod: 3.22.4
+ dev: false
+
+ /zod@3.22.4:
+ resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
+ dev: false
/zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
diff --git a/prisma/migrations/01_init/migration.sql b/prisma/migrations/01_init/migration.sql
deleted file mode 100644
index 8ecd061d..00000000
--- a/prisma/migrations/01_init/migration.sql
+++ /dev/null
@@ -1,122 +0,0 @@
--- CreateTable
-CREATE TABLE "sessions" (
- "id" TEXT NOT NULL,
- "sessionToken" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
- "expires" TIMESTAMP(3) NOT NULL,
-
- CONSTRAINT "sessions_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "users" (
- "id" TEXT NOT NULL,
- "platform" TEXT NOT NULL DEFAULT 'init',
- "name" TEXT,
- "email" TEXT,
- "emailVerified" TIMESTAMP(3),
- "image" TEXT,
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "defaultProvider" TEXT,
- "openAIKey" TEXT,
- "allowRecordCloudSync" BOOLEAN NOT NULL DEFAULT false,
-
- CONSTRAINT "users_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "verification_tokens" (
- "identifier" TEXT NOT NULL,
- "token" TEXT NOT NULL,
- "expires" TIMESTAMP(3) NOT NULL
-);
-
--- CreateTable
-CREATE TABLE "records" (
- "id" TEXT NOT NULL,
- "type" TEXT NOT NULL,
- "title" TEXT NOT NULL,
- "content" JSONB,
- "share" BOOLEAN NOT NULL DEFAULT false,
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "authorId" TEXT NOT NULL,
-
- CONSTRAINT "records_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "shares" (
- "id" TEXT NOT NULL,
- "type" TEXT NOT NULL,
- "title" TEXT NOT NULL,
- "content" JSONB,
- "share" BOOLEAN NOT NULL DEFAULT true,
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "userId" TEXT,
-
- CONSTRAINT "shares_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "teams" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "accessCode" TEXT NOT NULL,
- "openAIKey" TEXT,
- "openAIEndpoint" TEXT,
- "invitationOpen" BOOLEAN NOT NULL DEFAULT false,
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "authorId" TEXT NOT NULL,
- "allowVerfiedUsers" BOOLEAN NOT NULL DEFAULT false,
-
- CONSTRAINT "teams_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "team_members" (
- "id" TEXT NOT NULL,
- "teamId" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
-
- CONSTRAINT "team_members_pkey" PRIMARY KEY ("id")
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "sessions_sessionToken_key" ON "sessions"("sessionToken");
-
--- CreateIndex
-CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
-
--- CreateIndex
-CREATE UNIQUE INDEX "verification_tokens_token_key" ON "verification_tokens"("token");
-
--- CreateIndex
-CREATE UNIQUE INDEX "verification_tokens_identifier_token_key" ON "verification_tokens"("identifier", "token");
-
--- CreateIndex
-CREATE UNIQUE INDEX "teams_accessCode_key" ON "teams"("accessCode");
-
--- CreateIndex
-CREATE UNIQUE INDEX "teams_openAIKey_key" ON "teams"("openAIKey");
-
--- CreateIndex
-CREATE UNIQUE INDEX "team_members_teamId_userId_key" ON "team_members"("teamId", "userId");
-
--- AddForeignKey
-ALTER TABLE "sessions" ADD CONSTRAINT "sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "records" ADD CONSTRAINT "records_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "shares" ADD CONSTRAINT "shares_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "team_members" ADD CONSTRAINT "team_members_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "team_members" ADD CONSTRAINT "team_members_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "teams"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml
deleted file mode 100644
index fbffa92c..00000000
--- a/prisma/migrations/migration_lock.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Please do not edit this file manually
-# It should be added in your version-control system (i.e. Git)
-provider = "postgresql"
\ No newline at end of file
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
deleted file mode 100644
index d6cd0bdb..00000000
--- a/prisma/schema.prisma
+++ /dev/null
@@ -1,114 +0,0 @@
-generator client {
- provider = "prisma-client-js"
-}
-
-datasource db {
- provider = "postgresql"
- url = env("DATABASE_URL")
-}
-
-model Session {
- id String @id @default(cuid())
- sessionToken String @unique
- userId String
- expires DateTime
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
-
- @@map(name: "sessions")
-}
-
-model User {
- id String @id @default(cuid())
- platform String @default("init")
- name String?
- email String? @unique
- emailVerified DateTime?
- image String?
- createdAt DateTime @default(now()) @map(name: "created_at")
- updatedAt DateTime @default(now()) @map(name: "updated_at")
-
- defaultProvider String?
- openAIKey String?
- allowRecordCloudSync Boolean @default(false)
-
- sessions Session[]
- Record Record[]
- Share Share[]
- teams TeamMember[]
-
- @@map(name: "users")
-}
-
-model VerificationToken {
- identifier String
- token String @unique
- expires DateTime
-
- @@unique([identifier, token])
- @@map(name: "verification_tokens")
-}
-
-model Record {
- id String @id @default(cuid())
- type String
- title String
- content Json?
- share Boolean @default(false)
- createdAt DateTime @default(now()) @map(name: "created_at")
- updatedAt DateTime @default(now()) @map(name: "updated_at")
- authorId String
-
- author User @relation(fields: [authorId], references: [id])
-
- @@map(name: "records")
-}
-
-model Share {
- id String @id @default(cuid())
- type String
- title String
- content Json?
- share Boolean @default(true)
- createdAt DateTime @default(now()) @map(name: "created_at")
- updatedAt DateTime @default(now()) @map(name: "updated_at")
- User User? @relation(fields: [userId], references: [id])
- userId String?
-
- @@map(name: "shares")
-}
-
-model Team {
- id String @id @default(cuid())
- name String
- accessCode String @unique
- defaultServiceProvider String? @default("OpenAI")
- openAIKey String? @unique
- openAIEndpoint String?
- azureAPIKey String? @unique
- azureAPIEndpoint String?
- azureDeploymentName String?
- claudeAPIKey String?
-
- invitationOpen Boolean @default(false)
- createdAt DateTime @default(now()) @map(name: "created_at")
- updatedAt DateTime @default(now()) @map(name: "updated_at")
- authorId String
-
- allowVerfiedUsers Boolean @default(false)
-
- members TeamMember[]
-
- @@map(name: "teams")
-}
-
-model TeamMember {
- id String @id @default(cuid())
- teamId String
- userId String
-
- user User @relation(fields: [userId], references: [id])
- Team Team @relation(fields: [teamId], references: [id])
-
- @@unique([teamId, userId])
- @@map(name: "team_members")
-}
diff --git a/public/icon.svg b/public/icon.svg
new file mode 100644
index 00000000..d9445723
--- /dev/null
+++ b/public/icon.svg
@@ -0,0 +1,7 @@
+
+
+ OpenAI
+
+
+
+
diff --git a/public/img/Amazon.png b/public/img/Amazon.png
new file mode 100644
index 00000000..c412e296
Binary files /dev/null and b/public/img/Amazon.png differ
diff --git a/public/img/Claude.png b/public/img/Anthropic.png
similarity index 100%
rename from public/img/Claude.png
rename to public/img/Anthropic.png
diff --git a/public/img/Custom.png b/public/img/Custom.png
new file mode 100644
index 00000000..80ce2e8c
Binary files /dev/null and b/public/img/Custom.png differ
diff --git a/public/img/Fireworks.png b/public/img/Fireworks.png
new file mode 100644
index 00000000..e55f402b
Binary files /dev/null and b/public/img/Fireworks.png differ
diff --git a/public/img/Google.png b/public/img/Google.png
new file mode 100644
index 00000000..c5103c54
Binary files /dev/null and b/public/img/Google.png differ
diff --git a/public/img/Groq.png b/public/img/Groq.png
new file mode 100644
index 00000000..31564145
Binary files /dev/null and b/public/img/Groq.png differ
diff --git a/public/img/Hugging Face.png b/public/img/HuggingFace.png
similarity index 100%
rename from public/img/Hugging Face.png
rename to public/img/HuggingFace.png
diff --git a/public/img/Mistral.png b/public/img/Mistral.png
new file mode 100644
index 00000000..8211c4eb
Binary files /dev/null and b/public/img/Mistral.png differ
diff --git a/public/img/Perplexity.png b/public/img/Perplexity.png
new file mode 100644
index 00000000..96c2cf90
Binary files /dev/null and b/public/img/Perplexity.png differ
diff --git a/public/img/Replicate.png b/public/img/Replicate.png
new file mode 100644
index 00000000..9fa534b3
Binary files /dev/null and b/public/img/Replicate.png differ
diff --git a/public/img/Tavily.png b/public/img/Tavily.png
new file mode 100644
index 00000000..10f7fca5
Binary files /dev/null and b/public/img/Tavily.png differ
diff --git a/renovate.json b/renovate.json
index d47fb73a..1ded03d9 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,4 +1,5 @@
{
- "extends": ["config:base"],
- "ignoreDeps": ["lucide-react"]
-}
+ "extends": [
+ "config:base"
+ ]
+}
\ No newline at end of file
diff --git a/styles/globals.css b/styles/globals.css
index aeec678b..e95e7a7d 100644
--- a/styles/globals.css
+++ b/styles/globals.css
@@ -2,6 +2,10 @@
@tailwind components;
@tailwind utilities;
+::-webkit-scrollbar {
+ display: none;
+}
+
@layer base {
:root {
--background: 0 0% 100%;
@@ -74,65 +78,3 @@
@apply bg-background text-foreground;
}
}
-
-:root {
- scroll-behavior: smooth;
-}
-
-::-webkit-scrollbar {
- width: 5px;
-}
-
-::-webkit-scrollbar-thumb {
- border-radius: 5px;
-}
-
-@keyframes left-bounce {
- 0%,
- 100% {
- transform: translateX(-25%);
- animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
- }
- 50% {
- transform: none;
- animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
- }
-}
-
-@keyframes right-bounce {
- 0%,
- 100% {
- transform: translateX(25%);
- animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
- }
- 50% {
- transform: none;
- animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
- }
-}
-
-.animate-left-bounce {
- animation: left-bounce 1s infinite;
-}
-
-.animate-right-bounce {
- animation: right-bounce 1s infinite;
-}
-
-@keyframes gradient-flow {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-.gradient-flow {
- background-image: linear-gradient(to right, #38b2ac, #3b82f6, #9333ea);
- background-size: 200% 100%;
- animation: gradient-flow 2s ease infinite;
-}
diff --git a/styles/markdown.css b/styles/markdown.css
deleted file mode 100644
index cfa2a08c..00000000
--- a/styles/markdown.css
+++ /dev/null
@@ -1,79 +0,0 @@
-.markdown-inline-code {
- @apply rounded-sm bg-gray-100 px-1 py-0.5 text-xs text-black dark:bg-neutral-700 dark:text-neutral-300 !important;
-}
-
-.markdown-code {
- @apply border-2 border-slate-700 font-JetBrainsMono dark:border-stone-300 !important;
-}
-
-.markdown-code-language {
- @apply select-none text-2xl !important;
-}
-
-.markdown-h1 {
- @apply text-4xl font-bold !important;
-}
-
-.markdown-h2 {
- @apply text-3xl font-bold !important;
-}
-
-.markdown-h3 {
- @apply text-2xl font-bold !important;
-}
-
-.markdown-h4 {
- @apply text-xl font-bold !important;
-}
-
-.markdown-h5 {
- @apply text-lg font-bold !important;
-}
-
-.markdown-ul {
- @apply mx-5 list-outside list-disc pl-3 text-gray-600 dark:text-stone-300 !important;
-}
-
-.markdown-ol {
- @apply mx-5 list-outside list-decimal pl-3 text-gray-600 dark:text-stone-300 !important;
-}
-
-.markdown-li {
- @apply mb-1.5 !important;
-}
-
-.markdown-blockquote {
- @apply border-l-4 border-gray-200 pl-4 !important;
-}
-
-.markdown-a {
- @apply font-medium text-stone-700 transition-colors duration-300 hover:text-sky-700 dark:text-stone-300 dark:hover:text-sky-300 !important;
-}
-
-.markdown-table {
- @apply table-auto border-collapse border border-gray-200 bg-white text-center shadow-md !important;
-}
-
-.markdown-thead {
- @apply border-b border-gray-200 bg-stone-400 font-semibold text-black !important;
-}
-
-.markdown-tbody {
- @apply border border-gray-200 !important;
-}
-
-.markdown-tr {
- @apply bg-gray-100 !important;
-}
-
-.markdown-th {
- @apply border border-gray-200 px-2 py-1 !important;
-}
-
-.markdown-td {
- @apply border border-gray-200 px-2 py-1 !important;
-}
-
-.katex-html {
- @apply hidden !important;
-}
diff --git a/tailwind.config.js b/tailwind.config.ts
similarity index 89%
rename from tailwind.config.js
rename to tailwind.config.ts
index 724ef28f..df5763fc 100644
--- a/tailwind.config.js
+++ b/tailwind.config.ts
@@ -1,5 +1,6 @@
-/** @type {import('tailwindcss').Config} */
-module.exports = {
+import type { Config } from 'tailwindcss';
+
+const config = {
darkMode: ['class'],
content: ['./pages/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}'],
prefix: '',
@@ -52,10 +53,6 @@ module.exports = {
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
},
- fontFamily: {
- Rubik: ['var(--font-rubik)'],
- JetBrainsMono: ['var(--font-jetbrains-mono)'],
- },
keyframes: {
'accordion-down': {
from: { height: '0' },
@@ -72,5 +69,7 @@ module.exports = {
},
},
},
- plugins: [require('tailwindcss-animate'), require('@tailwindcss/typography')],
-};
+ plugins: [require('tailwindcss-animate')],
+} satisfies Config;
+
+export default config;
diff --git a/tsconfig.json b/tsconfig.json
index 911ae102..52494fac 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,28 +1,39 @@
{
- "compilerOptions": {
- "target": "es5",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": true,
- "forceConsistentCasingInFileNames": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "node",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "preserve",
- "incremental": true,
- "plugins": [
- {
- "name": "next"
- }
- ],
- "paths": {
- "@/*": ["./*"]
- }
- },
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
-}
+ "compilerOptions": {
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": [
+ "./*"
+ ]
+ }
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
\ No newline at end of file
diff --git a/types/app.d.ts b/types/app.d.ts
deleted file mode 100644
index c55aaa11..00000000
--- a/types/app.d.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-type ServiceProviderProps = 'Azure' | 'Claude' | 'Custom' | 'Hugging Face' | 'OpenAI' | 'Team' | 'Cohere' | 'Extension';
-
-type PluginProps = 'search' | 'fetch';
-
-type AppMessageProps = OpenAIMessage;
-
-interface AppSettings {
- serviceProvider: string;
- apiKey: string;
- apiEndpoint: string;
-}
-
-interface HistoryProps {
- id: string;
- type: 'chat';
- title: string;
- messages: MessageProps[];
- timestamp: number;
-}
-
-interface Record {
- id: string;
- type: string;
- title: string;
- content: string[];
- share: boolean;
- createdAt: number;
- updatedAt: number;
- authorId: string;
-}
-
-interface OpenAIConfigProps {
- apiKey: string;
- apiEndpoint: string;
- apiModel: string;
- apiTemperature: number;
-}
-
-interface AppPluginProps {
- name: string;
- key: any;
-}
diff --git a/types/app.ts b/types/app.ts
new file mode 100644
index 00000000..ef6a2eb9
--- /dev/null
+++ b/types/app.ts
@@ -0,0 +1,11 @@
+import { SimpleModel } from '@/types/model';
+import { SpecifiedProviderSetting } from '@/types/settings';
+
+export interface ApiConfig {
+ // apiKey?: string;
+ // endpoint?: string;
+ provider: SpecifiedProviderSetting;
+ model: SimpleModel;
+ stream: boolean | undefined;
+ numberOfContext: number;
+}
diff --git a/types/conversation.ts b/types/conversation.ts
new file mode 100644
index 00000000..bf473d23
--- /dev/null
+++ b/types/conversation.ts
@@ -0,0 +1,8 @@
+import { Message } from 'ai';
+
+export interface Conversation {
+ id: string;
+ conversation: Message[];
+ createdAt: string;
+ updatedAt?: string;
+}
diff --git a/types/database.d.ts b/types/database.d.ts
deleted file mode 100644
index 76438f7d..00000000
--- a/types/database.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-type userRole = 'user' | 'manager' | 'admin';
diff --git a/types/i18n.ts b/types/i18n.ts
new file mode 100644
index 00000000..3090c1cb
--- /dev/null
+++ b/types/i18n.ts
@@ -0,0 +1,3 @@
+import { languageId } from '@/config/i18n';
+
+export type TLocale = (typeof languageId)[number];
diff --git a/types/model.ts b/types/model.ts
new file mode 100644
index 00000000..0224c075
--- /dev/null
+++ b/types/model.ts
@@ -0,0 +1,17 @@
+import { AllModelId, AllModelName, Provider } from '@/config/provider';
+
+export interface Model {
+ id: AllModelId;
+ name: AllModelName;
+ maxInputTokens?: number | null;
+ maxOutputTokens?: number | null;
+ maxTokens?: number | null;
+ price?: number | null;
+ vision?: boolean;
+}
+
+export interface SimpleModel {
+ provider: Provider;
+ model_id: Model['id'];
+ model_name: Model['name'];
+}
diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts
deleted file mode 100644
index 4c97abf2..00000000
--- a/types/next-auth.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { User } from 'next-auth';
-import { JWT } from 'next-auth/jwt';
-
-declare module 'next-auth/jwt' {
- interface JWT {
- id: string;
- }
-}
-
-declare module 'next-auth' {
- interface Session {
- user: User & {
- id: string;
- };
- }
-}
diff --git a/types/openai.d.ts b/types/openai.d.ts
deleted file mode 100644
index 6c553b59..00000000
--- a/types/openai.d.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-type OpenAIProvider = 'Azure' | 'OpenAI';
-
-type OpenAIModel =
- | 'gpt-4'
- | 'gpt-4-0613'
- | 'gpt-4-0125-preview'
- | 'gpt-4-1106-preview'
- | 'gpt-4-vision-preview'
- | 'gpt-4-32k'
- | 'gpt-4-32k-0613'
- | 'gpt-3.5-turbo'
- | 'gpt-3.5-turbo-16k'
- | 'gpt-3.5-turbo-1106'
- | 'gpt-3.5-turbo-instruct';
-type OpenAIMessageRole = 'user' | 'system' | 'assistant';
-
-interface OpenAIMessage {
- role: OpenAIMessageRole;
- content: string;
-}
-
-interface OpenAIMessages {
- messages: OpenAIMessage[];
-}
-
-interface OpenAIChatPayload {
- model: OpenAIModel;
- messages: OpenAIMessage[];
- temperature?: number;
- top_p?: number;
- n?: integer;
- stream?: boolean;
- stop?: string | string[];
- max_tokens?: integer;
- presence_penalty?: number;
- frequency_penalty?: number;
- // logit_bias?: map;
- user?: string;
-}
-
-interface OpenAIImagePayload {
- prompt: string;
- n?: integer;
- size?: '256x256' | '512x512' | '1024x102';
- response_format?: 'url' | 'b64_json';
- user?: string;
-}
-
-interface OpenAIGPTModel {
- model: OpenAIModel;
- maxTokens: integer;
- price: integer;
-}
-
-type AzureOpenAiApiVersion =
- | '2020-10-01-preview'
- | '2022-12-01 Swagger'
- | '2023-03-15-preview'
- | '2023-05-15'
- | '2023-06-01-preview'
- | '2023-07-01-preview'
- | '2023-08-01-preview'
- | '2023-09-01-preview';
diff --git a/types/search.ts b/types/search.ts
new file mode 100644
index 00000000..ae1a5e20
--- /dev/null
+++ b/types/search.ts
@@ -0,0 +1,219 @@
+import { DeepPartial } from 'ai';
+
+import { SearchEngine } from '@/config/search';
+import { challengerSchema } from '@/lib/search/challenger';
+import { clarifierSchema } from '@/lib/search/clarifier';
+import { illustratorSchema } from '@/lib/search/illustrator';
+import { searcherSchema } from '@/lib/search/searcher';
+
+export type TChallenger = DeepPartial;
+export type TClarifier = DeepPartial;
+export type TIllustrator = DeepPartial;
+export type TSearcher = DeepPartial;
+
+export type TChallengerAction = {
+ object: TChallenger;
+};
+
+export interface TavilySearchEngine {
+ apiKey?: string;
+}
+
+export interface SearchEngineSetting {
+ [SearchEngine.Tavily]?: TavilySearchEngine;
+}
+
+export interface GoogleSearchResult {
+ kind: string;
+ url: {
+ type: string;
+ template: string;
+ };
+ queries: {
+ previousPage: [
+ {
+ title: string;
+ totalResults: string;
+ searchTerms: string;
+ count: number;
+ startIndex: number;
+ startPage: number;
+ language: string;
+ inputEncoding: string;
+ outputEncoding: string;
+ safe: string;
+ cx: string;
+ sort: string;
+ filter: string;
+ gl: string;
+ cr: string;
+ googleHost: string;
+ disableCnTwTranslation: string;
+ hq: string;
+ hl: string;
+ siteSearch: string;
+ siteSearchFilter: string;
+ exactTerms: string;
+ excludeTerms: string;
+ linkSite: string;
+ orTerms: string;
+ relatedSite: string;
+ dateRestrict: string;
+ lowRange: string;
+ highRange: string;
+ fileType: string;
+ rights: string;
+ searchType: string;
+ imgSize: string;
+ imgType: string;
+ imgColorType: string;
+ imgDominantColor: string;
+ },
+ ];
+ request: [
+ {
+ title: string;
+ totalResults: string;
+ searchTerms: string;
+ count: number;
+ startIndex: number;
+ startPage: number;
+ language: string;
+ inputEncoding: string;
+ outputEncoding: string;
+ safe: string;
+ cx: string;
+ sort: string;
+ filter: string;
+ gl: string;
+ cr: string;
+ googleHost: string;
+ disableCnTwTranslation: string;
+ hq: string;
+ hl: string;
+ siteSearch: string;
+ siteSearchFilter: string;
+ exactTerms: string;
+ excludeTerms: string;
+ linkSite: string;
+ orTerms: string;
+ relatedSite: string;
+ dateRestrict: string;
+ lowRange: string;
+ highRange: string;
+ fileType: string;
+ rights: string;
+ searchType: string;
+ imgSize: string;
+ imgType: string;
+ imgColorType: string;
+ imgDominantColor: string;
+ },
+ ];
+ nextPage: [
+ {
+ title: string;
+ totalResults: string;
+ searchTerms: string;
+ count: number;
+ startIndex: number;
+ startPage: number;
+ language: string;
+ inputEncoding: string;
+ outputEncoding: string;
+ safe: string;
+ cx: string;
+ sort: string;
+ filter: string;
+ gl: string;
+ cr: string;
+ googleHost: string;
+ disableCnTwTranslation: string;
+ hq: string;
+ hl: string;
+ siteSearch: string;
+ siteSearchFilter: string;
+ exactTerms: string;
+ excludeTerms: string;
+ linkSite: string;
+ orTerms: string;
+ relatedSite: string;
+ dateRestrict: string;
+ lowRange: string;
+ highRange: string;
+ fileType: string;
+ rights: string;
+ searchType: string;
+ imgSize: string;
+ imgType: string;
+ imgColorType: string;
+ imgDominantColor: string;
+ },
+ ];
+ };
+ promotions: GoogleSearchPromotionItem[];
+ context: any;
+ searchInformation: {
+ searchTime: number;
+ formattedSearchTime: string;
+ totalResults: string;
+ formattedTotalResults: string;
+ };
+ spelling: {
+ correctedQuery: string;
+ htmlCorrectedQuery: string;
+ };
+ items: GoogleSearchResultItem[];
+}
+
+export interface GoogleSearchPromotionItem {
+ title: string;
+ htmlTitle: string;
+ link: string;
+ displayLink: string;
+ bodyLines: [
+ {
+ title: string;
+ htmlTitle: string;
+ url: string;
+ link: string;
+ },
+ ];
+ image: {
+ source: string;
+ width: number;
+ height: number;
+ };
+}
+
+export interface GoogleSearchResultItem {
+ kind: string;
+ title: string;
+ htmlTitle: string;
+ link: string;
+ displayLink: string;
+ snippet: string;
+ htmlSnippet: string;
+ cacheId: string;
+ formattedUrl: string;
+ htmlFormattedUrl: string;
+ pagemap: any;
+ mime: string;
+ fileFormat: string;
+ image: {
+ contextLink: string;
+ height: number;
+ width: number;
+ byteSize: number;
+ thumbnailLink: string;
+ thumbnailHeight: number;
+ thumbnailWidth: number;
+ };
+ labels: [
+ {
+ name: string;
+ displayName: string;
+ label_with_op: string;
+ },
+ ];
+}
diff --git a/types/search/resources.ts b/types/search/resources.ts
new file mode 100644
index 00000000..13ce8a8a
--- /dev/null
+++ b/types/search/resources.ts
@@ -0,0 +1,14 @@
+export type Resources = TavilyResult[] | YouResult[];
+export type Resource = TavilyResult | YouResult;
+
+export interface TavilyResult {
+ title: string;
+ url: string;
+ content: string;
+}
+
+export interface YouResult {
+ title: string;
+ url: string;
+ description: string;
+}
diff --git a/types/settings.ts b/types/settings.ts
new file mode 100644
index 00000000..8793fafc
--- /dev/null
+++ b/types/settings.ts
@@ -0,0 +1,126 @@
+import { Provider } from '@/config/provider';
+
+export enum Theme {
+ Light = 'light',
+ Dark = 'dark',
+ System = 'system',
+}
+
+export type SendKeyType = 'ctrl+enter' | 'enter' | 'shift+enter';
+export type RenderMode = 'markdown' | 'plain';
+
+export interface Preference {
+ theme?: Theme;
+ // sendKey?: SendKeyType;
+ enterSend?: boolean;
+ // autoRead?: boolean;
+ // renderMode?: RenderMode;
+ useMarkdown?: boolean;
+ // autoScroll?: boolean;
+}
+
+export interface AdvancedSettings {
+ unifiedEndpoint?: boolean;
+ streamMessages?: boolean;
+}
+
+export interface ConversationSettings {
+ numOfContext: number;
+ systemPrompt?: string | null;
+}
+
+export interface OpenAISettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export interface GoogleSettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export interface AmazonSettings {
+ apiKey?: string;
+ endpoint?: string;
+ secretKey?: string;
+ region?: string;
+}
+
+export interface AnthropicSettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export interface AzureSettings {
+ apiKey?: string;
+ endpoint?: string;
+ deploymentName?: string;
+}
+
+export interface CohereSettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export interface FireworksSettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export interface GroqSettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export interface HuggingFaceSettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export interface MistralSettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export interface PerplexitySettings {
+ apiKey?: string;
+ endpoint?: string;
+}
+
+export type CustomSettings = SingleCustomSettings[];
+
+export interface SingleCustomSettings {
+ basedProvider?: Provider;
+ apiKey?: string;
+ endpoint?: string;
+ model?: string;
+}
+
+export interface ProviderSetting {
+ [Provider.Amazon]?: AmazonSettings;
+ [Provider.OpenAI]?: OpenAISettings;
+ [Provider.Google]?: GoogleSettings;
+ [Provider.Anthropic]?: AnthropicSettings;
+ [Provider.Azure]?: AzureSettings;
+ [Provider.Cohere]?: CohereSettings;
+ [Provider.Fireworks]?: FireworksSettings;
+ [Provider.Groq]?: GroqSettings;
+ [Provider.HuggingFace]?: HuggingFaceSettings;
+ [Provider.Mistral]?: MistralSettings;
+ [Provider.Perplexity]?: PerplexitySettings;
+ [Provider.Custom]?: CustomSettings;
+}
+
+export type SpecifiedProviderSetting =
+ | AmazonSettings
+ | OpenAISettings
+ | GoogleSettings
+ | AnthropicSettings
+ | AzureSettings
+ | CohereSettings
+ | FireworksSettings
+ | GroqSettings
+ | HuggingFaceSettings
+ | MistralSettings
+ | PerplexitySettings
+ | SingleCustomSettings;
diff --git a/utils/app/formatDate.ts b/utils/app/formatDate.ts
deleted file mode 100644
index ac9f5ec2..00000000
--- a/utils/app/formatDate.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export const formatDate = (date: number | Date | undefined) => {
- return new Intl.DateTimeFormat('en-US', {
- year: 'numeric',
- month: 'short',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit',
- second: '2-digit',
- }).format(date);
-};
diff --git a/utils/app/generateHash.ts b/utils/app/generateHash.ts
deleted file mode 100644
index 500cade9..00000000
--- a/utils/app/generateHash.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-const generateHash = (length: number): string => {
- let result = '';
- const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
-
- for (let i = 0; i < length; i++) {
- result += characters.charAt(Math.floor(Math.random() * characters.length));
- }
-
- return result;
-};
-
-export default generateHash;
diff --git a/utils/app/icon.ts b/utils/app/icon.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/utils/app/renderMessage.tsx b/utils/app/renderMessage.tsx
deleted file mode 100644
index 5aede991..00000000
--- a/utils/app/renderMessage.tsx
+++ /dev/null
@@ -1,163 +0,0 @@
-import { FC, memo } from 'react';
-
-import { jetbrains_mono } from '@/app/fonts';
-
-import { toast } from 'react-hot-toast';
-
-import { useTranslations } from 'next-intl';
-
-import ReactMarkdown, { Options } from 'react-markdown';
-
-import remarkGfm from 'remark-gfm';
-import remarkMath from 'remark-math';
-import rehypeKatex from 'rehype-katex';
-
-import { LightAsync as SyntaxHighlighter } from 'react-syntax-highlighter';
-import { atomOneDark } from 'react-syntax-highlighter/dist/cjs/styles/hljs';
-
-import { FiCopy } from 'react-icons/fi';
-
-export const MemoReactMarkdown: FC = memo(ReactMarkdown);
-
-const renderMarkdownMessage = (message: string) => {
- return (
- (
-
- {children}
-
- ),
- h2: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- h3: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- h4: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- h5: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- ul: ({ children, ...props }: any) => (
-
- ),
- ol: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- li: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- blockquote: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- a: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- table: ({ children, ...props }: any) => (
-
- ),
- thead: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- tbody: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- tr: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- th: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- td: ({ children, ...props }: any) => (
-
- {children}
-
- ),
- }}
- linkTarget='_blank'
- >
- {message}
-
- );
-};
-
-const renderUserMessage = (message: string) => {
- return (
-
- {message}
-
- );
-};
-
-const CodeComponent = ({ node, inline, className, children, ...props }: any) => {
- const match = /language-(\w+)/.exec(className || '');
-
- const t = useTranslations('');
-
- return !inline ? (
-
-
-
- {
- navigator.clipboard.writeText(String(children).replace(/\n$/, ''));
- toast.success(t('Copied'));
- }}
- >
-
-
- {(match?.[1] != null ? match[1] : 'unknown').toUpperCase()}
-
-
-
-
- {String(children).replace(/\n$/, '')}
-
-
-
- ) : (
-
- {children}
-
- );
-};
-
-export { renderMarkdownMessage, renderUserMessage };
diff --git a/utils/app/time.ts b/utils/app/time.ts
new file mode 100644
index 00000000..759003fd
--- /dev/null
+++ b/utils/app/time.ts
@@ -0,0 +1,11 @@
+export const whatTimeOfDay = () => {
+ const currentTime = new Date().getHours();
+
+ if (currentTime < 12) {
+ return 'good_morning';
+ } else if (currentTime < 18) {
+ return 'good_afternoon';
+ } else {
+ return 'good_evening';
+ }
+};
diff --git a/utils/app/checkVersion.ts b/utils/app/version.ts
similarity index 57%
rename from utils/app/checkVersion.ts
rename to utils/app/version.ts
index 4258f15b..36fa2577 100644
--- a/utils/app/checkVersion.ts
+++ b/utils/app/version.ts
@@ -1,4 +1,4 @@
-export const getGitHubLatestVersion = async ({ owner, repo }: { owner: string; repo: string }) => {
+export const getLatestVersion = async ({ owner, repo }: { owner: string; repo: string }) => {
const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/releases/latest`);
return await response.json();
diff --git a/utils/plugins/fetch_content.ts b/utils/plugins/fetch_content.ts
deleted file mode 100644
index 8dbe2f87..00000000
--- a/utils/plugins/fetch_content.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import axios from 'axios';
-
-import * as cheerio from 'cheerio';
-
-export const fetchContent = async (url: string) => {
- try {
- const response = await axios.get(url);
- const $ = cheerio.load(response.data);
-
- const mainContent = $('main').text().trim();
-
- if (!mainContent) {
- throw new Error('No content found');
- }
-
- return mainContent;
- } catch (error) {
- console.error(`Error fetching content from ${url}:`, error);
- return null;
- }
-};
diff --git a/utils/plugins/search.ts b/utils/plugins/search.ts
deleted file mode 100644
index 2ab16218..00000000
--- a/utils/plugins/search.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-export const getSearchFromGoogleProgrammableSearchEngine = async (searchAPIKey: string, searchEngineID: string, query: string) => {
- const searchUrl = `https://www.googleapis.com/customsearch/v1?key=${searchAPIKey}&cx=${searchEngineID}&q=${query}`;
-
- const response = await fetch(searchUrl);
- const data = await response.json();
-
- const result = data.items?.map((item: any) => ({
- title: item.title,
- link: item.link,
- snippet: item.snippet,
- }));
-
- return result;
-};
diff --git a/utils/provider/azure/messages.ts b/utils/provider/azure/messages.ts
deleted file mode 100644
index 9713e09a..00000000
--- a/utils/provider/azure/messages.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { createParser, ParsedEvent, ReconnectInterval } from 'eventsource-parser';
-
-export async function sendAzureStreamMessages(payload: OpenAIChatPayload, apiKey: string, apiEndpoint: string, deploymentName: string) {
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- let counter = 0;
-
- if (!apiKey) {
- return 'ERROR: No API key provided';
- }
-
- if (!apiEndpoint) {
- return 'ERROR: No API endpoint provided';
- }
-
- if (!deploymentName) {
- return 'ERROR: No deployment name provided';
- }
-
- const API_ENDPOINT = apiEndpoint;
-
- const res = await fetch(`${API_ENDPOINT}/openai/deployments/${deploymentName}/chat/completions?api-version=2023-03-15-preview`, {
- headers: {
- 'Content-Type': 'application/json',
- 'api-key': apiKey,
- },
- method: 'POST',
- body: JSON.stringify(payload),
- });
-
- return new ReadableStream({
- async start(controller) {
- function onParse(event: ParsedEvent | ReconnectInterval) {
- if (event.type === 'event') {
- const { data } = event;
- if (data === '[DONE]') {
- controller.close();
- return;
- }
- try {
- const json = JSON.parse(data);
- const text = json.choices[0].delta?.content || '';
- if (counter < 2 && (text.match(/\n/) || []).length) {
- return;
- }
- const queue = encoder.encode(text);
- controller.enqueue(queue);
- counter++;
- } catch (e) {
- controller.error(e);
- }
- }
- }
-
- const parser = createParser(onParse);
- for await (const chunk of res.body as any) {
- parser.feed(decoder.decode(chunk));
- }
- },
- });
-}
-
-export async function sendAzureMessages(payload: OpenAIChatPayload, apiKey: string, apiEndpoint: string, deploymentName: string) {
- if (!apiKey) {
- return 'ERROR: No API key provided';
- }
-
- if (!apiEndpoint) {
- return 'ERROR: No API endpoint provided';
- }
-
- if (!deploymentName) {
- return 'ERROR: No deployment name provided';
- }
-
- const API_ENDPOINT = apiEndpoint;
-
- const res = await fetch(`${API_ENDPOINT}/openai/deployments/${deploymentName}/chat/completions?api-version=2023-03-15-preview`, {
- headers: {
- 'Content-Type': 'application/json',
- 'api-key': apiKey,
- },
- method: 'POST',
- body: JSON.stringify(payload),
- });
-
- const data = await res.json();
-
- return data.choices[0].message.content;
-}
diff --git a/utils/provider/claude/messages.ts b/utils/provider/claude/messages.ts
deleted file mode 100644
index f2388e17..00000000
--- a/utils/provider/claude/messages.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-export async function sendClaudeMessages(model: string, message: string, apiKey: string, claudeAPITemperature: number) {
- if (!apiKey) {
- return 'ERROR: No API key provided';
- }
-
- const HUMAN_PROMPT = '\n\nHuman:' + message;
- const AI_PROMPT = '\n\nAssistant:';
-
- const response = await fetch('https://api.anthropic.com/v1/complete', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- 'X-API-Key': apiKey,
- },
- body: JSON.stringify({
- model: model,
- prompt: `${HUMAN_PROMPT}${AI_PROMPT}`,
- max_tokens_to_sample: 3000,
- temperature: claudeAPITemperature || 1.0,
- }),
- });
-
- const data = await response.json();
-
- return data.completion;
-}
diff --git a/utils/provider/cohere.tsx b/utils/provider/cohere.tsx
new file mode 100644
index 00000000..786ebe25
--- /dev/null
+++ b/utils/provider/cohere.tsx
@@ -0,0 +1,8 @@
+import { Cohere } from 'cohere-ai';
+
+export const toCohereRole = (role: string): Cohere.ChatMessageRole => {
+ if (role === 'user') {
+ return Cohere.ChatMessageRole.User;
+ }
+ return Cohere.ChatMessageRole.Chatbot;
+};
diff --git a/utils/provider/cohere/messages.ts b/utils/provider/cohere/messages.ts
deleted file mode 100644
index 56a8db9b..00000000
--- a/utils/provider/cohere/messages.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-export async function sendCohereMessages(model: string, message: string, apiKey: string) {
- if (!apiKey) {
- return 'ERROR: No API key provided';
- }
-
- const response = await fetch('https://api.cohere.ai/generate', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- Authorization: `Bearer ${apiKey}`,
- 'Cohere-Version': '2022-12-06',
- },
- body: JSON.stringify({
- model: model,
- prompt: message,
- return_likelihoods: 'NONE',
- max_tokens: 200,
- temperature: 0.9,
- p: 1,
- }),
- });
-
- const data = await response.json();
-
- return data.generations[0].text;
-}
diff --git a/utils/provider/google.tsx b/utils/provider/google.tsx
new file mode 100644
index 00000000..59383566
--- /dev/null
+++ b/utils/provider/google.tsx
@@ -0,0 +1,11 @@
+import { GenerateContentRequest } from '@google/generative-ai';
+import { Message } from 'ai';
+
+export const toGoogleMessage = (messages: Message[]): GenerateContentRequest => ({
+ contents: messages
+ .filter((message) => message.role === 'user' || message.role === 'assistant')
+ .map((message) => ({
+ role: message.role === 'user' ? 'user' : 'model',
+ parts: [{ text: message.content }],
+ })),
+});
diff --git a/utils/provider/huggingface/messages.ts b/utils/provider/huggingface/messages.ts
deleted file mode 100644
index 61782da8..00000000
--- a/utils/provider/huggingface/messages.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-export async function sendHuggingFaceStreamMessages(huggingFacePayload: any, accessToken: string) {
- return null;
-}
-
-export async function sendHuggingFaceMessages(model: string, message: string, accessToken: string) {
- if (!accessToken) {
- return 'ERROR: No access token provided';
- }
-
- const response = await fetch(`https://api-inference.huggingface.co/models/` + model, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- Authorization: `Bearer ${accessToken}`,
- },
- body: JSON.stringify({ inputs: message }),
- });
-
- const data = await response.json();
-
- return data[0].generated_text;
-}
diff --git a/utils/provider/openai/calculateModelPrice.ts b/utils/provider/openai/calculateModelPrice.ts
deleted file mode 100644
index 43ec64e1..00000000
--- a/utils/provider/openai/calculateModelPrice.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { openAIModelConfig } from '@/config/provider/openai.config';
-
-const calculateModelPrice = (model: OpenAIModel, tokenCount: number) => {
- const modelPrice = openAIModelConfig.find((item) => item.model === model)?.price;
-
- if (!modelPrice) {
- return 0;
- }
-
- const price = modelPrice * tokenCount;
-
- return price;
-};
-
-export default calculateModelPrice;
diff --git a/utils/provider/openai/checkOpenAIReachable.ts b/utils/provider/openai/checkOpenAIReachable.ts
deleted file mode 100644
index a7bb8acd..00000000
--- a/utils/provider/openai/checkOpenAIReachable.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import axios from 'axios';
-
-const checkOpenAIReachable = async (): Promise => {
- try {
- const response = await axios.options('https://api.openai.com/v1/chat/completions?_timestamp=' + new Date().valueOf(), {});
- if (response.status === 200) {
- return true;
- } else {
- return false;
- }
- } catch (error) {
- return false;
- }
-};
-
-export default checkOpenAIReachable;
diff --git a/utils/provider/openai/messages.ts b/utils/provider/openai/messages.ts
deleted file mode 100644
index ed75e876..00000000
--- a/utils/provider/openai/messages.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { createParser, ParsedEvent, ReconnectInterval } from 'eventsource-parser';
-
-export async function sendOpenAIStreamMessages(payload: OpenAIChatPayload, apiKey: string, apiEndpoint: string) {
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- let counter = 0;
-
- if (!apiKey) {
- return 'ERROR: No API key provided';
- }
-
- if (apiKey.includes(';')) {
- apiKey = apiKey.split(';')[Math.floor(Math.random() * apiKey.split(';').length)].trim();
- }
-
- const API_KEY = apiKey;
- const API_ENDPOINT = apiEndpoint != '' ? apiEndpoint : 'https://api.openai.com';
-
- const res = await fetch(`${API_ENDPOINT}/v1/chat/completions`, {
- headers: {
- 'Content-Type': 'application/json',
- Authorization: `Bearer ${API_KEY}`,
- },
- method: 'POST',
- body: JSON.stringify(payload),
- });
-
- return new ReadableStream({
- async start(controller) {
- function onParse(event: ParsedEvent | ReconnectInterval) {
- if (event.type === 'event') {
- const { data } = event;
- if (data === '[DONE]') {
- controller.close();
- return;
- }
- try {
- const json = JSON.parse(data);
- const text = json.choices[0].delta?.content || '';
- if (counter < 2 && (text.match(/\n/) || []).length) {
- return;
- }
- const queue = encoder.encode(text);
- controller.enqueue(queue);
- counter++;
- } catch (e) {
- controller.error(e);
- }
- }
- }
-
- const parser = createParser(onParse);
- for await (const chunk of res.body as any) {
- parser.feed(decoder.decode(chunk));
- }
- },
- });
-}
-
-export async function sendOpenAIMessages(payload: OpenAIChatPayload, apiKey: string, apiEndpoint: string) {
- if (!apiKey) {
- return 'ERROR: No API key provided';
- }
-
- const API_KEY = apiKey;
- const API_ENDPOINT = apiEndpoint != '' ? apiEndpoint : 'https://api.openai.com';
-
- const res = await fetch(`${API_ENDPOINT}/v1/chat/completions`, {
- headers: {
- 'Content-Type': 'application/json',
- Authorization: `Bearer ${API_KEY}`,
- },
- method: 'POST',
- body: JSON.stringify(payload),
- });
-
- const data = await res.json();
-
- if (data.error) {
- return 'ERROR: ' + data.error.message;
- }
-
- return data.choices[0].message.content;
-}
diff --git a/utils/provider/openai/tokens.ts b/utils/provider/openai/tokens.ts
deleted file mode 100644
index 89513f6d..00000000
--- a/utils/provider/openai/tokens.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { get_encoding } from '@dqbd/tiktoken';
-
-const getTokenCount = (message: string) => {
- const encoding = get_encoding('gpt2');
-
- const tokens = encoding.encode(message);
-
- encoding.free();
-
- return tokens.length;
-};
-
-const getTokenCountByConversation = (conversation: OpenAIMessage[]) => {
- const encoding = get_encoding('gpt2');
-
- const tokens = encoding.encode(conversation.map((message) => message.content).join(' '));
-
- encoding.free();
-
- return tokens.length;
-};
-
-export { getTokenCount, getTokenCountByConversation };
diff --git a/utils/provider/team/messages.ts b/utils/provider/team/messages.ts
deleted file mode 100644
index 53a98c49..00000000
--- a/utils/provider/team/messages.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { createParser, ParsedEvent, ReconnectInterval } from 'eventsource-parser';
-
-export async function sendTeamStreamMessages(teamPayload: any, accessCode: string) {
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- let counter = 0;
-
- const response = await fetch(`${process.env.NEXTAUTH_URL}/api/team/info?accessCode=${accessCode}`).then((res) => res.json());
-
- const { defaultServiceProvider, openAIKey, openAIEndpoint, azureAPIKey, azureAPIEndpoint, azureDeploymentName, claudeAPIKey } = response;
-
- let res: Response;
-
- switch (defaultServiceProvider) {
- case 'OpenAI':
- const openAIPayload: OpenAIChatPayload = {
- model: 'gpt-3.5-turbo' as OpenAIModel,
- messages: teamPayload.messages as OpenAIMessage[],
- // temperature: 1.0,
- stream: true as boolean,
- };
-
- res = await fetch(`${openAIEndpoint}/v1/chat/completions`, {
- headers: {
- 'Content-Type': 'application/json',
- Authorization: `Bearer ${openAIKey}`,
- },
- method: 'POST',
- body: JSON.stringify(openAIPayload),
- });
- break;
-
- case 'Azure':
- const azurePayload: OpenAIChatPayload = {
- model: 'gpt-3.5-turbo' as OpenAIModel,
- messages: teamPayload.messages as OpenAIMessage[],
- // temperature: 1.0,
- stream: true as boolean,
- };
-
- res = await fetch(`${azureAPIEndpoint}/openai/deployments/${azureDeploymentName}/chat/completions?api-version=2023-03-15-preview`, {
- headers: {
- 'Content-Type': 'application/json',
- 'api-key': azureAPIKey,
- },
- method: 'POST',
- body: JSON.stringify(azurePayload),
- });
- break;
-
- case 'Claude':
- const HUMAN_PROMPT = '\n\nHuman:' + teamPayload.messages.content;
- const AI_PROMPT = '\n\nAssistant:';
-
- const claudePayload = {
- model: 'claude-v1',
- prompt: `${HUMAN_PROMPT}${AI_PROMPT}`,
- max_tokens_to_sample: 3000,
- temperature: 1.0,
- };
-
- res = await fetch('https://api.anthropic.com/v1/complete', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- 'X-API-Key': claudeAPIKey,
- },
- body: JSON.stringify(claudePayload),
- });
- break;
- }
-
- return new ReadableStream({
- async start(controller) {
- function onParse(event: ParsedEvent | ReconnectInterval) {
- if (event.type === 'event') {
- const { data } = event;
- if (data === '[DONE]') {
- controller.close();
- return;
- }
- try {
- const json = JSON.parse(data);
- const text = json.choices[0].delta?.content || '';
- if (counter < 2 && (text.match(/\n/) || []).length) {
- return;
- }
- const queue = encoder.encode(text);
- controller.enqueue(queue);
- counter++;
- } catch (e) {
- controller.error(e);
- }
- }
- }
-
- const parser = createParser(onParse);
- for await (const chunk of res.body as any) {
- parser.feed(decoder.decode(chunk));
- }
- },
- });
-}
diff --git a/utils/search/engines/google.ts b/utils/search/engines/google.ts
new file mode 100644
index 00000000..16a2e07f
--- /dev/null
+++ b/utils/search/engines/google.ts
@@ -0,0 +1,23 @@
+import { GoogleSearchResult, GoogleSearchResultItem } from '@/types/search';
+
+export const withGoogleSearch = async (query: string, searchAPIKey?: string, searchEngineID?: string, lang: string = 'en') => {
+ const apiKey = process.env.GOOGLE_SEARCH_API_KEY ?? searchAPIKey ?? '';
+
+ const engineId = process.env.GOOGLE_SEARCH_ENGINE_ID ?? searchEngineID ?? '';
+
+ const searchUrl = `https://www.googleapis.com/customsearch/v1?key=${apiKey}&cx=${engineId}&q=${query}&lr=lang_${lang}`;
+
+ const response = await fetch(searchUrl, {
+ method: 'GET',
+ });
+
+ if (!response.ok) {
+ throw new Error(`Error(${response.status}): ${response.statusText}`);
+ }
+
+ return await response.json();
+};
+
+export const getGoogleSearchResultImage = (result: GoogleSearchResult) => {
+ return result.items.map((item: GoogleSearchResultItem) => item.pagemap.cse_image?.[0].src);
+};
diff --git a/utils/search/engines/tavily.ts b/utils/search/engines/tavily.ts
new file mode 100644
index 00000000..74dc0095
--- /dev/null
+++ b/utils/search/engines/tavily.ts
@@ -0,0 +1,30 @@
+import { TavilySearchEngine } from '@/types/search';
+
+export const withTavilySearch = async (query: string, maxResults: number = 10, searchDepth: 'basic' | 'advanced' = 'basic', config?: TavilySearchEngine) => {
+ const apiKey = config?.apiKey ?? process.env.TAVILY_SEARCH_API_KEY;
+
+ const response = await fetch('https://api.tavily.com/search', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ api_key: apiKey,
+ query,
+ max_results: maxResults < 5 ? 5 : maxResults,
+ search_depth: searchDepth,
+ include_images: true,
+ include_answers: true,
+ }),
+ });
+
+ if (!response.ok) {
+ throw new Error(`Error(${response.status}): ${response.statusText}`);
+ }
+
+ return await response.json();
+};
+
+export const getTavilySearchResultImage = (result: any) => {
+ return result.images;
+};
diff --git a/utils/search/engines/you.ts b/utils/search/engines/you.ts
new file mode 100644
index 00000000..1e6f9059
--- /dev/null
+++ b/utils/search/engines/you.ts
@@ -0,0 +1,19 @@
+export const withYouSearch = async (query: string, maxResults: number = 10, searchDepth: 'basic' | 'advanced' = 'basic') => {
+ const apiKey = process.env.YOU_SEARCH_API_KEY ?? '';
+
+ const url = `https://api.ydc-index.io/search?query=${query}`;
+
+ const response = await fetch(url, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'X-API-Key': apiKey,
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Error(${response.status}): ${response.statusText}`);
+ }
+
+ return await response.json();
+};
diff --git a/utils/search/image.ts b/utils/search/image.ts
new file mode 100644
index 00000000..88a92dcd
--- /dev/null
+++ b/utils/search/image.ts
@@ -0,0 +1,9 @@
+import { getTavilySearchResultImage } from '@/utils/search/engines/tavily';
+
+export const getImage = ({ result }: { result: any }): string[] => {
+ let images = [];
+
+ images = getTavilySearchResultImage(result);
+
+ return images;
+};