diff --git a/.dockerignore b/.dockerignore
index 8802acb5..6668a7b5 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,10 +1,11 @@
-.git/
-.pytest_cache/
-.vscode/
-.venv/
-docs/
+.*
+**/__pycache__/
+*.egg-info/
+documentation/
tests/
build/
dist/
scripts/
-*.egg-info/
+src/interface/
+src/telemetry/
+!src/interface/web
diff --git a/.github/workflows/dockerize.yml b/.github/workflows/dockerize.yml
index 94c77c23..eae321aa 100644
--- a/.github/workflows/dockerize.yml
+++ b/.github/workflows/dockerize.yml
@@ -38,13 +38,23 @@ env:
jobs:
build:
name: Publish Khoj Docker Images
- runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
- image:
- - 'local'
- - 'cloud'
+ include:
+ - image: 'local'
+ platform: linux/amd64
+ runner: ubuntu-latest
+ - image: 'local'
+ platform: linux/arm64
+ runner: ubuntu-linux-arm64
+ - image: 'cloud'
+ platform: linux/amd64
+ runner: ubuntu-latest
+ - image: 'cloud'
+ platform: linux/arm64
+ runner: ubuntu-linux-arm64
+ runs-on: ${{ matrix.runner }}
steps:
- name: Checkout Code
uses: actions/checkout@v3
@@ -52,9 +62,6 @@ jobs:
# Get all history to correctly infer Khoj version using hatch
fetch-depth: 0
- - name: 🧹 Delete huge unnecessary tools folder
- run: rm -rf /opt/hostedtoolcache
-
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
@@ -73,31 +80,68 @@ jobs:
run: rm -rf /opt/hostedtoolcache
- name: 📦 Build and Push Docker Image
- uses: docker/build-push-action@v2
+ uses: docker/build-push-action@v4
if: (matrix.image == 'local' && github.event_name == 'workflow_dispatch') && github.event.inputs.khoj == 'true' || (matrix.image == 'local' && github.event_name == 'push')
with:
context: .
file: Dockerfile
- platforms: linux/amd64, linux/arm64
push: true
tags: |
- ghcr.io/${{ github.repository }}:${{ env.DOCKER_IMAGE_TAG }}
- ${{ github.ref_type == 'tag' && format('ghcr.io/{0}:latest', github.repository) || '' }}
+ ghcr.io/${{ github.repository }}:${{ env.DOCKER_IMAGE_TAG }}-${{ matrix.platform == 'linux/amd64' && 'amd64' || 'arm64' }}
build-args: |
VERSION=${{ steps.hatch.outputs.version }}
PORT=42110
+ cache-from: type=gha,scope=${{ matrix.image }}-${{ matrix.platform }}
+ cache-to: type=gha,mode=max,scope=${{ matrix.image }}-${{ matrix.platform}}
+ labels: |
+ org.opencontainers.image.description=Khoj AI - Your second brain powered by LLMs and Neural Search
+ org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
- name: 📦️⛅️ Build and Push Cloud Docker Image
- uses: docker/build-push-action@v2
+ uses: docker/build-push-action@v4
if: (matrix.image == 'cloud' && github.event_name == 'workflow_dispatch') && github.event.inputs.khoj-cloud == 'true' || (matrix.image == 'cloud' && github.event_name == 'push')
with:
context: .
file: prod.Dockerfile
- platforms: linux/amd64, linux/arm64
push: true
tags: |
- ghcr.io/${{ github.repository }}-cloud:${{ env.DOCKER_IMAGE_TAG }}
- ${{ github.ref_type == 'tag' && format('ghcr.io/{0}-cloud:latest', github.repository) || '' }}
+ ghcr.io/${{ github.repository }}-cloud:${{ env.DOCKER_IMAGE_TAG }}-${{ matrix.platform == 'linux/amd64' && 'amd64' || 'arm64' }}
build-args: |
VERSION=${{ steps.hatch.outputs.version }}
PORT=42110
+ cache-from: type=gha,scope=${{ matrix.image }}-${{ matrix.platform }}
+ cache-to: type=gha,mode=max,scope=${{ matrix.image }}-${{ matrix.platform}}
+ labels: |
+ org.opencontainers.image.description=Khoj AI Cloud - Your second brain powered by LLMs and Neural Search
+ org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
+
+ manifest:
+ needs: build
+ runs-on: ubuntu-latest
+ if: github.event_name != 'pull_request'
+ steps:
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v2
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.PAT }}
+
+ - name: Create and Push Local Manifest
+ if: github.event.inputs.khoj == 'true' || github.event_name == 'push'
+ run: |
+ docker buildx imagetools create \
+ -t ghcr.io/${{ github.repository }}:${{ env.DOCKER_IMAGE_TAG }} \
+ ghcr.io/${{ github.repository }}:${{ env.DOCKER_IMAGE_TAG }}-amd64 \
+ ghcr.io/${{ github.repository }}:${{ env.DOCKER_IMAGE_TAG }}-arm64
+
+ - name: Create and Push Cloud Manifest
+ if: github.event.inputs.khoj-cloud == 'true' || github.event_name == 'push'
+ run: |
+ docker buildx imagetools create \
+ -t ghcr.io/${{ github.repository }}-cloud:${{ env.DOCKER_IMAGE_TAG }} \
+ ghcr.io/${{ github.repository }}-cloud:${{ env.DOCKER_IMAGE_TAG }}-amd64 \
+ ghcr.io/${{ github.repository }}-cloud:${{ env.DOCKER_IMAGE_TAG }}-arm64
diff --git a/.github/workflows/run_evals.yml b/.github/workflows/run_evals.yml
index e77dcbfd..dc8c89b7 100644
--- a/.github/workflows/run_evals.yml
+++ b/.github/workflows/run_evals.yml
@@ -25,6 +25,8 @@ on:
options:
- frames
- simpleqa
+ - gpqa
+ - math500
sample_size:
description: 'Number of samples to evaluate'
required: false
@@ -74,12 +76,12 @@ jobs:
DEBIAN_FRONTEND: noninteractive
run: |
# install postgres and other dependencies
- apt update && apt install -y git python3-pip libegl1 sqlite3 libsqlite3-dev libsqlite3-0 ffmpeg libsm6 libxext6
- apt install -y postgresql postgresql-client && apt install -y postgresql-server-dev-14
+ sudo apt update && sudo apt install -y git python3-pip libegl1 sqlite3 libsqlite3-dev libsqlite3-0 ffmpeg libsm6 libxext6
+ sudo apt install -y postgresql postgresql-client && sudo apt install -y postgresql-server-dev-14
# upgrade pip
python -m ensurepip --upgrade && python -m pip install --upgrade pip
# install terrarium for code sandbox
- git clone https://github.com/cohere-ai/cohere-terrarium.git && cd cohere-terrarium && npm install && mkdir pyodide_cache
+ git clone https://github.com/khoj-ai/terrarium.git && cd terrarium && npm install --legacy-peer-deps && mkdir pyodide_cache
- name: ⬇️ Install Application
run: |
@@ -89,14 +91,15 @@ jobs:
- name: 📝 Run Eval
env:
KHOJ_MODE: ${{ matrix.khoj_mode }}
- SAMPLE_SIZE: ${{ inputs.sample_size }}
+ SAMPLE_SIZE: ${{ github.event_name == 'workflow_dispatch' && inputs.sample_size || 200 }}
BATCH_SIZE: "20"
RANDOMIZE: "True"
KHOJ_URL: "http://localhost:42110"
KHOJ_LLM_SEED: "42"
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
- SERPER_DEV_API_KEY: ${{ secrets.SERPER_DEV_API_KEY }}
- OLOSTEP_API_KEY: ${{ secrets.OLOSTEP_API_KEY }}
+ SERPER_DEV_API_KEY: ${{ matrix.dataset != 'math500' && secrets.SERPER_DEV_API_KEY }}
+ OLOSTEP_API_KEY: ${{ matrix.dataset != 'math500' && secrets.OLOSTEP_API_KEY }}
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
KHOJ_ADMIN_EMAIL: khoj
KHOJ_ADMIN_PASSWORD: khoj
POSTGRES_HOST: localhost
@@ -110,7 +113,7 @@ jobs:
khoj --anonymous-mode --non-interactive &
# Start code sandbox
- npm run dev --prefix cohere-terrarium &
+ npm run dev --prefix terrarium &
# Wait for server to be ready
timeout=120
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 2583f351..1f5dfc6f 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -55,15 +55,13 @@ jobs:
with:
python-version: ${{ matrix.python_version }}
- - name: Install Git
- run: |
- apt update && apt install -y git
-
- name: ⏬️ Install Dependencies
env:
DEBIAN_FRONTEND: noninteractive
run: |
- apt update && apt install -y libegl1 sqlite3 libsqlite3-dev libsqlite3-0 ffmpeg libsm6 libxext6
+ apt update && apt install -y git libegl1 sqlite3 libsqlite3-dev libsqlite3-0 ffmpeg libsm6 libxext6
+ # required by llama-cpp-python prebuilt wheels
+ apt install -y musl-dev && ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1
- name: ⬇️ Install Postgres
env:
@@ -78,6 +76,9 @@ jobs:
python -m pip install --upgrade pip
- name: ⬇️ Install Application
+ env:
+ PIP_EXTRA_INDEX_URL: "https://download.pytorch.org/whl/cpu https://abetlen.github.io/llama-cpp-python/whl/cpu"
+ CUDA_VISIBLE_DEVICES: ""
run: sed -i 's/dynamic = \["version"\]/version = "0.0.0"/' pyproject.toml && pip install --upgrade .[dev]
- name: 🧪 Test Application
diff --git a/.gitignore b/.gitignore
index 4041122a..09288aa7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,3 +42,13 @@ src/interface/obsidian/main.js
# obsidian
data.json
+
+# Android
+src/interface/android/.gradle
+src/interface/android/app/build
+src/interface/android/build
+src/interface/android/*.aab
+src/interface/android/*.apk
+src/interface/android/*.apk.idsig
+src/interface/android/*.keystore
+src/interface/android/local.properties
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 444e182d..01cfc839 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -26,7 +26,7 @@ repos:
rev: v1.0.0
hooks:
- id: mypy
- stages: [push, manual]
+ stages: [pre-push, manual]
pass_filenames: false
args:
- --config-file=pyproject.toml
diff --git a/Dockerfile b/Dockerfile
index 479fbadc..fab572cc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
-FROM ubuntu:jammy
+FROM ubuntu:jammy AS base
LABEL homepage="https://khoj.dev"
LABEL repository="https://github.com/khoj-ai/khoj"
LABEL org.opencontainers.image.source="https://github.com/khoj-ai/khoj"
@@ -13,36 +13,51 @@ RUN apt update -y && apt -y install \
# Required by RapidOCR
libgl1 \
libglx-mesa0 \
- libglib2.0-0 && \
- # Required by Next.js Web app
- curl -sL https://deb.nodesource.com/setup_20.x | bash - && \
- curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
- echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
- apt update -y && apt -y --no-install-recommends install nodejs yarn && \
+ libglib2.0-0 \
+ # Required by llama-cpp-python pre-built wheels. See #1628
+ musl-dev && \
+ ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1 && \
+ # Clean up
apt clean && rm -rf /var/lib/apt/lists/*
-# Install Application
+# Build Server
+FROM base AS server-deps
WORKDIR /app
COPY pyproject.toml .
COPY README.md .
ARG VERSION=0.0.0
+# use the pre-built llama-cpp-python, torch cpu wheel
+ENV PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/cpu https://abetlen.github.io/llama-cpp-python/whl/cpu"
+# avoid downloading unused cuda specific python packages
+ENV CUDA_VISIBLE_DEVICES=""
RUN sed -i "s/dynamic = \\[\"version\"\\]/version = \"$VERSION\"/" pyproject.toml && \
pip install --no-cache-dir .
-# Copy Source Code
-COPY . .
-
-# Set the PYTHONPATH environment variable in order for it to find the Django app.
-ENV PYTHONPATH=/app/src:$PYTHONPATH
-
-# Go to the directory src/interface/web and export the built Next.js assets
+# Build Web App
+FROM node:20-alpine AS web-app
+# Set build optimization env vars
+ENV NODE_ENV=production
+ENV NEXT_TELEMETRY_DISABLED=1
WORKDIR /app/src/interface/web
-RUN bash -c "yarn install --frozen-lockfile && yarn ciexport && yarn cache clean"
+# Install dependencies first (cache layer)
+COPY src/interface/web/package.json src/interface/web/yarn.lock ./
+RUN yarn install --frozen-lockfile
+# Copy source and build
+COPY src/interface/web/. ./
+RUN yarn build
+
+# Merge the Server and Web App into a Single Image
+FROM base
+ENV PYTHONPATH=/app/src
WORKDIR /app
+COPY --from=server-deps /usr/local/lib/python3.10/dist-packages /usr/local/lib/python3.10/dist-packages
+COPY --from=web-app /app/src/interface/web/out ./src/khoj/interface/built
+COPY . .
+RUN cd src && python3 khoj/manage.py collectstatic --noinput
# Run the Application
# There are more arguments required for the application to run,
-# but these should be passed in through the docker-compose.yml file.
+# but those should be passed in through the docker-compose.yml file.
ARG PORT
EXPOSE ${PORT}
ENTRYPOINT ["python3", "src/khoj/main.py"]
diff --git a/README.md b/README.md
index 07e23457..dbbe221c 100644
--- a/README.md
+++ b/README.md
@@ -29,10 +29,17 @@
-
+***
+
+### 🎁 New
+* Start any message with `/research` to try out the experimental research mode with Khoj.
+* Anyone can now [create custom agents](https://blog.khoj.dev/posts/create-agents-on-khoj/) with tunable personality, tools and knowledge bases.
+* [Read](https://blog.khoj.dev/posts/evaluate-khoj-quality/) about Khoj's excellent performance on modern retrieval and reasoning benchmarks.
***
+## Overview
+
[Khoj](https://khoj.dev) is a personal AI app to extend your capabilities. It smoothly scales up from an on-device personal AI to a cloud-scale enterprise AI.
- Chat with any local or online LLM (e.g llama3, qwen, gemma, mistral, gpt, claude, gemini).
@@ -47,8 +54,6 @@
***
-
-
## See it in action
![demo_chat](https://github.com/khoj-ai/khoj/blob/master/documentation/assets/img/quadratic_equation_khoj_web.gif?raw=true)
diff --git a/docker-compose.yml b/docker-compose.yml
index 652cf6a0..572e592e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -22,9 +22,9 @@ services:
depends_on:
database:
condition: service_healthy
- # Use the following line to use the latest version of khoj. Otherwise, it will build from source.
+ # Use the following line to use the latest version of khoj. Otherwise, it will build from source. Set this to ghcr.io/khoj-ai/khoj-cloud if you want to use the prod image.
image: ghcr.io/khoj-ai/khoj:latest
- # Uncomment the following line to build from source. This will take a few minutes. Comment the next two lines out if you want to use the offiicial image.
+ # Uncomment the following line to build from source. This will take a few minutes. Comment the next two lines out if you want to use the official image.
# build:
# context: .
ports:
@@ -49,6 +49,8 @@ services:
- KHOJ_DEBUG=False
- KHOJ_ADMIN_EMAIL=username@example.com
- KHOJ_ADMIN_PASSWORD=password
+ # Default URL of Terrarium, the Python sandbox used by Khoj to run code. Its container is specified above
+ - KHOJ_TERRARIUM_URL=http://host.docker.internal:8080
# Uncomment line below to use with Ollama running on your local machine at localhost:11434.
# Change URL to use with other OpenAI API compatible providers like VLLM, LMStudio etc.
# - OPENAI_API_BASE=http://host.docker.internal:11434/v1/
@@ -64,7 +66,7 @@ services:
# Ensure you set your provider specific API keys.
# ---
# Free, Slower API. Does both web search and webpage read. Get API key from https://jina.ai/
- # - JINA_API_KEY=you_jina_api_key
+ # - JINA_API_KEY=your_jina_api_key
# Paid, Fast API. Only does web search. Get API key from https://serper.dev/
# - SERPER_DEV_API_KEY=your_serper_dev_api_key
# Paid, Fast, Open API. Only does webpage read. Get API key from https://firecrawl.dev/
@@ -83,6 +85,7 @@ services:
# Telemetry helps us prioritize feature development and understand how people are using Khoj
# Read more at https://docs.khoj.dev/miscellaneous/telemetry
# - KHOJ_TELEMETRY_DISABLE=True
+ # Comment out this line when you're using the official ghcr.io/khoj-ai/khoj-cloud prod image.
command: --host="0.0.0.0" --port=42110 -vv --anonymous-mode --non-interactive
diff --git a/documentation/assets/img/chrome_pwa_alt.png b/documentation/assets/img/chrome_pwa_alt.png
new file mode 100644
index 00000000..018eb04a
Binary files /dev/null and b/documentation/assets/img/chrome_pwa_alt.png differ
diff --git a/documentation/assets/img/khoj_chat_on_desktop.png b/documentation/assets/img/khoj_chat_on_desktop.png
deleted file mode 100644
index e8c10718..00000000
Binary files a/documentation/assets/img/khoj_chat_on_desktop.png and /dev/null differ
diff --git a/documentation/assets/img/khoj_search_on_desktop.png b/documentation/assets/img/khoj_search_on_desktop.png
deleted file mode 100644
index 1dc3231d..00000000
Binary files a/documentation/assets/img/khoj_search_on_desktop.png and /dev/null differ
diff --git a/documentation/assets/img/mic_chat_icon.png b/documentation/assets/img/mic_chat_icon.png
deleted file mode 100644
index 0bf64de6..00000000
Binary files a/documentation/assets/img/mic_chat_icon.png and /dev/null differ
diff --git a/documentation/assets/img/pwa_install_desktop.png b/documentation/assets/img/pwa_install_desktop.png
new file mode 100644
index 00000000..633f1b85
Binary files /dev/null and b/documentation/assets/img/pwa_install_desktop.png differ
diff --git a/documentation/docs/advanced/admin.md b/documentation/docs/advanced/admin.md
index c1d641e1..a9727d2b 100644
--- a/documentation/docs/advanced/admin.md
+++ b/documentation/docs/advanced/admin.md
@@ -38,14 +38,13 @@ To add a server chat setting:
- The `Advanced` field doesn't need to be set when self-hosting. When unset, the `Default` chat model is used for all users and the intermediate steps.
-### OpenAI Processor Conversation Configs
-These settings configure chat model providers to be accessed over API.
-The name of this setting is kind of a misnomer, we know, it'll hopefully be changed at some point.
-For each chat model provider you [add](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add):
+### AI Model API
+These settings configure APIs to interact with AI models.
+For each AI Model API you [add](http://localhost:42110/server/admin/database/aimodelapi/add):
- `Api key`: Set to your [OpenAI](https://platform.openai.com/api-keys), [Anthropic](https://console.anthropic.com/account/keys) or [Gemini](https://aistudio.google.com/app/apikey) API keys.
- `Name`: Give the configuration any friendly name like `OpenAI`, `Gemini`, `Anthropic`.
- `Api base url`: Set the API base URL. This is only relevant to set if you're using another OpenAI-compatible proxy server like [Ollama](/advanced/ollama) or [LMStudio](/advanced/lmstudio).
- ![example configuration for openai processor](/img/example_openai_processor_config.png)
+ ![example configuration for ai model api](/img/example_openai_processor_config.png)
### Search Model Configs
Search models are used to generate vector embeddings of your documents for natural language search and chat. You can choose any [embeddings models on HuggingFace](https://huggingface.co/models?pipeline_tag=sentence-similarity) to try, use for your to create vector embeddings of your documents for natural language search and chat.
diff --git a/documentation/docs/advanced/litellm.md b/documentation/docs/advanced/litellm.md
index 9dfaaf34..212ac047 100644
--- a/documentation/docs/advanced/litellm.md
+++ b/documentation/docs/advanced/litellm.md
@@ -21,7 +21,7 @@ Using LiteLLM with Khoj makes it possible to turn any LLM behind an API into you
export MISTRAL_API_KEY=
litellm --model mistral/mistral-tiny --drop_params
```
-3. Create a new [OpenAI Processor Conversation Config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) on your Khoj admin panel
+3. Create a new [API Model API](http://localhost:42110/server/admin/database/aimodelapi/add) on your Khoj admin panel
- Name: `proxy-name`
- Api Key: `any string`
- Api Base Url: **URL of your Openai Proxy API**
diff --git a/documentation/docs/advanced/ollama.mdx b/documentation/docs/advanced/ollama.mdx
index ef5295ef..78d77d26 100644
--- a/documentation/docs/advanced/ollama.mdx
+++ b/documentation/docs/advanced/ollama.mdx
@@ -60,7 +60,7 @@ Restart your Khoj server after first run or update to the settings below to ensu
```bash
ollama pull llama3.1
```
- 3. Create a new [OpenAI Processor Conversation Config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) on your Khoj admin panel
+ 3. Create a new [AI Model API](http://localhost:42110/server/admin/database/aimodelapi/add) on your Khoj admin panel
- Name: `ollama`
- Api Key: `any string`
- Api Base Url: `http://localhost:11434/v1/` (default for Ollama)
diff --git a/documentation/docs/advanced/use-openai-proxy.md b/documentation/docs/advanced/use-openai-proxy.md
index ec674767..6efaad1c 100644
--- a/documentation/docs/advanced/use-openai-proxy.md
+++ b/documentation/docs/advanced/use-openai-proxy.md
@@ -11,7 +11,7 @@ This is only helpful for self-hosted users. If you're using [Khoj Cloud](https:/
Khoj natively supports local LLMs [available on HuggingFace in GGUF format](https://huggingface.co/models?library=gguf). Using an OpenAI API proxy with Khoj maybe useful for ease of setup, trying new models or using commercial LLMs via API.
:::
-Khoj can use any OpenAI API compatible server including [Ollama](/advanced/ollama), [LMStudio](/advanced/lmstudio) and [LiteLLM](/advanced/litellm).
+Khoj can use any OpenAI API compatible server including local providers like [Ollama](/advanced/ollama), [LMStudio](/advanced/lmstudio) and [LiteLLM](/advanced/litellm) and commercial providers like [HuggingFace](https://huggingface.co/docs/api-inference/tasks/chat-completion#using-the-api), [OpenRouter](https://openrouter.ai/docs/quick-start) etc.
Configuring this allows you to use non-standard, open or commercial, local or hosted LLM models for Khoj
Combine them with Khoj can turn your favorite LLM into an AI agent. Allowing you to chat with your docs, find answers from the internet, build custom agents and run automations.
@@ -20,8 +20,8 @@ For specific integrations, see our [Ollama](/advanced/ollama), [LMStudio](/advan
## General Setup
-1. Start your preferred OpenAI API compatible app
-2. Create a new [OpenAI Processor Conversation Config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) on your Khoj admin panel
+1. Start your preferred OpenAI API compatible app locally or get API keys from commercial AI model providers.
+3. Create a new [API Model API](http://localhost:42110/server/admin/database/aimodelapi/add) on your Khoj admin panel
- Name: `any name`
- Api Key: `any string`
- Api Base Url: **URL of your Openai Proxy API**
diff --git a/documentation/docs/clients/desktop.md b/documentation/docs/clients/desktop.md
index 104c10fa..b8b7269d 100644
--- a/documentation/docs/clients/desktop.md
+++ b/documentation/docs/clients/desktop.md
@@ -4,22 +4,13 @@ sidebar_position: 1
# Desktop
-> Query your Second Brain from your machine
+> Upload your knowledge base to Khoj and chat with your whole corpus
-Use the Desktop app to chat and search with Khoj.
-You can also share your files, folders with Khoj using the app.
+## Companion App
+
+Share your files, folders with Khoj using the app.
Khoj will keep these files in sync to provide contextual responses when you search or chat.
-## Features
-- **Chat**
- - **Faster answers**: Find answers quickly, from your private notes or the public internet
- - **Assisted creativity**: Smoothly weave across retrieving answers and generating content
- - **Iterative discovery**: Iteratively explore and re-discover your notes
- - **Quick access**: Use [Khoj Mini](/features/khoj_mini) on the desktop to quickly pull up a mini chat module for quicker answers
-- **Search**
- - **Natural**: Advanced natural language understanding using Transformer based ML Models
- - **Incremental**: Incremental search for a fast, search-as-you-type experience
-
## Setup
:::info[Self Hosting]
If you are self-hosting the Khoj server, update the *Settings* page on the Khoj Desktop app to:
@@ -34,7 +25,20 @@ If you are self-hosting the Khoj server, update the *Settings* page on the Khoj
4. [Optional] Add any files, folders you'd like Khoj to be aware of on the *Settings* page and Click *Save*.
These files and folders will be automatically kept in sync for you
-## Interface
-| Chat | Search |
-|:----:|:------:|
-| ![](/img/khoj_chat_on_desktop.png) | ![](/img/khoj_search_on_desktop.png) |
+# Main App
+
+You can also install the Khoj application on your desktop as a progressive web app.
+
+1. Open the [Khoj Web App](https://app.khoj.dev) in Chrome.
+2. Click on the install button in the address bar to install the app. You must be logged into your Chrome browser for this to work.
+
+![progressive web app install icon](/img/pwa_install_desktop.png)
+
+Alternatively, you can also install using this route:
+
+1. Open the three-dot menu in the top right corner of the browser.
+2. Go to 'Cast, Save, and Share' option.
+3. Click on the "Open in Khoj" option.
+
+
+![progressive web app install route](/img/chrome_pwa_alt.png)
diff --git a/documentation/docs/clients/emacs.md b/documentation/docs/clients/emacs.md
index 73405b69..c047e282 100644
--- a/documentation/docs/clients/emacs.md
+++ b/documentation/docs/clients/emacs.md
@@ -114,7 +114,7 @@ This feature finds entries similar to the one you are currently on.
2. Hit `C-c s f` (or `M-x khoj RET f`) to find similar entries
### Advanced Usage
-- Add [query filters](https://github.com/khoj-ai/khoj/#query-filters) during search to narrow down results further
+- Add [query filters](/miscellaneous/advanced#query-filters) during search to narrow down results further
e.g. `What is the meaning of life? -"god" +"none" dt>"last week"`
- Use `C-c C-o 2` to open the current result at cursor in its source org file
diff --git a/documentation/docs/get-started/setup.mdx b/documentation/docs/get-started/setup.mdx
index a7459376..a3081e96 100644
--- a/documentation/docs/get-started/setup.mdx
+++ b/documentation/docs/get-started/setup.mdx
@@ -302,11 +302,11 @@ Setup which chat model you'd want to use. Khoj supports local and online chat mo
Using Ollama? See the [Ollama Integration](/advanced/ollama) section for more custom setup instructions.
:::
-1. Create a new [OpenAI processor conversation config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) in the server admin settings. This is kind of a misnomer, we know.
+1. Create a new [AI Model Api](http://localhost:42110/server/admin/database/aimodelapi/add) in the server admin settings.
- Add your [OpenAI API key](https://platform.openai.com/api-keys)
- Give the configuration a friendly name like `OpenAI`
- (Optional) Set the API base URL. It is only relevant if you're using another OpenAI-compatible proxy server like [Ollama](/advanced/ollama) or [LMStudio](/advanced/lmstudio).
-![example configuration for openai processor](/img/example_openai_processor_config.png)
+![example configuration for ai model api](/img/example_openai_processor_config.png)
2. Create a new [chat model options](http://localhost:42110/server/admin/database/chatmodeloptions/add)
- Set the `chat-model` field to an [OpenAI chat model](https://platform.openai.com/docs/models). Example: `gpt-4o`.
- Make sure to set the `model-type` field to `OpenAI`.
@@ -315,22 +315,22 @@ Using Ollama? See the [Ollama Integration](/advanced/ollama) section for more cu
![example configuration for chat model options](/img/example_chatmodel_option.png)
-1. Create a new [OpenAI processor conversation config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) in the server admin settings. This is kind of a misnomer, we know.
+1. Create a new [AI Model API](http://localhost:42110/server/admin/database/aimodelapi/add) in the server admin settings.
- Add your [Anthropic API key](https://console.anthropic.com/account/keys)
- Give the configuration a friendly name like `Anthropic`. Do not configure the API base url.
2. Create a new [chat model options](http://localhost:42110/server/admin/database/chatmodeloptions/add)
- Set the `chat-model` field to an [Anthropic chat model](https://docs.anthropic.com/en/docs/about-claude/models#model-names). Example: `claude-3-5-sonnet-20240620`.
- Set the `model-type` field to `Anthropic`.
- - Set the `Openai config` field to the OpenAI processor conversation config for Anthropic you created in step 1.
+ - Set the `ai model api` field to the Anthropic AI Model API you created in step 1.
-1. Create a new [OpenAI processor conversation config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) in the server admin settings. This is kind of a misnomer, we know.
+1. Create a new [AI Model API](http://localhost:42110/server/admin/database/aimodelapi/add) in the server admin settings.
- Add your [Gemini API key](https://aistudio.google.com/app/apikey)
- Give the configuration a friendly name like `Gemini`. Do not configure the API base url.
2. Create a new [chat model options](http://localhost:42110/server/admin/database/chatmodeloptions/add)
- Set the `chat-model` field to a [Google Gemini chat model](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-models). Example: `gemini-1.5-flash`.
- Set the `model-type` field to `Gemini`.
- - Set the `Openai config` field to the OpenAI processor conversation config for Gemini you created in step 1.
+ - Set the `ai model api` field to the Gemini AI Model API you created in step 1.
diff --git a/documentation/docusaurus.config.js b/documentation/docusaurus.config.js
index 6fcff6bc..13f4e906 100644
--- a/documentation/docusaurus.config.js
+++ b/documentation/docusaurus.config.js
@@ -37,6 +37,9 @@ const config = {
locales: ['en'],
},
+ // Add a widget for Chatwoot for live chat if users need help
+ clientModules: [require.resolve('./src/components/ChatwootWidget.js')],
+
presets: [
[
'classic',
@@ -69,7 +72,6 @@ const config = {
}),
],
],
-
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
diff --git a/documentation/src/components/ChatwootWidget.js b/documentation/src/components/ChatwootWidget.js
new file mode 100644
index 00000000..bb90e1c5
--- /dev/null
+++ b/documentation/src/components/ChatwootWidget.js
@@ -0,0 +1,19 @@
+import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
+
+// Only execute on client-side
+if (ExecutionEnvironment.canUseDOM) {
+ (function (d, t) {
+ var BASE_URL = "https://app.chatwoot.com";
+ var g = d.createElement(t), s = d.getElementsByTagName(t)[0];
+ g.src = BASE_URL + "/packs/js/sdk.js";
+ g.defer = true;
+ g.async = true;
+ s.parentNode.insertBefore(g, s);
+ g.onload = function () {
+ window.chatwootSDK.run({
+ websiteToken: 'cFxvnLSjfE2UF4UUiPCA5NsF',
+ baseUrl: BASE_URL
+ })
+ }
+ })(document, 'script');
+}
diff --git a/documentation/yarn.lock b/documentation/yarn.lock
index b00abca1..cf6450b9 100644
--- a/documentation/yarn.lock
+++ b/documentation/yarn.lock
@@ -48,15 +48,15 @@
dependencies:
"@algolia/cache-common" "4.24.0"
-"@algolia/client-abtesting@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.15.0.tgz#6414895e2246dc7b7facd97bd98c3abe13cabe59"
- integrity sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==
+"@algolia/client-abtesting@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.16.0.tgz#806d2da147c7bffab23ea2498e602a73432a8490"
+ integrity sha512-fqQ2Szc6zxqXyQF8Vr64QMVoqFHHDsR5gEr/Eki+q+lgERvGr3YXruiB7Xs8rDTXP6+NC3tM2sZjdaEXW/P+6Q==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
"@algolia/client-account@4.24.0":
version "4.24.0"
@@ -77,15 +77,15 @@
"@algolia/requester-common" "4.24.0"
"@algolia/transporter" "4.24.0"
-"@algolia/client-analytics@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.15.0.tgz#7ca1043cba7ac225d30e8bb52579504946b95f58"
- integrity sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==
+"@algolia/client-analytics@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.16.0.tgz#a923f43059b674239e6125f9a917cd25104e79dd"
+ integrity sha512-8HqIoGUwjc/XqjA+AjpRvtB40QzQ067qHuJujkR0k6WBLEM3OiB30FOfLZLabxnPIZgU55zmQ8exe+0WpgyKqA==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
"@algolia/client-common@4.24.0":
version "4.24.0"
@@ -95,20 +95,20 @@
"@algolia/requester-common" "4.24.0"
"@algolia/transporter" "4.24.0"
-"@algolia/client-common@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.15.0.tgz#cd47ae07a3afc7065438a2dab29f8434f848928e"
- integrity sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==
+"@algolia/client-common@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.16.0.tgz#4e53548c6a83fa6c6d1856053347506c426aabae"
+ integrity sha512-4Bzvs5cdZ2MTMQvDlsmruZfyEk/NhSdsc+tA3vH9iMGIRzOj7Y9mwITpJM+hLFhbSE9Q0p0ojTF03RoDVclsZA==
-"@algolia/client-insights@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.15.0.tgz#f3bead0edd10e69365895da4a96044064b504f4d"
- integrity sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==
+"@algolia/client-insights@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.16.0.tgz#69d9d9077a1977320ca325a7f8c9c31b0aaead31"
+ integrity sha512-vIiOK8+exA0AOlR9mRDUr148Rx3WNU73whaJtciYoqeHoy/utib+m3Lw1+6s0o7OuPb/wGRoJ1l5vQuVezVHgA==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
"@algolia/client-personalization@4.24.0":
version "4.24.0"
@@ -119,25 +119,25 @@
"@algolia/requester-common" "4.24.0"
"@algolia/transporter" "4.24.0"
-"@algolia/client-personalization@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.15.0.tgz#e962793ebf737a5ffa4867d2dfdfe17924be3833"
- integrity sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==
+"@algolia/client-personalization@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.16.0.tgz#dab4d8e694cc0d76196e64e5c90059a78b511450"
+ integrity sha512-psAzXJgzqPMCID31wrWVRg19K+h5TsLKSv6YfzQhB5munnj4IAE2lxEet2hDkji7vPA0WWpXGAW5Tx0scyMvkA==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
-"@algolia/client-query-suggestions@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.15.0.tgz#d9a2d0d0660241bdae5fc36a6f1fcf339abbafeb"
- integrity sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==
+"@algolia/client-query-suggestions@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.16.0.tgz#d515b0f246c3872b54053bc57b4c0b3be416ece7"
+ integrity sha512-ygek1jdrAbw/tUIyHkK4YrH3uQoRmBbSUvZl8NBbz0S0GxjR6bhPbDZT8ny1INIMCA3KlYHPZAlCS+02RtvDyg==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
"@algolia/client-search@4.24.0":
version "4.24.0"
@@ -148,30 +148,30 @@
"@algolia/requester-common" "4.24.0"
"@algolia/transporter" "4.24.0"
-"@algolia/client-search@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.15.0.tgz#8645f5bc87a959b8008e021d8b31d55a47920b94"
- integrity sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==
+"@algolia/client-search@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.16.0.tgz#f9a4d3754b3f0d3ec2ea6af76268edbc9cf39de2"
+ integrity sha512-mVnkDZjpbiqdXRz0NrQlx6+QsnKYENuruYyjTJNcG3qAe015tvGAHcvvzRT78ZxETS7WjruWSlXBcL5llycNsQ==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
"@algolia/events@^4.0.1":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950"
integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==
-"@algolia/ingestion@1.15.0":
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.15.0.tgz#a3f3ec2139042f8597c2a975430a6f77cd764db3"
- integrity sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==
+"@algolia/ingestion@1.16.0":
+ version "1.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.16.0.tgz#f68a803bf6949a585ccf61021206310930950452"
+ integrity sha512-nmLcQYeG1YYRDAv2U+ebBD23mBSfkmhSwdDx2DBzqupStNrYWqYHsNgATLTMtMUTfgD0nSgBl5c+03yXg5WpiQ==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
"@algolia/logger-common@4.24.0":
version "4.24.0"
@@ -185,15 +185,15 @@
dependencies:
"@algolia/logger-common" "4.24.0"
-"@algolia/monitoring@1.15.0":
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.15.0.tgz#1eb58722ec9ea6e5de3621150f97a43571bd312e"
- integrity sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==
+"@algolia/monitoring@1.16.0":
+ version "1.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.16.0.tgz#f6e838df45f06e951ec7ac40f697b8bc5f3607e0"
+ integrity sha512-tiDkoQOO/d4o8W6dEnpCIMCWp6mwdjqZ+Q51QiCKvz1vcYU/YEx4lleY9oadjAMoOVWZHL6ItEF1LbQHvVNogQ==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
"@algolia/recommend@4.24.0":
version "4.24.0"
@@ -212,15 +212,15 @@
"@algolia/requester-node-http" "4.24.0"
"@algolia/transporter" "4.24.0"
-"@algolia/recommend@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.15.0.tgz#8f3359ee7e855849ac3872f67c0672f6835c8f79"
- integrity sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==
+"@algolia/recommend@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.16.0.tgz#df9eac25697b3208bd77b72ec5a9e90bcef72a04"
+ integrity sha512-hehiMLsDnXnnZGXXKdeXUsvP3PwqAKL/rT4XutkYXsqQ1Jnv4EFrMOY8morUT8nlPv7d1bHPF+bTiNaKvkbBbA==
dependencies:
- "@algolia/client-common" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
"@algolia/requester-browser-xhr@4.24.0":
version "4.24.0"
@@ -229,24 +229,24 @@
dependencies:
"@algolia/requester-common" "4.24.0"
-"@algolia/requester-browser-xhr@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.15.0.tgz#5ffdccdf5cd7814ed3486bed418edb6db25c32a2"
- integrity sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==
+"@algolia/requester-browser-xhr@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.16.0.tgz#ca9da2695844e698add53cf759b80a6a397f0af2"
+ integrity sha512-s/ty3lN0Bk9EC6VId/JO+AMOy6s0Hb3IpXUIa4iKKrH7p3n+lTEtwltVjFVW0fq9JfvQdECoaM951K23G/nRtQ==
dependencies:
- "@algolia/client-common" "5.15.0"
+ "@algolia/client-common" "5.16.0"
"@algolia/requester-common@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.24.0.tgz#1c60c198031f48fcdb9e34c4057a3ea987b9a436"
integrity sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==
-"@algolia/requester-fetch@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.15.0.tgz#2ce94d4855090fac192b208d95eeea22e1ca4489"
- integrity sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==
+"@algolia/requester-fetch@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.16.0.tgz#8e8799c7c8efd07be4ca4fa4d12cee235eaad714"
+ integrity sha512-E8euSKDkljYpv5QHOZQrBCMZ4W98PKHRp5Cx8JxMYyyPWQ0xkD9b1c5yvOtJJ1lufqDvcuxvrF4eRBwW+BP3QA==
dependencies:
- "@algolia/client-common" "5.15.0"
+ "@algolia/client-common" "5.16.0"
"@algolia/requester-node-http@4.24.0":
version "4.24.0"
@@ -255,12 +255,12 @@
dependencies:
"@algolia/requester-common" "4.24.0"
-"@algolia/requester-node-http@5.15.0":
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.15.0.tgz#e2020afcdaea56dc204bc6c82daab41478b32d87"
- integrity sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==
+"@algolia/requester-node-http@5.16.0":
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.16.0.tgz#fe883a6f92da5afbb3de778f6c0e43c6c7f9e133"
+ integrity sha512-gzLIQlgvvXzGExBC8xFVtsiDbenGgANQ+p/lcPO5ERs1ZNGXIqLnyqwP8amZl6YwXJEt4PPXL/p4IytBWs0jUw==
dependencies:
- "@algolia/client-common" "5.15.0"
+ "@algolia/client-common" "5.16.0"
"@algolia/transporter@4.24.0":
version "4.24.0"
@@ -279,7 +279,7 @@
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.8.3":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.8.3":
version "7.26.2"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
@@ -289,9 +289,9 @@
picocolors "^1.0.0"
"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0":
- version "7.26.2"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e"
- integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02"
+ integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==
"@babel/core@^7.21.3", "@babel/core@^7.25.9":
version "7.26.0"
@@ -314,13 +314,13 @@
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/generator@^7.25.9", "@babel/generator@^7.26.0":
- version "7.26.2"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f"
- integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==
+"@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.26.3":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019"
+ integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==
dependencies:
- "@babel/parser" "^7.26.2"
- "@babel/types" "^7.26.0"
+ "@babel/parser" "^7.26.3"
+ "@babel/types" "^7.26.3"
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
jsesc "^3.0.2"
@@ -332,14 +332,6 @@
dependencies:
"@babel/types" "^7.25.9"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9"
- integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==
- dependencies:
- "@babel/traverse" "^7.25.9"
- "@babel/types" "^7.25.9"
-
"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9":
version "7.25.9"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875"
@@ -365,12 +357,12 @@
semver "^6.3.1"
"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26"
- integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0"
+ integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==
dependencies:
"@babel/helper-annotate-as-pure" "^7.25.9"
- regexpu-core "^6.1.1"
+ regexpu-core "^6.2.0"
semver "^6.3.1"
"@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3":
@@ -439,14 +431,6 @@
"@babel/helper-optimise-call-expression" "^7.25.9"
"@babel/traverse" "^7.25.9"
-"@babel/helper-simple-access@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739"
- integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==
- dependencies:
- "@babel/traverse" "^7.25.9"
- "@babel/types" "^7.25.9"
-
"@babel/helper-skip-transparent-expression-wrappers@^7.25.9":
version "7.25.9"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9"
@@ -487,12 +471,12 @@
"@babel/template" "^7.25.9"
"@babel/types" "^7.26.0"
-"@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2":
- version "7.26.2"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11"
- integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==
+"@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234"
+ integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==
dependencies:
- "@babel/types" "^7.26.0"
+ "@babel/types" "^7.26.3"
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9":
version "7.25.9"
@@ -694,11 +678,10 @@
"@babel/helper-plugin-utils" "^7.25.9"
"@babel/plugin-transform-exponentiation-operator@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f"
- integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc"
+ integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9"
"@babel/helper-plugin-utils" "^7.25.9"
"@babel/plugin-transform-export-namespace-from@^7.25.9":
@@ -762,13 +745,12 @@
"@babel/helper-plugin-utils" "^7.25.9"
"@babel/plugin-transform-modules-commonjs@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686"
- integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb"
+ integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==
dependencies:
- "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-module-transforms" "^7.26.0"
"@babel/helper-plugin-utils" "^7.25.9"
- "@babel/helper-simple-access" "^7.25.9"
"@babel/plugin-transform-modules-systemjs@^7.25.9":
version "7.25.9"
@@ -992,9 +974,9 @@
"@babel/helper-plugin-utils" "^7.25.9"
"@babel/plugin-transform-typescript@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849"
- integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd"
+ integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==
dependencies:
"@babel/helper-annotate-as-pure" "^7.25.9"
"@babel/helper-create-class-features-plugin" "^7.25.9"
@@ -1118,9 +1100,9 @@
esutils "^2.0.2"
"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e"
- integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.26.3.tgz#7c5e028d623b4683c1f83a0bd4713b9100560caa"
+ integrity sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==
dependencies:
"@babel/helper-plugin-utils" "^7.25.9"
"@babel/helper-validator-option" "^7.25.9"
@@ -1165,22 +1147,22 @@
"@babel/types" "^7.25.9"
"@babel/traverse@^7.25.9":
- version "7.25.9"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84"
- integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==
+ version "7.26.4"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd"
+ integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==
dependencies:
- "@babel/code-frame" "^7.25.9"
- "@babel/generator" "^7.25.9"
- "@babel/parser" "^7.25.9"
+ "@babel/code-frame" "^7.26.2"
+ "@babel/generator" "^7.26.3"
+ "@babel/parser" "^7.26.3"
"@babel/template" "^7.25.9"
- "@babel/types" "^7.25.9"
+ "@babel/types" "^7.26.3"
debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.21.3", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.4.4":
- version "7.26.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff"
- integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==
+"@babel/types@^7.21.3", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.4.4":
+ version "7.26.3"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0"
+ integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==
dependencies:
"@babel/helper-string-parser" "^7.25.9"
"@babel/helper-validator-identifier" "^7.25.9"
@@ -1532,10 +1514,10 @@
"@docsearch/css" "3.8.0"
algoliasearch "^5.12.0"
-"@docusaurus/babel@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.6.2.tgz#c63dd2d9d7861189fe51950b3b6550477057bcee"
- integrity sha512-v8N8TWGXDsb5sxQC3Rcqb1CZr0LlU1OgqqVBUchN6cpIUr7EJuVJs5eHcIu5Ag8mwO/hWN3f7FE9uaHTMapAbg==
+"@docusaurus/babel@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.6.3.tgz#016714fe7a8807d0fc2f7180eace5e82bebbb8a6"
+ integrity sha512-7dW9Hat9EHYCVicFXYA4hjxBY38+hPuCURL8oRF9fySRm7vzNWuEOghA1TXcykuXZp0HLG2td4RhDxCvGG7tNw==
dependencies:
"@babel/core" "^7.25.9"
"@babel/generator" "^7.25.9"
@@ -1547,23 +1529,23 @@
"@babel/runtime" "^7.25.9"
"@babel/runtime-corejs3" "^7.25.9"
"@babel/traverse" "^7.25.9"
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/utils" "3.6.2"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
babel-plugin-dynamic-import-node "^2.3.3"
fs-extra "^11.1.1"
tslib "^2.6.0"
-"@docusaurus/bundler@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.6.2.tgz#5bdd46862b40f1eea93f14714b858d07c2dd8c2f"
- integrity sha512-YkEifEVs4lV931SrHBB4n6WqRowMw+aM/QPH3z8aU+5t1dWa+1p2OPqARS+tSbh3la9ns+L1zIfSbd8RHi2/PQ==
+"@docusaurus/bundler@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.6.3.tgz#f09c2e29613f988b874a4be2247708e121b7fc5c"
+ integrity sha512-47JLuc8D4wA+6VOvmMd5fUC9rFppBQpQOnxDYiVXffm/DeV/wmm3sbpNd5Y+O+G2+nevLTRnvCm/qyancv0Y3A==
dependencies:
"@babel/core" "^7.25.9"
- "@docusaurus/babel" "3.6.2"
- "@docusaurus/cssnano-preset" "3.6.2"
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils" "3.6.2"
+ "@docusaurus/babel" "3.6.3"
+ "@docusaurus/cssnano-preset" "3.6.3"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
babel-loader "^9.2.1"
clean-css "^5.3.2"
copy-webpack-plugin "^11.0.0"
@@ -1584,18 +1566,18 @@
webpack "^5.95.0"
webpackbar "^6.0.1"
-"@docusaurus/core@3.6.2", "@docusaurus/core@^3.2.1":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.6.2.tgz#78628790f255555bb4c81e5952d16ea1412c4548"
- integrity sha512-irMts/mGLZv8dWcy0WUtbY/U6b5qIfHgQd1/kXMyAxUJo99fL0wFSqhMI+tcxjk0HYy427MXerLMqFJj+Arg1w==
+"@docusaurus/core@3.6.3", "@docusaurus/core@^3.2.1":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.6.3.tgz#6bf968ee26a36d71387bab293f27ccffc0e428b6"
+ integrity sha512-xL7FRY9Jr5DWqB6pEnqgKqcMPJOX5V0pgWXi5lCiih11sUBmcFKM7c3+GyxcVeeWFxyYSDP3grLTWqJoP4P9Vw==
dependencies:
- "@docusaurus/babel" "3.6.2"
- "@docusaurus/bundler" "3.6.2"
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/mdx-loader" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-common" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/babel" "3.6.3"
+ "@docusaurus/bundler" "3.6.3"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/mdx-loader" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-common" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
boxen "^6.2.1"
chalk "^4.1.2"
chokidar "^3.5.3"
@@ -1633,32 +1615,32 @@
webpack-dev-server "^4.15.2"
webpack-merge "^6.0.1"
-"@docusaurus/cssnano-preset@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.2.tgz#007e7150b099ea2e9e874dd48a809614c628a335"
- integrity sha512-mBkVa4QMHRwCFCVLYdBlOZuAT1iVVsS7GGSgliSVAeTOagP/AbtlBsCVrBs+keEuDuRF1w/6QEcqDoZe9fa5pw==
+"@docusaurus/cssnano-preset@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.3.tgz#ea19b307183ec20dea4927efc4ddf249150b8c6a"
+ integrity sha512-qP7SXrwZ+23GFJdPN4aIHQrZW+oH/7tzwEuc/RNL0+BdZdmIjYQqUxdXsjE4lFxLNZjj0eUrSNYIS6xwfij+5Q==
dependencies:
cssnano-preset-advanced "^6.1.2"
postcss "^8.4.38"
postcss-sort-media-queries "^5.2.0"
tslib "^2.6.0"
-"@docusaurus/logger@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.6.2.tgz#4f73f82b33e1d432f3940fc208b3c0646ca5549c"
- integrity sha512-1p4IQhhgLyIfsey4UAdAIW69aUE1Ei6O91Nsw30ryZeDWSG5dh4o3zaRGOLxfAX69Ac/yDm6YCwJOafUxL6Vxg==
+"@docusaurus/logger@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.6.3.tgz#c6e514c9429487ef38be2f2129b2b842740d92fd"
+ integrity sha512-xSubJixcNyMV9wMV4q0s47CBz3Rlc5jbcCCuij8pfQP8qn/DIpt0ks8W6hQWzHAedg/J/EwxxUOUrnEoKzJo8g==
dependencies:
chalk "^4.1.2"
tslib "^2.6.0"
-"@docusaurus/mdx-loader@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.6.2.tgz#d240974b0e754d5a5d8eb3f9d0a00a2055fabc68"
- integrity sha512-7fbRmNgF3CR96Ja82Ya0/Cdu1OL9UJ/22llNMY8lr5gAbw718Y5ryXMVRIYn0JNLTiSxzgtvW4DIsUWEB8NMpw==
+"@docusaurus/mdx-loader@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.6.3.tgz#127babc7cdb26d37c723bc3ae518bda17ce40160"
+ integrity sha512-3iJdiDz9540ppBseeI93tWTDtUGVkxzh59nMq4ignylxMuXBLK8dFqVeaEor23v1vx6TrGKZ2FuLaTB+U7C0QQ==
dependencies:
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
"@mdx-js/mdx" "^3.0.0"
"@slorber/remark-comment" "^1.0.0"
escape-html "^1.0.3"
@@ -1681,12 +1663,12 @@
vfile "^6.0.1"
webpack "^5.88.1"
-"@docusaurus/module-type-aliases@3.6.2", "@docusaurus/module-type-aliases@^3.2.1":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.2.tgz#7432618696668acc9a7cfb47de66c6987cd57680"
- integrity sha512-NrJkL2rLTCjHtWOqUvWzwqvJrsKLj0gVJeV6q5yeKdKKgItietcTf2fTRkM9LHKSUN8CBDXxwHABeQvTahvmXQ==
+"@docusaurus/module-type-aliases@3.6.3", "@docusaurus/module-type-aliases@^3.2.1":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.3.tgz#1f7030b1cf1f658cf664d41b6eadba93bbe51d87"
+ integrity sha512-MjaXX9PN/k5ugNvfRZdWyKWq4FsrhN4LEXaj0pEmMebJuBNlFeGyKQUa9DRhJHpadNaiMLrbo9m3U7Ig5YlsZg==
dependencies:
- "@docusaurus/types" "3.6.2"
+ "@docusaurus/types" "3.6.3"
"@types/history" "^4.7.11"
"@types/react" "*"
"@types/react-router-config" "*"
@@ -1694,19 +1676,19 @@
react-helmet-async "*"
react-loadable "npm:@docusaurus/react-loadable@6.0.0"
-"@docusaurus/plugin-content-blog@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.2.tgz#b197dd920e380bf1394995215ba7fee8019baa82"
- integrity sha512-6bJxr6Or4NslEVH3BJuPH30kUWiqUjDRdGPhvxpHmt9W/RY2/6u72WICG3bW3dLFxJ/2uDLBU92lHnatpvo7Ew==
+"@docusaurus/plugin-content-blog@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.3.tgz#d6a597e4bfdeb3f1f6ce06d2ac86207296988cc9"
+ integrity sha512-k0ogWwwJU3pFRFfvW1kRVHxzf2DutLGaaLjAnHVEU6ju+aRP0Z5ap/13DHyPOfHeE4WKpn/M0TqjdwZAcY3kAw==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/mdx-loader" "3.6.2"
- "@docusaurus/theme-common" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-common" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/mdx-loader" "3.6.3"
+ "@docusaurus/theme-common" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-common" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
cheerio "1.0.0-rc.12"
feed "^4.2.2"
fs-extra "^11.1.1"
@@ -1718,20 +1700,20 @@
utility-types "^3.10.0"
webpack "^5.88.1"
-"@docusaurus/plugin-content-docs@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.2.tgz#3a8b4b162a2688e5855c04ed6c4ec0b6951619a0"
- integrity sha512-e6WW1g10RIXXLN/rrtqTi/FyJ1Hj3X9Mmgz4V11/0pDCxIGGI8m4ocbAglUlLtgvbLD5viNLefl/NwbOW3JXiQ==
+"@docusaurus/plugin-content-docs@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.3.tgz#aae044d2af6996d1a6de8d815aca8a83b485e0a5"
+ integrity sha512-r2wS8y/fsaDcxkm20W5bbYJFPzdWdEaTWVYjNxlHlcmX086eqQR1Fomlg9BHTJ0dLXPzAlbC8EN4XqMr3QzNCQ==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/mdx-loader" "3.6.2"
- "@docusaurus/module-type-aliases" "3.6.2"
- "@docusaurus/theme-common" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-common" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/mdx-loader" "3.6.3"
+ "@docusaurus/module-type-aliases" "3.6.3"
+ "@docusaurus/theme-common" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-common" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
"@types/react-router-config" "^5.0.7"
combine-promises "^1.1.0"
fs-extra "^11.1.1"
@@ -1741,115 +1723,115 @@
utility-types "^3.10.0"
webpack "^5.88.1"
-"@docusaurus/plugin-content-pages@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.2.tgz#49b1a033d41841f7a8bcbbe67511609b402cc80f"
- integrity sha512-fo4NyGkw10lYHyHaTxE6TZLYnxNtCfRHeZkNK1N9pBYqe7TT2dBUNAEeVW2U3ed9m6YuB7JKSQsa++GGmcP+6g==
+"@docusaurus/plugin-content-pages@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.3.tgz#0a5a43d1677ee519f63a54634653c54ddf41f475"
+ integrity sha512-eHrmTgjgLZsuqfsYr5X2xEwyIcck0wseSofWrjTwT9FLOWp+KDmMAuVK+wRo7sFImWXZk3oV/xX/g9aZrhD7OA==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/mdx-loader" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/mdx-loader" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
fs-extra "^11.1.1"
tslib "^2.6.0"
webpack "^5.88.1"
-"@docusaurus/plugin-debug@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.6.2.tgz#6983f64954fe69a51b65b2d9431bdf0b5ccf1884"
- integrity sha512-T/eS3VvHElpeV5S8uwp7Si4ujEynmgFtJLvA2CSa5pzQuOF1EEghF9nekAIj0cWtDHsqNUDZNr8hK1brivFXSg==
+"@docusaurus/plugin-debug@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.6.3.tgz#4e62ddfbae4d597b073f8e3c632cc12d012339e3"
+ integrity sha512-zB9GXfIZNPRfzKnNjU6xGVrqn9bPXuGhpjgsuc/YtcTDjnjhasg38NdYd5LEqXex5G/zIorQgWB3n6x/Ut62vQ==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
fs-extra "^11.1.1"
react-json-view-lite "^1.2.0"
tslib "^2.6.0"
-"@docusaurus/plugin-google-analytics@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.2.tgz#4266b4b2273998e87fa733d932d5b464c2a10b21"
- integrity sha512-B7ihrr3wz8e4XqW+dIAtq844u3Z83u5CeiL1xrCqzFH+vDCjUZHTamS3zKXNcgi6YVVe6hUQXPG15ltaqQaVPQ==
+"@docusaurus/plugin-google-analytics@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.3.tgz#63648d469b1e3c50fad8878e7a7db9856e503d5f"
+ integrity sha512-rCDNy1QW8Dag7nZq67pcum0bpFLrwvxJhYuVprhFh8BMBDxV0bY+bAkGHbSf68P3Bk9C3hNOAXX1srGLIDvcTA==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
tslib "^2.6.0"
-"@docusaurus/plugin-google-gtag@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.2.tgz#23f70f7a05e61cfb9d9d7ee18dbff3ef2b129f2c"
- integrity sha512-V8ijI6qddAAkJ0vd8sjZ7S/apRTLJn9dAwvj/rSMd93witGdKINemL+9TyfLkhcXKTxyqRT8zKdu8ewjPXqKHg==
+"@docusaurus/plugin-google-gtag@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.3.tgz#8a1388b4123904be17e661ea7aa71d798d0c046e"
+ integrity sha512-+OyDvhM6rqVkQOmLVkQWVJAizEEfkPzVWtIHXlWPOCFGK9X4/AWeBSrU0WG4iMg9Z4zD4YDRrU+lvI4s6DSC+w==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
"@types/gtag.js" "^0.0.12"
tslib "^2.6.0"
-"@docusaurus/plugin-google-tag-manager@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.2.tgz#36ab95fcd5c1bf96fd18c0cf9b208bb428b81242"
- integrity sha512-fnWQ5FdN9f8c8VTgjaQ98208Y+d/JjHhD506rWIIL9rt1cJOf29XElxvOeKpMJadfkgY5KLZSAiHkGt+4qgN4g==
+"@docusaurus/plugin-google-tag-manager@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.3.tgz#38cbe416803f29782807cebf3ebf240cb47c3c74"
+ integrity sha512-1M6UPB13gWUtN2UHX083/beTn85PlRI9ABItTl/JL1FJ5dJTWWFXXsHf9WW/6hrVwthwTeV/AGbGKvLKV+IlCA==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
tslib "^2.6.0"
-"@docusaurus/plugin-sitemap@3.6.2", "@docusaurus/plugin-sitemap@^3.2.1":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.2.tgz#c8ff7cf82bd5d943a13bb8d0ae690080a025029e"
- integrity sha512-qcAQAP1Ot0dZpeRoJ0L/Zck5FVDkll2IleVZQLzxeRVDZIw1P9/TK7/Aw1w2pmH7dmw/Cwk/cLSVRvLAmp9k7A==
+"@docusaurus/plugin-sitemap@3.6.3", "@docusaurus/plugin-sitemap@^3.2.1":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.3.tgz#0458e6f7476ab6fd1466e01b153a3211d3223c53"
+ integrity sha512-94qOO4M9Fwv9KfVQJsgbe91k+fPJ4byf1L3Ez8TUa6TAFPo/BrLwQ80zclHkENlL1824TuxkcMKv33u6eydQCg==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-common" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-common" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
fs-extra "^11.1.1"
sitemap "^7.1.1"
tslib "^2.6.0"
"@docusaurus/preset-classic@^3.2.1":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.6.2.tgz#5ec801fa317123ba8458af3105eca8eac78a49bc"
- integrity sha512-r2n5eHdhiNSrJGsrrYcw+WsyStmXxe0ZG3RdA9LVyK5+jBHM8blrUWJEDugnzCNbyhUzhdtcmgCC9fhdAvKuQw==
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.6.3.tgz#072298b5b6d0de7d0346b1e9b550a30ef2add56d"
+ integrity sha512-VHSYWROT3flvNNI1SrnMOtW1EsjeHNK9dhU6s9eY5hryZe79lUqnZJyze/ymDe2LXAqzyj6y5oYvyBoZZk6ErA==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/plugin-content-blog" "3.6.2"
- "@docusaurus/plugin-content-docs" "3.6.2"
- "@docusaurus/plugin-content-pages" "3.6.2"
- "@docusaurus/plugin-debug" "3.6.2"
- "@docusaurus/plugin-google-analytics" "3.6.2"
- "@docusaurus/plugin-google-gtag" "3.6.2"
- "@docusaurus/plugin-google-tag-manager" "3.6.2"
- "@docusaurus/plugin-sitemap" "3.6.2"
- "@docusaurus/theme-classic" "3.6.2"
- "@docusaurus/theme-common" "3.6.2"
- "@docusaurus/theme-search-algolia" "3.6.2"
- "@docusaurus/types" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/plugin-content-blog" "3.6.3"
+ "@docusaurus/plugin-content-docs" "3.6.3"
+ "@docusaurus/plugin-content-pages" "3.6.3"
+ "@docusaurus/plugin-debug" "3.6.3"
+ "@docusaurus/plugin-google-analytics" "3.6.3"
+ "@docusaurus/plugin-google-gtag" "3.6.3"
+ "@docusaurus/plugin-google-tag-manager" "3.6.3"
+ "@docusaurus/plugin-sitemap" "3.6.3"
+ "@docusaurus/theme-classic" "3.6.3"
+ "@docusaurus/theme-common" "3.6.3"
+ "@docusaurus/theme-search-algolia" "3.6.3"
+ "@docusaurus/types" "3.6.3"
-"@docusaurus/theme-classic@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.6.2.tgz#4c2770d3609176dd2462dfb0cb4d0b3d3010404b"
- integrity sha512-bCdOPqPNezhLx+hgNVO2Cf+8/1AHa9uHDOqTx/CKAx2I0J/jV9G+6JiMtpSRKGNfBoLT1O+56/7+WtkOf54xTw==
+"@docusaurus/theme-classic@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.6.3.tgz#00599a9de5fd5c122fd1b8c59d3b755878f2a72c"
+ integrity sha512-1RRLK1tSArI2c00qugWYO3jRocjOZwGF1mBzPPylDVRwWCS/rnWWR91ChdbbaxIupRJ+hX8ZBYrwr5bbU0oztQ==
dependencies:
- "@docusaurus/core" "3.6.2"
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/mdx-loader" "3.6.2"
- "@docusaurus/module-type-aliases" "3.6.2"
- "@docusaurus/plugin-content-blog" "3.6.2"
- "@docusaurus/plugin-content-docs" "3.6.2"
- "@docusaurus/plugin-content-pages" "3.6.2"
- "@docusaurus/theme-common" "3.6.2"
- "@docusaurus/theme-translations" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-common" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/mdx-loader" "3.6.3"
+ "@docusaurus/module-type-aliases" "3.6.3"
+ "@docusaurus/plugin-content-blog" "3.6.3"
+ "@docusaurus/plugin-content-docs" "3.6.3"
+ "@docusaurus/plugin-content-pages" "3.6.3"
+ "@docusaurus/theme-common" "3.6.3"
+ "@docusaurus/theme-translations" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-common" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
"@mdx-js/react" "^3.0.0"
clsx "^2.0.0"
copy-text-to-clipboard "^3.2.0"
@@ -1864,15 +1846,15 @@
tslib "^2.6.0"
utility-types "^3.10.0"
-"@docusaurus/theme-common@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.6.2.tgz#a520d9053b6ea0fa913d42898d35f73ed5ca3b9b"
- integrity sha512-lfgsL064KEHpCkgGUc0OYoUPCpYfzggp6Hof8sz59UuKiLvb/Z7raewE9/NfocrJ2HZI17rLgMX3SQlRDh/5gg==
+"@docusaurus/theme-common@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.6.3.tgz#a8a6ebd2b0fd7a5cca4d0c6a2f9ccff905fa7438"
+ integrity sha512-b8ZkhczXHDxWWyvz+YJy4t/PlPbEogTTbgnHoflYnH7rmRtyoodTsu8WVM12la5LmlMJBclBXFl29OH8kPE7gg==
dependencies:
- "@docusaurus/mdx-loader" "3.6.2"
- "@docusaurus/module-type-aliases" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-common" "3.6.2"
+ "@docusaurus/mdx-loader" "3.6.3"
+ "@docusaurus/module-type-aliases" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-common" "3.6.3"
"@types/history" "^4.7.11"
"@types/react" "*"
"@types/react-router-config" "*"
@@ -1882,19 +1864,19 @@
tslib "^2.6.0"
utility-types "^3.10.0"
-"@docusaurus/theme-search-algolia@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.2.tgz#b03b7d35a385004d089d000be764abdfb3fa5721"
- integrity sha512-SFLS+Rq8Cg2yepnHucA9sRpIR97yHvZWlCgMzBLunV3KHbB6hD2h5HPhFV39wYHYCjJUAOH1lX9poJ1qKYuSvg==
+"@docusaurus/theme-search-algolia@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.3.tgz#1a3331a489f392f5b032c4efc5f431e57eddf7ce"
+ integrity sha512-rt+MGCCpYgPyWCGXtbxlwFbTSobu15jWBTPI2LHsHNa5B0zSmOISX6FWYAPt5X1rNDOqMGM0FATnh7TBHRohVA==
dependencies:
"@docsearch/react" "^3.5.2"
- "@docusaurus/core" "3.6.2"
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/plugin-content-docs" "3.6.2"
- "@docusaurus/theme-common" "3.6.2"
- "@docusaurus/theme-translations" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-validation" "3.6.2"
+ "@docusaurus/core" "3.6.3"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/plugin-content-docs" "3.6.3"
+ "@docusaurus/theme-common" "3.6.3"
+ "@docusaurus/theme-translations" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-validation" "3.6.3"
algoliasearch "^4.18.0"
algoliasearch-helper "^3.13.3"
clsx "^2.0.0"
@@ -1904,18 +1886,18 @@
tslib "^2.6.0"
utility-types "^3.10.0"
-"@docusaurus/theme-translations@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.6.2.tgz#ff6d2588aa9bf9fb1e07465def067529d5668665"
- integrity sha512-LIWrYoDUsOTKmb0c7IQzawiPUTAaczBs5IOx6srxOWoTHVUMLzJCkl5Y6whfuRrnul8G05qv2vk238bN5Ko62g==
+"@docusaurus/theme-translations@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.6.3.tgz#6e473835ea016ce4acd7d2997f411811db8c4f6b"
+ integrity sha512-Gb0regclToVlngSIIwUCtBMQBq48qVUaN1XQNKW4XwlsgUyk0vP01LULdqbem7czSwIeBAFXFoORJ0RPX7ht/w==
dependencies:
fs-extra "^11.1.1"
tslib "^2.6.0"
-"@docusaurus/types@3.6.2", "@docusaurus/types@^3.2.1":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.6.2.tgz#bd69c4c99b535b67f01276dc186622e0b1fc1305"
- integrity sha512-117Wsk6xXrWEAsCYCXS3TGJv5tkdIZDcd7T/V0UJvKYmY0gyVPPcEQChy8yTdjbIkbB2q4fa7Jpox72Qv86mqQ==
+"@docusaurus/types@3.6.3", "@docusaurus/types@^3.2.1":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.6.3.tgz#e87592e31616da1b8dc473e4c8205c61885a1518"
+ integrity sha512-xD9oTGDrouWzefkhe9ogB2fDV96/82cRpNGx2HIvI5L87JHNhQVIWimQ/3JIiiX/TEd5S9s+VO6FFguwKNRVow==
dependencies:
"@mdx-js/mdx" "^3.0.0"
"@types/history" "^4.7.11"
@@ -1927,36 +1909,36 @@
webpack "^5.95.0"
webpack-merge "^5.9.0"
-"@docusaurus/utils-common@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.6.2.tgz#3367572d72090b7f17e721af7f020f8e39931662"
- integrity sha512-dr5wK+OyU2QAWxG7S5siD2bPgS7+ZeqWHfgLNHZ5yalaZf8TbeNNLqydfngukAY56BGZN0NbMkX6jGIr7ZF0sA==
+"@docusaurus/utils-common@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.6.3.tgz#57f840bd6f0928cf10060198cb421f1b9212c8f5"
+ integrity sha512-v4nKDaANLgT3pMBewHYEMAl/ufY0LkXao1QkFWzI5huWFOmNQ2UFzv2BiKeHX5Ownis0/w6cAyoxPhVdDonlSQ==
dependencies:
- "@docusaurus/types" "3.6.2"
+ "@docusaurus/types" "3.6.3"
tslib "^2.6.0"
-"@docusaurus/utils-validation@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.6.2.tgz#62b97a0d72694c85fa63928c494dd238a84c991f"
- integrity sha512-Y3EwblDz72KOcobb5t2zlhHSmrfE8EaHusPJ96Kx2JYtNXL2omqCoOb6FpaXWhES75wvjUpkFLYfiNqAqEov8g==
+"@docusaurus/utils-validation@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.6.3.tgz#3eca7125235eb90983ff660b97a71f331e331f57"
+ integrity sha512-bhEGGiN5BE38h21vjqD70Gxg++j+PfYVddDUE5UFvLDup68QOcpD33CLr+2knPorlxRbEaNfz6HQDUMQ3HuqKw==
dependencies:
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/utils" "3.6.2"
- "@docusaurus/utils-common" "3.6.2"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/utils" "3.6.3"
+ "@docusaurus/utils-common" "3.6.3"
fs-extra "^11.2.0"
joi "^17.9.2"
js-yaml "^4.1.0"
lodash "^4.17.21"
tslib "^2.6.0"
-"@docusaurus/utils@3.6.2":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.6.2.tgz#727299c2051eee04c1b431bc6ccd55fd4e5a0d52"
- integrity sha512-oxnpUcFZGE3uPCDoXr8GJriB3VWM9sFjPedFidX3Fsz87l1NZNc1wtbKPfQ7GYFDMYo2IGlAv5+47Me9RkM6lg==
+"@docusaurus/utils@3.6.3":
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.6.3.tgz#8dcb1969e4011a84dfb0a031da806dadddebf0ea"
+ integrity sha512-0R/FR3bKVl4yl8QwbL4TYFfR+OXBRpVUaTJdENapBGR3YMwfM6/JnhGilWQO8AOwPJGtGoDK7ib8+8UF9f3OZQ==
dependencies:
- "@docusaurus/logger" "3.6.2"
- "@docusaurus/types" "3.6.2"
- "@docusaurus/utils-common" "3.6.2"
+ "@docusaurus/logger" "3.6.3"
+ "@docusaurus/types" "3.6.3"
+ "@docusaurus/utils-common" "3.6.3"
"@svgr/webpack" "^8.1.0"
escape-string-regexp "^4.0.0"
file-loader "^6.2.0"
@@ -2368,9 +2350,9 @@
integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db"
- integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a"
+ integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==
dependencies:
"@types/node" "*"
"@types/qs" "*"
@@ -2500,11 +2482,11 @@
"@types/node" "*"
"@types/node@*":
- version "22.9.1"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.1.tgz#bdf91c36e0e7ecfb7257b2d75bf1b206b308ca71"
- integrity sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==
+ version "22.10.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766"
+ integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==
dependencies:
- undici-types "~6.19.8"
+ undici-types "~6.20.0"
"@types/node@^17.0.5":
version "17.0.45"
@@ -2521,11 +2503,6 @@
resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.5.tgz#72499abbb4c4ec9982446509d2f14fb8483869d6"
integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==
-"@types/prop-types@*":
- version "15.7.13"
- resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451"
- integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
-
"@types/qs@*":
version "6.9.17"
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a"
@@ -2563,11 +2540,10 @@
"@types/react" "*"
"@types/react@*":
- version "18.3.12"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60"
- integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==
+ version "19.0.1"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.1.tgz#a000d5b78f473732a08cecbead0f3751e550b3df"
+ integrity sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==
dependencies:
- "@types/prop-types" "*"
csstype "^3.0.2"
"@types/retry@0.12.0":
@@ -2643,11 +2619,11 @@
"@types/yargs-parser" "*"
"@ungap/structured-clone@^1.0.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
- integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd"
+ integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==
-"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1":
+"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1":
version "1.14.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6"
integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==
@@ -2713,7 +2689,7 @@
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1"
integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==
-"@webassemblyjs/wasm-edit@^1.12.1":
+"@webassemblyjs/wasm-edit@^1.14.1":
version "1.14.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597"
integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==
@@ -2748,7 +2724,7 @@
"@webassemblyjs/wasm-gen" "1.14.1"
"@webassemblyjs/wasm-parser" "1.14.1"
-"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1":
+"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1":
version "1.14.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb"
integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==
@@ -2856,9 +2832,9 @@ ajv@^8.0.0, ajv@^8.9.0:
require-from-string "^2.0.2"
algoliasearch-helper@^3.13.3:
- version "3.22.5"
- resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.22.5.tgz#2fcc26814e10a121a2c2526a1b05c754061c56c0"
- integrity sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==
+ version "3.22.6"
+ resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.22.6.tgz#6a31c67d277a32f3f7ae1b8a6e57ca73f1e1a0b0"
+ integrity sha512-F2gSb43QHyvZmvH/2hxIjbk/uFdO2MguQYTFP7J+RowMW1csjIODMobEnpLI8nbLQuzZnGZdIxl5Bpy1k9+CFQ==
dependencies:
"@algolia/events" "^4.0.1"
@@ -2884,23 +2860,23 @@ algoliasearch@^4.18.0:
"@algolia/transporter" "4.24.0"
algoliasearch@^5.12.0:
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.15.0.tgz#09cef5a2555c4554b37a99f0488ea6ab2347e625"
- integrity sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==
+ version "5.16.0"
+ resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.16.0.tgz#5a1768ae6846c93a8314ecdf1521dd11ce6c80b0"
+ integrity sha512-0zWz0LGfB0MLrhcnyGDpvVWPSsZnECNU6V/GPtNkHHSgaUj/7i+j36bZm6HClCvo8GvuxbN+ccbFREWUouHlfg==
dependencies:
- "@algolia/client-abtesting" "5.15.0"
- "@algolia/client-analytics" "5.15.0"
- "@algolia/client-common" "5.15.0"
- "@algolia/client-insights" "5.15.0"
- "@algolia/client-personalization" "5.15.0"
- "@algolia/client-query-suggestions" "5.15.0"
- "@algolia/client-search" "5.15.0"
- "@algolia/ingestion" "1.15.0"
- "@algolia/monitoring" "1.15.0"
- "@algolia/recommend" "5.15.0"
- "@algolia/requester-browser-xhr" "5.15.0"
- "@algolia/requester-fetch" "5.15.0"
- "@algolia/requester-node-http" "5.15.0"
+ "@algolia/client-abtesting" "5.16.0"
+ "@algolia/client-analytics" "5.16.0"
+ "@algolia/client-common" "5.16.0"
+ "@algolia/client-insights" "5.16.0"
+ "@algolia/client-personalization" "5.16.0"
+ "@algolia/client-query-suggestions" "5.16.0"
+ "@algolia/client-search" "5.16.0"
+ "@algolia/ingestion" "1.16.0"
+ "@algolia/monitoring" "1.16.0"
+ "@algolia/recommend" "5.16.0"
+ "@algolia/requester-browser-xhr" "5.16.0"
+ "@algolia/requester-fetch" "5.16.0"
+ "@algolia/requester-node-http" "5.16.0"
ansi-align@^3.0.1:
version "3.0.1"
@@ -3181,16 +3157,23 @@ cacheable-request@^10.2.8:
normalize-url "^8.0.0"
responselike "^3.0.0"
-call-bind@^1.0.5, call-bind@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
- integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+call-bind-apply-helpers@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840"
+ integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==
dependencies:
- es-define-property "^1.0.0"
es-errors "^1.3.0"
function-bind "^1.1.2"
+
+call-bind@^1.0.5, call-bind@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c"
+ integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==
+ dependencies:
+ call-bind-apply-helpers "^1.0.0"
+ es-define-property "^1.0.0"
get-intrinsic "^1.2.4"
- set-function-length "^1.2.1"
+ set-function-length "^1.2.2"
callsites@^3.0.0:
version "3.1.0"
@@ -3226,9 +3209,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669:
- version "1.0.30001680"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz#5380ede637a33b9f9f1fc6045ea99bd142f3da5e"
- integrity sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==
+ version "1.0.30001687"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz#d0ac634d043648498eedf7a3932836beba90ebae"
+ integrity sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==
ccount@^2.0.0:
version "2.0.1"
@@ -3688,9 +3671,9 @@ css-what@^6.0.1, css-what@^6.1.0:
integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
cssdb@^8.2.1:
- version "8.2.1"
- resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.2.1.tgz#62a5d9a41e2c86f1d7c35981098fc5ce47c5766c"
- integrity sha512-KwEPys7lNsC8OjASI8RrmwOYYDcm0JOW9zQhcV83ejYcQkirTEyeAGui8aO2F5PiS6SLpxuTzl6qlMElIdsgIg==
+ version "8.2.3"
+ resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.2.3.tgz#7e6980bb5a785a9b4eb2a21bd38d50624b56cb46"
+ integrity sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==
cssesc@^3.0.0:
version "3.0.0"
@@ -3784,9 +3767,9 @@ debug@2.6.9, debug@^2.6.0:
ms "2.0.0"
debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
- version "4.3.7"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
- integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
dependencies:
ms "^2.1.3"
@@ -4002,6 +3985,15 @@ dot-prop@^6.0.1:
dependencies:
is-obj "^2.0.0"
+dunder-proto@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.0.tgz#c2fce098b3c8f8899554905f4377b6d85dabaa80"
+ integrity sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
duplexer@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
@@ -4018,9 +4010,9 @@ ee-first@1.1.1:
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
electron-to-chromium@^1.5.41:
- version "1.5.63"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz#69444d592fbbe628d129866c2355691ea93eda3e"
- integrity sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==
+ version "1.5.72"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz#a732805986d3a5b5fedd438ddf4616c7d78ac2df"
+ integrity sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==
emoji-regex@^8.0.0:
version "8.0.0"
@@ -4082,12 +4074,10 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
-es-define-property@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
- integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
- dependencies:
- get-intrinsic "^1.2.4"
+es-define-property@^1.0.0, es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
es-errors@^1.3.0:
version "1.3.0"
@@ -4289,9 +4279,9 @@ execa@^5.0.0:
strip-final-newline "^2.0.0"
express@^4.17.3:
- version "4.21.1"
- resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281"
- integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==
+ version "4.21.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32"
+ integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
dependencies:
accepts "~1.3.8"
array-flatten "1.1.1"
@@ -4312,7 +4302,7 @@ express@^4.17.3:
methods "~1.1.2"
on-finished "2.4.1"
parseurl "~1.3.3"
- path-to-regexp "0.1.10"
+ path-to-regexp "0.1.12"
proxy-addr "~2.0.7"
qs "6.13.0"
range-parser "~1.2.1"
@@ -4560,16 +4550,19 @@ gensync@^1.0.0-beta.2:
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
-get-intrinsic@^1.1.3, get-intrinsic@^1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
- integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+get-intrinsic@^1.2.4:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.5.tgz#dfe7dd1b30761b464fe51bf4bb00ac7c37b681e7"
+ integrity sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==
dependencies:
+ call-bind-apply-helpers "^1.0.0"
+ dunder-proto "^1.0.0"
+ es-define-property "^1.0.1"
es-errors "^1.3.0"
function-bind "^1.1.2"
- has-proto "^1.0.1"
- has-symbols "^1.0.3"
- hasown "^2.0.0"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
get-own-enumerable-property-symbols@^3.0.0:
version "3.0.2"
@@ -4668,12 +4661,10 @@ globby@^13.1.1:
merge2 "^1.4.1"
slash "^4.0.0"
-gopd@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
- integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
- dependencies:
- get-intrinsic "^1.1.3"
+gopd@^1.0.1, gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
got@^12.1.0:
version "12.6.1"
@@ -4736,22 +4727,17 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
dependencies:
es-define-property "^1.0.0"
-has-proto@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
- integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
-
-has-symbols@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
- integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+has-symbols@^1.0.3, has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
has-yarn@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d"
integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==
-hasown@^2.0.0, hasown@^2.0.2:
+hasown@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
@@ -5496,9 +5482,9 @@ leven@^3.1.0:
integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
lilconfig@^3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb"
- integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4"
+ integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==
lines-and-columns@^1.1.6:
version "1.2.4"
@@ -6397,9 +6383,9 @@ multicast-dns@^7.2.5:
thunky "^1.0.2"
nanoid@^3.3.7:
- version "3.3.7"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
- integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+ version "3.3.8"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
+ integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
negotiator@0.6.3:
version "0.6.3"
@@ -6425,9 +6411,9 @@ no-case@^3.0.4:
tslib "^2.0.3"
node-emoji@^2.1.0:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06"
- integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0"
+ integrity sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==
dependencies:
"@sindresorhus/is" "^4.6.0"
char-regex "^1.0.2"
@@ -6440,9 +6426,9 @@ node-forge@^1:
integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
node-releases@^2.0.18:
- version "2.0.18"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
- integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+ version "2.0.19"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
+ integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
@@ -6740,10 +6726,10 @@ path-parse@^1.0.7:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
-path-to-regexp@0.1.10:
- version "0.1.10"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b"
- integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==
+path-to-regexp@0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
+ integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
path-to-regexp@3.3.0:
version "3.3.0"
@@ -7727,22 +7713,22 @@ regenerator-transform@^0.15.2:
dependencies:
"@babel/runtime" "^7.8.4"
-regexpu-core@^6.1.1:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac"
- integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==
+regexpu-core@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826"
+ integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==
dependencies:
regenerate "^1.4.2"
regenerate-unicode-properties "^10.2.0"
regjsgen "^0.8.0"
- regjsparser "^0.11.0"
+ regjsparser "^0.12.0"
unicode-match-property-ecmascript "^2.0.0"
unicode-match-property-value-ecmascript "^2.1.0"
registry-auth-token@^5.0.1:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756"
- integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.3.tgz#417d758c8164569de8cf5cabff16cc937902dcc6"
+ integrity sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==
dependencies:
"@pnpm/npm-conf" "^2.1.0"
@@ -7758,10 +7744,10 @@ regjsgen@^0.8.0:
resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab"
integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==
-regjsparser@^0.11.0:
- version "0.11.2"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.2.tgz#7404ad42be00226d72bcf1f003f1f441861913d8"
- integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==
+regjsparser@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc"
+ integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==
dependencies:
jsesc "~3.0.2"
@@ -8125,7 +8111,7 @@ serve-static@1.16.2:
parseurl "~1.3.3"
send "0.19.0"
-set-function-length@^1.2.1:
+set-function-length@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
@@ -8172,9 +8158,9 @@ shebang-regex@^3.0.0:
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shell-quote@^1.7.3, shell-quote@^1.8.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
- integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a"
+ integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==
shelljs@^0.8.5:
version "0.8.5"
@@ -8503,9 +8489,9 @@ terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.9:
terser "^5.26.0"
terser@^5.10.0, terser@^5.15.1, terser@^5.26.0:
- version "5.36.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e"
- integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==
+ version "5.37.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3"
+ integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@@ -8594,10 +8580,10 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
-undici-types@~6.19.8:
- version "6.19.8"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
- integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+undici-types@~6.20.0:
+ version "6.20.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
+ integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.1"
@@ -8914,15 +8900,15 @@ webpack-sources@^3.2.3:
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
webpack@^5.88.1, webpack@^5.95.0:
- version "5.96.1"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.96.1.tgz#3676d1626d8312b6b10d0c18cc049fba7ac01f0c"
- integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==
+ version "5.97.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.97.1.tgz#972a8320a438b56ff0f1d94ade9e82eac155fa58"
+ integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==
dependencies:
"@types/eslint-scope" "^3.7.7"
"@types/estree" "^1.0.6"
- "@webassemblyjs/ast" "^1.12.1"
- "@webassemblyjs/wasm-edit" "^1.12.1"
- "@webassemblyjs/wasm-parser" "^1.12.1"
+ "@webassemblyjs/ast" "^1.14.1"
+ "@webassemblyjs/wasm-edit" "^1.14.1"
+ "@webassemblyjs/wasm-parser" "^1.14.1"
acorn "^8.14.0"
browserslist "^4.24.0"
chrome-trace-event "^1.0.2"
diff --git a/manifest.json b/manifest.json
index fbe0a70d..5c7d60aa 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"id": "khoj",
"name": "Khoj",
- "version": "1.30.1",
+ "version": "1.31.0",
"minAppVersion": "0.15.0",
"description": "Your Second Brain",
"author": "Khoj Inc.",
diff --git a/prod.Dockerfile b/prod.Dockerfile
index d955f155..015a5a3e 100644
--- a/prod.Dockerfile
+++ b/prod.Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
-FROM ubuntu:jammy
+FROM ubuntu:jammy AS base
LABEL homepage="https://khoj.dev"
LABEL repository="https://github.com/khoj-ai/khoj"
LABEL org.opencontainers.image.source="https://github.com/khoj-ai/khoj"
@@ -13,36 +13,52 @@ RUN apt update -y && apt -y install \
libsm6 \
libxext6 \
swig \
- curl && \
- # Required by Next.js Web app
- curl -sL https://deb.nodesource.com/setup_20.x | bash - && \
- curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
- echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
- apt update -y && apt -y --no-install-recommends install nodejs yarn && \
+ curl \
+ # Required by llama-cpp-python pre-built wheels. See #1628
+ musl-dev && \
+ ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1 && \
+ # Clean up
apt clean && rm -rf /var/lib/apt/lists/*
-# Install Application
+# Build Server
+FROM base AS server-deps
WORKDIR /app
COPY pyproject.toml .
COPY README.md .
ARG VERSION=0.0.0
+# use the pre-built llama-cpp-python, torch cpu wheel
+ENV PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/cpu https://abetlen.github.io/llama-cpp-python/whl/cpu"
+# avoid downloading unused cuda specific python packages
+ENV CUDA_VISIBLE_DEVICES=""
RUN sed -i "s/dynamic = \\[\"version\"\\]/version = \"$VERSION\"/" pyproject.toml && \
pip install --no-cache-dir -e .[prod]
-# Copy Source Code
-COPY . .
-
-# Set the PYTHONPATH environment variable in order for it to find the Django app.
-ENV PYTHONPATH=/app/src:$PYTHONPATH
-
-# Go to the directory src/interface/web and export the built Next.js assets
+# Build Web App
+FROM node:20-alpine AS web-app
+# Set build optimization env vars
+ENV NODE_ENV=production
+ENV NEXT_TELEMETRY_DISABLED=1
WORKDIR /app/src/interface/web
-RUN bash -c "yarn install --frozen-lockfile --verbose && yarn ciexport && yarn cache clean"
+# Install dependencies first (cache layer)
+COPY src/interface/web/package.json src/interface/web/yarn.lock ./
+RUN yarn install --frozen-lockfile
+# Copy source and build
+COPY src/interface/web/. ./
+RUN yarn build
+
+# Merge the Server and Web App into a Single Image
+FROM base
+ENV PYTHONPATH=/app/src:$PYTHONPATH
WORKDIR /app
+COPY --from=server-deps /usr/local/lib/python3.10/dist-packages /usr/local/lib/python3.10/dist-packages
+COPY --from=server-deps /usr/local/bin /usr/local/bin
+COPY --from=web-app /app/src/interface/web/out ./src/khoj/interface/built
+COPY . .
+RUN cd src && python3 khoj/manage.py collectstatic --noinput
# Run the Application
# There are more arguments required for the application to run,
-# but these should be passed in through the docker-compose.yml file.
+# but those should be passed in through the docker-compose.yml file.
ARG PORT
EXPOSE ${PORT}
ENTRYPOINT ["gunicorn", "-c", "gunicorn-config.py", "src.khoj.main:app"]
diff --git a/pyproject.toml b/pyproject.toml
index f02b5559..fbe4135e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -63,7 +63,8 @@ dependencies = [
"tenacity == 8.3.0",
"anyio == 3.7.1",
"pymupdf == 1.24.11",
- "django == 5.0.9",
+ "django == 5.0.10",
+ "django-unfold == 0.42.0",
"authlib == 1.2.1",
"llama-cpp-python == 0.2.88",
"itsdangerous == 2.1.2",
@@ -88,6 +89,7 @@ dependencies = [
"anthropic == 0.26.1",
"docx2txt == 0.8",
"google-generativeai == 0.8.3",
+ "pyjson5 == 1.6.7",
]
dynamic = ["version"]
diff --git a/src/interface/android/app/build.gradle b/src/interface/android/app/build.gradle
new file mode 100644
index 00000000..bfa06911
--- /dev/null
+++ b/src/interface/android/app/build.gradle
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import groovy.xml.MarkupBuilder
+
+plugins {
+ id 'com.android.application'
+}
+
+def twaManifest = [
+ applicationId: 'dev.khoj.app',
+ hostName: 'app.khoj.dev', // The domain being opened in the TWA.
+ launchUrl: '/', // The start path for the TWA. Must be relative to the domain.
+ name: 'Khoj AI', // The application name.
+ launcherName: 'Khoj', // The name shown on the Android Launcher.
+ themeColor: '#FFFFFF', // The color used for the status bar.
+ themeColorDark: '#000000', // The color used for the dark status bar.
+ navigationColor: '#000000', // The color used for the navigation bar.
+ navigationColorDark: '#000000', // The color used for the dark navbar.
+ navigationDividerColor: '#000000', // The navbar divider color.
+ navigationDividerColorDark: '#000000', // The dark navbar divider color.
+ backgroundColor: '#FFFFFF', // The color used for the splash screen background.
+ enableNotifications: true, // Set to true to enable notification delegation.
+ // Every shortcut must include the following fields:
+ // - name: String that will show up in the shortcut.
+ // - short_name: Shorter string used if |name| is too long.
+ // - url: Absolute path of the URL to launch the app with (e.g '/create').
+ // - icon: Name of the resource in the drawable folder to use as an icon.
+ shortcuts: [],
+ // The duration of fade out animation in milliseconds to be played when removing splash screen.
+ splashScreenFadeOutDuration: 300,
+ generatorApp: 'bubblewrap-cli', // Application that generated the Android Project
+ // The fallback strategy for when Trusted Web Activity is not available. Possible values are
+ // 'customtabs' and 'webview'.
+ fallbackType: 'customtabs',
+ enableSiteSettingsShortcut: 'true',
+ orientation: 'natural',
+]
+
+android {
+ compileSdkVersion 35
+ namespace "dev.khoj.app"
+ defaultConfig {
+ applicationId "dev.khoj.app"
+ minSdkVersion 19
+ targetSdkVersion 35
+ versionCode 4
+ versionName "4"
+
+ // The name for the application
+ resValue "string", "appName", twaManifest.name
+
+ // The name for the application on the Android Launcher
+ resValue "string", "launcherName", twaManifest.launcherName
+
+ // The URL that will be used when launching the TWA from the Android Launcher
+ def launchUrl = "https://" + twaManifest.hostName + twaManifest.launchUrl
+ resValue "string", "launchUrl", launchUrl
+
+
+ // The URL the Web Manifest for the Progressive Web App that the TWA points to. This
+ // is used by Chrome OS and Meta Quest to open the Web version of the PWA instead of
+ // the TWA, as it will probably give a better user experience for non-mobile devices.
+ resValue "string", "webManifestUrl", 'https://app.khoj.dev/static/khoj.webmanifest'
+
+
+
+ // This is used by Meta Quest.
+ resValue "string", "fullScopeUrl", 'https://app.khoj.dev/'
+
+
+
+
+ // The hostname is used when building the intent-filter, so the TWA is able to
+ // handle Intents to open host url of the application.
+ resValue "string", "hostName", twaManifest.hostName
+
+ // This attribute sets the status bar color for the TWA. It can be either set here or in
+ // `res/values/colors.xml`. Setting in both places is an error and the app will not
+ // compile. If not set, the status bar color defaults to #FFFFFF - white.
+ resValue "color", "colorPrimary", twaManifest.themeColor
+
+ // This attribute sets the dark status bar color for the TWA. It can be either set here or in
+ // `res/values/colors.xml`. Setting in both places is an error and the app will not
+ // compile. If not set, the status bar color defaults to #000000 - white.
+ resValue "color", "colorPrimaryDark", twaManifest.themeColorDark
+
+ // This attribute sets the navigation bar color for the TWA. It can be either set here or
+ // in `res/values/colors.xml`. Setting in both places is an error and the app will not
+ // compile. If not set, the navigation bar color defaults to #FFFFFF - white.
+ resValue "color", "navigationColor", twaManifest.navigationColor
+
+ // This attribute sets the dark navigation bar color for the TWA. It can be either set here
+ // or in `res/values/colors.xml`. Setting in both places is an error and the app will not
+ // compile. If not set, the navigation bar color defaults to #000000 - black.
+ resValue "color", "navigationColorDark", twaManifest.navigationColorDark
+
+ // This attribute sets the navbar divider color for the TWA. It can be either
+ // set here or in `res/values/colors.xml`. Setting in both places is an error and the app
+ // will not compile. If not set, the divider color defaults to #00000000 - transparent.
+ resValue "color", "navigationDividerColor", twaManifest.navigationDividerColor
+
+ // This attribute sets the dark navbar divider color for the TWA. It can be either
+ // set here or in `res/values/colors.xml`. Setting in both places is an error and the
+ //app will not compile. If not set, the divider color defaults to #000000 - black.
+ resValue "color", "navigationDividerColorDark", twaManifest.navigationDividerColorDark
+
+ // Sets the color for the background used for the splash screen when launching the
+ // Trusted Web Activity.
+ resValue "color", "backgroundColor", twaManifest.backgroundColor
+
+ // Defines a provider authority for the Splash Screen
+ resValue "string", "providerAuthority", twaManifest.applicationId + '.fileprovider'
+
+ // The enableNotification resource is used to enable or disable the
+ // TrustedWebActivityService, by changing the android:enabled and android:exported
+ // attributes
+ resValue "bool", "enableNotification", twaManifest.enableNotifications.toString()
+
+ twaManifest.shortcuts.eachWithIndex { shortcut, index ->
+ resValue "string", "shortcut_name_$index", "$shortcut.name"
+ resValue "string", "shortcut_short_name_$index", "$shortcut.short_name"
+ }
+
+ // The splashScreenFadeOutDuration resource is used to set the duration of fade out animation in milliseconds
+ // to be played when removing splash screen. The default is 0 (no animation).
+ resValue "integer", "splashScreenFadeOutDuration", twaManifest.splashScreenFadeOutDuration.toString()
+
+ resValue "string", "generatorApp", twaManifest.generatorApp
+
+ resValue "string", "fallbackType", twaManifest.fallbackType
+
+ resValue "bool", "enableSiteSettingsShortcut", twaManifest.enableSiteSettingsShortcut
+ resValue "string", "orientation", twaManifest.orientation
+ }
+ buildTypes {
+ release {
+ minifyEnabled true
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ lintOptions {
+ checkReleaseBuilds false
+ }
+}
+
+task generateShorcutsFile {
+ assert twaManifest.shortcuts.size() < 5, "You can have at most 4 shortcuts."
+ twaManifest.shortcuts.eachWithIndex { s, i ->
+ assert s.name != null, 'Missing `name` in shortcut #' + i
+ assert s.short_name != null, 'Missing `short_name` in shortcut #' + i
+ assert s.url != null, 'Missing `icon` in shortcut #' + i
+ assert s.icon != null, 'Missing `url` in shortcut #' + i
+ }
+
+ def shortcutsFile = new File("$projectDir/src/main/res/xml", "shortcuts.xml")
+
+ def xmlWriter = new StringWriter()
+ def xmlMarkup = new MarkupBuilder(new IndentPrinter(xmlWriter, " ", true))
+
+ xmlMarkup
+ .'shortcuts'('xmlns:android': 'http://schemas.android.com/apk/res/android') {
+ twaManifest.shortcuts.eachWithIndex { s, i ->
+ 'shortcut'(
+ 'android:shortcutId': 'shortcut' + i,
+ 'android:enabled': 'true',
+ 'android:icon': '@drawable/' + s.icon,
+ 'android:shortcutShortLabel': '@string/shortcut_short_name_' + i,
+ 'android:shortcutLongLabel': '@string/shortcut_name_' + i) {
+ 'intent'(
+ 'android:action': 'android.intent.action.MAIN',
+ 'android:targetPackage': twaManifest.applicationId,
+ 'android:targetClass': twaManifest.applicationId + '.LauncherActivity',
+ 'android:data': s.url)
+ 'categories'('android:name': 'android.intent.category.LAUNCHER')
+ }
+ }
+ }
+ shortcutsFile.text = xmlWriter.toString() + '\n'
+}
+
+preBuild.dependsOn(generateShorcutsFile)
+
+repositories {
+
+}
+
+dependencies {
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
+
+ implementation 'com.google.androidbrowserhelper:locationdelegation:1.1.1'
+
+ implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.5.0'
+
+}
diff --git a/src/interface/android/app/src/main/AndroidManifest.xml b/src/interface/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..39fee27d
--- /dev/null
+++ b/src/interface/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/interface/android/app/src/main/java/dev/khoj/app/Application.java b/src/interface/android/app/src/main/java/dev/khoj/app/Application.java
new file mode 100644
index 00000000..a1d3040f
--- /dev/null
+++ b/src/interface/android/app/src/main/java/dev/khoj/app/Application.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package dev.khoj.app;
+
+
+
+public class Application extends android.app.Application {
+
+
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ }
+}
diff --git a/src/interface/android/app/src/main/java/dev/khoj/app/DelegationService.java b/src/interface/android/app/src/main/java/dev/khoj/app/DelegationService.java
new file mode 100644
index 00000000..d8d6bd10
--- /dev/null
+++ b/src/interface/android/app/src/main/java/dev/khoj/app/DelegationService.java
@@ -0,0 +1,17 @@
+package dev.khoj.app;
+
+
+import com.google.androidbrowserhelper.locationdelegation.LocationDelegationExtraCommandHandler;
+
+
+public class DelegationService extends
+ com.google.androidbrowserhelper.trusted.DelegationService {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+
+ registerExtraCommandHandler(new LocationDelegationExtraCommandHandler());
+
+ }
+}
diff --git a/src/interface/android/app/src/main/java/dev/khoj/app/LauncherActivity.java b/src/interface/android/app/src/main/java/dev/khoj/app/LauncherActivity.java
new file mode 100644
index 00000000..a56c4232
--- /dev/null
+++ b/src/interface/android/app/src/main/java/dev/khoj/app/LauncherActivity.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package dev.khoj.app;
+
+import android.content.pm.ActivityInfo;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+
+
+
+public class LauncherActivity
+ extends com.google.androidbrowserhelper.trusted.LauncherActivity {
+
+
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // Setting an orientation crashes the app due to the transparent background on Android 8.0
+ // Oreo and below. We only set the orientation on Oreo and above. This only affects the
+ // splash screen and Chrome will still respect the orientation.
+ // See https://github.com/GoogleChromeLabs/bubblewrap/issues/496 for details.
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+ } else {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+ }
+ }
+
+ @Override
+ protected Uri getLaunchingUrl() {
+ // Get the original launch Url.
+ Uri uri = super.getLaunchingUrl();
+
+
+
+ return uri;
+ }
+}
diff --git a/src/interface/android/app/src/main/res/drawable-anydpi/shortcut_legacy_background.xml b/src/interface/android/app/src/main/res/drawable-anydpi/shortcut_legacy_background.xml
new file mode 100644
index 00000000..d53c148a
--- /dev/null
+++ b/src/interface/android/app/src/main/res/drawable-anydpi/shortcut_legacy_background.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/interface/android/app/src/main/res/drawable-hdpi/ic_notification_icon.png b/src/interface/android/app/src/main/res/drawable-hdpi/ic_notification_icon.png
new file mode 100644
index 00000000..db196a12
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-hdpi/ic_notification_icon.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-hdpi/splash.png b/src/interface/android/app/src/main/res/drawable-hdpi/splash.png
new file mode 100644
index 00000000..9d2384e2
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-hdpi/splash.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-mdpi/ic_notification_icon.png b/src/interface/android/app/src/main/res/drawable-mdpi/ic_notification_icon.png
new file mode 100644
index 00000000..1d97f7c1
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-mdpi/ic_notification_icon.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-mdpi/splash.png b/src/interface/android/app/src/main/res/drawable-mdpi/splash.png
new file mode 100644
index 00000000..77088425
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-mdpi/splash.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-xhdpi/ic_notification_icon.png b/src/interface/android/app/src/main/res/drawable-xhdpi/ic_notification_icon.png
new file mode 100644
index 00000000..9625ad91
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-xhdpi/ic_notification_icon.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-xhdpi/splash.png b/src/interface/android/app/src/main/res/drawable-xhdpi/splash.png
new file mode 100644
index 00000000..1d4f64fe
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-xhdpi/splash.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-xxhdpi/ic_notification_icon.png b/src/interface/android/app/src/main/res/drawable-xxhdpi/ic_notification_icon.png
new file mode 100644
index 00000000..355b7586
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-xxhdpi/ic_notification_icon.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-xxhdpi/splash.png b/src/interface/android/app/src/main/res/drawable-xxhdpi/splash.png
new file mode 100644
index 00000000..43423514
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-xxhdpi/splash.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-xxxhdpi/ic_notification_icon.png b/src/interface/android/app/src/main/res/drawable-xxxhdpi/ic_notification_icon.png
new file mode 100644
index 00000000..9ed4d5e6
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-xxxhdpi/ic_notification_icon.png differ
diff --git a/src/interface/android/app/src/main/res/drawable-xxxhdpi/splash.png b/src/interface/android/app/src/main/res/drawable-xxxhdpi/splash.png
new file mode 100644
index 00000000..cec7e27d
Binary files /dev/null and b/src/interface/android/app/src/main/res/drawable-xxxhdpi/splash.png differ
diff --git a/src/interface/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/src/interface/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..b97b2df5
Binary files /dev/null and b/src/interface/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/interface/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/src/interface/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..0a454eb1
Binary files /dev/null and b/src/interface/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/interface/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/src/interface/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..47c45373
Binary files /dev/null and b/src/interface/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/interface/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/src/interface/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..643b56f7
Binary files /dev/null and b/src/interface/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/interface/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src/interface/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..3a456d9f
Binary files /dev/null and b/src/interface/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/interface/android/app/src/main/res/raw/web_app_manifest.json b/src/interface/android/app/src/main/res/raw/web_app_manifest.json
new file mode 100644
index 00000000..cff9d4ef
--- /dev/null
+++ b/src/interface/android/app/src/main/res/raw/web_app_manifest.json
@@ -0,0 +1 @@
+{"name":"Khoj","short_name":"Khoj","display":"standalone","start_url":"/","description":"The open, personal AI for your digital brain. You can ask Khoj to draft a message, paint your imagination, find information on the internet and even answer questions from your documents.","theme_color":"#ffffff","background_color":"#ffffff","icons":[{"src":"/static/assets/icons/khoj_lantern_128x128.png","sizes":"128x128","type":"image/png"},{"src":"/static/assets/icons/khoj_lantern_256x256.png","sizes":"256x256","type":"image/png"}],"screenshots":[{"src":"/static/assets/samples/phone-remember-plan-sample.png","sizes":"419x900","type":"image/png","form_factor":"narrow","label":"Remember and Plan"},{"src":"/static/assets/samples/phone-browse-draw-sample.png","sizes":"419x900","type":"image/png","form_factor":"narrow","label":"Browse and Draw"},{"src":"/static/assets/samples/desktop-remember-plan-sample.png","sizes":"1260x742","type":"image/png","form_factor":"wide","label":"Remember and Plan"},{"src":"/static/assets/samples/desktop-browse-draw-sample.png","sizes":"1260x742","type":"image/png","form_factor":"wide","label":"Browse and Draw"}]}
diff --git a/src/interface/android/app/src/main/res/values/colors.xml b/src/interface/android/app/src/main/res/values/colors.xml
new file mode 100644
index 00000000..e66222d0
--- /dev/null
+++ b/src/interface/android/app/src/main/res/values/colors.xml
@@ -0,0 +1,18 @@
+
+
+ #F5F5F5
+
diff --git a/src/interface/android/app/src/main/res/values/strings.xml b/src/interface/android/app/src/main/res/values/strings.xml
new file mode 100644
index 00000000..d5d34f8b
--- /dev/null
+++ b/src/interface/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+ [{
+ \"relation\": [\"delegate_permission/common.handle_all_urls\"],
+ \"target\": {
+ \"namespace\": \"web\",
+ \"site\": \"https://app.khoj.dev\"
+ }
+ }]
+
+
+
diff --git a/src/interface/android/app/src/main/res/xml/filepaths.xml b/src/interface/android/app/src/main/res/xml/filepaths.xml
new file mode 100644
index 00000000..a5434852
--- /dev/null
+++ b/src/interface/android/app/src/main/res/xml/filepaths.xml
@@ -0,0 +1,18 @@
+
+
+
+
diff --git a/src/interface/android/app/src/main/res/xml/shortcuts.xml b/src/interface/android/app/src/main/res/xml/shortcuts.xml
new file mode 100644
index 00000000..5effdb1d
--- /dev/null
+++ b/src/interface/android/app/src/main/res/xml/shortcuts.xml
@@ -0,0 +1 @@
+
diff --git a/src/interface/android/build.gradle b/src/interface/android/build.gradle
new file mode 100644
index 00000000..fe8944ba
--- /dev/null
+++ b/src/interface/android/build.gradle
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.7.2'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+tasks.register('clean', Delete) {
+ delete rootProject.buildDir
+}
diff --git a/src/interface/android/gradle.properties b/src/interface/android/gradle.properties
new file mode 100644
index 00000000..784a1d43
--- /dev/null
+++ b/src/interface/android/gradle.properties
@@ -0,0 +1,14 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+android.useAndroidX=true
diff --git a/src/interface/android/gradle/wrapper/gradle-wrapper.jar b/src/interface/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..5c2d1cf0
Binary files /dev/null and b/src/interface/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/src/interface/android/gradle/wrapper/gradle-wrapper.properties b/src/interface/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..b30c9914
--- /dev/null
+++ b/src/interface/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
diff --git a/src/interface/android/gradlew b/src/interface/android/gradlew
new file mode 100755
index 00000000..b740cf13
--- /dev/null
+++ b/src/interface/android/gradlew
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/src/interface/android/gradlew.bat b/src/interface/android/gradlew.bat
new file mode 100644
index 00000000..7101f8e4
--- /dev/null
+++ b/src/interface/android/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/src/interface/android/manifest-checksum.txt b/src/interface/android/manifest-checksum.txt
new file mode 100644
index 00000000..d3280ee8
--- /dev/null
+++ b/src/interface/android/manifest-checksum.txt
@@ -0,0 +1 @@
+6ee1711cf4f745dafc80c1cc13c3025342a0f5da
diff --git a/src/interface/android/settings.gradle b/src/interface/android/settings.gradle
new file mode 100644
index 00000000..e7b4def4
--- /dev/null
+++ b/src/interface/android/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/src/interface/android/store_icon.png b/src/interface/android/store_icon.png
new file mode 100644
index 00000000..93b5729d
Binary files /dev/null and b/src/interface/android/store_icon.png differ
diff --git a/src/interface/android/twa-manifest.json b/src/interface/android/twa-manifest.json
new file mode 100644
index 00000000..9b462834
--- /dev/null
+++ b/src/interface/android/twa-manifest.json
@@ -0,0 +1,55 @@
+{
+ "packageId": "dev.khoj.app",
+ "host": "app.khoj.dev",
+ "name": "Khoj AI",
+ "launcherName": "Khoj",
+ "display": "standalone",
+ "themeColor": "#FFFFFF",
+ "themeColorDark": "#000000",
+ "navigationColor": "#000000",
+ "navigationColorDark": "#000000",
+ "navigationDividerColor": "#000000",
+ "navigationDividerColorDark": "#000000",
+ "backgroundColor": "#FFFFFF",
+ "enableNotifications": true,
+ "startUrl": "/",
+ "iconUrl": "https://assets.khoj.dev/khoj_lantern_1200x1200.png",
+ "splashScreenFadeOutDuration": 300,
+ "signingKey": {
+ "path": "android.keystore",
+ "alias": "android"
+ },
+ "appVersionName": "4",
+ "appVersionCode": 4,
+ "shortcuts": [],
+ "generatorApp": "bubblewrap-cli",
+ "webManifestUrl": "https://app.khoj.dev/static/khoj.webmanifest",
+ "fallbackType": "customtabs",
+ "features": {
+ "locationDelegation": {
+ "enabled": true
+ }
+ },
+ "alphaDependencies": {
+ "enabled": false
+ },
+ "enableSiteSettingsShortcut": true,
+ "isChromeOSOnly": false,
+ "isMetaQuest": false,
+ "fullScopeUrl": "https://app.khoj.dev/",
+ "minSdkVersion": 19,
+ "orientation": "natural",
+ "fingerprints": [
+ {
+ "name": "signing",
+ "value": "CC:98:4A:0A:F1:CC:84:26:AC:02:86:49:AA:69:64:B9:5E:63:A3:EF:18:56:EA:CA:13:C1:3A:15:CA:49:77:46"
+ },
+ {
+ "name": "upload",
+ "value": "D4:5A:6F:6C:18:28:D2:1C:78:27:92:C6:AC:DB:4C:12:C4:52:A1:88:9B:A1:F5:67:D1:22:FE:A0:0F:B1:AE:92"
+ }
+ ],
+ "additionalTrustedOrigins": [],
+ "retainedBundles": [],
+ "appVersion": "4"
+}
diff --git a/src/interface/desktop/assets/icons/chat.svg b/src/interface/desktop/assets/icons/chat.svg
deleted file mode 100644
index a5cbf3af..00000000
--- a/src/interface/desktop/assets/icons/chat.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
diff --git a/src/interface/desktop/assets/icons/circular-add.svg b/src/interface/desktop/assets/icons/circular-add.svg
deleted file mode 100644
index 9e6ac67b..00000000
--- a/src/interface/desktop/assets/icons/circular-add.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/src/interface/desktop/assets/icons/clock.svg b/src/interface/desktop/assets/icons/clock.svg
new file mode 100644
index 00000000..e9ac78df
--- /dev/null
+++ b/src/interface/desktop/assets/icons/clock.svg
@@ -0,0 +1 @@
+
diff --git a/src/interface/desktop/assets/icons/confirm-icon.svg b/src/interface/desktop/assets/icons/confirm-icon.svg
deleted file mode 100644
index 98d30500..00000000
--- a/src/interface/desktop/assets/icons/confirm-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-confirm
diff --git a/src/interface/desktop/assets/icons/file-not-synced.svg b/src/interface/desktop/assets/icons/file-not-synced.svg
index 227d51d3..62d1425c 100644
--- a/src/interface/desktop/assets/icons/file-not-synced.svg
+++ b/src/interface/desktop/assets/icons/file-not-synced.svg
@@ -1,9 +1 @@
-
-
-
-
-
-
-
-
-
+
diff --git a/src/interface/desktop/assets/icons/file-synced.svg b/src/interface/desktop/assets/icons/file-synced.svg
index c584a86d..c19d8446 100644
--- a/src/interface/desktop/assets/icons/file-synced.svg
+++ b/src/interface/desktop/assets/icons/file-synced.svg
@@ -1,9 +1 @@
-
-
-
-
-
-
-
-
-
+
diff --git a/src/interface/desktop/assets/icons/folder.svg b/src/interface/desktop/assets/icons/folder.svg
deleted file mode 100644
index c7003a64..00000000
--- a/src/interface/desktop/assets/icons/folder.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/interface/desktop/assets/icons/key.svg b/src/interface/desktop/assets/icons/key.svg
deleted file mode 100644
index 437688fb..00000000
--- a/src/interface/desktop/assets/icons/key.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/src/interface/desktop/assets/icons/khoj-logo-sideways-200.png b/src/interface/desktop/assets/icons/khoj-logo-sideways-200.png
deleted file mode 100644
index 52ccdfa4..00000000
Binary files a/src/interface/desktop/assets/icons/khoj-logo-sideways-200.png and /dev/null differ
diff --git a/src/interface/desktop/assets/icons/khoj-logo-sideways-500.png b/src/interface/desktop/assets/icons/khoj-logo-sideways-500.png
deleted file mode 100644
index 765d6e33..00000000
Binary files a/src/interface/desktop/assets/icons/khoj-logo-sideways-500.png and /dev/null differ
diff --git a/src/interface/desktop/assets/icons/khoj_logo.png b/src/interface/desktop/assets/icons/khoj_logo.png
new file mode 100644
index 00000000..a3301e62
Binary files /dev/null and b/src/interface/desktop/assets/icons/khoj_logo.png differ
diff --git a/src/interface/desktop/assets/icons/link.svg b/src/interface/desktop/assets/icons/link.svg
deleted file mode 100644
index 43852d95..00000000
--- a/src/interface/desktop/assets/icons/link.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/src/interface/desktop/assets/icons/microphone-solid.svg b/src/interface/desktop/assets/icons/microphone-solid.svg
deleted file mode 100644
index 3fc4b91d..00000000
--- a/src/interface/desktop/assets/icons/microphone-solid.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/interface/desktop/assets/icons/open-link.svg b/src/interface/desktop/assets/icons/open-link.svg
new file mode 100644
index 00000000..abaa88ad
--- /dev/null
+++ b/src/interface/desktop/assets/icons/open-link.svg
@@ -0,0 +1 @@
+
diff --git a/src/interface/desktop/assets/icons/plaintext.svg b/src/interface/desktop/assets/icons/plaintext.svg
deleted file mode 100644
index 92233c24..00000000
--- a/src/interface/desktop/assets/icons/plaintext.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/interface/desktop/assets/icons/question-mark-icon.svg b/src/interface/desktop/assets/icons/question-mark-icon.svg
deleted file mode 100644
index fde2e972..00000000
--- a/src/interface/desktop/assets/icons/question-mark-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/interface/desktop/assets/icons/search.svg b/src/interface/desktop/assets/icons/search.svg
deleted file mode 100644
index f0e463f2..00000000
--- a/src/interface/desktop/assets/icons/search.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
diff --git a/src/interface/desktop/assets/icons/stop-solid.svg b/src/interface/desktop/assets/icons/stop-solid.svg
deleted file mode 100644
index a9aaba28..00000000
--- a/src/interface/desktop/assets/icons/stop-solid.svg
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/interface/desktop/assets/icons/trash-solid.svg b/src/interface/desktop/assets/icons/trash-solid.svg
index 768d80f8..3b67fe45 100644
--- a/src/interface/desktop/assets/icons/trash-solid.svg
+++ b/src/interface/desktop/assets/icons/trash-solid.svg
@@ -1 +1 @@
-
+
diff --git a/src/interface/desktop/assets/icons/upload.svg b/src/interface/desktop/assets/icons/upload.svg
new file mode 100644
index 00000000..2fe72e20
--- /dev/null
+++ b/src/interface/desktop/assets/icons/upload.svg
@@ -0,0 +1 @@
+
diff --git a/src/interface/desktop/assets/khoj.css b/src/interface/desktop/assets/khoj.css
index 1f1594d5..9781902f 100644
--- a/src/interface/desktop/assets/khoj.css
+++ b/src/interface/desktop/assets/khoj.css
@@ -8,13 +8,12 @@
--primary-hover: #fee285;
--primary-focus: rgba(255, 179, 0, 0.125);
--primary-inverse: rgba(0, 0, 0, 0.75);
- --background-color: #f5f4f3;
+ --background-color: #fff;
--main-text-color: #475569;
--summer-sun: #fcc50b;
--water: #44b9da;
--leaf: #7b990a;
--flower: #d1684e;
- --font-family: "Noto Sans", "Noto Sans Arabic", sans-serif !important;
}
/* Amber Dark scheme (Auto) */
@@ -25,13 +24,12 @@
--primary-hover: #fee285;
--primary-focus: rgba(255, 179, 0, 0.25);
--primary-inverse: rgba(0, 0, 0, 0.75);
- --background-color: #f5f4f3;
+ --background-color: #fff;
--main-text-color: #475569;
--summer-sun: #fcc50b;
--water: #44b9da;
--leaf: #7b990a;
--flower: #d1684e;
- --font-family: "Noto Sans", "Noto Sans Arabic", sans-serif !important;
}
}
/* Amber Dark scheme (Forced) */
@@ -41,13 +39,12 @@
--primary-hover: #fcc50b;
--primary-focus: rgba(255, 179, 0, 0.25);
--primary-inverse: rgba(0, 0, 0, 0.75);
- --background-color: #f5f4f3;
+ --background-color: #fff;
--main-text-color: #475569;
--summer-sun: #fcc50b;
--water: #44b9da;
--leaf: #7b990a;
--flower: #d1684e;
- --font-family: "Noto Sans", "Noto Sans Arabic", sans-serif !important;
}
/* Amber (Common styles) */
:root {
@@ -90,36 +87,46 @@ nav.khoj-nav {
grid-gap: 32px;
justify-self: right;
align-items: center;
- }
+}
- .khoj-status-box {
+.khoj-status-box {
display: flex;
align-items: center;
- justify-content: center;
- min-width: 52px;
- gap: 4px;
- -webkit-app-region: no-drag;
+ padding: 8px 12px;
+ border-radius: 16px;
+ font-size: 14px;
+ font-weight: 500;
+ background-color: #f5f5f5; /* Neutral background */
+ color: #333; /* Neutral text color */
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); /* Subtle shadow */
+ transition: background-color 0.3s ease, color 0.3s ease;
}
- .khoj-status-box .khoj-status-connected {
- height: 12px;
- width: 12px;
+.khoj-status-connected {
+ width: 10px;
+ height: 10px;
border-radius: 50%;
- background-color: rgb(90, 235, 90);
- }
- .khoj-status-box .khoj-status-not-connected {
- height: 12px;
- width: 12px;
- border-radius: 50%;
- background-color: rgb(235, 90, 90);
- }
-
- .khoj-status-box .khoj-status-text {
- display: none;
+ background-color: #4CAF50; /* Green for connected */
+ margin-right: 8px;
+}
+
+.khoj-status-not-connected {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ background-color: #F44336; /* Red for not connected */
+ margin-right: 8px;
+}
+
+.khoj-status-text {
+ color: #333; /* Neutral text color */
+ font-family: inherit;
+}
+
+.khoj-status-box:hover {
+ background-color: #e0e0e0; /* Slightly darker background on hover */
+ color: #000; /* Darker text on hover */
}
-.khoj-status-box:hover .khoj-status-text {
- display: block;
- }
a.khoj-nav {
display: flex;
@@ -188,18 +195,18 @@ img.khoj-logo {
.khoj-nav-dropdown-content.show {
opacity: 1;
pointer-events: auto;
- border-radius: 20px;
+ border-radius: 8px;
}
.khoj-nav-dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
- border-radius: 20px;
}
.khoj-nav-dropdown-content a:hover {
- background-color: var(--primary-hover);
+ background-color: hsla(24.6 95% 53.1% / 0.125);
}
+
.khoj-nav-username {
padding: 12px 16px;
text-decoration: none;
@@ -233,6 +240,17 @@ img.khoj-logo {
border: 3px solid var(--primary-hover);
}
+.khoj-nav-icon {
+ width: 20px;
+ height: 20px;
+}
+
+a.khoj-nav-link {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
@media screen and (max-width: 600px) {
.khoj-nav-dropdown-content {
display: block;
diff --git a/src/interface/desktop/chat.html b/src/interface/desktop/chat.html
deleted file mode 100644
index 4c2258cc..00000000
--- a/src/interface/desktop/chat.html
+++ /dev/null
@@ -1,1744 +0,0 @@
-
-
-
-
- Khoj - Chat
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/interface/desktop/main.js b/src/interface/desktop/main.js
index 7c7bf4fc..a2d382de 100644
--- a/src/interface/desktop/main.js
+++ b/src/interface/desktop/main.js
@@ -440,7 +440,7 @@ let titleBarStyle = process.platform === 'win32' ? 'default' : 'hidden';
const {globalShortcut, clipboard} = require('electron'); // global shortcut and clipboard dependencies for shortcut window
const openShortcutWindowKeyBind = 'CommandOrControl+Shift+K'
-const createWindow = (tab = 'chat.html') => {
+const createWindow = (tab = 'settings.html') => {
win = new BrowserWindow({
width: 800,
height: 800,
@@ -602,6 +602,14 @@ app.whenReady().then(() => {
});
ipcMain.handle('deleteAllFiles', deleteAllFiles);
+ ipcMain.handle('openFile', async (_, path) => {
+ try {
+ await shell.openPath(path);
+ } catch (error) {
+ console.error('Error opening file:', error);
+ }
+ });
+
const mainWindow = createWindow();
app.setAboutPanelOptions({
@@ -652,7 +660,7 @@ app.whenReady().then(() => {
globalShortcut.unregister('Escape');
});
ipcMain.on('continue-conversation-button-clicked', () => {
- openWindow('chat.html');
+ openWindow('settings.html');
if (shortcutWin && !shortcutWin.isDestroyed()) {
shortcutWin.close();
}
@@ -727,8 +735,6 @@ app.whenReady().then(() => {
tray = new Tray(icon)
const contextMenu = Menu.buildFromTemplate([
- { label: 'Chat', type: 'normal', click: () => { openWindow('chat.html'); }},
- { label: 'Search', type: 'normal', click: () => { openWindow('search.html') }},
{ label: 'Configure', type: 'normal', click: () => { openWindow('settings.html') }},
{ type: 'separator' },
{ label: 'About Khoj', type: 'normal', click: () => { openAboutWindow(); } },
diff --git a/src/interface/desktop/package.json b/src/interface/desktop/package.json
index 7a635e4b..a67b218d 100644
--- a/src/interface/desktop/package.json
+++ b/src/interface/desktop/package.json
@@ -1,6 +1,6 @@
{
"name": "Khoj",
- "version": "1.30.1",
+ "version": "1.31.0",
"description": "Your Second Brain",
"author": "Khoj Inc. ",
"license": "GPL-3.0-or-later",
@@ -16,7 +16,7 @@
"start": "yarn electron ."
},
"dependencies": {
- "@todesktop/runtime": "^1.6.4",
+ "@todesktop/runtime": "^2.0.0",
"axios": "^1.7.4",
"cron": "^2.4.3",
"electron-store": "^8.1.0"
diff --git a/src/interface/desktop/preload.js b/src/interface/desktop/preload.js
index e8f13ff3..a2649609 100644
--- a/src/interface/desktop/preload.js
+++ b/src/interface/desktop/preload.js
@@ -83,4 +83,9 @@ contextBridge.exposeInMainWorld('appInfoAPI', {
contextBridge.exposeInMainWorld('navigateAPI', {
navigateToSettings: () => ipcRenderer.send('navigate', 'settings.html'),
navigateToWebSettings: () => ipcRenderer.send('navigateToWebApp', 'settings'),
+ navigateToWebHome: () => ipcRenderer.send('navigateToWebApp', ''),
})
+
+contextBridge.exposeInMainWorld('openFileAPI', {
+ openFile: (path) => ipcRenderer.invoke('openFile', path)
+});
diff --git a/src/interface/desktop/renderer.js b/src/interface/desktop/renderer.js
index 78387813..aa359274 100644
--- a/src/interface/desktop/renderer.js
+++ b/src/interface/desktop/renderer.js
@@ -26,37 +26,10 @@ async function removeFolder(folderPath) {
}
}
-const toggleFilesButton = document.getElementById('toggle-files');
const currentFiles = document.getElementById('current-files');
-const toggleFilesSVG = document.getElementById('toggle-files-svg');
-
-toggleFilesButton.addEventListener('click', () => {
- if (currentFiles.style.display === 'none') {
- currentFiles.style.display = 'block';
- toggleFilesSVG.style.transform = 'rotate(0deg)';
- } else {
- currentFiles.style.display = 'none';
- toggleFilesSVG.style.transform = 'rotate(180deg)';
- }
-});
-
-const toggleFoldersButton = document.getElementById('toggle-folders');
const currentFolders = document.getElementById('current-folders');
-const toggleFoldersSVG = document.getElementById('toggle-folders-svg');
-
-
-toggleFoldersButton.addEventListener('click', () => {
- if (currentFolders.style.display === 'none') {
- currentFolders.style.display = 'block';
- toggleFoldersSVG.style.transform = 'rotate(0deg)';
- } else {
- currentFolders.style.display = 'none';
- toggleFoldersSVG.style.transform = 'rotate(180deg)';
- }
-});
-
function makeFileElement(file) {
let fileElement = document.createElement("div");
fileElement.classList.add("file-element");
@@ -64,20 +37,34 @@ function makeFileElement(file) {
let fileNameElement = document.createElement("div");
fileNameElement.classList.add("content-name");
fileNameElement.innerHTML = file.path;
+ fileNameElement.style.cursor = "pointer";
+
+ fileNameElement.addEventListener("click", () => {
+ window.openFileAPI.openFile(file.path);
+ });
+
fileElement.appendChild(fileNameElement);
let buttonContainer = document.createElement("div");
buttonContainer.classList.add("remove-button-container");
let removeFileButton = document.createElement("button");
- let fileSyncedImage = document.createElement("img")
+ let fileSyncedImage = document.createElement("img");
fileSyncedImage.classList.add("file-synced-image");
+ fileSyncedImage.src = "./assets/icons/file-synced.svg";
+
+ // Create trash icon image
+ let trashIcon = document.createElement("img");
+ trashIcon.src = "./assets/icons/trash-solid.svg";
+ trashIcon.classList.add("trash-icon");
+
removeFileButton.classList.add("remove-file-button");
- removeFileButton.innerHTML = "🗑️";
+ removeFileButton.appendChild(trashIcon);
removeFileButton.addEventListener("click", () => {
removeFile(file.path);
});
+
buttonContainer.appendChild(removeFileButton);
- buttonContainer.insertAdjacentElement("afterbegin",fileSyncedImage);
+ buttonContainer.insertAdjacentElement("afterbegin", fileSyncedImage);
fileElement.appendChild(buttonContainer);
return fileElement;
}
@@ -89,13 +76,26 @@ function makeFolderElement(folder) {
let folderNameElement = document.createElement("div");
folderNameElement.classList.add("content-name");
folderNameElement.innerHTML = folder.path;
+ folderNameElement.style.cursor = "pointer";
+
+ folderNameElement.addEventListener("click", () => {
+ window.openFileAPI.openFile(folder.path);
+ });
+
folderElement.appendChild(folderNameElement);
let buttonContainer = document.createElement("div");
buttonContainer.classList.add("remove-button-container");
let removeFolderButton = document.createElement("button");
removeFolderButton.classList.add("remove-folder-button");
- removeFolderButton.innerHTML = "🗑️";
+
+ // Create trash icon image
+ let trashIcon = document.createElement("img");
+ trashIcon.src = "./assets/icons/trash-solid.svg";
+ trashIcon.classList.add("trash-icon");
+
+ removeFolderButton.appendChild(trashIcon);
+
removeFolderButton.addEventListener("click", () => {
removeFolder(folder.path);
});
@@ -104,7 +104,7 @@ function makeFolderElement(folder) {
return folderElement;
}
-(async function() {
+(async function () {
const files = await window.getFilesAPI.getFiles();
let currentFilesElement = document.getElementById("current-files");
for (const file of files) {
@@ -157,26 +157,35 @@ window.updateStateAPI.onUpdateState((event, state) => {
console.log("state was updated", state);
loadingBar.style.display = 'none';
let syncStatusElement = document.getElementById("sync-status");
+ syncStatusElement.innerHTML = '';
const currentTime = new Date();
nextSyncTime = new Date();
nextSyncTime.setMinutes(Math.ceil((nextSyncTime.getMinutes() + 1) / 10) * 10);
if (state.completed == false) {
- fileSyncedImage.forEach((image)=> {
+ fileSyncedImage.forEach((image) => {
image.style.display = "block"
image.src = "./assets/icons/file-not-synced.svg"
})
if (state.error) syncStatusElement.innerHTML = state.error;
return;
} else {
- fileSyncedImage.forEach((image)=> {
+ fileSyncedImage.forEach((image) => {
image.style.display = "block"
image.src = "./assets/icons/file-synced.svg"
})
}
const options = { hour: '2-digit', minute: '2-digit' };
- syncStatusElement.innerHTML = `⏱️ Synced at ${currentTime.toLocaleTimeString(undefined, options)}. Next sync at ${nextSyncTime.toLocaleTimeString(undefined, options)}.`;
+
+ const clockElement = document.createElement("div");
+ const clockIcon = document.createElement("img");
+ clockIcon.src = "./assets/icons/clock.svg";
+ clockIcon.classList.add("clock-icon");
+
+ clockElement.appendChild(clockIcon);
+ syncStatusElement.appendChild(clockElement);
+ syncStatusElement.innerHTML += ` Synced at ${currentTime.toLocaleTimeString(undefined, options)}. Next sync at ${nextSyncTime.toLocaleTimeString(undefined, options)}.`;
});
window.needsSubscriptionAPI.onNeedsSubscription((event, needsSubscription) => {
@@ -188,7 +197,7 @@ window.needsSubscriptionAPI.onNeedsSubscription((event, needsSubscription) => {
});
const urlInput = document.getElementById('khoj-host-url');
-(async function() {
+(async function () {
const url = await window.hostURLAPI.getURL();
urlInput.value = url;
})();
@@ -210,7 +219,7 @@ urlInput.addEventListener('blur', async () => {
});
const khojKeyInput = document.getElementById('khoj-access-key');
-(async function() {
+(async function () {
const token = await window.tokenAPI.getToken();
khojKeyInput.value = token;
})();
diff --git a/src/interface/desktop/search.html b/src/interface/desktop/search.html
deleted file mode 100644
index 792470a6..00000000
--- a/src/interface/desktop/search.html
+++ /dev/null
@@ -1,458 +0,0 @@
-
-
-
-
-
- Khoj - Search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/interface/desktop/settings.html b/src/interface/desktop/settings.html
index f6a283d3..601cb27b 100644
--- a/src/interface/desktop/settings.html
+++ b/src/interface/desktop/settings.html
@@ -1,16 +1,264 @@
-
-
-
-
- Khoj - Settings
+
+
-
-
-
-
+
+
+
+ Khoj - Settings
+
+
+
+
-
-
+
+
+
-
-
-
-
-
- Server URL
-
-
-
-
-
-
-
-
- API Key
-
-
-
-
-
+
+
+ Server URL
+
+
+
+
+
+ API Key
+
+
+
+
+
-
-
-
-
-
- Files
-
-
-
-
-
-
-
-
- Add
-
-
-
-
+
-
-
-
-
-
- Folders
-
-
-
-
-
-
-
-
- Add
-
-
-
-
-
-
-
- 💾 Save
-
-
- 🗑️ Delete All
-
-
-
-
+
+
+
+
+
+ Force Sync
+
+
+
+ Delete All
+
+
-
-
-
-
+
+
+
diff --git a/src/interface/desktop/utils.js b/src/interface/desktop/utils.js
index 84e50460..8d244ff1 100644
--- a/src/interface/desktop/utils.js
+++ b/src/interface/desktop/utils.js
@@ -31,7 +31,7 @@ function toggleNavMenu() {
}
// Close the dropdown menu if the user clicks outside of it
-document.addEventListener('click', function(event) {
+document.addEventListener('click', function (event) {
let menu = document.getElementById("khoj-nav-menu");
let menuContainer = document.getElementById("khoj-nav-menu-container");
let isClickOnMenu = menuContainer?.contains(event.target) || menuContainer === event.target;
@@ -56,25 +56,19 @@ async function populateHeaderPane() {
// Populate the header element with the navigation pane
return `
-
+
- ${
- userInfo && userInfo.email
- ? `
+ ${userInfo && userInfo.email
+ ? `
Connected to server
`
- : `
+ : `
Not connected to server
`
- }
-
-
- Chat
-
- ${has_documents ? '
Search ' : ''}
+ }
${username ? `
` : ''}
diff --git a/src/interface/desktop/yarn.lock b/src/interface/desktop/yarn.lock
index cbe35457..207f0f99 100644
--- a/src/interface/desktop/yarn.lock
+++ b/src/interface/desktop/yarn.lock
@@ -50,17 +50,17 @@
dependencies:
defer-to-connect "^2.0.0"
-"@todesktop/runtime@^1.6.4":
- version "1.6.4"
- resolved "https://registry.yarnpkg.com/@todesktop/runtime/-/runtime-1.6.4.tgz#a9d62a021cf2647c51371c892bfb1d4c5a29ed7e"
- integrity sha512-n6dOxhrKKsXMM+i2u9iRvoJSR2KCWw0orYK+FT9RbWNPykhuFIYd0yy8dYgYy/OuClKGyGl4SJFi2757FLhWDA==
+"@todesktop/runtime@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@todesktop/runtime/-/runtime-2.0.0.tgz#dfd409186ae664f5e28186a03b99e620ec7b7f82"
+ integrity sha512-0a2tmWpIc/HJE/873xRMZKQNggfrYhoKYIchfN+k8RqKdzTPwTWa5ztur7GdCHLHBUaiMBPNRzF3h4kwHd1NCw==
dependencies:
- del "^6.0.0"
- electron-updater "^4.6.1"
- eventemitter2 "^6.4.5"
+ del "^6.1.1"
+ electron-updater "^6.3.9"
+ eventemitter2 "^6.4.9"
execa "^5.0.0"
lodash.once "^4.1.1"
- semver "^7.3.2"
+ semver "^7.6.3"
"@types/cacheable-request@^6.0.1":
version "6.0.3"
@@ -90,16 +90,16 @@
integrity sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ==
"@types/node@*":
- version "22.9.1"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.1.tgz#bdf91c36e0e7ecfb7257b2d75bf1b206b308ca71"
- integrity sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==
+ version "22.10.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766"
+ integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==
dependencies:
- undici-types "~6.19.8"
+ undici-types "~6.20.0"
"@types/node@^18.11.18":
- version "18.19.64"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.64.tgz#122897fb79f2a9ec9c979bded01c11461b2b1478"
- integrity sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==
+ version "18.19.67"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.67.tgz#77c4b01641a1e3e1509aff7e10d39e4afd5ae06d"
+ integrity sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==
dependencies:
undici-types "~5.26.4"
@@ -110,11 +110,6 @@
dependencies:
"@types/node" "*"
-"@types/semver@^7.3.6":
- version "7.5.8"
- resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
- integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
-
"@types/yauzl@^2.9.1":
version "2.10.3"
resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999"
@@ -168,9 +163,9 @@ atomically@^1.7.0:
integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==
axios@^1.7.4:
- version "1.7.7"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f"
- integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
+ version "1.7.8"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e"
+ integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.0"
@@ -206,12 +201,12 @@ buffer-crc32@~0.2.3:
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
-builder-util-runtime@8.9.2:
- version "8.9.2"
- resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz#a9669ae5b5dcabfe411ded26678e7ae997246c28"
- integrity sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==
+builder-util-runtime@9.2.10:
+ version "9.2.10"
+ resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz#a0f7d9e214158402e78b74a745c8d9f870c604bc"
+ integrity sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==
dependencies:
- debug "^4.3.2"
+ debug "^4.3.4"
sax "^1.2.4"
cacheable-lookup@^5.0.3:
@@ -296,7 +291,7 @@ debounce-fn@^4.0.0:
dependencies:
mimic-fn "^3.0.0"
-debug@^4.1.0, debug@^4.1.1, debug@^4.3.2:
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.4:
version "4.3.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
@@ -333,7 +328,7 @@ define-properties@^1.2.1:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
-del@^6.0.0:
+del@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a"
integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==
@@ -379,19 +374,19 @@ electron-store@^8.1.0:
conf "^10.2.0"
type-fest "^2.17.0"
-electron-updater@^4.6.1:
- version "4.6.5"
- resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.5.tgz#e9a75458bbfd6bb41a58a829839e150ad2eb2d3d"
- integrity sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==
+electron-updater@^6.3.9:
+ version "6.3.9"
+ resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.3.9.tgz#e1e7f155624c58e6f3760f376c3a584028165ec4"
+ integrity sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==
dependencies:
- "@types/semver" "^7.3.6"
- builder-util-runtime "8.9.2"
- fs-extra "^10.0.0"
+ builder-util-runtime "9.2.10"
+ fs-extra "^10.1.0"
js-yaml "^4.1.0"
lazy-val "^1.0.5"
lodash.escaperegexp "^4.1.2"
lodash.isequal "^4.5.0"
- semver "^7.3.5"
+ semver "^7.6.3"
+ tiny-typed-emitter "^2.1.0"
electron@28.2.1:
version "28.2.1"
@@ -436,7 +431,7 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-eventemitter2@^6.4.5:
+eventemitter2@^6.4.9:
version "6.4.9"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125"
integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==
@@ -530,7 +525,7 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
-fs-extra@^10.0.0:
+fs-extra@^10.1.0:
version "10.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
@@ -1115,7 +1110,7 @@ semver@^6.2.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.3.2, semver@^7.3.5:
+semver@^7.3.2, semver@^7.3.5, semver@^7.6.3:
version "7.6.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
@@ -1166,6 +1161,11 @@ sumchecker@^3.0.1:
dependencies:
debug "^4.1.0"
+tiny-typed-emitter@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5"
+ integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==
+
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -1188,10 +1188,10 @@ undici-types@~5.26.4:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-undici-types@~6.19.8:
- version "6.19.8"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
- integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+undici-types@~6.20.0:
+ version "6.20.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
+ integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
universalify@^0.1.0:
version "0.1.2"
diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el
index fadf8ca2..c43ae762 100644
--- a/src/interface/emacs/khoj.el
+++ b/src/interface/emacs/khoj.el
@@ -6,7 +6,7 @@
;; Saba Imran
;; Description: Your Second Brain
;; Keywords: search, chat, ai, org-mode, outlines, markdown, pdf, image
-;; Version: 1.30.1
+;; Version: 1.31.0
;; Package-Requires: ((emacs "27.1") (transient "0.3.0") (dash "2.19.1"))
;; URL: https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs
@@ -434,9 +434,9 @@ Auto invokes setup steps on calling main entrypoint."
Append 'TYPE-QUERY' as query parameter in request url.
Specify `BOUNDARY' used to separate files in request header."
(let ((url-request-method (if force "PUT" "PATCH"))
- (url-request-data body)
- (url-request-extra-headers `(("content-type" . ,(format "multipart/form-data; boundary=%s" boundary))
- ("Authorization" . ,(format "Bearer %s" khoj-api-key)))))
+ (url-request-data (encode-coding-string body 'utf-8))
+ (url-request-extra-headers `(("content-type" . ,(format "multipart/form-data; boundary=%s" boundary))
+ ("Authorization" . ,(encode-coding-string (format "Bearer %s" khoj-api-key) 'utf-8)))))
(with-current-buffer
(url-retrieve (format "%s/api/content?%s&client=emacs" khoj-server-url type-query)
;; render response from indexing API endpoint on server
@@ -668,9 +668,9 @@ Simplified fork of `org-cycle-content' from Emacs 29.1 to work with >=27.1."
"Sync call API at PATH with METHOD, query PARAMS and BODY as kv assoc list.
Optionally apply CALLBACK with JSON parsed response and CBARGS."
(let* ((url-request-method (or method "GET"))
- (url-request-extra-headers `(("Authorization" . ,(format "Bearer %s" khoj-api-key))))
- (url-request-extra-headers `(("Authorization" . ,(format "Bearer %s" khoj-api-key)) ("Content-Type" . "application/json")))
- (url-request-data (if body (json-encode body) nil))
+ (url-request-extra-headers `(("Authorization" . ,(encode-coding-string (format "Bearer %s" khoj-api-key) 'utf-8))
+ ("Content-Type" . "application/json")))
+ (url-request-data (if body (encode-coding-string (json-encode body) 'utf-8) nil))
(param-string (url-build-query-string (append params '((client "emacs")))))
(query-url (format "%s%s?%s" khoj-server-url path param-string))
(cbargs (if (and (listp cbargs) (listp (car cbargs))) (car cbargs) cbargs))) ; normalize cbargs to (a b) from ((a b)) if required
@@ -689,8 +689,9 @@ Optionally apply CALLBACK with JSON parsed response and CBARGS."
"Async call to API at PATH with specified METHOD, query PARAMS and request BODY.
Optionally apply CALLBACK with JSON parsed response and CBARGS."
(let* ((url-request-method (or method "GET"))
- (url-request-extra-headers `(("Authorization" . ,(format "Bearer %s" khoj-api-key)) ("Content-Type" . "application/json")))
- (url-request-data (if body (json-encode body) nil))
+ (url-request-extra-headers `(("Authorization" . ,(encode-coding-string (format "Bearer %s" khoj-api-key) 'utf-8))
+ ("Content-Type" . "application/json")))
+ (url-request-data (if body (encode-coding-string (json-encode body) 'utf-8) nil))
(param-string (url-build-query-string (append params '((client "emacs")))))
(query-url (format "%s%s?%s" khoj-server-url path param-string))
(cbargs (if (and (listp cbargs) (listp (car cbargs))) (car cbargs) cbargs))) ; normalize cbargs to (a b) from ((a b)) if required
@@ -716,7 +717,10 @@ Optionally apply CALLBACK with JSON parsed response and CBARGS."
Render search results in BUFFER-NAME using CONTENT-TYPE and QUERY.
Filter out first similar result if IS-FIND-SIMILAR set."
(let* ((rerank (or rerank "false"))
- (params `((q ,query) (t ,content-type) (r ,rerank) (n ,khoj-results-count)))
+ (params `((q ,(encode-coding-string query 'utf-8))
+ (t ,content-type)
+ (r ,rerank)
+ (n ,khoj-results-count)))
(path "/api/search"))
(khoj--call-api-async path
"GET"
diff --git a/src/interface/obsidian/manifest.json b/src/interface/obsidian/manifest.json
index fbe0a70d..5c7d60aa 100644
--- a/src/interface/obsidian/manifest.json
+++ b/src/interface/obsidian/manifest.json
@@ -1,7 +1,7 @@
{
"id": "khoj",
"name": "Khoj",
- "version": "1.30.1",
+ "version": "1.31.0",
"minAppVersion": "0.15.0",
"description": "Your Second Brain",
"author": "Khoj Inc.",
diff --git a/src/interface/obsidian/package.json b/src/interface/obsidian/package.json
index 5912a51e..7302043a 100644
--- a/src/interface/obsidian/package.json
+++ b/src/interface/obsidian/package.json
@@ -1,6 +1,6 @@
{
"name": "Khoj",
- "version": "1.30.1",
+ "version": "1.31.0",
"description": "Your Second Brain",
"author": "Debanjum Singh Solanky, Saba Imran ",
"license": "GPL-3.0-or-later",
diff --git a/src/interface/obsidian/src/chat_view.ts b/src/interface/obsidian/src/chat_view.ts
index 552a54bd..86d5e1f9 100644
--- a/src/interface/obsidian/src/chat_view.ts
+++ b/src/interface/obsidian/src/chat_view.ts
@@ -1,4 +1,4 @@
-import {ItemView, MarkdownRenderer, Scope, WorkspaceLeaf, request, requestUrl, setIcon, Platform} from 'obsidian';
+import { ItemView, MarkdownRenderer, Scope, WorkspaceLeaf, request, requestUrl, setIcon, Platform } from 'obsidian';
import * as DOMPurify from 'dompurify';
import { KhojSetting } from 'src/settings';
import { KhojPaneView } from 'src/pane_view';
@@ -27,6 +27,7 @@ interface ChatMessageState {
newResponseEl: HTMLElement | null;
loadingEllipsis: HTMLElement | null;
references: any;
+ generatedAssets: string;
rawResponse: string;
rawQuery: string;
isVoice: boolean;
@@ -46,10 +47,10 @@ export class KhojChatView extends KhojPaneView {
waitingForLocation: boolean;
location: Location = { timezone: Intl.DateTimeFormat().resolvedOptions().timeZone };
keyPressTimeout: NodeJS.Timeout | null = null;
- userMessages: string[] = []; // Store user sent messages for input history cycling
- currentMessageIndex: number = -1; // Track current message index in userMessages array
- private currentUserInput: string = ""; // Stores the current user input that is being typed in chat
- private startingMessage: string = "Message";
+ userMessages: string[] = []; // Store user sent messages for input history cycling
+ currentMessageIndex: number = -1; // Track current message index in userMessages array
+ private currentUserInput: string = ""; // Stores the current user input that is being typed in chat
+ private startingMessage: string = "Message";
chatMessageState: ChatMessageState;
constructor(leaf: WorkspaceLeaf, setting: KhojSetting) {
@@ -102,14 +103,14 @@ export class KhojChatView extends KhojPaneView {
// Clear text after extracting message to send
let user_message = input_el.value.trim();
- // Store the message in the array if it's not empty
- if (user_message) {
- this.userMessages.push(user_message);
- // Update starting message after sending a new message
- const modifierKey = Platform.isMacOS ? '⌘' : '^';
- this.startingMessage = `(${modifierKey}+↑/↓) for prev messages`;
- input_el.placeholder = this.startingMessage;
- }
+ // Store the message in the array if it's not empty
+ if (user_message) {
+ this.userMessages.push(user_message);
+ // Update starting message after sending a new message
+ const modifierKey = Platform.isMacOS ? '⌘' : '^';
+ this.startingMessage = `(${modifierKey}+↑/↓) for prev messages`;
+ input_el.placeholder = this.startingMessage;
+ }
input_el.value = "";
this.autoResize();
@@ -162,9 +163,9 @@ export class KhojChatView extends KhojPaneView {
})
chatInput.addEventListener('input', (_) => { this.onChatInput() });
chatInput.addEventListener('keydown', (event) => {
- this.incrementalChat(event);
- this.handleArrowKeys(event);
- });
+ this.incrementalChat(event);
+ this.handleArrowKeys(event);
+ });
// Add event listeners for long press keybinding
this.contentEl.addEventListener('keydown', this.handleKeyDown.bind(this));
@@ -199,7 +200,7 @@ export class KhojChatView extends KhojPaneView {
// Get chat history from Khoj backend and set chat input state
let getChatHistorySucessfully = await this.getChatHistory(chatBodyEl);
- let placeholderText : string = getChatHistorySucessfully ? this.startingMessage : "Configure Khoj to enable chat";
+ let placeholderText: string = getChatHistorySucessfully ? this.startingMessage : "Configure Khoj to enable chat";
chatInput.placeholder = placeholderText;
chatInput.disabled = !getChatHistorySucessfully;
@@ -214,7 +215,7 @@ export class KhojChatView extends KhojPaneView {
});
}
- startSpeechToText(event: KeyboardEvent | MouseEvent | TouchEvent, timeout=200) {
+ startSpeechToText(event: KeyboardEvent | MouseEvent | TouchEvent, timeout = 200) {
if (!this.keyPressTimeout) {
this.keyPressTimeout = setTimeout(async () => {
// Reset auto send voice message timer, UI if running
@@ -320,7 +321,7 @@ export class KhojChatView extends KhojPaneView {
referenceButton.tabIndex = 0;
// Add event listener to toggle full reference on click
- referenceButton.addEventListener('click', function() {
+ referenceButton.addEventListener('click', function () {
if (this.classList.contains("collapsed")) {
this.classList.remove("collapsed");
this.classList.add("expanded");
@@ -375,7 +376,7 @@ export class KhojChatView extends KhojPaneView {
referenceButton.tabIndex = 0;
// Add event listener to toggle full reference on click
- referenceButton.addEventListener('click', function() {
+ referenceButton.addEventListener('click', function () {
if (this.classList.contains("collapsed")) {
this.classList.remove("collapsed");
this.classList.add("expanded");
@@ -420,23 +421,23 @@ export class KhojChatView extends KhojPaneView {
"Authorization": `Bearer ${this.setting.khojApiKey}`,
},
})
- .then(response => response.arrayBuffer())
- .then(arrayBuffer => context.decodeAudioData(arrayBuffer))
- .then(audioBuffer => {
- const source = context.createBufferSource();
- source.buffer = audioBuffer;
- source.connect(context.destination);
- source.start(0);
- source.onended = function() {
+ .then(response => response.arrayBuffer())
+ .then(arrayBuffer => context.decodeAudioData(arrayBuffer))
+ .then(audioBuffer => {
+ const source = context.createBufferSource();
+ source.buffer = audioBuffer;
+ source.connect(context.destination);
+ source.start(0);
+ source.onended = function () {
+ speechButton.removeChild(loader);
+ speechButton.disabled = false;
+ };
+ })
+ .catch(err => {
+ console.error("Error playing speech:", err);
speechButton.removeChild(loader);
- speechButton.disabled = false;
- };
- })
- .catch(err => {
- console.error("Error playing speech:", err);
- speechButton.removeChild(loader);
- speechButton.disabled = false; // Consider enabling the button again to allow retrying
- });
+ speechButton.disabled = false; // Consider enabling the button again to allow retrying
+ });
}
formatHTMLMessage(message: string, raw = false, willReplace = true) {
@@ -463,7 +464,7 @@ export class KhojChatView extends KhojPaneView {
let virtualChatMessageBodyTextEl = document.createElement("div");
// Convert the message to html
- MarkdownRenderer.renderMarkdown(markdownText, virtualChatMessageBodyTextEl, '', component);
+ MarkdownRenderer.render(this.app, markdownText, virtualChatMessageBodyTextEl, '', component);
// Remove image HTML elements with any non whitelisted src prefix
virtualChatMessageBodyTextEl.innerHTML = virtualChatMessageBodyTextEl.innerHTML.replace(
@@ -485,12 +486,18 @@ export class KhojChatView extends KhojPaneView {
intentType?: string,
inferredQueries?: string[],
conversationId?: string,
+ images?: string[],
+ excalidrawDiagram?: string
) {
if (!message) return;
let chatMessageEl;
- if (intentType?.includes("text-to-image") || intentType === "excalidraw") {
- let imageMarkdown = this.generateImageMarkdown(message, intentType, inferredQueries, conversationId);
+ if (
+ intentType?.includes("text-to-image") ||
+ intentType === "excalidraw" ||
+ (images && images.length > 0) ||
+ excalidrawDiagram) {
+ let imageMarkdown = this.generateImageMarkdown(message, intentType ?? "", inferredQueries, conversationId, images, excalidrawDiagram);
chatMessageEl = this.renderMessage(chatEl, imageMarkdown, sender, dt);
} else {
chatMessageEl = this.renderMessage(chatEl, message, sender, dt);
@@ -510,7 +517,7 @@ export class KhojChatView extends KhojPaneView {
chatMessageBodyEl.appendChild(this.createReferenceSection(references));
}
- generateImageMarkdown(message: string, intentType: string, inferredQueries?: string[], conversationId?: string): string {
+ generateImageMarkdown(message: string, intentType: string, inferredQueries?: string[], conversationId?: string, images?: string[], excalidrawDiagram?: string): string {
let imageMarkdown = "";
if (intentType === "text-to-image") {
imageMarkdown = `![](data:image/png;base64,${message})`;
@@ -518,12 +525,23 @@ export class KhojChatView extends KhojPaneView {
imageMarkdown = `![](${message})`;
} else if (intentType === "text-to-image-v3") {
imageMarkdown = `![](data:image/webp;base64,${message})`;
- } else if (intentType === "excalidraw") {
+ } else if (intentType === "excalidraw" || excalidrawDiagram) {
const domain = this.setting.khojUrl.endsWith("/") ? this.setting.khojUrl : `${this.setting.khojUrl}/`;
const redirectMessage = `Hey, I'm not ready to show you diagrams yet here. But you can view it in ${domain}chat?conversationId=${conversationId}`;
imageMarkdown = redirectMessage;
+ } else if (images && images.length > 0) {
+ for (let image of images) {
+ if (image.startsWith("https://")) {
+ imageMarkdown += `![](${image})\n\n`;
+ } else {
+ imageMarkdown += `![](data:image/png;base64,${image})\n\n`;
+ }
+ }
+
+ imageMarkdown += `${message}`;
}
- if (inferredQueries) {
+
+ if (images?.length === 0 && inferredQueries) {
imageMarkdown += "\n\n**Inferred Query**:";
for (let inferredQuery of inferredQueries) {
imageMarkdown += `\n\n${inferredQuery}`;
@@ -534,13 +552,12 @@ export class KhojChatView extends KhojPaneView {
renderMessage(chatBodyEl: Element, message: string, sender: string, dt?: Date, raw: boolean = false, willReplace: boolean = true): Element {
let message_time = this.formatDate(dt ?? new Date());
- let emojified_sender = sender == "khoj" ? "🏮 Khoj" : "🤔 You";
// Append message to conversation history HTML element.
// The chat logs should display above the message input box to follow standard UI semantics
let chatMessageEl = chatBodyEl.createDiv({
attr: {
- "data-meta": `${emojified_sender} at ${message_time}`,
+ "data-meta": message_time,
class: `khoj-chat-message ${sender}`
},
})
@@ -580,7 +597,7 @@ export class KhojChatView extends KhojPaneView {
let chatBodyEl = this.contentEl.getElementsByClassName("khoj-chat-body")[0];
let chatMessageEl = chatBodyEl.createDiv({
attr: {
- "data-meta": `🏮 Khoj at ${messageTime}`,
+ "data-meta": messageTime,
class: `khoj-chat-message khoj`
},
})
@@ -650,26 +667,26 @@ export class KhojChatView extends KhojPaneView {
chatBodyEl.innerHTML = "";
chatBodyEl.dataset.conversationId = "";
chatBodyEl.dataset.conversationTitle = "";
- this.userMessages = [];
- this.startingMessage = "Message";
+ this.userMessages = [];
+ this.startingMessage = "Message";
- // Update the placeholder of the chat input
- const chatInput = this.contentEl.querySelector('.khoj-chat-input') as HTMLTextAreaElement;
- if (chatInput) {
- chatInput.placeholder = this.startingMessage;
- }
+ // Update the placeholder of the chat input
+ const chatInput = this.contentEl.querySelector('.khoj-chat-input') as HTMLTextAreaElement;
+ if (chatInput) {
+ chatInput.placeholder = this.startingMessage;
+ }
this.renderMessage(chatBodyEl, "Hey 👋🏾, what's up?", "khoj");
}
async toggleChatSessions(forceShow: boolean = false): Promise {
- this.userMessages = []; // clear user previous message history
+ this.userMessages = []; // clear user previous message history
let chatBodyEl = this.contentEl.getElementsByClassName("khoj-chat-body")[0] as HTMLElement;
if (!forceShow && this.contentEl.getElementsByClassName("side-panel")?.length > 0) {
chatBodyEl.innerHTML = "";
return this.getChatHistory(chatBodyEl);
}
chatBodyEl.innerHTML = "";
- const sidePanelEl = this.contentEl.createDiv("side-panel");
+ const sidePanelEl = chatBodyEl.createDiv("side-panel");
const newConversationEl = sidePanelEl.createDiv("new-conversation");
const conversationHeaderTitleEl = newConversationEl.createDiv("conversation-header-title");
conversationHeaderTitleEl.textContent = "Conversations";
@@ -727,7 +744,6 @@ export class KhojChatView extends KhojPaneView {
conversationSessionEl.appendChild(conversationMenuEl);
conversationListBodyEl.appendChild(conversationSessionEl);
- chatBodyEl.appendChild(sidePanelEl);
}
}
} catch (err) {
@@ -768,10 +784,10 @@ export class KhojChatView extends KhojPaneView {
let editConversationTitleInputEl = this.contentEl.createEl('input');
editConversationTitleInputEl.classList.add("conversation-title-input");
editConversationTitleInputEl.value = conversationTitle;
- editConversationTitleInputEl.addEventListener('click', function(event) {
+ editConversationTitleInputEl.addEventListener('click', function (event) {
event.stopPropagation();
});
- editConversationTitleInputEl.addEventListener('keydown', function(event) {
+ editConversationTitleInputEl.addEventListener('keydown', function (event) {
if (event.key === "Enter") {
event.preventDefault();
editConversationTitleSaveButtonEl.click();
@@ -890,15 +906,17 @@ export class KhojChatView extends KhojPaneView {
chatLog.intent?.type,
chatLog.intent?.["inferred-queries"],
chatBodyEl.dataset.conversationId ?? "",
+ chatLog.images,
+ chatLog.excalidrawDiagram,
);
// push the user messages to the chat history
- if(chatLog.by === "you"){
+ if (chatLog.by === "you") {
this.userMessages.push(chatLog.message);
}
});
// Update starting message after loading history
- const modifierKey: string = Platform.isMacOS ? '⌘' : '^';
+ const modifierKey: string = Platform.isMacOS ? '⌘' : '^';
this.startingMessage = this.userMessages.length > 0
? `(${modifierKey}+↑/↓) for prev messages`
: "Message";
@@ -922,15 +940,15 @@ export class KhojChatView extends KhojPaneView {
try {
let jsonChunk = JSON.parse(rawChunk);
if (!jsonChunk.type)
- jsonChunk = {type: 'message', data: jsonChunk};
+ jsonChunk = { type: 'message', data: jsonChunk };
return jsonChunk;
} catch (e) {
- return {type: 'message', data: rawChunk};
+ return { type: 'message', data: rawChunk };
}
} else if (rawChunk.length > 0) {
- return {type: 'message', data: rawChunk};
+ return { type: 'message', data: rawChunk };
}
- return {type: '', data: ''};
+ return { type: '', data: '' };
}
processMessageChunk(rawChunk: string): void {
@@ -941,6 +959,11 @@ export class KhojChatView extends KhojPaneView {
console.log(`status: ${chunk.data}`);
const statusMessage = chunk.data;
this.handleStreamResponse(this.chatMessageState.newResponseTextEl, statusMessage, this.chatMessageState.loadingEllipsis, false);
+ } else if (chunk.type === 'generated_assets') {
+ const generatedAssets = chunk.data;
+ const imageData = this.handleImageResponse(generatedAssets, this.chatMessageState.rawResponse);
+ this.chatMessageState.generatedAssets = imageData;
+ this.handleStreamResponse(this.chatMessageState.newResponseTextEl, imageData, this.chatMessageState.loadingEllipsis, false);
} else if (chunk.type === 'start_llm_response') {
console.log("Started streaming", new Date());
} else if (chunk.type === 'end_llm_response') {
@@ -963,9 +986,10 @@ export class KhojChatView extends KhojPaneView {
rawResponse: "",
rawQuery: liveQuery,
isVoice: false,
+ generatedAssets: "",
};
} else if (chunk.type === "references") {
- this.chatMessageState.references = {"notes": chunk.data.context, "online": chunk.data.onlineContext};
+ this.chatMessageState.references = { "notes": chunk.data.context, "online": chunk.data.onlineContext };
} else if (chunk.type === 'message') {
const chunkData = chunk.data;
if (typeof chunkData === 'object' && chunkData !== null) {
@@ -978,17 +1002,17 @@ export class KhojChatView extends KhojPaneView {
this.handleJsonResponse(jsonData);
} catch (e) {
this.chatMessageState.rawResponse += chunkData;
- this.handleStreamResponse(this.chatMessageState.newResponseTextEl, this.chatMessageState.rawResponse, this.chatMessageState.loadingEllipsis);
+ this.handleStreamResponse(this.chatMessageState.newResponseTextEl, this.chatMessageState.rawResponse + this.chatMessageState.generatedAssets, this.chatMessageState.loadingEllipsis);
}
} else {
this.chatMessageState.rawResponse += chunkData;
- this.handleStreamResponse(this.chatMessageState.newResponseTextEl, this.chatMessageState.rawResponse, this.chatMessageState.loadingEllipsis);
+ this.handleStreamResponse(this.chatMessageState.newResponseTextEl, this.chatMessageState.rawResponse + this.chatMessageState.generatedAssets, this.chatMessageState.loadingEllipsis);
}
}
}
handleJsonResponse(jsonData: any): void {
- if (jsonData.image || jsonData.detail) {
+ if (jsonData.image || jsonData.detail || jsonData.images || jsonData.excalidrawDiagram) {
this.chatMessageState.rawResponse = this.handleImageResponse(jsonData, this.chatMessageState.rawResponse);
} else if (jsonData.response) {
this.chatMessageState.rawResponse = jsonData.response;
@@ -1088,6 +1112,7 @@ export class KhojChatView extends KhojPaneView {
rawQuery: query,
rawResponse: "",
isVoice: isVoice,
+ generatedAssets: "",
};
let response = await fetch(chatUrl, {
@@ -1234,11 +1259,11 @@ export class KhojChatView extends KhojPaneView {
const recordingConfig = { mimeType: 'audio/webm' };
this.mediaRecorder = new MediaRecorder(stream, recordingConfig);
- this.mediaRecorder.addEventListener("dataavailable", function(event) {
+ this.mediaRecorder.addEventListener("dataavailable", function (event) {
if (event.data.size > 0) audioChunks.push(event.data);
});
- this.mediaRecorder.addEventListener("stop", async function() {
+ this.mediaRecorder.addEventListener("stop", async function () {
const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });
await sendToServer(audioBlob);
});
@@ -1368,7 +1393,22 @@ export class KhojChatView extends KhojPaneView {
if (inferredQuery) {
rawResponse += `\n\n**Inferred Query**:\n\n${inferredQuery}`;
}
+ } else if (imageJson.images) {
+ // If response has images field, response is a list of generated images.
+ imageJson.images.forEach((image: any) => {
+
+ if (image.startsWith("http")) {
+ rawResponse += `![generated_image](${image})\n\n`;
+ } else {
+ rawResponse += `![generated_image](data:image/png;base64,${image})\n\n`;
+ }
+ });
+ } else if (imageJson.excalidrawDiagram) {
+ const domain = this.setting.khojUrl.endsWith("/") ? this.setting.khojUrl : `${this.setting.khojUrl}/`;
+ const redirectMessage = `Hey, I'm not ready to show you diagrams yet here. But you can view it in ${domain}`;
+ rawResponse += redirectMessage;
}
+
// If response has detail field, response is an error message.
if (imageJson.detail) rawResponse += imageJson.detail;
@@ -1407,7 +1447,7 @@ export class KhojChatView extends KhojPaneView {
referenceExpandButton.classList.add("reference-expand-button");
referenceExpandButton.innerHTML = numReferences == 1 ? "1 reference" : `${numReferences} references`;
- referenceExpandButton.addEventListener('click', function() {
+ referenceExpandButton.addEventListener('click', function () {
if (referenceSection.classList.contains("collapsed")) {
referenceSection.classList.remove("collapsed");
referenceSection.classList.add("expanded");
diff --git a/src/interface/obsidian/styles.css b/src/interface/obsidian/styles.css
index b02b2ff3..0d2ea1d4 100644
--- a/src/interface/obsidian/styles.css
+++ b/src/interface/obsidian/styles.css
@@ -50,12 +50,12 @@ If your plugin does not need CSS, delete this file.
overflow-y: scroll; /* Make chat body scroll to see history */
}
/* add chat metatdata to bottom of bubble */
-.khoj-chat-message::after {
+.khoj-chat-message.khoj::after {
content: attr(data-meta);
display: block;
font-size: var(--font-ui-smaller);
color: var(--text-muted);
- margin: -12px 7px 0 -5px;
+ margin: -12px 7px 0 0px;
}
/* move message by khoj to left */
.khoj-chat-message.khoj {
@@ -82,7 +82,8 @@ If your plugin does not need CSS, delete this file.
}
/* color chat bubble by khoj blue */
.khoj-chat-message-text.khoj {
- border: 1px solid var(--khoj-sun);
+ border-left: 2px solid var(--khoj-sun);
+ border-radius: 0px;
margin-left: auto;
white-space: pre-line;
}
@@ -104,8 +105,9 @@ If your plugin does not need CSS, delete this file.
}
/* color chat bubble by you dark grey */
.khoj-chat-message-text.you {
- border: 1px solid var(--color-accent);
+ color: var(--text-normal);
margin-right: auto;
+ background-color: var(--background-modifier-cover);
}
/* add right protrusion to you chat bubble */
.khoj-chat-message-text.you:after {
@@ -240,6 +242,10 @@ div.new-conversation {
grid-auto-flow: column;
grid-template-columns: 1fr auto;
margin-bottom: 16px;
+ position: sticky;
+ top: 0;
+ z-index: 10;
+ background-color: var(--background-primary)
}
div.conversation-header-title {
text-align: left;
@@ -314,6 +320,9 @@ div.selected-conversation {
background: var(--background-primary);
margin: 0 0 0 -8px;
align-items: center;
+ position: sticky;
+ bottom: 0;
+ z-index: 10;
}
#khoj-chat-input.option:hover {
box-shadow: 0 0 11px var(--background-modifier-box-shadow);
diff --git a/src/interface/obsidian/versions.json b/src/interface/obsidian/versions.json
index d727a9b1..56597ada 100644
--- a/src/interface/obsidian/versions.json
+++ b/src/interface/obsidian/versions.json
@@ -92,5 +92,15 @@
"1.29.0": "0.15.0",
"1.29.1": "0.15.0",
"1.30.0": "0.15.0",
- "1.30.1": "0.15.0"
+ "1.30.1": "0.15.0",
+ "1.30.2": "0.15.0",
+ "1.30.3": "0.15.0",
+ "1.30.4": "0.15.0",
+ "1.30.5": "0.15.0",
+ "1.30.6": "0.15.0",
+ "1.30.7": "0.15.0",
+ "1.30.8": "0.15.0",
+ "1.30.9": "0.15.0",
+ "1.30.10": "0.15.0",
+ "1.31.0": "0.15.0"
}
diff --git a/src/interface/web/app/agents/layout.tsx b/src/interface/web/app/agents/layout.tsx
index b30c782d..5749ef4c 100644
--- a/src/interface/web/app/agents/layout.tsx
+++ b/src/interface/web/app/agents/layout.tsx
@@ -1,8 +1,7 @@
import type { Metadata } from "next";
-import { Noto_Sans } from "next/font/google";
+import { noto_sans, noto_sans_arabic } from "@/app/fonts";
import "../globals.css";
-
-const inter = Noto_Sans({ subsets: ["latin"] });
+import { ContentSecurityPolicy } from "../common/layoutHelper";
export const metadata: Metadata = {
title: "Khoj AI - Agents",
@@ -33,20 +32,9 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
-
- {children}
+
+
+ {children}
);
}
diff --git a/src/interface/web/app/automations/layout.tsx b/src/interface/web/app/automations/layout.tsx
index 05686bef..aca8ec50 100644
--- a/src/interface/web/app/automations/layout.tsx
+++ b/src/interface/web/app/automations/layout.tsx
@@ -2,6 +2,7 @@ import type { Metadata } from "next";
import { Toaster } from "@/components/ui/toaster";
import "../globals.css";
+import { ContentSecurityPolicy } from "../common/layoutHelper";
export const metadata: Metadata = {
title: "Khoj AI - Automations",
@@ -32,9 +33,12 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
- {children}
-
-
+
+
+
+ {children}
+
+
+
);
}
diff --git a/src/interface/web/app/automations/page.tsx b/src/interface/web/app/automations/page.tsx
index e2c0c3f9..0ecf5809 100644
--- a/src/interface/web/app/automations/page.tsx
+++ b/src/interface/web/app/automations/page.tsx
@@ -994,7 +994,7 @@ export default function Automations() {
const [suggestedAutomations, setSuggestedAutomations] = useState([]);
const [showLoginPrompt, setShowLoginPrompt] = useState(false);
const isMobileWidth = useIsMobileWidth();
- const ipLocationData = useIPLocationData();
+ const { locationData, locationDataError, locationDataLoading } = useIPLocationData();
useEffect(() => {
if (newAutomationData) {
@@ -1044,18 +1044,18 @@ export default function Automations() {
{authenticatedData.email}
) : null}
- {ipLocationData && (
+ {locationData && (
- {ipLocationData
- ? `${ipLocationData.city}, ${ipLocationData.country}`
+ {locationData
+ ? `${locationData.city}, ${locationData.country}`
: "Unknown"}
)}
- {ipLocationData && (
+ {locationData && (
- {ipLocationData ? `${ipLocationData.timezone}` : "Unknown"}
+ {locationData ? `${locationData.timezone}` : "Unknown"}
)}
@@ -1086,7 +1086,7 @@ export default function Automations() {
setNewAutomationData={setNewAutomationData}
authenticatedData={authenticatedData}
isCreating={isCreating}
- ipLocationData={ipLocationData}
+ ipLocationData={locationData}
/>
) : (
) : (
@@ -1158,7 +1158,7 @@ export default function Automations() {
key={automation.id}
authenticatedData={authenticatedData}
automation={automation}
- locationData={ipLocationData}
+ locationData={locationData}
isLoggedIn={authenticatedData ? true : false}
setShowLoginPrompt={setShowLoginPrompt}
/>
@@ -1173,7 +1173,7 @@ export default function Automations() {
key={automation.id}
authenticatedData={authenticatedData}
automation={automation}
- locationData={ipLocationData}
+ locationData={locationData}
isLoggedIn={authenticatedData ? true : false}
setShowLoginPrompt={setShowLoginPrompt}
suggestedCard={true}
diff --git a/src/interface/web/app/chat/layout.tsx b/src/interface/web/app/chat/layout.tsx
index 09c3afb7..83778d80 100644
--- a/src/interface/web/app/chat/layout.tsx
+++ b/src/interface/web/app/chat/layout.tsx
@@ -1,8 +1,7 @@
import type { Metadata } from "next";
-import { Noto_Sans } from "next/font/google";
+import { noto_sans, noto_sans_arabic } from "@/app/fonts";
import "../globals.css";
-
-const inter = Noto_Sans({ subsets: ["latin"] });
+import { ContentSecurityPolicy } from "../common/layoutHelper";
export const metadata: Metadata = {
title: "Khoj AI - Chat",
@@ -34,20 +33,9 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
-
-
+
+
+
{children}