Move vars to dynamic, add metrics (#1085)
Browse files* Add healthcheck route
* Add prom client with basic metrics
* wip: serve metrics on a different port
* exclude server from tsconfig
* latest
* refacto(all): use class & singleton
* refacto(all): use class & singleton
* refacto(all): add request logs
* Make all the env vars dynamic (#1092)
* Add truncate to task model (#1090)
* retry text area height (#1091)
* Make all the env vars dynamic
* only check for db at runtime
* remove secret from build step
* improve dockerfile
* Wrap db in singleton
* add .env.local to dockerignore
* changes to dockerfile
* lint
* aborted generations
* move collections build check
* Use a single dockerfile
* lint
* fixes
* lint
* don't return db during building
* remove dev
---------
Co-authored-by: Victor Muštar <victor.mustar@gmail.com>
* refacto(all): update default metrics port
* fix recursion error
* add version check
* revert vite preview
* Move request logs to debug level and add an env var to filter by log level in dev mode
* Set package version if needed
* Set log level for prod and dev
---------
Co-authored-by: rtrompier <remy.trompier@gmail.com>
Co-authored-by: Victor Muštar <victor.mustar@gmail.com>
- .dockerignore +1 -1
- .env +2 -0
- .github/workflows/build-image.yml +3 -3
- Dockerfile +56 -10
- Dockerfile.local +0 -28
- entrypoint.sh +5 -15
- package-lock.json +642 -12
- package.json +3 -0
- scripts/populate.ts +9 -4
- src/hooks.server.ts +36 -26
- src/lib/assistantStats/refresh-assistants-counts.ts +40 -35
- src/lib/components/AnnouncementBanner.svelte +1 -1
- src/lib/components/DisclaimerModal.svelte +6 -10
- src/lib/components/LoginModal.svelte +5 -5
- src/lib/components/NavMenu.svelte +7 -4
- src/lib/components/chat/AssistantIntroduction.svelte +3 -2
- src/lib/components/chat/ChatIntroduction.svelte +6 -8
- src/lib/components/chat/ChatWindow.svelte +1 -1
- src/lib/components/icons/Logo.svelte +4 -4
- src/lib/migrations/migrations.ts +29 -22
- src/lib/migrations/routines/01-update-search-assistants.ts +5 -5
- src/lib/migrations/routines/02-update-assistants-models.ts +3 -3
- src/lib/migrations/routines/index.ts +4 -3
- src/lib/server/abortedGenerations.ts +25 -13
- src/lib/server/auth.ts +13 -24
- src/lib/server/database.ts +188 -141
- src/lib/server/embeddingEndpoints/hfApi/embeddingHfApi.ts +2 -2
- src/lib/server/embeddingEndpoints/openai/embeddingEndpoints.ts +2 -2
- src/lib/server/embeddingEndpoints/tei/embeddingEndpoints.ts +2 -2
- src/lib/server/embeddingModels.ts +2 -2
- src/lib/server/endpoints/anthropic/endpointAnthropic.ts +2 -2
- src/lib/server/endpoints/cloudflare/endpointCloudflare.ts +3 -3
- src/lib/server/endpoints/cohere/endpointCohere.ts +2 -2
- src/lib/server/endpoints/llamacpp/endpointLlamacpp.ts +2 -2
- src/lib/server/endpoints/openai/endpointOai.ts +2 -2
- src/lib/server/endpoints/tgi/endpointTgi.ts +2 -2
- src/lib/server/files/downloadFile.ts +1 -1
- src/lib/server/files/uploadFile.ts +1 -1
- src/lib/server/logger.ts +2 -2
- src/lib/server/metrics.ts +43 -0
- src/lib/server/models.ts +9 -16
- src/lib/server/summarize.ts +2 -2
- src/lib/server/usageLimits.ts +3 -3
- src/lib/server/websearch/runWebSearch.ts +4 -4
- src/lib/server/websearch/searchSearxng.ts +2 -2
- src/lib/server/websearch/searchWeb.ts +13 -20
- src/lib/utils/getShareUrl.ts +4 -2
- src/lib/utils/isHuggingChat.ts +2 -2
- src/routes/+layout.server.ts +10 -20
- src/routes/+layout.svelte +20 -21
@@ -8,4 +8,4 @@ node_modules/
|
|
8 |
.svelte-kit/
|
9 |
.env*
|
10 |
!.env
|
11 |
-
|
|
|
8 |
.svelte-kit/
|
9 |
.env*
|
10 |
!.env
|
11 |
+
.env.local
|
@@ -154,3 +154,5 @@ ALLOWED_USER_EMAILS=`[]` # if it's defined, only these emails will be allowed to
|
|
154 |
|
155 |
USAGE_LIMITS=`{}`
|
156 |
ALLOW_INSECURE_COOKIES=false # recommended to keep this to false but set to true if you need to run over http without tls
|
|
|
|
|
|
154 |
|
155 |
USAGE_LIMITS=`{}`
|
156 |
ALLOW_INSECURE_COOKIES=false # recommended to keep this to false but set to true if you need to run over http without tls
|
157 |
+
METRICS_PORT=
|
158 |
+
LOG_LEVEL=info
|
@@ -8,7 +8,7 @@ on:
|
|
8 |
branches:
|
9 |
- "*"
|
10 |
paths:
|
11 |
-
- "Dockerfile
|
12 |
- "entrypoint.sh"
|
13 |
workflow_dispatch:
|
14 |
release:
|
@@ -62,7 +62,7 @@ jobs:
|
|
62 |
uses: docker/build-push-action@v5
|
63 |
with:
|
64 |
context: .
|
65 |
-
file: Dockerfile
|
66 |
push: ${{ github.event_name != 'pull_request' }}
|
67 |
tags: ${{ steps.meta.outputs.tags }}
|
68 |
labels: ${{ steps.meta.outputs.labels }}
|
@@ -116,7 +116,7 @@ jobs:
|
|
116 |
uses: docker/build-push-action@v5
|
117 |
with:
|
118 |
context: .
|
119 |
-
file: Dockerfile
|
120 |
push: ${{ github.event_name != 'pull_request' }}
|
121 |
tags: ${{ steps.meta.outputs.tags }}
|
122 |
labels: ${{ steps.meta.outputs.labels }}
|
|
|
8 |
branches:
|
9 |
- "*"
|
10 |
paths:
|
11 |
+
- "Dockerfile"
|
12 |
- "entrypoint.sh"
|
13 |
workflow_dispatch:
|
14 |
release:
|
|
|
62 |
uses: docker/build-push-action@v5
|
63 |
with:
|
64 |
context: .
|
65 |
+
file: Dockerfile
|
66 |
push: ${{ github.event_name != 'pull_request' }}
|
67 |
tags: ${{ steps.meta.outputs.tags }}
|
68 |
labels: ${{ steps.meta.outputs.labels }}
|
|
|
116 |
uses: docker/build-push-action@v5
|
117 |
with:
|
118 |
context: .
|
119 |
+
file: Dockerfile
|
120 |
push: ${{ github.event_name != 'pull_request' }}
|
121 |
tags: ${{ steps.meta.outputs.tags }}
|
122 |
labels: ${{ steps.meta.outputs.labels }}
|
@@ -1,6 +1,9 @@
|
|
1 |
# syntax=docker/dockerfile:1
|
2 |
# read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
|
3 |
# you will also find guides on how best to write your Dockerfile
|
|
|
|
|
|
|
4 |
FROM node:20 as builder-production
|
5 |
|
6 |
WORKDIR /app
|
@@ -12,31 +15,74 @@ RUN --mount=type=cache,target=/app/.npm \
|
|
12 |
|
13 |
FROM builder-production as builder
|
14 |
|
|
|
|
|
|
|
15 |
RUN --mount=type=cache,target=/app/.npm \
|
16 |
npm set cache /app/.npm && \
|
17 |
npm ci
|
18 |
|
19 |
COPY --link --chown=1000 . .
|
20 |
|
21 |
-
RUN
|
22 |
-
npm run build
|
23 |
|
24 |
-
|
25 |
-
|
26 |
|
27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
|
29 |
-
RUN useradd -m -u 1000 user
|
30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
USER user
|
32 |
|
33 |
ENV HOME=/home/user \
|
34 |
PATH=/home/user/.local/bin:$PATH
|
35 |
|
|
|
36 |
|
37 |
-
|
38 |
-
|
39 |
-
|
|
|
|
|
|
|
|
|
40 |
COPY --chown=1000 gcp-*.json /app/
|
41 |
|
42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
# syntax=docker/dockerfile:1
|
2 |
# read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
|
3 |
# you will also find guides on how best to write your Dockerfile
|
4 |
+
ARG INCLUDE_DB=false
|
5 |
+
|
6 |
+
# stage that install the dependencies
|
7 |
FROM node:20 as builder-production
|
8 |
|
9 |
WORKDIR /app
|
|
|
15 |
|
16 |
FROM builder-production as builder
|
17 |
|
18 |
+
ARG APP_BASE=
|
19 |
+
ARG PUBLIC_APP_COLOR=blue
|
20 |
+
|
21 |
RUN --mount=type=cache,target=/app/.npm \
|
22 |
npm set cache /app/.npm && \
|
23 |
npm ci
|
24 |
|
25 |
COPY --link --chown=1000 . .
|
26 |
|
27 |
+
RUN npm run build
|
|
|
28 |
|
29 |
+
# mongo image
|
30 |
+
FROM mongo:latest as mongo
|
31 |
|
32 |
+
# image to be used if INCLUDE_DB is false
|
33 |
+
FROM node:20-slim as local_db_false
|
34 |
+
|
35 |
+
# image to be used if INCLUDE_DB is true
|
36 |
+
FROM node:20-slim as local_db_true
|
37 |
+
|
38 |
+
RUN apt-get update
|
39 |
+
RUN apt-get install gnupg curl -y
|
40 |
+
# copy mongo from the other stage
|
41 |
+
COPY --from=mongo /usr/bin/mongo* /usr/bin/
|
42 |
+
|
43 |
+
ENV MONGODB_URL=mongodb://localhost:27017
|
44 |
+
RUN mkdir -p /data/db
|
45 |
+
RUN chown -R 1000:1000 /data/db
|
46 |
+
|
47 |
+
# final image
|
48 |
+
FROM local_db_${INCLUDE_DB} as final
|
49 |
+
|
50 |
+
# build arg to determine if the database should be included
|
51 |
+
ARG INCLUDE_DB=false
|
52 |
+
ENV INCLUDE_DB=${INCLUDE_DB}
|
53 |
+
|
54 |
+
# svelte requires APP_BASE at build time so it must be passed as a build arg
|
55 |
+
ARG APP_BASE=
|
56 |
+
# tailwind requires the primary theme to be known at build time so it must be passed as a build arg
|
57 |
+
ARG PUBLIC_APP_COLOR=blue
|
58 |
|
|
|
59 |
|
60 |
+
# install dotenv-cli
|
61 |
+
RUN npm install -g dotenv-cli
|
62 |
+
|
63 |
+
# switch to a user that works for spaces
|
64 |
+
RUN userdel -r node
|
65 |
+
RUN useradd -m -u 1000 user
|
66 |
USER user
|
67 |
|
68 |
ENV HOME=/home/user \
|
69 |
PATH=/home/user/.local/bin:$PATH
|
70 |
|
71 |
+
WORKDIR /app
|
72 |
|
73 |
+
# add a .env.local if the user doesn't bind a volume to it
|
74 |
+
RUN touch /app/.env.local
|
75 |
+
|
76 |
+
# get the default config, the entrypoint script and the server script
|
77 |
+
COPY --chown=1000 package.json /app/package.json
|
78 |
+
COPY --chown=1000 .env /app/.env
|
79 |
+
COPY --chown=1000 entrypoint.sh /app/entrypoint.sh
|
80 |
COPY --chown=1000 gcp-*.json /app/
|
81 |
|
82 |
+
#import the build & dependencies
|
83 |
+
COPY --from=builder --chown=1000 /app/build /app/build
|
84 |
+
COPY --from=builder --chown=1000 /app/node_modules /app/node_modules
|
85 |
+
|
86 |
+
RUN chmod +x /app/entrypoint.sh
|
87 |
+
|
88 |
+
CMD ["/bin/bash", "-c", "/app/entrypoint.sh"]
|
@@ -1,28 +0,0 @@
|
|
1 |
-
ARG INCLUDE_DB=false
|
2 |
-
FROM mongo:latest as mongo
|
3 |
-
|
4 |
-
FROM node:20-slim as local_db_false
|
5 |
-
|
6 |
-
FROM node:20-slim as local_db_true
|
7 |
-
|
8 |
-
RUN apt-get update
|
9 |
-
RUN apt-get install gnupg curl -y
|
10 |
-
|
11 |
-
COPY --from=mongo /usr/bin/mongo* /usr/bin/
|
12 |
-
|
13 |
-
FROM local_db_${INCLUDE_DB} as final
|
14 |
-
ARG INCLUDE_DB=false
|
15 |
-
ENV INCLUDE_DB=${INCLUDE_DB}
|
16 |
-
|
17 |
-
WORKDIR /app
|
18 |
-
|
19 |
-
COPY --link --chown=1000 package-lock.json package.json ./
|
20 |
-
RUN --mount=type=cache,target=/app/.npm \
|
21 |
-
npm set cache /app/.npm && \
|
22 |
-
npm ci
|
23 |
-
|
24 |
-
# copy the rest of the files, run regardless of
|
25 |
-
COPY --chown=1000 --link . .
|
26 |
-
RUN chmod +x /app/entrypoint.sh
|
27 |
-
|
28 |
-
CMD ["/bin/bash", "-c", "/app/entrypoint.sh"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -2,7 +2,7 @@ ENV_LOCAL_PATH=/app/.env.local
|
|
2 |
|
3 |
if test -z "${DOTENV_LOCAL}" ; then
|
4 |
if ! test -f "${ENV_LOCAL_PATH}" ; then
|
5 |
-
echo "DOTENV_LOCAL was not found in the ENV variables and .env.local is not set using a bind volume.
|
6 |
fi;
|
7 |
else
|
8 |
echo "DOTENV_LOCAL was found in the ENV variables. Creating .env.local file."
|
@@ -10,20 +10,10 @@ else
|
|
10 |
fi;
|
11 |
|
12 |
if [ "$INCLUDE_DB" = "true" ] ; then
|
13 |
-
echo "INCLUDE_DB is set to true."
|
14 |
-
|
15 |
-
MONGODB_CONFIG="MONGODB_URL=mongodb://localhost:27017"
|
16 |
-
if ! grep -q "^${MONGODB_CONFIG}$" ${ENV_LOCAL_PATH}; then
|
17 |
-
echo "Appending MONGODB_URL"
|
18 |
-
touch /app/.env.local
|
19 |
-
echo -e "\n${MONGODB_CONFIG}" >> ${ENV_LOCAL_PATH}
|
20 |
-
fi
|
21 |
-
|
22 |
-
mkdir -p /data/db
|
23 |
-
mongod &
|
24 |
echo "Starting local MongoDB instance"
|
25 |
-
|
26 |
fi;
|
27 |
|
28 |
-
|
29 |
-
|
|
|
|
2 |
|
3 |
if test -z "${DOTENV_LOCAL}" ; then
|
4 |
if ! test -f "${ENV_LOCAL_PATH}" ; then
|
5 |
+
echo "DOTENV_LOCAL was not found in the ENV variables and .env.local is not set using a bind volume. Make sure to set environment variables properly. "
|
6 |
fi;
|
7 |
else
|
8 |
echo "DOTENV_LOCAL was found in the ENV variables. Creating .env.local file."
|
|
|
10 |
fi;
|
11 |
|
12 |
if [ "$INCLUDE_DB" = "true" ] ; then
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
echo "Starting local MongoDB instance"
|
14 |
+
nohup mongod &
|
15 |
fi;
|
16 |
|
17 |
+
export PUBLIC_VERSION=$(node -p "require('./package.json').version")
|
18 |
+
|
19 |
+
dotenv -e /app/.env -c -- node /app/build/index.js -- --host 0.0.0.0 --port 3000
|
@@ -17,6 +17,7 @@
|
|
17 |
"browser-image-resizer": "^2.4.1",
|
18 |
"date-fns": "^2.29.3",
|
19 |
"dotenv": "^16.0.3",
|
|
|
20 |
"handlebars": "^4.7.8",
|
21 |
"highlight.js": "^11.7.0",
|
22 |
"image-size": "^1.0.2",
|
@@ -49,6 +50,7 @@
|
|
49 |
"@sveltejs/adapter-node": "^1.3.1",
|
50 |
"@sveltejs/kit": "^1.30.4",
|
51 |
"@tailwindcss/typography": "^0.5.9",
|
|
|
52 |
"@types/jsdom": "^21.1.1",
|
53 |
"@types/minimist": "^1.2.5",
|
54 |
"@types/parquetjs": "^0.10.3",
|
@@ -62,6 +64,7 @@
|
|
62 |
"prettier": "^2.8.0",
|
63 |
"prettier-plugin-svelte": "^2.10.1",
|
64 |
"prettier-plugin-tailwindcss": "^0.2.7",
|
|
|
65 |
"svelte": "^4.2.8",
|
66 |
"svelte-check": "^3.6.2",
|
67 |
"ts-node": "^10.9.1",
|
@@ -1263,6 +1266,15 @@
|
|
1263 |
"node": ">= 8"
|
1264 |
}
|
1265 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1266 |
"node_modules/@polka/url": {
|
1267 |
"version": "1.0.0-next.21",
|
1268 |
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
|
@@ -1987,6 +1999,16 @@
|
|
1987 |
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
|
1988 |
"devOptional": true
|
1989 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1990 |
"node_modules/@types/chai": {
|
1991 |
"version": "4.3.5",
|
1992 |
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz",
|
@@ -2002,6 +2024,15 @@
|
|
2002 |
"@types/chai": "*"
|
2003 |
}
|
2004 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2005 |
"node_modules/@types/cookie": {
|
2006 |
"version": "0.5.1",
|
2007 |
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz",
|
@@ -2014,6 +2045,36 @@
|
|
2014 |
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
|
2015 |
"dev": true
|
2016 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017 |
"node_modules/@types/jsdom": {
|
2018 |
"version": "21.1.1",
|
2019 |
"resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.1.tgz",
|
@@ -2041,6 +2102,12 @@
|
|
2041 |
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
|
2042 |
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
|
2043 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
2044 |
"node_modules/@types/minimist": {
|
2045 |
"version": "1.2.5",
|
2046 |
"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
|
@@ -2086,6 +2153,18 @@
|
|
2086 |
"integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==",
|
2087 |
"dev": true
|
2088 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2089 |
"node_modules/@types/resolve": {
|
2090 |
"version": "1.20.2",
|
2091 |
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
|
@@ -2098,6 +2177,27 @@
|
|
2098 |
"integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==",
|
2099 |
"dev": true
|
2100 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2101 |
"node_modules/@types/tough-cookie": {
|
2102 |
"version": "4.0.2",
|
2103 |
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz",
|
@@ -2460,6 +2560,18 @@
|
|
2460 |
"node": ">=6.5"
|
2461 |
}
|
2462 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2463 |
"node_modules/acorn": {
|
2464 |
"version": "8.11.3",
|
2465 |
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
|
@@ -2590,6 +2702,11 @@
|
|
2590 |
"dequal": "^2.0.3"
|
2591 |
}
|
2592 |
},
|
|
|
|
|
|
|
|
|
|
|
2593 |
"node_modules/array-union": {
|
2594 |
"version": "2.1.0",
|
2595 |
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
|
@@ -2726,6 +2843,12 @@
|
|
2726 |
"integrity": "sha512-u4cBQNepWxYA55FunZSM7wMi55yQaN0otnhhilNoWHq0MfOfJeQx0v0mRRpolGOExPjZcl6FtB0BB8Xkb88F0g==",
|
2727 |
"optional": true
|
2728 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
2729 |
"node_modules/bl": {
|
2730 |
"version": "4.1.0",
|
2731 |
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
|
@@ -2742,6 +2865,67 @@
|
|
2742 |
"integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==",
|
2743 |
"dev": true
|
2744 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2745 |
"node_modules/brace-expansion": {
|
2746 |
"version": "1.1.11",
|
2747 |
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
@@ -2874,6 +3058,14 @@
|
|
2874 |
"url": "https://github.com/sponsors/sindresorhus"
|
2875 |
}
|
2876 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2877 |
"node_modules/cac": {
|
2878 |
"version": "6.7.14",
|
2879 |
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
|
@@ -2887,7 +3079,6 @@
|
|
2887 |
"version": "1.0.7",
|
2888 |
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
2889 |
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
2890 |
-
"optional": true,
|
2891 |
"dependencies": {
|
2892 |
"es-define-property": "^1.0.0",
|
2893 |
"es-errors": "^1.3.0",
|
@@ -3166,6 +3357,25 @@
|
|
3166 |
"node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14"
|
3167 |
}
|
3168 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3169 |
"node_modules/cookie": {
|
3170 |
"version": "0.5.0",
|
3171 |
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
|
@@ -3175,6 +3385,11 @@
|
|
3175 |
"node": ">= 0.6"
|
3176 |
}
|
3177 |
},
|
|
|
|
|
|
|
|
|
|
|
3178 |
"node_modules/create-require": {
|
3179 |
"version": "1.1.1",
|
3180 |
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
|
@@ -3409,7 +3624,6 @@
|
|
3409 |
"version": "1.1.4",
|
3410 |
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
3411 |
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
3412 |
-
"optional": true,
|
3413 |
"dependencies": {
|
3414 |
"es-define-property": "^1.0.0",
|
3415 |
"es-errors": "^1.3.0",
|
@@ -3430,6 +3644,14 @@
|
|
3430 |
"node": ">=0.4.0"
|
3431 |
}
|
3432 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3433 |
"node_modules/dequal": {
|
3434 |
"version": "2.0.3",
|
3435 |
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
|
@@ -3439,6 +3661,15 @@
|
|
3439 |
"node": ">=6"
|
3440 |
}
|
3441 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3442 |
"node_modules/detect-indent": {
|
3443 |
"version": "6.1.0",
|
3444 |
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
|
@@ -3543,6 +3774,11 @@
|
|
3543 |
"safe-buffer": "^5.0.1"
|
3544 |
}
|
3545 |
},
|
|
|
|
|
|
|
|
|
|
|
3546 |
"node_modules/electron-to-chromium": {
|
3547 |
"version": "1.4.359",
|
3548 |
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.359.tgz",
|
@@ -3553,6 +3789,14 @@
|
|
3553 |
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
|
3554 |
"integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="
|
3555 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3556 |
"node_modules/end-of-stream": {
|
3557 |
"version": "1.4.4",
|
3558 |
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
@@ -3576,7 +3820,6 @@
|
|
3576 |
"version": "1.0.0",
|
3577 |
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
3578 |
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
3579 |
-
"optional": true,
|
3580 |
"dependencies": {
|
3581 |
"get-intrinsic": "^1.2.4"
|
3582 |
},
|
@@ -3588,7 +3831,6 @@
|
|
3588 |
"version": "1.3.0",
|
3589 |
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
3590 |
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
3591 |
-
"optional": true,
|
3592 |
"engines": {
|
3593 |
"node": ">= 0.4"
|
3594 |
}
|
@@ -3878,6 +4120,14 @@
|
|
3878 |
"node": ">=0.10.0"
|
3879 |
}
|
3880 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3881 |
"node_modules/event-target-shim": {
|
3882 |
"version": "5.0.1",
|
3883 |
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
@@ -3925,6 +4175,82 @@
|
|
3925 |
"node": ">=6"
|
3926 |
}
|
3927 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3928 |
"node_modules/extend": {
|
3929 |
"version": "3.0.2",
|
3930 |
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
@@ -4040,6 +4366,36 @@
|
|
4040 |
"node": ">=8"
|
4041 |
}
|
4042 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4043 |
"node_modules/find-up": {
|
4044 |
"version": "5.0.0",
|
4045 |
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
|
@@ -4112,6 +4468,14 @@
|
|
4112 |
"node": ">= 12.20"
|
4113 |
}
|
4114 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4115 |
"node_modules/fraction.js": {
|
4116 |
"version": "4.2.0",
|
4117 |
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
|
@@ -4124,6 +4488,14 @@
|
|
4124 |
"url": "https://www.patreon.com/infusion"
|
4125 |
}
|
4126 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4127 |
"node_modules/fs-constants": {
|
4128 |
"version": "1.0.0",
|
4129 |
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
@@ -4221,7 +4593,6 @@
|
|
4221 |
"version": "1.2.4",
|
4222 |
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
4223 |
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
4224 |
-
"optional": true,
|
4225 |
"dependencies": {
|
4226 |
"es-errors": "^1.3.0",
|
4227 |
"function-bind": "^1.1.2",
|
@@ -4352,7 +4723,6 @@
|
|
4352 |
"version": "1.0.1",
|
4353 |
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
4354 |
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
4355 |
-
"optional": true,
|
4356 |
"dependencies": {
|
4357 |
"get-intrinsic": "^1.1.3"
|
4358 |
},
|
@@ -4429,7 +4799,6 @@
|
|
4429 |
"version": "1.0.2",
|
4430 |
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
4431 |
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
4432 |
-
"optional": true,
|
4433 |
"dependencies": {
|
4434 |
"es-define-property": "^1.0.0"
|
4435 |
},
|
@@ -4441,7 +4810,6 @@
|
|
4441 |
"version": "1.0.3",
|
4442 |
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
4443 |
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
|
4444 |
-
"optional": true,
|
4445 |
"engines": {
|
4446 |
"node": ">= 0.4"
|
4447 |
},
|
@@ -4453,7 +4821,6 @@
|
|
4453 |
"version": "1.0.3",
|
4454 |
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
|
4455 |
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
|
4456 |
-
"optional": true,
|
4457 |
"engines": {
|
4458 |
"node": ">= 0.4"
|
4459 |
},
|
@@ -4512,6 +4879,21 @@
|
|
4512 |
"node": ">=12"
|
4513 |
}
|
4514 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4515 |
"node_modules/http-proxy-agent": {
|
4516 |
"version": "5.0.0",
|
4517 |
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
|
@@ -4669,6 +5051,14 @@
|
|
4669 |
"node": ">= 12"
|
4670 |
}
|
4671 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4672 |
"node_modules/is-arrayish": {
|
4673 |
"version": "0.3.2",
|
4674 |
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
|
@@ -5231,11 +5621,24 @@
|
|
5231 |
"integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
|
5232 |
"dev": true
|
5233 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5234 |
"node_modules/memory-pager": {
|
5235 |
"version": "1.5.0",
|
5236 |
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
|
5237 |
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
|
5238 |
},
|
|
|
|
|
|
|
|
|
|
|
5239 |
"node_modules/merge-stream": {
|
5240 |
"version": "2.0.0",
|
5241 |
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
@@ -5250,6 +5653,14 @@
|
|
5250 |
"node": ">= 8"
|
5251 |
}
|
5252 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5253 |
"node_modules/micromatch": {
|
5254 |
"version": "4.0.5",
|
5255 |
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
|
@@ -5262,6 +5673,17 @@
|
|
5262 |
"node": ">=8.6"
|
5263 |
}
|
5264 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5265 |
"node_modules/mime-db": {
|
5266 |
"version": "1.52.0",
|
5267 |
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
@@ -5468,6 +5890,14 @@
|
|
5468 |
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
|
5469 |
"dev": true
|
5470 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5471 |
"node_modules/neo-async": {
|
5472 |
"version": "2.6.2",
|
5473 |
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
|
@@ -5625,7 +6055,6 @@
|
|
5625 |
"version": "1.13.1",
|
5626 |
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
5627 |
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
5628 |
-
"optional": true,
|
5629 |
"funding": {
|
5630 |
"url": "https://github.com/sponsors/ljharb"
|
5631 |
}
|
@@ -5654,6 +6083,17 @@
|
|
5654 |
"node": ">=14.0.0"
|
5655 |
}
|
5656 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5657 |
"node_modules/once": {
|
5658 |
"version": "1.4.0",
|
5659 |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
@@ -5880,6 +6320,14 @@
|
|
5880 |
"url": "https://github.com/inikulin/parse5?sponsor=1"
|
5881 |
}
|
5882 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5883 |
"node_modules/path-exists": {
|
5884 |
"version": "4.0.0",
|
5885 |
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
@@ -5911,6 +6359,11 @@
|
|
5911 |
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
5912 |
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
5913 |
},
|
|
|
|
|
|
|
|
|
|
|
5914 |
"node_modules/path-type": {
|
5915 |
"version": "4.0.0",
|
5916 |
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
|
@@ -6529,6 +6982,19 @@
|
|
6529 |
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz",
|
6530 |
"integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="
|
6531 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6532 |
"node_modules/protobufjs": {
|
6533 |
"version": "6.11.4",
|
6534 |
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz",
|
@@ -6554,6 +7020,18 @@
|
|
6554 |
"pbts": "bin/pbts"
|
6555 |
}
|
6556 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6557 |
"node_modules/psl": {
|
6558 |
"version": "1.9.0",
|
6559 |
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
|
@@ -6642,6 +7120,39 @@
|
|
6642 |
"resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
|
6643 |
"integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="
|
6644 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6645 |
"node_modules/rc": {
|
6646 |
"version": "1.2.8",
|
6647 |
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
|
@@ -6944,6 +7455,47 @@
|
|
6944 |
"node": ">=10"
|
6945 |
}
|
6946 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6947 |
"node_modules/serpapi": {
|
6948 |
"version": "1.1.1",
|
6949 |
"resolved": "https://registry.npmjs.org/serpapi/-/serpapi-1.1.1.tgz",
|
@@ -6952,6 +7504,20 @@
|
|
6952 |
"undici": "^5.12.0"
|
6953 |
}
|
6954 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6955 |
"node_modules/set-cookie-parser": {
|
6956 |
"version": "2.6.0",
|
6957 |
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz",
|
@@ -6962,7 +7528,6 @@
|
|
6962 |
"version": "1.2.2",
|
6963 |
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
6964 |
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
|
6965 |
-
"optional": true,
|
6966 |
"dependencies": {
|
6967 |
"define-data-property": "^1.1.4",
|
6968 |
"es-errors": "^1.3.0",
|
@@ -6975,6 +7540,11 @@
|
|
6975 |
"node": ">= 0.4"
|
6976 |
}
|
6977 |
},
|
|
|
|
|
|
|
|
|
|
|
6978 |
"node_modules/sharp": {
|
6979 |
"version": "0.33.2",
|
6980 |
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.2.tgz",
|
@@ -7039,7 +7609,6 @@
|
|
7039 |
"version": "1.0.6",
|
7040 |
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
|
7041 |
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
|
7042 |
-
"optional": true,
|
7043 |
"dependencies": {
|
7044 |
"call-bind": "^1.0.7",
|
7045 |
"es-errors": "^1.3.0",
|
@@ -7232,6 +7801,14 @@
|
|
7232 |
"integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
|
7233 |
"dev": true
|
7234 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7235 |
"node_modules/std-env": {
|
7236 |
"version": "3.3.3",
|
7237 |
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz",
|
@@ -7703,6 +8280,15 @@
|
|
7703 |
"streamx": "^2.15.0"
|
7704 |
}
|
7705 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7706 |
"node_modules/text-table": {
|
7707 |
"version": "0.2.0",
|
7708 |
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
@@ -7808,6 +8394,14 @@
|
|
7808 |
"node": ">=8.0"
|
7809 |
}
|
7810 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7811 |
"node_modules/totalist": {
|
7812 |
"version": "3.0.0",
|
7813 |
"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz",
|
@@ -7958,6 +8552,18 @@
|
|
7958 |
"url": "https://github.com/sponsors/sindresorhus"
|
7959 |
}
|
7960 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7961 |
"node_modules/typescript": {
|
7962 |
"version": "5.2.2",
|
7963 |
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
|
@@ -8022,6 +8628,14 @@
|
|
8022 |
"node": ">= 4.0.0"
|
8023 |
}
|
8024 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8025 |
"node_modules/unplugin": {
|
8026 |
"version": "1.3.1",
|
8027 |
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.3.1.tgz",
|
@@ -8126,6 +8740,14 @@
|
|
8126 |
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
8127 |
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
8128 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8129 |
"node_modules/uuid": {
|
8130 |
"version": "9.0.1",
|
8131 |
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
|
@@ -8149,6 +8771,14 @@
|
|
8149 |
"resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
|
8150 |
"integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow=="
|
8151 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8152 |
"node_modules/vite": {
|
8153 |
"version": "4.5.3",
|
8154 |
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz",
|
|
|
17 |
"browser-image-resizer": "^2.4.1",
|
18 |
"date-fns": "^2.29.3",
|
19 |
"dotenv": "^16.0.3",
|
20 |
+
"express": "^4.19.2",
|
21 |
"handlebars": "^4.7.8",
|
22 |
"highlight.js": "^11.7.0",
|
23 |
"image-size": "^1.0.2",
|
|
|
50 |
"@sveltejs/adapter-node": "^1.3.1",
|
51 |
"@sveltejs/kit": "^1.30.4",
|
52 |
"@tailwindcss/typography": "^0.5.9",
|
53 |
+
"@types/express": "^4.17.21",
|
54 |
"@types/jsdom": "^21.1.1",
|
55 |
"@types/minimist": "^1.2.5",
|
56 |
"@types/parquetjs": "^0.10.3",
|
|
|
64 |
"prettier": "^2.8.0",
|
65 |
"prettier-plugin-svelte": "^2.10.1",
|
66 |
"prettier-plugin-tailwindcss": "^0.2.7",
|
67 |
+
"prom-client": "^15.1.2",
|
68 |
"svelte": "^4.2.8",
|
69 |
"svelte-check": "^3.6.2",
|
70 |
"ts-node": "^10.9.1",
|
|
|
1266 |
"node": ">= 8"
|
1267 |
}
|
1268 |
},
|
1269 |
+
"node_modules/@opentelemetry/api": {
|
1270 |
+
"version": "1.8.0",
|
1271 |
+
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz",
|
1272 |
+
"integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==",
|
1273 |
+
"dev": true,
|
1274 |
+
"engines": {
|
1275 |
+
"node": ">=8.0.0"
|
1276 |
+
}
|
1277 |
+
},
|
1278 |
"node_modules/@polka/url": {
|
1279 |
"version": "1.0.0-next.21",
|
1280 |
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
|
|
|
1999 |
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
|
2000 |
"devOptional": true
|
2001 |
},
|
2002 |
+
"node_modules/@types/body-parser": {
|
2003 |
+
"version": "1.19.5",
|
2004 |
+
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
|
2005 |
+
"integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
|
2006 |
+
"dev": true,
|
2007 |
+
"dependencies": {
|
2008 |
+
"@types/connect": "*",
|
2009 |
+
"@types/node": "*"
|
2010 |
+
}
|
2011 |
+
},
|
2012 |
"node_modules/@types/chai": {
|
2013 |
"version": "4.3.5",
|
2014 |
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz",
|
|
|
2024 |
"@types/chai": "*"
|
2025 |
}
|
2026 |
},
|
2027 |
+
"node_modules/@types/connect": {
|
2028 |
+
"version": "3.4.38",
|
2029 |
+
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
|
2030 |
+
"integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
|
2031 |
+
"dev": true,
|
2032 |
+
"dependencies": {
|
2033 |
+
"@types/node": "*"
|
2034 |
+
}
|
2035 |
+
},
|
2036 |
"node_modules/@types/cookie": {
|
2037 |
"version": "0.5.1",
|
2038 |
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz",
|
|
|
2045 |
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
|
2046 |
"dev": true
|
2047 |
},
|
2048 |
+
"node_modules/@types/express": {
|
2049 |
+
"version": "4.17.21",
|
2050 |
+
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
|
2051 |
+
"integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
|
2052 |
+
"dev": true,
|
2053 |
+
"dependencies": {
|
2054 |
+
"@types/body-parser": "*",
|
2055 |
+
"@types/express-serve-static-core": "^4.17.33",
|
2056 |
+
"@types/qs": "*",
|
2057 |
+
"@types/serve-static": "*"
|
2058 |
+
}
|
2059 |
+
},
|
2060 |
+
"node_modules/@types/express-serve-static-core": {
|
2061 |
+
"version": "4.19.0",
|
2062 |
+
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz",
|
2063 |
+
"integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==",
|
2064 |
+
"dev": true,
|
2065 |
+
"dependencies": {
|
2066 |
+
"@types/node": "*",
|
2067 |
+
"@types/qs": "*",
|
2068 |
+
"@types/range-parser": "*",
|
2069 |
+
"@types/send": "*"
|
2070 |
+
}
|
2071 |
+
},
|
2072 |
+
"node_modules/@types/http-errors": {
|
2073 |
+
"version": "2.0.4",
|
2074 |
+
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
|
2075 |
+
"integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
|
2076 |
+
"dev": true
|
2077 |
+
},
|
2078 |
"node_modules/@types/jsdom": {
|
2079 |
"version": "21.1.1",
|
2080 |
"resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.1.tgz",
|
|
|
2102 |
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
|
2103 |
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
|
2104 |
},
|
2105 |
+
"node_modules/@types/mime": {
|
2106 |
+
"version": "1.3.5",
|
2107 |
+
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
|
2108 |
+
"integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
|
2109 |
+
"dev": true
|
2110 |
+
},
|
2111 |
"node_modules/@types/minimist": {
|
2112 |
"version": "1.2.5",
|
2113 |
"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
|
|
|
2153 |
"integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==",
|
2154 |
"dev": true
|
2155 |
},
|
2156 |
+
"node_modules/@types/qs": {
|
2157 |
+
"version": "6.9.15",
|
2158 |
+
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz",
|
2159 |
+
"integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==",
|
2160 |
+
"dev": true
|
2161 |
+
},
|
2162 |
+
"node_modules/@types/range-parser": {
|
2163 |
+
"version": "1.2.7",
|
2164 |
+
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
|
2165 |
+
"integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
|
2166 |
+
"dev": true
|
2167 |
+
},
|
2168 |
"node_modules/@types/resolve": {
|
2169 |
"version": "1.20.2",
|
2170 |
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
|
|
|
2177 |
"integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==",
|
2178 |
"dev": true
|
2179 |
},
|
2180 |
+
"node_modules/@types/send": {
|
2181 |
+
"version": "0.17.4",
|
2182 |
+
"resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
|
2183 |
+
"integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
|
2184 |
+
"dev": true,
|
2185 |
+
"dependencies": {
|
2186 |
+
"@types/mime": "^1",
|
2187 |
+
"@types/node": "*"
|
2188 |
+
}
|
2189 |
+
},
|
2190 |
+
"node_modules/@types/serve-static": {
|
2191 |
+
"version": "1.15.7",
|
2192 |
+
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
|
2193 |
+
"integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
|
2194 |
+
"dev": true,
|
2195 |
+
"dependencies": {
|
2196 |
+
"@types/http-errors": "*",
|
2197 |
+
"@types/node": "*",
|
2198 |
+
"@types/send": "*"
|
2199 |
+
}
|
2200 |
+
},
|
2201 |
"node_modules/@types/tough-cookie": {
|
2202 |
"version": "4.0.2",
|
2203 |
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz",
|
|
|
2560 |
"node": ">=6.5"
|
2561 |
}
|
2562 |
},
|
2563 |
+
"node_modules/accepts": {
|
2564 |
+
"version": "1.3.8",
|
2565 |
+
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
|
2566 |
+
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
|
2567 |
+
"dependencies": {
|
2568 |
+
"mime-types": "~2.1.34",
|
2569 |
+
"negotiator": "0.6.3"
|
2570 |
+
},
|
2571 |
+
"engines": {
|
2572 |
+
"node": ">= 0.6"
|
2573 |
+
}
|
2574 |
+
},
|
2575 |
"node_modules/acorn": {
|
2576 |
"version": "8.11.3",
|
2577 |
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
|
|
|
2702 |
"dequal": "^2.0.3"
|
2703 |
}
|
2704 |
},
|
2705 |
+
"node_modules/array-flatten": {
|
2706 |
+
"version": "1.1.1",
|
2707 |
+
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
2708 |
+
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
|
2709 |
+
},
|
2710 |
"node_modules/array-union": {
|
2711 |
"version": "2.1.0",
|
2712 |
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
|
|
|
2843 |
"integrity": "sha512-u4cBQNepWxYA55FunZSM7wMi55yQaN0otnhhilNoWHq0MfOfJeQx0v0mRRpolGOExPjZcl6FtB0BB8Xkb88F0g==",
|
2844 |
"optional": true
|
2845 |
},
|
2846 |
+
"node_modules/bintrees": {
|
2847 |
+
"version": "1.0.2",
|
2848 |
+
"resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz",
|
2849 |
+
"integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==",
|
2850 |
+
"dev": true
|
2851 |
+
},
|
2852 |
"node_modules/bl": {
|
2853 |
"version": "4.1.0",
|
2854 |
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
|
|
|
2865 |
"integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==",
|
2866 |
"dev": true
|
2867 |
},
|
2868 |
+
"node_modules/body-parser": {
|
2869 |
+
"version": "1.20.2",
|
2870 |
+
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
|
2871 |
+
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
|
2872 |
+
"dependencies": {
|
2873 |
+
"bytes": "3.1.2",
|
2874 |
+
"content-type": "~1.0.5",
|
2875 |
+
"debug": "2.6.9",
|
2876 |
+
"depd": "2.0.0",
|
2877 |
+
"destroy": "1.2.0",
|
2878 |
+
"http-errors": "2.0.0",
|
2879 |
+
"iconv-lite": "0.4.24",
|
2880 |
+
"on-finished": "2.4.1",
|
2881 |
+
"qs": "6.11.0",
|
2882 |
+
"raw-body": "2.5.2",
|
2883 |
+
"type-is": "~1.6.18",
|
2884 |
+
"unpipe": "1.0.0"
|
2885 |
+
},
|
2886 |
+
"engines": {
|
2887 |
+
"node": ">= 0.8",
|
2888 |
+
"npm": "1.2.8000 || >= 1.4.16"
|
2889 |
+
}
|
2890 |
+
},
|
2891 |
+
"node_modules/body-parser/node_modules/debug": {
|
2892 |
+
"version": "2.6.9",
|
2893 |
+
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
2894 |
+
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
2895 |
+
"dependencies": {
|
2896 |
+
"ms": "2.0.0"
|
2897 |
+
}
|
2898 |
+
},
|
2899 |
+
"node_modules/body-parser/node_modules/iconv-lite": {
|
2900 |
+
"version": "0.4.24",
|
2901 |
+
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
2902 |
+
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
2903 |
+
"dependencies": {
|
2904 |
+
"safer-buffer": ">= 2.1.2 < 3"
|
2905 |
+
},
|
2906 |
+
"engines": {
|
2907 |
+
"node": ">=0.10.0"
|
2908 |
+
}
|
2909 |
+
},
|
2910 |
+
"node_modules/body-parser/node_modules/ms": {
|
2911 |
+
"version": "2.0.0",
|
2912 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
2913 |
+
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
2914 |
+
},
|
2915 |
+
"node_modules/body-parser/node_modules/qs": {
|
2916 |
+
"version": "6.11.0",
|
2917 |
+
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
|
2918 |
+
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
|
2919 |
+
"dependencies": {
|
2920 |
+
"side-channel": "^1.0.4"
|
2921 |
+
},
|
2922 |
+
"engines": {
|
2923 |
+
"node": ">=0.6"
|
2924 |
+
},
|
2925 |
+
"funding": {
|
2926 |
+
"url": "https://github.com/sponsors/ljharb"
|
2927 |
+
}
|
2928 |
+
},
|
2929 |
"node_modules/brace-expansion": {
|
2930 |
"version": "1.1.11",
|
2931 |
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
|
|
3058 |
"url": "https://github.com/sponsors/sindresorhus"
|
3059 |
}
|
3060 |
},
|
3061 |
+
"node_modules/bytes": {
|
3062 |
+
"version": "3.1.2",
|
3063 |
+
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
3064 |
+
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
|
3065 |
+
"engines": {
|
3066 |
+
"node": ">= 0.8"
|
3067 |
+
}
|
3068 |
+
},
|
3069 |
"node_modules/cac": {
|
3070 |
"version": "6.7.14",
|
3071 |
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
|
|
|
3079 |
"version": "1.0.7",
|
3080 |
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
3081 |
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
|
|
3082 |
"dependencies": {
|
3083 |
"es-define-property": "^1.0.0",
|
3084 |
"es-errors": "^1.3.0",
|
|
|
3357 |
"node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14"
|
3358 |
}
|
3359 |
},
|
3360 |
+
"node_modules/content-disposition": {
|
3361 |
+
"version": "0.5.4",
|
3362 |
+
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
|
3363 |
+
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
|
3364 |
+
"dependencies": {
|
3365 |
+
"safe-buffer": "5.2.1"
|
3366 |
+
},
|
3367 |
+
"engines": {
|
3368 |
+
"node": ">= 0.6"
|
3369 |
+
}
|
3370 |
+
},
|
3371 |
+
"node_modules/content-type": {
|
3372 |
+
"version": "1.0.5",
|
3373 |
+
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
|
3374 |
+
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
|
3375 |
+
"engines": {
|
3376 |
+
"node": ">= 0.6"
|
3377 |
+
}
|
3378 |
+
},
|
3379 |
"node_modules/cookie": {
|
3380 |
"version": "0.5.0",
|
3381 |
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
|
|
|
3385 |
"node": ">= 0.6"
|
3386 |
}
|
3387 |
},
|
3388 |
+
"node_modules/cookie-signature": {
|
3389 |
+
"version": "1.0.6",
|
3390 |
+
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
3391 |
+
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
|
3392 |
+
},
|
3393 |
"node_modules/create-require": {
|
3394 |
"version": "1.1.1",
|
3395 |
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
|
|
|
3624 |
"version": "1.1.4",
|
3625 |
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
3626 |
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
|
|
3627 |
"dependencies": {
|
3628 |
"es-define-property": "^1.0.0",
|
3629 |
"es-errors": "^1.3.0",
|
|
|
3644 |
"node": ">=0.4.0"
|
3645 |
}
|
3646 |
},
|
3647 |
+
"node_modules/depd": {
|
3648 |
+
"version": "2.0.0",
|
3649 |
+
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
3650 |
+
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
|
3651 |
+
"engines": {
|
3652 |
+
"node": ">= 0.8"
|
3653 |
+
}
|
3654 |
+
},
|
3655 |
"node_modules/dequal": {
|
3656 |
"version": "2.0.3",
|
3657 |
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
|
|
|
3661 |
"node": ">=6"
|
3662 |
}
|
3663 |
},
|
3664 |
+
"node_modules/destroy": {
|
3665 |
+
"version": "1.2.0",
|
3666 |
+
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
|
3667 |
+
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
|
3668 |
+
"engines": {
|
3669 |
+
"node": ">= 0.8",
|
3670 |
+
"npm": "1.2.8000 || >= 1.4.16"
|
3671 |
+
}
|
3672 |
+
},
|
3673 |
"node_modules/detect-indent": {
|
3674 |
"version": "6.1.0",
|
3675 |
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
|
|
|
3774 |
"safe-buffer": "^5.0.1"
|
3775 |
}
|
3776 |
},
|
3777 |
+
"node_modules/ee-first": {
|
3778 |
+
"version": "1.1.1",
|
3779 |
+
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
3780 |
+
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
|
3781 |
+
},
|
3782 |
"node_modules/electron-to-chromium": {
|
3783 |
"version": "1.4.359",
|
3784 |
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.359.tgz",
|
|
|
3789 |
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
|
3790 |
"integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="
|
3791 |
},
|
3792 |
+
"node_modules/encodeurl": {
|
3793 |
+
"version": "1.0.2",
|
3794 |
+
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
3795 |
+
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
|
3796 |
+
"engines": {
|
3797 |
+
"node": ">= 0.8"
|
3798 |
+
}
|
3799 |
+
},
|
3800 |
"node_modules/end-of-stream": {
|
3801 |
"version": "1.4.4",
|
3802 |
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
|
|
3820 |
"version": "1.0.0",
|
3821 |
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
3822 |
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
|
|
3823 |
"dependencies": {
|
3824 |
"get-intrinsic": "^1.2.4"
|
3825 |
},
|
|
|
3831 |
"version": "1.3.0",
|
3832 |
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
3833 |
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
|
|
3834 |
"engines": {
|
3835 |
"node": ">= 0.4"
|
3836 |
}
|
|
|
4120 |
"node": ">=0.10.0"
|
4121 |
}
|
4122 |
},
|
4123 |
+
"node_modules/etag": {
|
4124 |
+
"version": "1.8.1",
|
4125 |
+
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
4126 |
+
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
|
4127 |
+
"engines": {
|
4128 |
+
"node": ">= 0.6"
|
4129 |
+
}
|
4130 |
+
},
|
4131 |
"node_modules/event-target-shim": {
|
4132 |
"version": "5.0.1",
|
4133 |
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
|
|
4175 |
"node": ">=6"
|
4176 |
}
|
4177 |
},
|
4178 |
+
"node_modules/express": {
|
4179 |
+
"version": "4.19.2",
|
4180 |
+
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
|
4181 |
+
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
|
4182 |
+
"dependencies": {
|
4183 |
+
"accepts": "~1.3.8",
|
4184 |
+
"array-flatten": "1.1.1",
|
4185 |
+
"body-parser": "1.20.2",
|
4186 |
+
"content-disposition": "0.5.4",
|
4187 |
+
"content-type": "~1.0.4",
|
4188 |
+
"cookie": "0.6.0",
|
4189 |
+
"cookie-signature": "1.0.6",
|
4190 |
+
"debug": "2.6.9",
|
4191 |
+
"depd": "2.0.0",
|
4192 |
+
"encodeurl": "~1.0.2",
|
4193 |
+
"escape-html": "~1.0.3",
|
4194 |
+
"etag": "~1.8.1",
|
4195 |
+
"finalhandler": "1.2.0",
|
4196 |
+
"fresh": "0.5.2",
|
4197 |
+
"http-errors": "2.0.0",
|
4198 |
+
"merge-descriptors": "1.0.1",
|
4199 |
+
"methods": "~1.1.2",
|
4200 |
+
"on-finished": "2.4.1",
|
4201 |
+
"parseurl": "~1.3.3",
|
4202 |
+
"path-to-regexp": "0.1.7",
|
4203 |
+
"proxy-addr": "~2.0.7",
|
4204 |
+
"qs": "6.11.0",
|
4205 |
+
"range-parser": "~1.2.1",
|
4206 |
+
"safe-buffer": "5.2.1",
|
4207 |
+
"send": "0.18.0",
|
4208 |
+
"serve-static": "1.15.0",
|
4209 |
+
"setprototypeof": "1.2.0",
|
4210 |
+
"statuses": "2.0.1",
|
4211 |
+
"type-is": "~1.6.18",
|
4212 |
+
"utils-merge": "1.0.1",
|
4213 |
+
"vary": "~1.1.2"
|
4214 |
+
},
|
4215 |
+
"engines": {
|
4216 |
+
"node": ">= 0.10.0"
|
4217 |
+
}
|
4218 |
+
},
|
4219 |
+
"node_modules/express/node_modules/cookie": {
|
4220 |
+
"version": "0.6.0",
|
4221 |
+
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
|
4222 |
+
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
|
4223 |
+
"engines": {
|
4224 |
+
"node": ">= 0.6"
|
4225 |
+
}
|
4226 |
+
},
|
4227 |
+
"node_modules/express/node_modules/debug": {
|
4228 |
+
"version": "2.6.9",
|
4229 |
+
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
4230 |
+
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
4231 |
+
"dependencies": {
|
4232 |
+
"ms": "2.0.0"
|
4233 |
+
}
|
4234 |
+
},
|
4235 |
+
"node_modules/express/node_modules/ms": {
|
4236 |
+
"version": "2.0.0",
|
4237 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
4238 |
+
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
4239 |
+
},
|
4240 |
+
"node_modules/express/node_modules/qs": {
|
4241 |
+
"version": "6.11.0",
|
4242 |
+
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
|
4243 |
+
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
|
4244 |
+
"dependencies": {
|
4245 |
+
"side-channel": "^1.0.4"
|
4246 |
+
},
|
4247 |
+
"engines": {
|
4248 |
+
"node": ">=0.6"
|
4249 |
+
},
|
4250 |
+
"funding": {
|
4251 |
+
"url": "https://github.com/sponsors/ljharb"
|
4252 |
+
}
|
4253 |
+
},
|
4254 |
"node_modules/extend": {
|
4255 |
"version": "3.0.2",
|
4256 |
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
|
|
4366 |
"node": ">=8"
|
4367 |
}
|
4368 |
},
|
4369 |
+
"node_modules/finalhandler": {
|
4370 |
+
"version": "1.2.0",
|
4371 |
+
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
|
4372 |
+
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
|
4373 |
+
"dependencies": {
|
4374 |
+
"debug": "2.6.9",
|
4375 |
+
"encodeurl": "~1.0.2",
|
4376 |
+
"escape-html": "~1.0.3",
|
4377 |
+
"on-finished": "2.4.1",
|
4378 |
+
"parseurl": "~1.3.3",
|
4379 |
+
"statuses": "2.0.1",
|
4380 |
+
"unpipe": "~1.0.0"
|
4381 |
+
},
|
4382 |
+
"engines": {
|
4383 |
+
"node": ">= 0.8"
|
4384 |
+
}
|
4385 |
+
},
|
4386 |
+
"node_modules/finalhandler/node_modules/debug": {
|
4387 |
+
"version": "2.6.9",
|
4388 |
+
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
4389 |
+
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
4390 |
+
"dependencies": {
|
4391 |
+
"ms": "2.0.0"
|
4392 |
+
}
|
4393 |
+
},
|
4394 |
+
"node_modules/finalhandler/node_modules/ms": {
|
4395 |
+
"version": "2.0.0",
|
4396 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
4397 |
+
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
4398 |
+
},
|
4399 |
"node_modules/find-up": {
|
4400 |
"version": "5.0.0",
|
4401 |
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
|
|
|
4468 |
"node": ">= 12.20"
|
4469 |
}
|
4470 |
},
|
4471 |
+
"node_modules/forwarded": {
|
4472 |
+
"version": "0.2.0",
|
4473 |
+
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
4474 |
+
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
|
4475 |
+
"engines": {
|
4476 |
+
"node": ">= 0.6"
|
4477 |
+
}
|
4478 |
+
},
|
4479 |
"node_modules/fraction.js": {
|
4480 |
"version": "4.2.0",
|
4481 |
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
|
|
|
4488 |
"url": "https://www.patreon.com/infusion"
|
4489 |
}
|
4490 |
},
|
4491 |
+
"node_modules/fresh": {
|
4492 |
+
"version": "0.5.2",
|
4493 |
+
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
4494 |
+
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
|
4495 |
+
"engines": {
|
4496 |
+
"node": ">= 0.6"
|
4497 |
+
}
|
4498 |
+
},
|
4499 |
"node_modules/fs-constants": {
|
4500 |
"version": "1.0.0",
|
4501 |
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
|
|
4593 |
"version": "1.2.4",
|
4594 |
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
4595 |
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
|
|
4596 |
"dependencies": {
|
4597 |
"es-errors": "^1.3.0",
|
4598 |
"function-bind": "^1.1.2",
|
|
|
4723 |
"version": "1.0.1",
|
4724 |
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
4725 |
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
|
|
4726 |
"dependencies": {
|
4727 |
"get-intrinsic": "^1.1.3"
|
4728 |
},
|
|
|
4799 |
"version": "1.0.2",
|
4800 |
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
4801 |
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
|
|
4802 |
"dependencies": {
|
4803 |
"es-define-property": "^1.0.0"
|
4804 |
},
|
|
|
4810 |
"version": "1.0.3",
|
4811 |
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
4812 |
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
|
|
|
4813 |
"engines": {
|
4814 |
"node": ">= 0.4"
|
4815 |
},
|
|
|
4821 |
"version": "1.0.3",
|
4822 |
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
|
4823 |
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
|
|
|
4824 |
"engines": {
|
4825 |
"node": ">= 0.4"
|
4826 |
},
|
|
|
4879 |
"node": ">=12"
|
4880 |
}
|
4881 |
},
|
4882 |
+
"node_modules/http-errors": {
|
4883 |
+
"version": "2.0.0",
|
4884 |
+
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
|
4885 |
+
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
|
4886 |
+
"dependencies": {
|
4887 |
+
"depd": "2.0.0",
|
4888 |
+
"inherits": "2.0.4",
|
4889 |
+
"setprototypeof": "1.2.0",
|
4890 |
+
"statuses": "2.0.1",
|
4891 |
+
"toidentifier": "1.0.1"
|
4892 |
+
},
|
4893 |
+
"engines": {
|
4894 |
+
"node": ">= 0.8"
|
4895 |
+
}
|
4896 |
+
},
|
4897 |
"node_modules/http-proxy-agent": {
|
4898 |
"version": "5.0.0",
|
4899 |
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
|
|
|
5051 |
"node": ">= 12"
|
5052 |
}
|
5053 |
},
|
5054 |
+
"node_modules/ipaddr.js": {
|
5055 |
+
"version": "1.9.1",
|
5056 |
+
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
5057 |
+
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
|
5058 |
+
"engines": {
|
5059 |
+
"node": ">= 0.10"
|
5060 |
+
}
|
5061 |
+
},
|
5062 |
"node_modules/is-arrayish": {
|
5063 |
"version": "0.3.2",
|
5064 |
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
|
|
|
5621 |
"integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
|
5622 |
"dev": true
|
5623 |
},
|
5624 |
+
"node_modules/media-typer": {
|
5625 |
+
"version": "0.3.0",
|
5626 |
+
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
5627 |
+
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
|
5628 |
+
"engines": {
|
5629 |
+
"node": ">= 0.6"
|
5630 |
+
}
|
5631 |
+
},
|
5632 |
"node_modules/memory-pager": {
|
5633 |
"version": "1.5.0",
|
5634 |
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
|
5635 |
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
|
5636 |
},
|
5637 |
+
"node_modules/merge-descriptors": {
|
5638 |
+
"version": "1.0.1",
|
5639 |
+
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
5640 |
+
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
|
5641 |
+
},
|
5642 |
"node_modules/merge-stream": {
|
5643 |
"version": "2.0.0",
|
5644 |
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
|
|
5653 |
"node": ">= 8"
|
5654 |
}
|
5655 |
},
|
5656 |
+
"node_modules/methods": {
|
5657 |
+
"version": "1.1.2",
|
5658 |
+
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
5659 |
+
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
|
5660 |
+
"engines": {
|
5661 |
+
"node": ">= 0.6"
|
5662 |
+
}
|
5663 |
+
},
|
5664 |
"node_modules/micromatch": {
|
5665 |
"version": "4.0.5",
|
5666 |
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
|
|
|
5673 |
"node": ">=8.6"
|
5674 |
}
|
5675 |
},
|
5676 |
+
"node_modules/mime": {
|
5677 |
+
"version": "1.6.0",
|
5678 |
+
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
5679 |
+
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
|
5680 |
+
"bin": {
|
5681 |
+
"mime": "cli.js"
|
5682 |
+
},
|
5683 |
+
"engines": {
|
5684 |
+
"node": ">=4"
|
5685 |
+
}
|
5686 |
+
},
|
5687 |
"node_modules/mime-db": {
|
5688 |
"version": "1.52.0",
|
5689 |
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
|
|
5890 |
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
|
5891 |
"dev": true
|
5892 |
},
|
5893 |
+
"node_modules/negotiator": {
|
5894 |
+
"version": "0.6.3",
|
5895 |
+
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
|
5896 |
+
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
|
5897 |
+
"engines": {
|
5898 |
+
"node": ">= 0.6"
|
5899 |
+
}
|
5900 |
+
},
|
5901 |
"node_modules/neo-async": {
|
5902 |
"version": "2.6.2",
|
5903 |
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
|
|
|
6055 |
"version": "1.13.1",
|
6056 |
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
6057 |
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
|
|
6058 |
"funding": {
|
6059 |
"url": "https://github.com/sponsors/ljharb"
|
6060 |
}
|
|
|
6083 |
"node": ">=14.0.0"
|
6084 |
}
|
6085 |
},
|
6086 |
+
"node_modules/on-finished": {
|
6087 |
+
"version": "2.4.1",
|
6088 |
+
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
|
6089 |
+
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
|
6090 |
+
"dependencies": {
|
6091 |
+
"ee-first": "1.1.1"
|
6092 |
+
},
|
6093 |
+
"engines": {
|
6094 |
+
"node": ">= 0.8"
|
6095 |
+
}
|
6096 |
+
},
|
6097 |
"node_modules/once": {
|
6098 |
"version": "1.4.0",
|
6099 |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
|
|
6320 |
"url": "https://github.com/inikulin/parse5?sponsor=1"
|
6321 |
}
|
6322 |
},
|
6323 |
+
"node_modules/parseurl": {
|
6324 |
+
"version": "1.3.3",
|
6325 |
+
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
6326 |
+
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
|
6327 |
+
"engines": {
|
6328 |
+
"node": ">= 0.8"
|
6329 |
+
}
|
6330 |
+
},
|
6331 |
"node_modules/path-exists": {
|
6332 |
"version": "4.0.0",
|
6333 |
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
|
|
6359 |
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
6360 |
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
6361 |
},
|
6362 |
+
"node_modules/path-to-regexp": {
|
6363 |
+
"version": "0.1.7",
|
6364 |
+
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
6365 |
+
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
|
6366 |
+
},
|
6367 |
"node_modules/path-type": {
|
6368 |
"version": "4.0.0",
|
6369 |
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
|
|
|
6982 |
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz",
|
6983 |
"integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="
|
6984 |
},
|
6985 |
+
"node_modules/prom-client": {
|
6986 |
+
"version": "15.1.2",
|
6987 |
+
"resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.2.tgz",
|
6988 |
+
"integrity": "sha512-on3h1iXb04QFLLThrmVYg1SChBQ9N1c+nKAjebBjokBqipddH3uxmOUcEkTnzmJ8Jh/5TSUnUqS40i2QB2dJHQ==",
|
6989 |
+
"dev": true,
|
6990 |
+
"dependencies": {
|
6991 |
+
"@opentelemetry/api": "^1.4.0",
|
6992 |
+
"tdigest": "^0.1.1"
|
6993 |
+
},
|
6994 |
+
"engines": {
|
6995 |
+
"node": "^16 || ^18 || >=20"
|
6996 |
+
}
|
6997 |
+
},
|
6998 |
"node_modules/protobufjs": {
|
6999 |
"version": "6.11.4",
|
7000 |
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz",
|
|
|
7020 |
"pbts": "bin/pbts"
|
7021 |
}
|
7022 |
},
|
7023 |
+
"node_modules/proxy-addr": {
|
7024 |
+
"version": "2.0.7",
|
7025 |
+
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
|
7026 |
+
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
|
7027 |
+
"dependencies": {
|
7028 |
+
"forwarded": "0.2.0",
|
7029 |
+
"ipaddr.js": "1.9.1"
|
7030 |
+
},
|
7031 |
+
"engines": {
|
7032 |
+
"node": ">= 0.10"
|
7033 |
+
}
|
7034 |
+
},
|
7035 |
"node_modules/psl": {
|
7036 |
"version": "1.9.0",
|
7037 |
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
|
|
|
7120 |
"resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
|
7121 |
"integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="
|
7122 |
},
|
7123 |
+
"node_modules/range-parser": {
|
7124 |
+
"version": "1.2.1",
|
7125 |
+
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
7126 |
+
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
|
7127 |
+
"engines": {
|
7128 |
+
"node": ">= 0.6"
|
7129 |
+
}
|
7130 |
+
},
|
7131 |
+
"node_modules/raw-body": {
|
7132 |
+
"version": "2.5.2",
|
7133 |
+
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
|
7134 |
+
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
|
7135 |
+
"dependencies": {
|
7136 |
+
"bytes": "3.1.2",
|
7137 |
+
"http-errors": "2.0.0",
|
7138 |
+
"iconv-lite": "0.4.24",
|
7139 |
+
"unpipe": "1.0.0"
|
7140 |
+
},
|
7141 |
+
"engines": {
|
7142 |
+
"node": ">= 0.8"
|
7143 |
+
}
|
7144 |
+
},
|
7145 |
+
"node_modules/raw-body/node_modules/iconv-lite": {
|
7146 |
+
"version": "0.4.24",
|
7147 |
+
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
7148 |
+
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
7149 |
+
"dependencies": {
|
7150 |
+
"safer-buffer": ">= 2.1.2 < 3"
|
7151 |
+
},
|
7152 |
+
"engines": {
|
7153 |
+
"node": ">=0.10.0"
|
7154 |
+
}
|
7155 |
+
},
|
7156 |
"node_modules/rc": {
|
7157 |
"version": "1.2.8",
|
7158 |
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
|
|
|
7455 |
"node": ">=10"
|
7456 |
}
|
7457 |
},
|
7458 |
+
"node_modules/send": {
|
7459 |
+
"version": "0.18.0",
|
7460 |
+
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
|
7461 |
+
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
|
7462 |
+
"dependencies": {
|
7463 |
+
"debug": "2.6.9",
|
7464 |
+
"depd": "2.0.0",
|
7465 |
+
"destroy": "1.2.0",
|
7466 |
+
"encodeurl": "~1.0.2",
|
7467 |
+
"escape-html": "~1.0.3",
|
7468 |
+
"etag": "~1.8.1",
|
7469 |
+
"fresh": "0.5.2",
|
7470 |
+
"http-errors": "2.0.0",
|
7471 |
+
"mime": "1.6.0",
|
7472 |
+
"ms": "2.1.3",
|
7473 |
+
"on-finished": "2.4.1",
|
7474 |
+
"range-parser": "~1.2.1",
|
7475 |
+
"statuses": "2.0.1"
|
7476 |
+
},
|
7477 |
+
"engines": {
|
7478 |
+
"node": ">= 0.8.0"
|
7479 |
+
}
|
7480 |
+
},
|
7481 |
+
"node_modules/send/node_modules/debug": {
|
7482 |
+
"version": "2.6.9",
|
7483 |
+
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
7484 |
+
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
7485 |
+
"dependencies": {
|
7486 |
+
"ms": "2.0.0"
|
7487 |
+
}
|
7488 |
+
},
|
7489 |
+
"node_modules/send/node_modules/debug/node_modules/ms": {
|
7490 |
+
"version": "2.0.0",
|
7491 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
7492 |
+
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
7493 |
+
},
|
7494 |
+
"node_modules/send/node_modules/ms": {
|
7495 |
+
"version": "2.1.3",
|
7496 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
7497 |
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
7498 |
+
},
|
7499 |
"node_modules/serpapi": {
|
7500 |
"version": "1.1.1",
|
7501 |
"resolved": "https://registry.npmjs.org/serpapi/-/serpapi-1.1.1.tgz",
|
|
|
7504 |
"undici": "^5.12.0"
|
7505 |
}
|
7506 |
},
|
7507 |
+
"node_modules/serve-static": {
|
7508 |
+
"version": "1.15.0",
|
7509 |
+
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
7510 |
+
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
|
7511 |
+
"dependencies": {
|
7512 |
+
"encodeurl": "~1.0.2",
|
7513 |
+
"escape-html": "~1.0.3",
|
7514 |
+
"parseurl": "~1.3.3",
|
7515 |
+
"send": "0.18.0"
|
7516 |
+
},
|
7517 |
+
"engines": {
|
7518 |
+
"node": ">= 0.8.0"
|
7519 |
+
}
|
7520 |
+
},
|
7521 |
"node_modules/set-cookie-parser": {
|
7522 |
"version": "2.6.0",
|
7523 |
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz",
|
|
|
7528 |
"version": "1.2.2",
|
7529 |
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
7530 |
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
|
|
|
7531 |
"dependencies": {
|
7532 |
"define-data-property": "^1.1.4",
|
7533 |
"es-errors": "^1.3.0",
|
|
|
7540 |
"node": ">= 0.4"
|
7541 |
}
|
7542 |
},
|
7543 |
+
"node_modules/setprototypeof": {
|
7544 |
+
"version": "1.2.0",
|
7545 |
+
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
|
7546 |
+
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
|
7547 |
+
},
|
7548 |
"node_modules/sharp": {
|
7549 |
"version": "0.33.2",
|
7550 |
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.2.tgz",
|
|
|
7609 |
"version": "1.0.6",
|
7610 |
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
|
7611 |
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
|
|
|
7612 |
"dependencies": {
|
7613 |
"call-bind": "^1.0.7",
|
7614 |
"es-errors": "^1.3.0",
|
|
|
7801 |
"integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
|
7802 |
"dev": true
|
7803 |
},
|
7804 |
+
"node_modules/statuses": {
|
7805 |
+
"version": "2.0.1",
|
7806 |
+
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
7807 |
+
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
|
7808 |
+
"engines": {
|
7809 |
+
"node": ">= 0.8"
|
7810 |
+
}
|
7811 |
+
},
|
7812 |
"node_modules/std-env": {
|
7813 |
"version": "3.3.3",
|
7814 |
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz",
|
|
|
8280 |
"streamx": "^2.15.0"
|
8281 |
}
|
8282 |
},
|
8283 |
+
"node_modules/tdigest": {
|
8284 |
+
"version": "0.1.2",
|
8285 |
+
"resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz",
|
8286 |
+
"integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==",
|
8287 |
+
"dev": true,
|
8288 |
+
"dependencies": {
|
8289 |
+
"bintrees": "1.0.2"
|
8290 |
+
}
|
8291 |
+
},
|
8292 |
"node_modules/text-table": {
|
8293 |
"version": "0.2.0",
|
8294 |
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
|
|
8394 |
"node": ">=8.0"
|
8395 |
}
|
8396 |
},
|
8397 |
+
"node_modules/toidentifier": {
|
8398 |
+
"version": "1.0.1",
|
8399 |
+
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
8400 |
+
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
|
8401 |
+
"engines": {
|
8402 |
+
"node": ">=0.6"
|
8403 |
+
}
|
8404 |
+
},
|
8405 |
"node_modules/totalist": {
|
8406 |
"version": "3.0.0",
|
8407 |
"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz",
|
|
|
8552 |
"url": "https://github.com/sponsors/sindresorhus"
|
8553 |
}
|
8554 |
},
|
8555 |
+
"node_modules/type-is": {
|
8556 |
+
"version": "1.6.18",
|
8557 |
+
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
8558 |
+
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
8559 |
+
"dependencies": {
|
8560 |
+
"media-typer": "0.3.0",
|
8561 |
+
"mime-types": "~2.1.24"
|
8562 |
+
},
|
8563 |
+
"engines": {
|
8564 |
+
"node": ">= 0.6"
|
8565 |
+
}
|
8566 |
+
},
|
8567 |
"node_modules/typescript": {
|
8568 |
"version": "5.2.2",
|
8569 |
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
|
|
|
8628 |
"node": ">= 4.0.0"
|
8629 |
}
|
8630 |
},
|
8631 |
+
"node_modules/unpipe": {
|
8632 |
+
"version": "1.0.0",
|
8633 |
+
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
8634 |
+
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
|
8635 |
+
"engines": {
|
8636 |
+
"node": ">= 0.8"
|
8637 |
+
}
|
8638 |
+
},
|
8639 |
"node_modules/unplugin": {
|
8640 |
"version": "1.3.1",
|
8641 |
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.3.1.tgz",
|
|
|
8740 |
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
8741 |
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
8742 |
},
|
8743 |
+
"node_modules/utils-merge": {
|
8744 |
+
"version": "1.0.1",
|
8745 |
+
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
8746 |
+
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
|
8747 |
+
"engines": {
|
8748 |
+
"node": ">= 0.4.0"
|
8749 |
+
}
|
8750 |
+
},
|
8751 |
"node_modules/uuid": {
|
8752 |
"version": "9.0.1",
|
8753 |
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
|
|
|
8771 |
"resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
|
8772 |
"integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow=="
|
8773 |
},
|
8774 |
+
"node_modules/vary": {
|
8775 |
+
"version": "1.1.2",
|
8776 |
+
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
8777 |
+
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
|
8778 |
+
"engines": {
|
8779 |
+
"node": ">= 0.8"
|
8780 |
+
}
|
8781 |
+
},
|
8782 |
"node_modules/vite": {
|
8783 |
"version": "4.5.3",
|
8784 |
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz",
|
@@ -23,6 +23,7 @@
|
|
23 |
"@sveltejs/adapter-node": "^1.3.1",
|
24 |
"@sveltejs/kit": "^1.30.4",
|
25 |
"@tailwindcss/typography": "^0.5.9",
|
|
|
26 |
"@types/jsdom": "^21.1.1",
|
27 |
"@types/minimist": "^1.2.5",
|
28 |
"@types/parquetjs": "^0.10.3",
|
@@ -36,6 +37,7 @@
|
|
36 |
"prettier": "^2.8.0",
|
37 |
"prettier-plugin-svelte": "^2.10.1",
|
38 |
"prettier-plugin-tailwindcss": "^0.2.7",
|
|
|
39 |
"svelte": "^4.2.8",
|
40 |
"svelte-check": "^3.6.2",
|
41 |
"ts-node": "^10.9.1",
|
@@ -57,6 +59,7 @@
|
|
57 |
"browser-image-resizer": "^2.4.1",
|
58 |
"date-fns": "^2.29.3",
|
59 |
"dotenv": "^16.0.3",
|
|
|
60 |
"handlebars": "^4.7.8",
|
61 |
"highlight.js": "^11.7.0",
|
62 |
"image-size": "^1.0.2",
|
|
|
23 |
"@sveltejs/adapter-node": "^1.3.1",
|
24 |
"@sveltejs/kit": "^1.30.4",
|
25 |
"@tailwindcss/typography": "^0.5.9",
|
26 |
+
"@types/express": "^4.17.21",
|
27 |
"@types/jsdom": "^21.1.1",
|
28 |
"@types/minimist": "^1.2.5",
|
29 |
"@types/parquetjs": "^0.10.3",
|
|
|
37 |
"prettier": "^2.8.0",
|
38 |
"prettier-plugin-svelte": "^2.10.1",
|
39 |
"prettier-plugin-tailwindcss": "^0.2.7",
|
40 |
+
"prom-client": "^15.1.2",
|
41 |
"svelte": "^4.2.8",
|
42 |
"svelte-check": "^3.6.2",
|
43 |
"ts-node": "^10.9.1",
|
|
|
59 |
"browser-image-resizer": "^2.4.1",
|
60 |
"date-fns": "^2.29.3",
|
61 |
"dotenv": "^16.0.3",
|
62 |
+
"express": "^4.19.2",
|
63 |
"handlebars": "^4.7.8",
|
64 |
"highlight.js": "^11.7.0",
|
65 |
"image-size": "^1.0.2",
|
@@ -2,12 +2,13 @@ import readline from "readline";
|
|
2 |
import minimist from "minimist";
|
3 |
|
4 |
// @ts-expect-error: vite-node makes the var available but the typescript compiler doesn't see them
|
5 |
-
import {
|
6 |
|
7 |
import { faker } from "@faker-js/faker";
|
8 |
import { ObjectId } from "mongodb";
|
9 |
|
10 |
-
|
|
|
11 |
import { models } from "../src/lib/server/models.ts";
|
12 |
import type { User } from "../src/lib/types/User";
|
13 |
import type { Assistant } from "../src/lib/types/Assistant";
|
@@ -17,6 +18,7 @@ import { defaultEmbeddingModel } from "../src/lib/server/embeddingModels.ts";
|
|
17 |
import { Message } from "../src/lib/types/Message.ts";
|
18 |
|
19 |
import { addChildren } from "../src/lib/utils/tree/addChildren.ts";
|
|
|
20 |
|
21 |
const rl = readline.createInterface({
|
22 |
input: process.stdin,
|
@@ -158,10 +160,11 @@ async function seed() {
|
|
158 |
console.log("Creating assistants for all users");
|
159 |
await Promise.all(
|
160 |
users.map(async (user) => {
|
|
|
161 |
const assistants = faker.helpers.multiple<Assistant>(
|
162 |
() => ({
|
163 |
_id: new ObjectId(),
|
164 |
-
name
|
165 |
createdById: user._id,
|
166 |
createdByName: user.username,
|
167 |
createdAt: faker.date.recent({ days: 30 }),
|
@@ -174,6 +177,8 @@ async function seed() {
|
|
174 |
exampleInputs: faker.helpers.multiple(() => faker.lorem.sentence(), {
|
175 |
count: faker.number.int({ min: 0, max: 4 }),
|
176 |
}),
|
|
|
|
|
177 |
}),
|
178 |
{ count: faker.number.int({ min: 3, max: 10 }) }
|
179 |
);
|
@@ -241,7 +246,7 @@ async function seed() {
|
|
241 |
try {
|
242 |
rl.question(
|
243 |
"You're about to run a seeding script on the following MONGODB_URL: \x1b[31m" +
|
244 |
-
MONGODB_URL +
|
245 |
"\x1b[0m\n\n With the following flags: \x1b[31m" +
|
246 |
flags.join("\x1b[0m , \x1b[31m") +
|
247 |
"\x1b[0m\n \n\n Are you sure you want to continue? (yes/no): ",
|
|
|
2 |
import minimist from "minimist";
|
3 |
|
4 |
// @ts-expect-error: vite-node makes the var available but the typescript compiler doesn't see them
|
5 |
+
import { env } from "$env/dynamic/private";
|
6 |
|
7 |
import { faker } from "@faker-js/faker";
|
8 |
import { ObjectId } from "mongodb";
|
9 |
|
10 |
+
// @ts-expect-error: vite-node makes the var available but the typescript compiler doesn't see them
|
11 |
+
import { collections } from "$lib/server/database";
|
12 |
import { models } from "../src/lib/server/models.ts";
|
13 |
import type { User } from "../src/lib/types/User";
|
14 |
import type { Assistant } from "../src/lib/types/Assistant";
|
|
|
18 |
import { Message } from "../src/lib/types/Message.ts";
|
19 |
|
20 |
import { addChildren } from "../src/lib/utils/tree/addChildren.ts";
|
21 |
+
import { generateSearchTokens } from "../src/lib/utils/searchTokens.ts";
|
22 |
|
23 |
const rl = readline.createInterface({
|
24 |
input: process.stdin,
|
|
|
160 |
console.log("Creating assistants for all users");
|
161 |
await Promise.all(
|
162 |
users.map(async (user) => {
|
163 |
+
const name = faker.animal.insect();
|
164 |
const assistants = faker.helpers.multiple<Assistant>(
|
165 |
() => ({
|
166 |
_id: new ObjectId(),
|
167 |
+
name,
|
168 |
createdById: user._id,
|
169 |
createdByName: user.username,
|
170 |
createdAt: faker.date.recent({ days: 30 }),
|
|
|
177 |
exampleInputs: faker.helpers.multiple(() => faker.lorem.sentence(), {
|
178 |
count: faker.number.int({ min: 0, max: 4 }),
|
179 |
}),
|
180 |
+
searchTokens: generateSearchTokens(name),
|
181 |
+
last24HoursCount: faker.number.int({ min: 0, max: 1000 }),
|
182 |
}),
|
183 |
{ count: faker.number.int({ min: 3, max: 10 }) }
|
184 |
);
|
|
|
246 |
try {
|
247 |
rl.question(
|
248 |
"You're about to run a seeding script on the following MONGODB_URL: \x1b[31m" +
|
249 |
+
env.MONGODB_URL +
|
250 |
"\x1b[0m\n\n With the following flags: \x1b[31m" +
|
251 |
flags.join("\x1b[0m , \x1b[31m") +
|
252 |
"\x1b[0m\n \n\n Are you sure you want to continue? (yes/no): ",
|
@@ -1,17 +1,6 @@
|
|
1 |
-
import {
|
2 |
-
|
3 |
-
COOKIE_NAME,
|
4 |
-
ENABLE_ASSISTANTS,
|
5 |
-
EXPOSE_API,
|
6 |
-
MESSAGES_BEFORE_LOGIN,
|
7 |
-
PARQUET_EXPORT_SECRET,
|
8 |
-
} from "$env/static/private";
|
9 |
import type { Handle, HandleServerError } from "@sveltejs/kit";
|
10 |
-
import {
|
11 |
-
PUBLIC_GOOGLE_ANALYTICS_ID,
|
12 |
-
PUBLIC_ORIGIN,
|
13 |
-
PUBLIC_APP_DISCLAIMER,
|
14 |
-
} from "$env/static/public";
|
15 |
import { collections } from "$lib/server/database";
|
16 |
import { base } from "$app/paths";
|
17 |
import { findUser, refreshSessionCookie, requiresUser } from "$lib/server/auth";
|
@@ -22,16 +11,30 @@ import { checkAndRunMigrations } from "$lib/migrations/migrations";
|
|
22 |
import { building } from "$app/environment";
|
23 |
import { refreshAssistantsCounts } from "$lib/assistantStats/refresh-assistants-counts";
|
24 |
import { logger } from "$lib/server/logger";
|
|
|
|
|
25 |
|
|
|
26 |
if (!building) {
|
27 |
await checkAndRunMigrations();
|
28 |
-
if (ENABLE_ASSISTANTS) {
|
29 |
refreshAssistantsCounts();
|
30 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
}
|
32 |
|
33 |
export const handleError: HandleServerError = async ({ error, event }) => {
|
34 |
// handle 404
|
|
|
|
|
|
|
|
|
|
|
35 |
if (event.route.id === null) {
|
36 |
return {
|
37 |
message: `Page ${event.url.pathname} not found`,
|
@@ -56,7 +59,14 @@ export const handleError: HandleServerError = async ({ error, event }) => {
|
|
56 |
};
|
57 |
|
58 |
export const handle: Handle = async ({ event, resolve }) => {
|
59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
return new Response("API is disabled", { status: 403 });
|
61 |
}
|
62 |
|
@@ -73,7 +83,7 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|
73 |
}
|
74 |
|
75 |
if (event.url.pathname.startsWith(`${base}/admin/`) || event.url.pathname === `${base}/admin`) {
|
76 |
-
const ADMIN_SECRET = ADMIN_API_SECRET || PARQUET_EXPORT_SECRET;
|
77 |
|
78 |
if (!ADMIN_SECRET) {
|
79 |
return errorResponse(500, "Admin API is not configured");
|
@@ -84,7 +94,7 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|
84 |
}
|
85 |
}
|
86 |
|
87 |
-
const token = event.cookies.get(COOKIE_NAME);
|
88 |
|
89 |
let secretSessionId: string;
|
90 |
let sessionId: string;
|
@@ -123,18 +133,18 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|
123 |
refreshSessionCookie(event.cookies, event.locals.sessionId);
|
124 |
|
125 |
if (nativeFormContentTypes.includes(requestContentType)) {
|
126 |
-
const
|
127 |
|
128 |
-
if (!
|
129 |
-
return errorResponse(403, "Non-JSON form requests need to have
|
130 |
}
|
131 |
|
132 |
const validOrigins = [
|
133 |
-
new URL(event.request.url).
|
134 |
-
...(PUBLIC_ORIGIN ? [new URL(PUBLIC_ORIGIN).
|
135 |
];
|
136 |
|
137 |
-
if (!validOrigins.includes(new URL(
|
138 |
return errorResponse(403, "Invalid referer for POST request");
|
139 |
}
|
140 |
}
|
@@ -158,7 +168,7 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|
158 |
if (
|
159 |
!event.locals.user &&
|
160 |
requiresUser &&
|
161 |
-
!((MESSAGES_BEFORE_LOGIN ? parseInt(MESSAGES_BEFORE_LOGIN) : 0) > 0)
|
162 |
) {
|
163 |
return errorResponse(401, ERROR_MESSAGES.authOnly);
|
164 |
}
|
@@ -169,7 +179,7 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|
169 |
if (
|
170 |
!requiresUser &&
|
171 |
!event.url.pathname.startsWith(`${base}/settings`) &&
|
172 |
-
!!PUBLIC_APP_DISCLAIMER
|
173 |
) {
|
174 |
const hasAcceptedEthicsModal = await collections.settings.countDocuments({
|
175 |
sessionId: event.locals.sessionId,
|
@@ -192,7 +202,7 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|
192 |
}
|
193 |
replaced = true;
|
194 |
|
195 |
-
return chunk.html.replace("%gaId%", PUBLIC_GOOGLE_ANALYTICS_ID);
|
196 |
},
|
197 |
});
|
198 |
|
|
|
1 |
+
import { env } from "$env/dynamic/private";
|
2 |
+
import { env as envPublic } from "$env/dynamic/public";
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
import type { Handle, HandleServerError } from "@sveltejs/kit";
|
|
|
|
|
|
|
|
|
|
|
4 |
import { collections } from "$lib/server/database";
|
5 |
import { base } from "$app/paths";
|
6 |
import { findUser, refreshSessionCookie, requiresUser } from "$lib/server/auth";
|
|
|
11 |
import { building } from "$app/environment";
|
12 |
import { refreshAssistantsCounts } from "$lib/assistantStats/refresh-assistants-counts";
|
13 |
import { logger } from "$lib/server/logger";
|
14 |
+
import { AbortedGenerations } from "$lib/server/abortedGenerations";
|
15 |
+
import { MetricsServer } from "$lib/server/metrics";
|
16 |
|
17 |
+
// TODO: move this code on a started server hook, instead of using a "building" flag
|
18 |
if (!building) {
|
19 |
await checkAndRunMigrations();
|
20 |
+
if (env.ENABLE_ASSISTANTS) {
|
21 |
refreshAssistantsCounts();
|
22 |
}
|
23 |
+
|
24 |
+
// Init metrics server
|
25 |
+
MetricsServer.getInstance();
|
26 |
+
|
27 |
+
// Init AbortedGenerations refresh process
|
28 |
+
AbortedGenerations.getInstance();
|
29 |
}
|
30 |
|
31 |
export const handleError: HandleServerError = async ({ error, event }) => {
|
32 |
// handle 404
|
33 |
+
|
34 |
+
if (building) {
|
35 |
+
throw error;
|
36 |
+
}
|
37 |
+
|
38 |
if (event.route.id === null) {
|
39 |
return {
|
40 |
message: `Page ${event.url.pathname} not found`,
|
|
|
59 |
};
|
60 |
|
61 |
export const handle: Handle = async ({ event, resolve }) => {
|
62 |
+
logger.debug({
|
63 |
+
locals: event.locals,
|
64 |
+
url: event.url.pathname,
|
65 |
+
params: event.params,
|
66 |
+
request: event.request,
|
67 |
+
});
|
68 |
+
|
69 |
+
if (event.url.pathname.startsWith(`${base}/api/`) && env.EXPOSE_API !== "true") {
|
70 |
return new Response("API is disabled", { status: 403 });
|
71 |
}
|
72 |
|
|
|
83 |
}
|
84 |
|
85 |
if (event.url.pathname.startsWith(`${base}/admin/`) || event.url.pathname === `${base}/admin`) {
|
86 |
+
const ADMIN_SECRET = env.ADMIN_API_SECRET || env.PARQUET_EXPORT_SECRET;
|
87 |
|
88 |
if (!ADMIN_SECRET) {
|
89 |
return errorResponse(500, "Admin API is not configured");
|
|
|
94 |
}
|
95 |
}
|
96 |
|
97 |
+
const token = event.cookies.get(env.COOKIE_NAME);
|
98 |
|
99 |
let secretSessionId: string;
|
100 |
let sessionId: string;
|
|
|
133 |
refreshSessionCookie(event.cookies, event.locals.sessionId);
|
134 |
|
135 |
if (nativeFormContentTypes.includes(requestContentType)) {
|
136 |
+
const origin = event.request.headers.get("origin");
|
137 |
|
138 |
+
if (!origin) {
|
139 |
+
return errorResponse(403, "Non-JSON form requests need to have an origin");
|
140 |
}
|
141 |
|
142 |
const validOrigins = [
|
143 |
+
new URL(event.request.url).host,
|
144 |
+
...(envPublic.PUBLIC_ORIGIN ? [new URL(envPublic.PUBLIC_ORIGIN).host] : []),
|
145 |
];
|
146 |
|
147 |
+
if (!validOrigins.includes(new URL(origin).host)) {
|
148 |
return errorResponse(403, "Invalid referer for POST request");
|
149 |
}
|
150 |
}
|
|
|
168 |
if (
|
169 |
!event.locals.user &&
|
170 |
requiresUser &&
|
171 |
+
!((env.MESSAGES_BEFORE_LOGIN ? parseInt(env.MESSAGES_BEFORE_LOGIN) : 0) > 0)
|
172 |
) {
|
173 |
return errorResponse(401, ERROR_MESSAGES.authOnly);
|
174 |
}
|
|
|
179 |
if (
|
180 |
!requiresUser &&
|
181 |
!event.url.pathname.startsWith(`${base}/settings`) &&
|
182 |
+
!!envPublic.PUBLIC_APP_DISCLAIMER
|
183 |
) {
|
184 |
const hasAcceptedEthicsModal = await collections.settings.countDocuments({
|
185 |
sessionId: event.locals.sessionId,
|
|
|
202 |
}
|
203 |
replaced = true;
|
204 |
|
205 |
+
return chunk.html.replace("%gaId%", envPublic.PUBLIC_GOOGLE_ANALYTICS_ID);
|
206 |
},
|
207 |
});
|
208 |
|
@@ -1,4 +1,4 @@
|
|
1 |
-
import {
|
2 |
import { acquireLock, refreshLock } from "$lib/migrations/lock";
|
3 |
import type { ObjectId } from "mongodb";
|
4 |
import { subDays } from "date-fns";
|
@@ -15,44 +15,49 @@ async function refreshAssistantsCountsHelper() {
|
|
15 |
}
|
16 |
|
17 |
try {
|
18 |
-
await
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
$
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
},
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
},
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
},
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
},
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
);
|
56 |
} catch (e) {
|
57 |
logger.error("Refresh assistants counter failed!");
|
58 |
logger.error(e);
|
|
|
1 |
+
import { Database } from "$lib/server/database";
|
2 |
import { acquireLock, refreshLock } from "$lib/migrations/lock";
|
3 |
import type { ObjectId } from "mongodb";
|
4 |
import { subDays } from "date-fns";
|
|
|
15 |
}
|
16 |
|
17 |
try {
|
18 |
+
await Database.getInstance()
|
19 |
+
.getClient()
|
20 |
+
.withSession((session) =>
|
21 |
+
session.withTransaction(async () => {
|
22 |
+
await Database.getInstance()
|
23 |
+
.getCollections()
|
24 |
+
.assistants.aggregate([
|
25 |
+
{ $project: { _id: 1 } },
|
26 |
+
{ $set: { last24HoursCount: 0 } },
|
27 |
+
{
|
28 |
+
$unionWith: {
|
29 |
+
coll: "assistants.stats",
|
30 |
+
pipeline: [
|
31 |
+
{
|
32 |
+
$match: { "date.at": { $gte: subDays(new Date(), 1) }, "date.span": "hour" },
|
33 |
},
|
34 |
+
{
|
35 |
+
$group: {
|
36 |
+
_id: "$assistantId",
|
37 |
+
last24HoursCount: { $sum: "$count" },
|
38 |
+
},
|
39 |
+
},
|
40 |
+
],
|
41 |
+
},
|
42 |
},
|
43 |
+
{
|
44 |
+
$group: {
|
45 |
+
_id: "$_id",
|
46 |
+
last24HoursCount: { $sum: "$last24HoursCount" },
|
47 |
+
},
|
48 |
},
|
49 |
+
{
|
50 |
+
$merge: {
|
51 |
+
into: "assistants",
|
52 |
+
on: "_id",
|
53 |
+
whenMatched: "merge",
|
54 |
+
whenNotMatched: "discard",
|
55 |
+
},
|
56 |
},
|
57 |
+
])
|
58 |
+
.next();
|
59 |
+
})
|
60 |
+
);
|
|
|
61 |
} catch (e) {
|
62 |
logger.error("Refresh assistants counter failed!");
|
63 |
logger.error(e);
|
@@ -5,7 +5,7 @@
|
|
5 |
|
6 |
<div class="flex items-center rounded-xl bg-gray-100 p-1 text-sm dark:bg-gray-800 {classNames}">
|
7 |
<span
|
8 |
-
class="mr-2 inline-flex items-center rounded-lg bg-gradient-to-br
|
9 |
>New</span
|
10 |
>
|
11 |
{title}
|
|
|
5 |
|
6 |
<div class="flex items-center rounded-xl bg-gray-100 p-1 text-sm dark:bg-gray-800 {classNames}">
|
7 |
<span
|
8 |
+
class="from-primary-300 text-primary-700 dark:from-primary-900 dark:text-primary-400 mr-2 inline-flex items-center rounded-lg bg-gradient-to-br px-2 py-1 text-xxs font-medium uppercase leading-3"
|
9 |
>New</span
|
10 |
>
|
11 |
{title}
|
@@ -1,11 +1,7 @@
|
|
1 |
<script lang="ts">
|
2 |
import { base } from "$app/paths";
|
3 |
import { page } from "$app/stores";
|
4 |
-
import {
|
5 |
-
PUBLIC_APP_DESCRIPTION,
|
6 |
-
PUBLIC_APP_NAME,
|
7 |
-
PUBLIC_APP_DISCLAIMER_MESSAGE,
|
8 |
-
} from "$env/static/public";
|
9 |
import LogoHuggingFaceBorderless from "$lib/components/icons/LogoHuggingFaceBorderless.svelte";
|
10 |
import Modal from "$lib/components/Modal.svelte";
|
11 |
import { useSettingsStore } from "$lib/stores/settings";
|
@@ -17,19 +13,19 @@
|
|
17 |
|
18 |
<Modal>
|
19 |
<div
|
20 |
-
class="flex w-full flex-col items-center gap-6 bg-gradient-to-b
|
21 |
>
|
22 |
<h2 class="flex items-center text-2xl font-semibold text-gray-800">
|
23 |
<Logo classNames="mr-1" />
|
24 |
-
{PUBLIC_APP_NAME}
|
25 |
</h2>
|
26 |
|
27 |
<p class="text-lg font-semibold leading-snug text-gray-800" style="text-wrap: balance;">
|
28 |
-
{PUBLIC_APP_DESCRIPTION}
|
29 |
</p>
|
30 |
|
31 |
<p class="text-sm text-gray-500">
|
32 |
-
{PUBLIC_APP_DISCLAIMER_MESSAGE}
|
33 |
</p>
|
34 |
|
35 |
<div class="flex w-full flex-col items-center gap-2">
|
@@ -61,7 +57,7 @@
|
|
61 |
class="flex w-full items-center justify-center whitespace-nowrap rounded-full border-2 border-black bg-black px-5 py-2 text-lg font-semibold text-gray-100 transition-colors hover:bg-gray-900"
|
62 |
>
|
63 |
Sign in
|
64 |
-
{#if PUBLIC_APP_NAME === "HuggingChat"}
|
65 |
with <LogoHuggingFaceBorderless classNames="text-xl mr-1 ml-1.5 flex-none" /> Hugging Face
|
66 |
{/if}
|
67 |
</button>
|
|
|
1 |
<script lang="ts">
|
2 |
import { base } from "$app/paths";
|
3 |
import { page } from "$app/stores";
|
4 |
+
import { env as envPublic } from "$env/dynamic/public";
|
|
|
|
|
|
|
|
|
5 |
import LogoHuggingFaceBorderless from "$lib/components/icons/LogoHuggingFaceBorderless.svelte";
|
6 |
import Modal from "$lib/components/Modal.svelte";
|
7 |
import { useSettingsStore } from "$lib/stores/settings";
|
|
|
13 |
|
14 |
<Modal>
|
15 |
<div
|
16 |
+
class="from-primary-500/40 via-primary-500/10 to-primary-500/0 flex w-full flex-col items-center gap-6 bg-gradient-to-b px-5 pb-8 pt-9 text-center sm:px-6"
|
17 |
>
|
18 |
<h2 class="flex items-center text-2xl font-semibold text-gray-800">
|
19 |
<Logo classNames="mr-1" />
|
20 |
+
{envPublic.PUBLIC_APP_NAME}
|
21 |
</h2>
|
22 |
|
23 |
<p class="text-lg font-semibold leading-snug text-gray-800" style="text-wrap: balance;">
|
24 |
+
{envPublic.PUBLIC_APP_DESCRIPTION}
|
25 |
</p>
|
26 |
|
27 |
<p class="text-sm text-gray-500">
|
28 |
+
{envPublic.PUBLIC_APP_DISCLAIMER_MESSAGE}
|
29 |
</p>
|
30 |
|
31 |
<div class="flex w-full flex-col items-center gap-2">
|
|
|
57 |
class="flex w-full items-center justify-center whitespace-nowrap rounded-full border-2 border-black bg-black px-5 py-2 text-lg font-semibold text-gray-100 transition-colors hover:bg-gray-900"
|
58 |
>
|
59 |
Sign in
|
60 |
+
{#if envPublic.PUBLIC_APP_NAME === "HuggingChat"}
|
61 |
with <LogoHuggingFaceBorderless classNames="text-xl mr-1 ml-1.5 flex-none" /> Hugging Face
|
62 |
{/if}
|
63 |
</button>
|
@@ -1,7 +1,7 @@
|
|
1 |
<script lang="ts">
|
2 |
import { base } from "$app/paths";
|
3 |
import { page } from "$app/stores";
|
4 |
-
import {
|
5 |
import LogoHuggingFaceBorderless from "$lib/components/icons/LogoHuggingFaceBorderless.svelte";
|
6 |
import Modal from "$lib/components/Modal.svelte";
|
7 |
import { useSettingsStore } from "$lib/stores/settings";
|
@@ -13,14 +13,14 @@
|
|
13 |
|
14 |
<Modal on:close>
|
15 |
<div
|
16 |
-
class="flex w-full flex-col items-center gap-6 bg-gradient-to-b
|
17 |
>
|
18 |
<h2 class="flex items-center text-2xl font-semibold text-gray-800">
|
19 |
<Logo classNames="mr-1" />
|
20 |
-
{PUBLIC_APP_NAME}
|
21 |
</h2>
|
22 |
<p class="text-balance text-lg font-semibold leading-snug text-gray-800">
|
23 |
-
{PUBLIC_APP_DESCRIPTION}
|
24 |
</p>
|
25 |
<p class="text-balance rounded-xl border bg-white/80 p-2 text-base text-gray-800">
|
26 |
You have reached the guest message limit, <strong class="font-semibold"
|
@@ -40,7 +40,7 @@
|
|
40 |
class="flex w-full items-center justify-center whitespace-nowrap rounded-full bg-black px-5 py-2 text-center text-lg font-semibold text-gray-100 transition-colors hover:bg-gray-900"
|
41 |
>
|
42 |
Sign in
|
43 |
-
{#if PUBLIC_APP_NAME === "HuggingChat"}
|
44 |
with <LogoHuggingFaceBorderless classNames="text-xl mr-1 ml-1.5" /> Hugging Face
|
45 |
{/if}
|
46 |
</button>
|
|
|
1 |
<script lang="ts">
|
2 |
import { base } from "$app/paths";
|
3 |
import { page } from "$app/stores";
|
4 |
+
import { env as envPublic } from "$env/dynamic/public";
|
5 |
import LogoHuggingFaceBorderless from "$lib/components/icons/LogoHuggingFaceBorderless.svelte";
|
6 |
import Modal from "$lib/components/Modal.svelte";
|
7 |
import { useSettingsStore } from "$lib/stores/settings";
|
|
|
13 |
|
14 |
<Modal on:close>
|
15 |
<div
|
16 |
+
class="from-primary-500/40 via-primary-500/10 to-primary-500/0 flex w-full flex-col items-center gap-6 bg-gradient-to-b px-5 pb-8 pt-9 text-center"
|
17 |
>
|
18 |
<h2 class="flex items-center text-2xl font-semibold text-gray-800">
|
19 |
<Logo classNames="mr-1" />
|
20 |
+
{envPublic.PUBLIC_APP_NAME}
|
21 |
</h2>
|
22 |
<p class="text-balance text-lg font-semibold leading-snug text-gray-800">
|
23 |
+
{envPublic.PUBLIC_APP_DESCRIPTION}
|
24 |
</p>
|
25 |
<p class="text-balance rounded-xl border bg-white/80 p-2 text-base text-gray-800">
|
26 |
You have reached the guest message limit, <strong class="font-semibold"
|
|
|
40 |
class="flex w-full items-center justify-center whitespace-nowrap rounded-full bg-black px-5 py-2 text-center text-lg font-semibold text-gray-100 transition-colors hover:bg-gray-900"
|
41 |
>
|
42 |
Sign in
|
43 |
+
{#if envPublic.PUBLIC_APP_NAME === "HuggingChat"}
|
44 |
with <LogoHuggingFaceBorderless classNames="text-xl mr-1 ml-1.5" /> Hugging Face
|
45 |
{/if}
|
46 |
</button>
|
@@ -4,7 +4,7 @@
|
|
4 |
import Logo from "$lib/components/icons/Logo.svelte";
|
5 |
import { switchTheme } from "$lib/switchTheme";
|
6 |
import { isAborted } from "$lib/stores/isAborted";
|
7 |
-
import {
|
8 |
import NavConversationItem from "./NavConversationItem.svelte";
|
9 |
import type { LayoutData } from "../../routes/$types";
|
10 |
import type { ConvSidebar } from "$lib/types/ConvSidebar";
|
@@ -47,9 +47,12 @@
|
|
47 |
</script>
|
48 |
|
49 |
<div class="sticky top-0 flex flex-none items-center justify-between px-3 py-3.5 max-sm:pt-0">
|
50 |
-
<a
|
|
|
|
|
|
|
51 |
<Logo classNames="mr-1" />
|
52 |
-
{PUBLIC_APP_NAME}
|
53 |
</a>
|
54 |
<a
|
55 |
href={`${base}/`}
|
@@ -142,7 +145,7 @@
|
|
142 |
>
|
143 |
Settings
|
144 |
</a>
|
145 |
-
{#if PUBLIC_APP_NAME === "HuggingChat"}
|
146 |
<a
|
147 |
href="{base}/privacy"
|
148 |
class="flex h-9 flex-none items-center gap-1.5 rounded-lg pl-2.5 pr-2 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700"
|
|
|
4 |
import Logo from "$lib/components/icons/Logo.svelte";
|
5 |
import { switchTheme } from "$lib/switchTheme";
|
6 |
import { isAborted } from "$lib/stores/isAborted";
|
7 |
+
import { env as envPublic } from "$env/dynamic/public";
|
8 |
import NavConversationItem from "./NavConversationItem.svelte";
|
9 |
import type { LayoutData } from "../../routes/$types";
|
10 |
import type { ConvSidebar } from "$lib/types/ConvSidebar";
|
|
|
47 |
</script>
|
48 |
|
49 |
<div class="sticky top-0 flex flex-none items-center justify-between px-3 py-3.5 max-sm:pt-0">
|
50 |
+
<a
|
51 |
+
class="flex items-center rounded-xl text-lg font-semibold"
|
52 |
+
href="{envPublic.PUBLIC_ORIGIN}{base}/"
|
53 |
+
>
|
54 |
<Logo classNames="mr-1" />
|
55 |
+
{envPublic.PUBLIC_APP_NAME}
|
56 |
</a>
|
57 |
<a
|
58 |
href={`${base}/`}
|
|
|
145 |
>
|
146 |
Settings
|
147 |
</a>
|
148 |
+
{#if envPublic.PUBLIC_APP_NAME === "HuggingChat"}
|
149 |
<a
|
150 |
href="{base}/privacy"
|
151 |
class="flex h-9 flex-none items-center gap-1.5 rounded-lg pl-2.5 pr-2 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700"
|
@@ -10,7 +10,7 @@
|
|
10 |
import CarbonUserMultiple from "~icons/carbon/user-multiple";
|
11 |
|
12 |
import { share } from "$lib/utils/share";
|
13 |
-
import {
|
14 |
import { page } from "$app/stores";
|
15 |
|
16 |
export let assistant: Pick<
|
@@ -35,7 +35,8 @@
|
|
35 |
(assistant?.rag?.allowedLinks?.length ?? 0) > 0 ||
|
36 |
assistant?.dynamicPrompt;
|
37 |
|
38 |
-
const prefix =
|
|
|
39 |
|
40 |
$: shareUrl = `${prefix}/assistant/${assistant?._id}`;
|
41 |
|
|
|
10 |
import CarbonUserMultiple from "~icons/carbon/user-multiple";
|
11 |
|
12 |
import { share } from "$lib/utils/share";
|
13 |
+
import { env as envPublic } from "$env/dynamic/public";
|
14 |
import { page } from "$app/stores";
|
15 |
|
16 |
export let assistant: Pick<
|
|
|
35 |
(assistant?.rag?.allowedLinks?.length ?? 0) > 0 ||
|
36 |
assistant?.dynamicPrompt;
|
37 |
|
38 |
+
const prefix =
|
39 |
+
envPublic.PUBLIC_SHARE_PREFIX || `${envPublic.PUBLIC_ORIGIN || $page.url.origin}${base}`;
|
40 |
|
41 |
$: shareUrl = `${prefix}/assistant/${assistant?._id}`;
|
42 |
|
@@ -1,7 +1,5 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import {
|
3 |
-
import { PUBLIC_ANNOUNCEMENT_BANNERS } from "$env/static/public";
|
4 |
-
import { PUBLIC_APP_DESCRIPTION } from "$env/static/public";
|
5 |
import Logo from "$lib/components/icons/Logo.svelte";
|
6 |
import { createEventDispatcher } from "svelte";
|
7 |
import IconGear from "~icons/bi/gear-fill";
|
@@ -20,8 +18,8 @@
|
|
20 |
|
21 |
$: currentModelMetadata = findCurrentModel(models, $settings.activeModel);
|
22 |
|
23 |
-
const announcementBanners = PUBLIC_ANNOUNCEMENT_BANNERS
|
24 |
-
? JSON5.parse(PUBLIC_ANNOUNCEMENT_BANNERS)
|
25 |
: [];
|
26 |
|
27 |
const dispatch = createEventDispatcher<{ message: string }>();
|
@@ -32,15 +30,15 @@
|
|
32 |
<div>
|
33 |
<div class="mb-3 flex items-center text-2xl font-semibold">
|
34 |
<Logo classNames="mr-1 flex-none" />
|
35 |
-
{PUBLIC_APP_NAME}
|
36 |
<div
|
37 |
class="ml-3 flex h-6 items-center rounded-lg border border-gray-100 bg-gray-50 px-2 text-base text-gray-400 dark:border-gray-700/60 dark:bg-gray-800"
|
38 |
>
|
39 |
-
v{PUBLIC_VERSION}
|
40 |
</div>
|
41 |
</div>
|
42 |
<p class="text-base text-gray-600 dark:text-gray-400">
|
43 |
-
{PUBLIC_APP_DESCRIPTION ||
|
44 |
"Making the community's best AI chat models available to everyone."}
|
45 |
</p>
|
46 |
</div>
|
|
|
1 |
<script lang="ts">
|
2 |
+
import { env as envPublic } from "$env/dynamic/public";
|
|
|
|
|
3 |
import Logo from "$lib/components/icons/Logo.svelte";
|
4 |
import { createEventDispatcher } from "svelte";
|
5 |
import IconGear from "~icons/bi/gear-fill";
|
|
|
18 |
|
19 |
$: currentModelMetadata = findCurrentModel(models, $settings.activeModel);
|
20 |
|
21 |
+
const announcementBanners = envPublic.PUBLIC_ANNOUNCEMENT_BANNERS
|
22 |
+
? JSON5.parse(envPublic.PUBLIC_ANNOUNCEMENT_BANNERS)
|
23 |
: [];
|
24 |
|
25 |
const dispatch = createEventDispatcher<{ message: string }>();
|
|
|
30 |
<div>
|
31 |
<div class="mb-3 flex items-center text-2xl font-semibold">
|
32 |
<Logo classNames="mr-1 flex-none" />
|
33 |
+
{envPublic.PUBLIC_APP_NAME}
|
34 |
<div
|
35 |
class="ml-3 flex h-6 items-center rounded-lg border border-gray-100 bg-gray-50 px-2 text-base text-gray-400 dark:border-gray-700/60 dark:bg-gray-800"
|
36 |
>
|
37 |
+
v{envPublic.PUBLIC_VERSION}
|
38 |
</div>
|
39 |
</div>
|
40 |
<p class="text-base text-gray-600 dark:text-gray-400">
|
41 |
+
{envPublic.PUBLIC_APP_DESCRIPTION ||
|
42 |
"Making the community's best AI chat models available to everyone."}
|
43 |
</p>
|
44 |
</div>
|
@@ -395,7 +395,7 @@
|
|
395 |
<CarbonCheckmark class="text-[.6rem] sm:mr-1.5 sm:text-green-600" />
|
396 |
<div class="text-green-600 max-sm:hidden">Link copied to clipboard</div>
|
397 |
{:else}
|
398 |
-
<CarbonExport class="text-[.6rem] sm:mr-1.5
|
399 |
<div class="max-sm:hidden">Share this conversation</div>
|
400 |
{/if}
|
401 |
</button>
|
|
|
395 |
<CarbonCheckmark class="text-[.6rem] sm:mr-1.5 sm:text-green-600" />
|
396 |
<div class="text-green-600 max-sm:hidden">Link copied to clipboard</div>
|
397 |
{:else}
|
398 |
+
<CarbonExport class="sm:text-primary-500 text-[.6rem] sm:mr-1.5" />
|
399 |
<div class="max-sm:hidden">Share this conversation</div>
|
400 |
{/if}
|
401 |
</button>
|
@@ -1,12 +1,12 @@
|
|
1 |
<script lang="ts">
|
2 |
import { page } from "$app/stores";
|
3 |
-
import {
|
4 |
import { base } from "$app/paths";
|
5 |
|
6 |
export let classNames = "";
|
7 |
</script>
|
8 |
|
9 |
-
{#if PUBLIC_APP_ASSETS === "chatui"}
|
10 |
<svg
|
11 |
height="30"
|
12 |
width="30"
|
@@ -22,7 +22,7 @@
|
|
22 |
{:else}
|
23 |
<img
|
24 |
class={classNames}
|
25 |
-
alt="{PUBLIC_APP_NAME} logo"
|
26 |
-
src="{PUBLIC_ORIGIN || $page.url.origin}{base}/{PUBLIC_APP_ASSETS}/logo.svg"
|
27 |
/>
|
28 |
{/if}
|
|
|
1 |
<script lang="ts">
|
2 |
import { page } from "$app/stores";
|
3 |
+
import { env as envPublic } from "$env/dynamic/public";
|
4 |
import { base } from "$app/paths";
|
5 |
|
6 |
export let classNames = "";
|
7 |
</script>
|
8 |
|
9 |
+
{#if envPublic.PUBLIC_APP_ASSETS === "chatui"}
|
10 |
<svg
|
11 |
height="30"
|
12 |
width="30"
|
|
|
22 |
{:else}
|
23 |
<img
|
24 |
class={classNames}
|
25 |
+
alt="{envPublic.PUBLIC_APP_NAME} logo"
|
26 |
+
src="{envPublic.PUBLIC_ORIGIN || $page.url.origin}{base}/{envPublic.PUBLIC_APP_ASSETS}/logo.svg"
|
27 |
/>
|
28 |
{/if}
|
@@ -1,4 +1,4 @@
|
|
1 |
-
import {
|
2 |
import { migrations } from "./routines";
|
3 |
import { acquireLock, releaseLock, isDBLocked, refreshLock } from "./lock";
|
4 |
import { isHuggingChat } from "$lib/utils/isHuggingChat";
|
@@ -13,12 +13,15 @@ export async function checkAndRunMigrations() {
|
|
13 |
}
|
14 |
|
15 |
// check if all migrations have already been run
|
16 |
-
const migrationResults = await
|
|
|
|
|
|
|
17 |
|
18 |
logger.info("[MIGRATIONS] Begin check...");
|
19 |
|
20 |
// connect to the database
|
21 |
-
const connectedClient = await
|
22 |
|
23 |
const lockId = await acquireLock(LOCK_KEY);
|
24 |
|
@@ -71,23 +74,25 @@ export async function checkAndRunMigrations() {
|
|
71 |
}. Applying...`
|
72 |
);
|
73 |
|
74 |
-
await
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
|
|
|
|
|
|
80 |
},
|
81 |
-
|
82 |
-
|
83 |
-
);
|
84 |
|
85 |
const session = connectedClient.startSession();
|
86 |
let result = false;
|
87 |
|
88 |
try {
|
89 |
await session.withTransaction(async () => {
|
90 |
-
result = await migration.up(
|
91 |
});
|
92 |
} catch (e) {
|
93 |
logger.info(`[MIGRATIONS] "${migration.name}" failed!`);
|
@@ -96,16 +101,18 @@ export async function checkAndRunMigrations() {
|
|
96 |
await session.endSession();
|
97 |
}
|
98 |
|
99 |
-
await
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
|
|
|
|
|
|
105 |
},
|
106 |
-
|
107 |
-
|
108 |
-
);
|
109 |
}
|
110 |
}
|
111 |
|
|
|
1 |
+
import { Database } from "$lib/server/database";
|
2 |
import { migrations } from "./routines";
|
3 |
import { acquireLock, releaseLock, isDBLocked, refreshLock } from "./lock";
|
4 |
import { isHuggingChat } from "$lib/utils/isHuggingChat";
|
|
|
13 |
}
|
14 |
|
15 |
// check if all migrations have already been run
|
16 |
+
const migrationResults = await Database.getInstance()
|
17 |
+
.getCollections()
|
18 |
+
.migrationResults.find()
|
19 |
+
.toArray();
|
20 |
|
21 |
logger.info("[MIGRATIONS] Begin check...");
|
22 |
|
23 |
// connect to the database
|
24 |
+
const connectedClient = await Database.getInstance().getClient().connect();
|
25 |
|
26 |
const lockId = await acquireLock(LOCK_KEY);
|
27 |
|
|
|
74 |
}. Applying...`
|
75 |
);
|
76 |
|
77 |
+
await Database.getInstance()
|
78 |
+
.getCollections()
|
79 |
+
.migrationResults.updateOne(
|
80 |
+
{ _id: migration._id },
|
81 |
+
{
|
82 |
+
$set: {
|
83 |
+
name: migration.name,
|
84 |
+
status: "ongoing",
|
85 |
+
},
|
86 |
},
|
87 |
+
{ upsert: true }
|
88 |
+
);
|
|
|
89 |
|
90 |
const session = connectedClient.startSession();
|
91 |
let result = false;
|
92 |
|
93 |
try {
|
94 |
await session.withTransaction(async () => {
|
95 |
+
result = await migration.up(Database.getInstance());
|
96 |
});
|
97 |
} catch (e) {
|
98 |
logger.info(`[MIGRATIONS] "${migration.name}" failed!`);
|
|
|
101 |
await session.endSession();
|
102 |
}
|
103 |
|
104 |
+
await Database.getInstance()
|
105 |
+
.getCollections()
|
106 |
+
.migrationResults.updateOne(
|
107 |
+
{ _id: migration._id },
|
108 |
+
{
|
109 |
+
$set: {
|
110 |
+
name: migration.name,
|
111 |
+
status: result ? "success" : "failure",
|
112 |
+
},
|
113 |
},
|
114 |
+
{ upsert: true }
|
115 |
+
);
|
|
|
116 |
}
|
117 |
}
|
118 |
|
@@ -1,5 +1,5 @@
|
|
1 |
import type { Migration } from ".";
|
2 |
-
import {
|
3 |
import { ObjectId, type AnyBulkWriteOperation } from "mongodb";
|
4 |
import type { Assistant } from "$lib/types/Assistant";
|
5 |
import { generateSearchTokens } from "$lib/utils/searchTokens";
|
@@ -7,8 +7,8 @@ import { generateSearchTokens } from "$lib/utils/searchTokens";
|
|
7 |
const migration: Migration = {
|
8 |
_id: new ObjectId("5f9f3e3e3e3e3e3e3e3e3e3e"),
|
9 |
name: "Update search assistants",
|
10 |
-
up: async (
|
11 |
-
const { assistants } =
|
12 |
let ops: AnyBulkWriteOperation<Assistant>[] = [];
|
13 |
|
14 |
for await (const assistant of assistants
|
@@ -40,8 +40,8 @@ const migration: Migration = {
|
|
40 |
|
41 |
return true;
|
42 |
},
|
43 |
-
down: async (
|
44 |
-
const { assistants } =
|
45 |
await assistants.updateMany({}, { $unset: { searchTokens: "" } });
|
46 |
return true;
|
47 |
},
|
|
|
1 |
import type { Migration } from ".";
|
2 |
+
import { collections } from "$lib/server/database";
|
3 |
import { ObjectId, type AnyBulkWriteOperation } from "mongodb";
|
4 |
import type { Assistant } from "$lib/types/Assistant";
|
5 |
import { generateSearchTokens } from "$lib/utils/searchTokens";
|
|
|
7 |
const migration: Migration = {
|
8 |
_id: new ObjectId("5f9f3e3e3e3e3e3e3e3e3e3e"),
|
9 |
name: "Update search assistants",
|
10 |
+
up: async () => {
|
11 |
+
const { assistants } = collections;
|
12 |
let ops: AnyBulkWriteOperation<Assistant>[] = [];
|
13 |
|
14 |
for await (const assistant of assistants
|
|
|
40 |
|
41 |
return true;
|
42 |
},
|
43 |
+
down: async () => {
|
44 |
+
const { assistants } = collections;
|
45 |
await assistants.updateMany({}, { $unset: { searchTokens: "" } });
|
46 |
return true;
|
47 |
},
|
@@ -1,14 +1,14 @@
|
|
1 |
import type { Migration } from ".";
|
2 |
-
import {
|
3 |
import { ObjectId } from "mongodb";
|
4 |
|
5 |
const updateAssistantsModels: Migration = {
|
6 |
_id: new ObjectId("5f9f3f3f3f3f3f3f3f3f3f3f"),
|
7 |
name: "Update deprecated models in assistants with the default model",
|
8 |
-
up: async (
|
9 |
const models = (await import("$lib/server/models")).models;
|
10 |
|
11 |
-
const { assistants } =
|
12 |
|
13 |
const modelIds = models.map((el) => el.id); // string[]
|
14 |
const defaultModelId = models[0].id;
|
|
|
1 |
import type { Migration } from ".";
|
2 |
+
import { collections } from "$lib/server/database";
|
3 |
import { ObjectId } from "mongodb";
|
4 |
|
5 |
const updateAssistantsModels: Migration = {
|
6 |
_id: new ObjectId("5f9f3f3f3f3f3f3f3f3f3f3f"),
|
7 |
name: "Update deprecated models in assistants with the default model",
|
8 |
+
up: async () => {
|
9 |
const models = (await import("$lib/server/models")).models;
|
10 |
|
11 |
+
const { assistants } = collections;
|
12 |
|
13 |
const modelIds = models.map((el) => el.id); // string[]
|
14 |
const defaultModelId = models[0].id;
|
@@ -1,13 +1,14 @@
|
|
1 |
-
import type {
|
2 |
|
3 |
import updateSearchAssistant from "./01-update-search-assistants";
|
4 |
import updateAssistantsModels from "./02-update-assistants-models";
|
|
|
5 |
|
6 |
export interface Migration {
|
7 |
_id: ObjectId;
|
8 |
name: string;
|
9 |
-
up: (client:
|
10 |
-
down?: (client:
|
11 |
runForFreshInstall?: "only" | "never"; // leave unspecified to run for both
|
12 |
runForHuggingChat?: "only" | "never"; // leave unspecified to run for both
|
13 |
runEveryTime?: boolean;
|
|
|
1 |
+
import type { ObjectId } from "mongodb";
|
2 |
|
3 |
import updateSearchAssistant from "./01-update-search-assistants";
|
4 |
import updateAssistantsModels from "./02-update-assistants-models";
|
5 |
+
import type { Database } from "$lib/server/database";
|
6 |
|
7 |
export interface Migration {
|
8 |
_id: ObjectId;
|
9 |
name: string;
|
10 |
+
up: (client: Database) => Promise<boolean>;
|
11 |
+
down?: (client: Database) => Promise<boolean>;
|
12 |
runForFreshInstall?: "only" | "never"; // leave unspecified to run for both
|
13 |
runForHuggingChat?: "only" | "never"; // leave unspecified to run for both
|
14 |
runEveryTime?: boolean;
|
@@ -1,24 +1,38 @@
|
|
1 |
// Shouldn't be needed if we dove into sveltekit internals, see https://github.com/huggingface/chat-ui/pull/88#issuecomment-1523173850
|
2 |
|
3 |
-
import { setTimeout } from "node:timers/promises";
|
4 |
-
import { collections } from "./database";
|
5 |
import { logger } from "$lib/server/logger";
|
|
|
6 |
|
7 |
-
|
8 |
-
|
9 |
-
closed = true;
|
10 |
-
});
|
11 |
|
12 |
-
|
13 |
|
14 |
-
|
15 |
-
|
16 |
-
await setTimeout(1000);
|
17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
try {
|
19 |
const aborts = await collections.abortedGenerations.find({}).sort({ createdAt: 1 }).toArray();
|
20 |
|
21 |
-
abortedGenerations = new Map(
|
22 |
aborts.map(({ conversationId, createdAt }) => [conversationId.toString(), createdAt])
|
23 |
);
|
24 |
} catch (err) {
|
@@ -26,5 +40,3 @@ async function maintainAbortedGenerations() {
|
|
26 |
}
|
27 |
}
|
28 |
}
|
29 |
-
|
30 |
-
maintainAbortedGenerations();
|
|
|
1 |
// Shouldn't be needed if we dove into sveltekit internals, see https://github.com/huggingface/chat-ui/pull/88#issuecomment-1523173850
|
2 |
|
|
|
|
|
3 |
import { logger } from "$lib/server/logger";
|
4 |
+
import { collections } from "$lib/server/database";
|
5 |
|
6 |
+
export class AbortedGenerations {
|
7 |
+
private static instance: AbortedGenerations;
|
|
|
|
|
8 |
|
9 |
+
private abortedGenerations: Map<string, Date> = new Map();
|
10 |
|
11 |
+
private constructor() {
|
12 |
+
const interval = setInterval(this.updateList, 1000);
|
|
|
13 |
|
14 |
+
process.on("SIGINT", () => {
|
15 |
+
clearInterval(interval);
|
16 |
+
});
|
17 |
+
}
|
18 |
+
|
19 |
+
public static getInstance(): AbortedGenerations {
|
20 |
+
if (!AbortedGenerations.instance) {
|
21 |
+
AbortedGenerations.instance = new AbortedGenerations();
|
22 |
+
}
|
23 |
+
|
24 |
+
return AbortedGenerations.instance;
|
25 |
+
}
|
26 |
+
|
27 |
+
public getList(): Map<string, Date> {
|
28 |
+
return this.abortedGenerations;
|
29 |
+
}
|
30 |
+
|
31 |
+
private async updateList() {
|
32 |
try {
|
33 |
const aborts = await collections.abortedGenerations.find({}).sort({ createdAt: 1 }).toArray();
|
34 |
|
35 |
+
this.abortedGenerations = new Map(
|
36 |
aborts.map(({ conversationId, createdAt }) => [conversationId.toString(), createdAt])
|
37 |
);
|
38 |
} catch (err) {
|
|
|
40 |
}
|
41 |
}
|
42 |
}
|
|
|
|
@@ -1,22 +1,11 @@
|
|
1 |
import { Issuer, BaseClient, type UserinfoResponse, TokenSet, custom } from "openid-client";
|
2 |
import { addHours, addWeeks } from "date-fns";
|
3 |
-
import {
|
4 |
-
COOKIE_NAME,
|
5 |
-
OPENID_CLIENT_ID,
|
6 |
-
OPENID_CLIENT_SECRET,
|
7 |
-
OPENID_PROVIDER_URL,
|
8 |
-
OPENID_SCOPES,
|
9 |
-
OPENID_NAME_CLAIM,
|
10 |
-
OPENID_TOLERANCE,
|
11 |
-
OPENID_RESOURCE,
|
12 |
-
OPENID_CONFIG,
|
13 |
-
ALLOW_INSECURE_COOKIES,
|
14 |
-
} from "$env/static/private";
|
15 |
import { sha256 } from "$lib/utils/sha256";
|
16 |
import { z } from "zod";
|
17 |
import { dev } from "$app/environment";
|
18 |
import type { Cookies } from "@sveltejs/kit";
|
19 |
-
import { collections } from "
|
20 |
import JSON5 from "json5";
|
21 |
import { logger } from "$lib/server/logger";
|
22 |
|
@@ -37,27 +26,27 @@ const stringWithDefault = (value: string) =>
|
|
37 |
|
38 |
export const OIDConfig = z
|
39 |
.object({
|
40 |
-
CLIENT_ID: stringWithDefault(OPENID_CLIENT_ID),
|
41 |
-
CLIENT_SECRET: stringWithDefault(OPENID_CLIENT_SECRET),
|
42 |
-
PROVIDER_URL: stringWithDefault(OPENID_PROVIDER_URL),
|
43 |
-
SCOPES: stringWithDefault(OPENID_SCOPES),
|
44 |
-
NAME_CLAIM: stringWithDefault(OPENID_NAME_CLAIM).refine(
|
45 |
(el) => !["preferred_username", "email", "picture", "sub"].includes(el),
|
46 |
{ message: "nameClaim cannot be one of the restricted keys." }
|
47 |
),
|
48 |
-
TOLERANCE: stringWithDefault(OPENID_TOLERANCE),
|
49 |
-
RESOURCE: stringWithDefault(OPENID_RESOURCE),
|
50 |
})
|
51 |
-
.parse(JSON5.parse(OPENID_CONFIG));
|
52 |
|
53 |
export const requiresUser = !!OIDConfig.CLIENT_ID && !!OIDConfig.CLIENT_SECRET;
|
54 |
|
55 |
export function refreshSessionCookie(cookies: Cookies, sessionId: string) {
|
56 |
-
cookies.set(COOKIE_NAME, sessionId, {
|
57 |
path: "/",
|
58 |
// So that it works inside the space's iframe
|
59 |
-
sameSite: dev || ALLOW_INSECURE_COOKIES === "true" ? "lax" : "none",
|
60 |
-
secure: !dev && !(ALLOW_INSECURE_COOKIES === "true"),
|
61 |
httpOnly: true,
|
62 |
expires: addWeeks(new Date(), 2),
|
63 |
});
|
|
|
1 |
import { Issuer, BaseClient, type UserinfoResponse, TokenSet, custom } from "openid-client";
|
2 |
import { addHours, addWeeks } from "date-fns";
|
3 |
+
import { env } from "$env/dynamic/private";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
import { sha256 } from "$lib/utils/sha256";
|
5 |
import { z } from "zod";
|
6 |
import { dev } from "$app/environment";
|
7 |
import type { Cookies } from "@sveltejs/kit";
|
8 |
+
import { collections } from "$lib/server/database";
|
9 |
import JSON5 from "json5";
|
10 |
import { logger } from "$lib/server/logger";
|
11 |
|
|
|
26 |
|
27 |
export const OIDConfig = z
|
28 |
.object({
|
29 |
+
CLIENT_ID: stringWithDefault(env.OPENID_CLIENT_ID),
|
30 |
+
CLIENT_SECRET: stringWithDefault(env.OPENID_CLIENT_SECRET),
|
31 |
+
PROVIDER_URL: stringWithDefault(env.OPENID_PROVIDER_URL),
|
32 |
+
SCOPES: stringWithDefault(env.OPENID_SCOPES),
|
33 |
+
NAME_CLAIM: stringWithDefault(env.OPENID_NAME_CLAIM).refine(
|
34 |
(el) => !["preferred_username", "email", "picture", "sub"].includes(el),
|
35 |
{ message: "nameClaim cannot be one of the restricted keys." }
|
36 |
),
|
37 |
+
TOLERANCE: stringWithDefault(env.OPENID_TOLERANCE),
|
38 |
+
RESOURCE: stringWithDefault(env.OPENID_RESOURCE),
|
39 |
})
|
40 |
+
.parse(JSON5.parse(env.OPENID_CONFIG));
|
41 |
|
42 |
export const requiresUser = !!OIDConfig.CLIENT_ID && !!OIDConfig.CLIENT_SECRET;
|
43 |
|
44 |
export function refreshSessionCookie(cookies: Cookies, sessionId: string) {
|
45 |
+
cookies.set(env.COOKIE_NAME, sessionId, {
|
46 |
path: "/",
|
47 |
// So that it works inside the space's iframe
|
48 |
+
sameSite: dev || env.ALLOW_INSECURE_COOKIES === "true" ? "lax" : "none",
|
49 |
+
secure: !dev && !(env.ALLOW_INSECURE_COOKIES === "true"),
|
50 |
httpOnly: true,
|
51 |
expires: addWeeks(new Date(), 2),
|
52 |
});
|
@@ -1,4 +1,4 @@
|
|
1 |
-
import {
|
2 |
import { GridFSBucket, MongoClient } from "mongodb";
|
3 |
import type { Conversation } from "$lib/types/Conversation";
|
4 |
import type { SharedConversation } from "$lib/types/SharedConversation";
|
@@ -14,149 +14,196 @@ import type { MigrationResult } from "$lib/types/MigrationResult";
|
|
14 |
import type { Semaphore } from "$lib/types/Semaphore";
|
15 |
import type { AssistantStats } from "$lib/types/AssistantStats";
|
16 |
import { logger } from "$lib/server/logger";
|
|
|
17 |
|
18 |
-
if (!MONGODB_URL) {
|
19 |
-
throw new Error(
|
20 |
-
"Please specify the MONGODB_URL environment variable inside .env.local. Set it to mongodb://localhost:27017 if you are running MongoDB locally, or to a MongoDB Atlas free instance for example."
|
21 |
-
);
|
22 |
-
}
|
23 |
export const CONVERSATION_STATS_COLLECTION = "conversations.stats";
|
24 |
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
}
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
.
|
90 |
-
|
91 |
-
|
92 |
-
)
|
93 |
-
|
94 |
-
|
95 |
-
.
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
type: 1,
|
117 |
"date.field": 1,
|
118 |
-
"date.span": 1,
|
119 |
"date.at": 1,
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
.createIndex({
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
})
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
// Unique index for semaphore and migration results
|
160 |
-
semaphores.createIndex({ key: 1 }, { unique: true }).catch(logger.error);
|
161 |
-
semaphores.createIndex({ createdAt: 1 }, { expireAfterSeconds: 60 }).catch(logger.error);
|
162 |
-
});
|
|
|
1 |
+
import { env } from "$env/dynamic/private";
|
2 |
import { GridFSBucket, MongoClient } from "mongodb";
|
3 |
import type { Conversation } from "$lib/types/Conversation";
|
4 |
import type { SharedConversation } from "$lib/types/SharedConversation";
|
|
|
14 |
import type { Semaphore } from "$lib/types/Semaphore";
|
15 |
import type { AssistantStats } from "$lib/types/AssistantStats";
|
16 |
import { logger } from "$lib/server/logger";
|
17 |
+
import { building } from "$app/environment";
|
18 |
|
|
|
|
|
|
|
|
|
|
|
19 |
export const CONVERSATION_STATS_COLLECTION = "conversations.stats";
|
20 |
|
21 |
+
export class Database {
|
22 |
+
private client: MongoClient;
|
23 |
+
|
24 |
+
private static instance: Database;
|
25 |
+
|
26 |
+
private constructor() {
|
27 |
+
if (!env.MONGODB_URL) {
|
28 |
+
throw new Error(
|
29 |
+
"Please specify the MONGODB_URL environment variable inside .env.local. Set it to mongodb://localhost:27017 if you are running MongoDB locally, or to a MongoDB Atlas free instance for example."
|
30 |
+
);
|
31 |
+
}
|
32 |
+
|
33 |
+
this.client = new MongoClient(env.MONGODB_URL, {
|
34 |
+
directConnection: env.MONGODB_DIRECT_CONNECTION === "true",
|
35 |
+
});
|
36 |
+
|
37 |
+
this.client.connect().catch((err) => {
|
38 |
+
logger.error("Connection error", err);
|
39 |
+
process.exit(1);
|
40 |
+
});
|
41 |
+
this.client.db(env.MONGODB_DB_NAME + (import.meta.env.MODE === "test" ? "-test" : ""));
|
42 |
+
this.client.on("open", () => this.initDatabase());
|
43 |
+
|
44 |
+
// Disconnect DB on process kill
|
45 |
+
process.on("SIGINT", async () => {
|
46 |
+
await this.client.close(true);
|
47 |
+
|
48 |
+
// https://github.com/sveltejs/kit/issues/9540
|
49 |
+
setTimeout(() => {
|
50 |
+
process.exit(0);
|
51 |
+
}, 100);
|
52 |
+
});
|
53 |
+
}
|
54 |
+
|
55 |
+
public static getInstance(): Database {
|
56 |
+
if (!Database.instance) {
|
57 |
+
Database.instance = new Database();
|
58 |
+
}
|
59 |
+
|
60 |
+
return Database.instance;
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Return mongoClient
|
65 |
+
*/
|
66 |
+
public getClient(): MongoClient {
|
67 |
+
return this.client;
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Return map of database's collections
|
72 |
+
*/
|
73 |
+
public getCollections() {
|
74 |
+
const db = this.client.db(
|
75 |
+
env.MONGODB_DB_NAME + (import.meta.env.MODE === "test" ? "-test" : "")
|
76 |
+
);
|
77 |
+
|
78 |
+
const conversations = db.collection<Conversation>("conversations");
|
79 |
+
const conversationStats = db.collection<ConversationStats>(CONVERSATION_STATS_COLLECTION);
|
80 |
+
const assistants = db.collection<Assistant>("assistants");
|
81 |
+
const assistantStats = db.collection<AssistantStats>("assistants.stats");
|
82 |
+
const reports = db.collection<Report>("reports");
|
83 |
+
const sharedConversations = db.collection<SharedConversation>("sharedConversations");
|
84 |
+
const abortedGenerations = db.collection<AbortedGeneration>("abortedGenerations");
|
85 |
+
const settings = db.collection<Settings>("settings");
|
86 |
+
const users = db.collection<User>("users");
|
87 |
+
const sessions = db.collection<Session>("sessions");
|
88 |
+
const messageEvents = db.collection<MessageEvent>("messageEvents");
|
89 |
+
const bucket = new GridFSBucket(db, { bucketName: "files" });
|
90 |
+
const migrationResults = db.collection<MigrationResult>("migrationResults");
|
91 |
+
const semaphores = db.collection<Semaphore>("semaphores");
|
92 |
+
|
93 |
+
return {
|
94 |
+
conversations,
|
95 |
+
conversationStats,
|
96 |
+
assistants,
|
97 |
+
assistantStats,
|
98 |
+
reports,
|
99 |
+
sharedConversations,
|
100 |
+
abortedGenerations,
|
101 |
+
settings,
|
102 |
+
users,
|
103 |
+
sessions,
|
104 |
+
messageEvents,
|
105 |
+
bucket,
|
106 |
+
migrationResults,
|
107 |
+
semaphores,
|
108 |
+
};
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* Init database once connected: Index creation
|
113 |
+
* @private
|
114 |
+
*/
|
115 |
+
private initDatabase() {
|
116 |
+
const {
|
117 |
+
conversations,
|
118 |
+
conversationStats,
|
119 |
+
assistants,
|
120 |
+
assistantStats,
|
121 |
+
reports,
|
122 |
+
sharedConversations,
|
123 |
+
abortedGenerations,
|
124 |
+
settings,
|
125 |
+
users,
|
126 |
+
sessions,
|
127 |
+
messageEvents,
|
128 |
+
semaphores,
|
129 |
+
} = this.getCollections();
|
130 |
+
|
131 |
+
conversations
|
132 |
+
.createIndex(
|
133 |
+
{ sessionId: 1, updatedAt: -1 },
|
134 |
+
{ partialFilterExpression: { sessionId: { $exists: true } } }
|
135 |
+
)
|
136 |
+
.catch(logger.error);
|
137 |
+
conversations
|
138 |
+
.createIndex(
|
139 |
+
{ userId: 1, updatedAt: -1 },
|
140 |
+
{ partialFilterExpression: { userId: { $exists: true } } }
|
141 |
+
)
|
142 |
+
.catch(logger.error);
|
143 |
+
conversations
|
144 |
+
.createIndex(
|
145 |
+
{ "message.id": 1, "message.ancestors": 1 },
|
146 |
+
{ partialFilterExpression: { userId: { $exists: true } } }
|
147 |
+
)
|
148 |
+
.catch(logger.error);
|
149 |
+
// Not strictly necessary, could use _id, but more convenient. Also for stats
|
150 |
+
// To do stats on conversation messages
|
151 |
+
conversations.createIndex({ "messages.createdAt": 1 }, { sparse: true }).catch(logger.error);
|
152 |
+
// Unique index for stats
|
153 |
+
conversationStats
|
154 |
+
.createIndex(
|
155 |
+
{
|
156 |
+
type: 1,
|
157 |
+
"date.field": 1,
|
158 |
+
"date.span": 1,
|
159 |
+
"date.at": 1,
|
160 |
+
distinct: 1,
|
161 |
+
},
|
162 |
+
{ unique: true }
|
163 |
+
)
|
164 |
+
.catch(logger.error);
|
165 |
+
// Allow easy check of last computed stat for given type/dateField
|
166 |
+
conversationStats
|
167 |
+
.createIndex({
|
168 |
type: 1,
|
169 |
"date.field": 1,
|
|
|
170 |
"date.at": 1,
|
171 |
+
})
|
172 |
+
.catch(logger.error);
|
173 |
+
abortedGenerations
|
174 |
+
.createIndex({ updatedAt: 1 }, { expireAfterSeconds: 30 })
|
175 |
+
.catch(logger.error);
|
176 |
+
abortedGenerations.createIndex({ conversationId: 1 }, { unique: true }).catch(logger.error);
|
177 |
+
sharedConversations.createIndex({ hash: 1 }, { unique: true }).catch(logger.error);
|
178 |
+
settings.createIndex({ sessionId: 1 }, { unique: true, sparse: true }).catch(logger.error);
|
179 |
+
settings.createIndex({ userId: 1 }, { unique: true, sparse: true }).catch(logger.error);
|
180 |
+
settings.createIndex({ assistants: 1 }).catch(logger.error);
|
181 |
+
users.createIndex({ hfUserId: 1 }, { unique: true }).catch(logger.error);
|
182 |
+
users.createIndex({ sessionId: 1 }, { unique: true, sparse: true }).catch(logger.error);
|
183 |
+
// No unicity because due to renames & outdated info from oauth provider, there may be the same username on different users
|
184 |
+
users.createIndex({ username: 1 }).catch(logger.error);
|
185 |
+
messageEvents.createIndex({ createdAt: 1 }, { expireAfterSeconds: 60 }).catch(logger.error);
|
186 |
+
sessions.createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 }).catch(logger.error);
|
187 |
+
sessions.createIndex({ sessionId: 1 }, { unique: true }).catch(logger.error);
|
188 |
+
assistants.createIndex({ createdById: 1, userCount: -1 }).catch(logger.error);
|
189 |
+
assistants.createIndex({ userCount: 1 }).catch(logger.error);
|
190 |
+
assistants.createIndex({ featured: 1, userCount: -1 }).catch(logger.error);
|
191 |
+
assistants.createIndex({ modelId: 1, userCount: -1 }).catch(logger.error);
|
192 |
+
assistants.createIndex({ searchTokens: 1 }).catch(logger.error);
|
193 |
+
assistants.createIndex({ last24HoursCount: 1 }).catch(logger.error);
|
194 |
+
assistantStats
|
195 |
+
// Order of keys is important for the queries
|
196 |
+
.createIndex({ "date.span": 1, "date.at": 1, assistantId: 1 }, { unique: true })
|
197 |
+
.catch(logger.error);
|
198 |
+
reports.createIndex({ assistantId: 1 }).catch(logger.error);
|
199 |
+
reports.createIndex({ createdBy: 1, assistantId: 1 }).catch(logger.error);
|
200 |
+
|
201 |
+
// Unique index for semaphore and migration results
|
202 |
+
semaphores.createIndex({ key: 1 }, { unique: true }).catch(logger.error);
|
203 |
+
semaphores.createIndex({ createdAt: 1 }, { expireAfterSeconds: 60 }).catch(logger.error);
|
204 |
+
}
|
205 |
+
}
|
206 |
+
|
207 |
+
export const collections = building
|
208 |
+
? ({} as unknown as ReturnType<typeof Database.prototype.getCollections>)
|
209 |
+
: Database.getInstance().getCollections();
|
|
|
|
|
|
|
|
@@ -1,7 +1,7 @@
|
|
1 |
import { z } from "zod";
|
2 |
import type { EmbeddingEndpoint, Embedding } from "../embeddingEndpoints";
|
3 |
import { chunk } from "$lib/utils/chunk";
|
4 |
-
import {
|
5 |
import { logger } from "$lib/server/logger";
|
6 |
|
7 |
export const embeddingEndpointHfApiSchema = z.object({
|
@@ -11,7 +11,7 @@ export const embeddingEndpointHfApiSchema = z.object({
|
|
11 |
authorization: z
|
12 |
.string()
|
13 |
.optional()
|
14 |
-
.transform((v) => (!v && HF_TOKEN ? "Bearer " + HF_TOKEN : v)), // if the header is not set but HF_TOKEN is, use it as the authorization header
|
15 |
});
|
16 |
|
17 |
export async function embeddingEndpointHfApi(
|
|
|
1 |
import { z } from "zod";
|
2 |
import type { EmbeddingEndpoint, Embedding } from "../embeddingEndpoints";
|
3 |
import { chunk } from "$lib/utils/chunk";
|
4 |
+
import { env } from "$env/dynamic/private";
|
5 |
import { logger } from "$lib/server/logger";
|
6 |
|
7 |
export const embeddingEndpointHfApiSchema = z.object({
|
|
|
11 |
authorization: z
|
12 |
.string()
|
13 |
.optional()
|
14 |
+
.transform((v) => (!v && env.HF_TOKEN ? "Bearer " + env.HF_TOKEN : v)), // if the header is not set but HF_TOKEN is, use it as the authorization header
|
15 |
});
|
16 |
|
17 |
export async function embeddingEndpointHfApi(
|
@@ -1,14 +1,14 @@
|
|
1 |
import { z } from "zod";
|
2 |
import type { EmbeddingEndpoint, Embedding } from "../embeddingEndpoints";
|
3 |
import { chunk } from "$lib/utils/chunk";
|
4 |
-
import {
|
5 |
|
6 |
export const embeddingEndpointOpenAIParametersSchema = z.object({
|
7 |
weight: z.number().int().positive().default(1),
|
8 |
model: z.any(),
|
9 |
type: z.literal("openai"),
|
10 |
url: z.string().url().default("https://api.openai.com/v1/embeddings"),
|
11 |
-
apiKey: z.string().default(OPENAI_API_KEY),
|
12 |
});
|
13 |
|
14 |
export async function embeddingEndpointOpenAI(
|
|
|
1 |
import { z } from "zod";
|
2 |
import type { EmbeddingEndpoint, Embedding } from "../embeddingEndpoints";
|
3 |
import { chunk } from "$lib/utils/chunk";
|
4 |
+
import { env } from "$env/dynamic/private";
|
5 |
|
6 |
export const embeddingEndpointOpenAIParametersSchema = z.object({
|
7 |
weight: z.number().int().positive().default(1),
|
8 |
model: z.any(),
|
9 |
type: z.literal("openai"),
|
10 |
url: z.string().url().default("https://api.openai.com/v1/embeddings"),
|
11 |
+
apiKey: z.string().default(env.OPENAI_API_KEY),
|
12 |
});
|
13 |
|
14 |
export async function embeddingEndpointOpenAI(
|
@@ -1,7 +1,7 @@
|
|
1 |
import { z } from "zod";
|
2 |
import type { EmbeddingEndpoint, Embedding } from "../embeddingEndpoints";
|
3 |
import { chunk } from "$lib/utils/chunk";
|
4 |
-
import {
|
5 |
import { logger } from "$lib/server/logger";
|
6 |
|
7 |
export const embeddingEndpointTeiParametersSchema = z.object({
|
@@ -12,7 +12,7 @@ export const embeddingEndpointTeiParametersSchema = z.object({
|
|
12 |
authorization: z
|
13 |
.string()
|
14 |
.optional()
|
15 |
-
.transform((v) => (!v && HF_TOKEN ? "Bearer " + HF_TOKEN : v)), // if the header is not set but HF_TOKEN is, use it as the authorization header
|
16 |
});
|
17 |
|
18 |
const getModelInfoByUrl = async (url: string, authorization?: string) => {
|
|
|
1 |
import { z } from "zod";
|
2 |
import type { EmbeddingEndpoint, Embedding } from "../embeddingEndpoints";
|
3 |
import { chunk } from "$lib/utils/chunk";
|
4 |
+
import { env } from "$env/dynamic/private";
|
5 |
import { logger } from "$lib/server/logger";
|
6 |
|
7 |
export const embeddingEndpointTeiParametersSchema = z.object({
|
|
|
12 |
authorization: z
|
13 |
.string()
|
14 |
.optional()
|
15 |
+
.transform((v) => (!v && env.HF_TOKEN ? "Bearer " + env.HF_TOKEN : v)), // if the header is not set but HF_TOKEN is, use it as the authorization header
|
16 |
});
|
17 |
|
18 |
const getModelInfoByUrl = async (url: string, authorization?: string) => {
|
@@ -1,4 +1,4 @@
|
|
1 |
-
import {
|
2 |
|
3 |
import { z } from "zod";
|
4 |
import { sum } from "$lib/utils/sum";
|
@@ -29,7 +29,7 @@ const modelConfig = z.object({
|
|
29 |
|
30 |
// Default embedding model for backward compatibility
|
31 |
const rawEmbeddingModelJSON =
|
32 |
-
TEXT_EMBEDDING_MODELS ||
|
33 |
`[
|
34 |
{
|
35 |
"name": "Xenova/gte-small",
|
|
|
1 |
+
import { env } from "$env/dynamic/private";
|
2 |
|
3 |
import { z } from "zod";
|
4 |
import { sum } from "$lib/utils/sum";
|
|
|
29 |
|
30 |
// Default embedding model for backward compatibility
|
31 |
const rawEmbeddingModelJSON =
|
32 |
+
env.TEXT_EMBEDDING_MODELS ||
|
33 |
`[
|
34 |
{
|
35 |
"name": "Xenova/gte-small",
|
@@ -1,5 +1,5 @@
|
|
1 |
import { z } from "zod";
|
2 |
-
import {
|
3 |
import type { Endpoint } from "../endpoints";
|
4 |
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
5 |
|
@@ -8,7 +8,7 @@ export const endpointAnthropicParametersSchema = z.object({
|
|
8 |
model: z.any(),
|
9 |
type: z.literal("anthropic"),
|
10 |
baseURL: z.string().url().default("https://api.anthropic.com"),
|
11 |
-
apiKey: z.string().default(ANTHROPIC_API_KEY ?? "sk-"),
|
12 |
defaultHeaders: z.record(z.string()).optional(),
|
13 |
defaultQuery: z.record(z.string()).optional(),
|
14 |
});
|
|
|
1 |
import { z } from "zod";
|
2 |
+
import { env } from "$env/dynamic/private";
|
3 |
import type { Endpoint } from "../endpoints";
|
4 |
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
5 |
|
|
|
8 |
model: z.any(),
|
9 |
type: z.literal("anthropic"),
|
10 |
baseURL: z.string().url().default("https://api.anthropic.com"),
|
11 |
+
apiKey: z.string().default(env.ANTHROPIC_API_KEY ?? "sk-"),
|
12 |
defaultHeaders: z.record(z.string()).optional(),
|
13 |
defaultQuery: z.record(z.string()).optional(),
|
14 |
});
|
@@ -1,15 +1,15 @@
|
|
1 |
import { z } from "zod";
|
2 |
import type { Endpoint } from "../endpoints";
|
3 |
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
4 |
-
import {
|
5 |
import { logger } from "$lib/server/logger";
|
6 |
|
7 |
export const endpointCloudflareParametersSchema = z.object({
|
8 |
weight: z.number().int().positive().default(1),
|
9 |
model: z.any(),
|
10 |
type: z.literal("cloudflare"),
|
11 |
-
accountId: z.string().default(CLOUDFLARE_ACCOUNT_ID),
|
12 |
-
apiToken: z.string().default(CLOUDFLARE_API_TOKEN),
|
13 |
});
|
14 |
|
15 |
export async function endpointCloudflare(
|
|
|
1 |
import { z } from "zod";
|
2 |
import type { Endpoint } from "../endpoints";
|
3 |
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
4 |
+
import { env } from "$env/dynamic/private";
|
5 |
import { logger } from "$lib/server/logger";
|
6 |
|
7 |
export const endpointCloudflareParametersSchema = z.object({
|
8 |
weight: z.number().int().positive().default(1),
|
9 |
model: z.any(),
|
10 |
type: z.literal("cloudflare"),
|
11 |
+
accountId: z.string().default(env.CLOUDFLARE_ACCOUNT_ID),
|
12 |
+
apiToken: z.string().default(env.CLOUDFLARE_API_TOKEN),
|
13 |
});
|
14 |
|
15 |
export async function endpointCloudflare(
|
@@ -1,5 +1,5 @@
|
|
1 |
import { z } from "zod";
|
2 |
-
import {
|
3 |
import type { Endpoint } from "../endpoints";
|
4 |
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
5 |
import type { Cohere, CohereClient } from "cohere-ai";
|
@@ -9,7 +9,7 @@ export const endpointCohereParametersSchema = z.object({
|
|
9 |
weight: z.number().int().positive().default(1),
|
10 |
model: z.any(),
|
11 |
type: z.literal("cohere"),
|
12 |
-
apiKey: z.string().default(COHERE_API_TOKEN),
|
13 |
raw: z.boolean().default(false),
|
14 |
});
|
15 |
|
|
|
1 |
import { z } from "zod";
|
2 |
+
import { env } from "$env/dynamic/private";
|
3 |
import type { Endpoint } from "../endpoints";
|
4 |
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
5 |
import type { Cohere, CohereClient } from "cohere-ai";
|
|
|
9 |
weight: z.number().int().positive().default(1),
|
10 |
model: z.any(),
|
11 |
type: z.literal("cohere"),
|
12 |
+
apiKey: z.string().default(env.COHERE_API_TOKEN),
|
13 |
raw: z.boolean().default(false),
|
14 |
});
|
15 |
|
@@ -1,4 +1,4 @@
|
|
1 |
-
import {
|
2 |
import { buildPrompt } from "$lib/buildPrompt";
|
3 |
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
4 |
import type { Endpoint } from "../endpoints";
|
@@ -13,7 +13,7 @@ export const endpointLlamacppParametersSchema = z.object({
|
|
13 |
accessToken: z
|
14 |
.string()
|
15 |
.min(1)
|
16 |
-
.default(HF_TOKEN ?? HF_ACCESS_TOKEN),
|
17 |
});
|
18 |
|
19 |
export function endpointLlamacpp(
|
|
|
1 |
+
import { env } from "$env/dynamic/private";
|
2 |
import { buildPrompt } from "$lib/buildPrompt";
|
3 |
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
4 |
import type { Endpoint } from "../endpoints";
|
|
|
13 |
accessToken: z
|
14 |
.string()
|
15 |
.min(1)
|
16 |
+
.default(env.HF_TOKEN ?? env.HF_ACCESS_TOKEN),
|
17 |
});
|
18 |
|
19 |
export function endpointLlamacpp(
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
2 |
import { openAICompletionToTextGenerationStream } from "./openAICompletionToTextGenerationStream";
|
3 |
import { openAIChatToTextGenerationStream } from "./openAIChatToTextGenerationStream";
|
4 |
import { buildPrompt } from "$lib/buildPrompt";
|
5 |
-
import {
|
6 |
import type { Endpoint } from "../endpoints";
|
7 |
|
8 |
export const endpointOAIParametersSchema = z.object({
|
@@ -10,7 +10,7 @@ export const endpointOAIParametersSchema = z.object({
|
|
10 |
model: z.any(),
|
11 |
type: z.literal("openai"),
|
12 |
baseURL: z.string().url().default("https://api.openai.com/v1"),
|
13 |
-
apiKey: z.string().default(OPENAI_API_KEY ?? "sk-"),
|
14 |
completion: z
|
15 |
.union([z.literal("completions"), z.literal("chat_completions")])
|
16 |
.default("chat_completions"),
|
|
|
2 |
import { openAICompletionToTextGenerationStream } from "./openAICompletionToTextGenerationStream";
|
3 |
import { openAIChatToTextGenerationStream } from "./openAIChatToTextGenerationStream";
|
4 |
import { buildPrompt } from "$lib/buildPrompt";
|
5 |
+
import { env } from "$env/dynamic/private";
|
6 |
import type { Endpoint } from "../endpoints";
|
7 |
|
8 |
export const endpointOAIParametersSchema = z.object({
|
|
|
10 |
model: z.any(),
|
11 |
type: z.literal("openai"),
|
12 |
baseURL: z.string().url().default("https://api.openai.com/v1"),
|
13 |
+
apiKey: z.string().default(env.OPENAI_API_KEY ?? "sk-"),
|
14 |
completion: z
|
15 |
.union([z.literal("completions"), z.literal("chat_completions")])
|
16 |
.default("chat_completions"),
|
@@ -1,4 +1,4 @@
|
|
1 |
-
import {
|
2 |
import { buildPrompt } from "$lib/buildPrompt";
|
3 |
import { textGenerationStream } from "@huggingface/inference";
|
4 |
import type { Endpoint } from "../endpoints";
|
@@ -9,7 +9,7 @@ export const endpointTgiParametersSchema = z.object({
|
|
9 |
model: z.any(),
|
10 |
type: z.literal("tgi"),
|
11 |
url: z.string().url(),
|
12 |
-
accessToken: z.string().default(HF_TOKEN ?? HF_ACCESS_TOKEN),
|
13 |
authorization: z.string().optional(),
|
14 |
});
|
15 |
|
|
|
1 |
+
import { env } from "$env/dynamic/private";
|
2 |
import { buildPrompt } from "$lib/buildPrompt";
|
3 |
import { textGenerationStream } from "@huggingface/inference";
|
4 |
import type { Endpoint } from "../endpoints";
|
|
|
9 |
model: z.any(),
|
10 |
type: z.literal("tgi"),
|
11 |
url: z.string().url(),
|
12 |
+
accessToken: z.string().default(env.HF_TOKEN ?? env.HF_ACCESS_TOKEN),
|
13 |
authorization: z.string().optional(),
|
14 |
});
|
15 |
|
@@ -1,5 +1,5 @@
|
|
1 |
import { error } from "@sveltejs/kit";
|
2 |
-
import { collections } from "
|
3 |
import type { Conversation } from "$lib/types/Conversation";
|
4 |
import type { SharedConversation } from "$lib/types/SharedConversation";
|
5 |
|
|
|
1 |
import { error } from "@sveltejs/kit";
|
2 |
+
import { collections } from "$lib/server/database";
|
3 |
import type { Conversation } from "$lib/types/Conversation";
|
4 |
import type { SharedConversation } from "$lib/types/SharedConversation";
|
5 |
|
@@ -1,6 +1,6 @@
|
|
1 |
import type { Conversation } from "$lib/types/Conversation";
|
2 |
import { sha256 } from "$lib/utils/sha256";
|
3 |
-
import { collections } from "
|
4 |
|
5 |
export async function uploadFile(file: Blob, conv: Conversation): Promise<string> {
|
6 |
const sha = await sha256(await file.text());
|
|
|
1 |
import type { Conversation } from "$lib/types/Conversation";
|
2 |
import { sha256 } from "$lib/utils/sha256";
|
3 |
+
import { collections } from "$lib/server/database";
|
4 |
|
5 |
export async function uploadFile(file: Blob, conv: Conversation): Promise<string> {
|
6 |
const sha = await sha256(await file.text());
|
@@ -1,11 +1,11 @@
|
|
1 |
import pino from "pino";
|
2 |
import { dev } from "$app/environment";
|
|
|
3 |
|
4 |
let options: pino.LoggerOptions = {};
|
5 |
|
6 |
if (dev) {
|
7 |
options = {
|
8 |
-
level: "debug",
|
9 |
transport: {
|
10 |
target: "pino-pretty",
|
11 |
options: {
|
@@ -15,4 +15,4 @@ if (dev) {
|
|
15 |
};
|
16 |
}
|
17 |
|
18 |
-
export const logger = pino(options);
|
|
|
1 |
import pino from "pino";
|
2 |
import { dev } from "$app/environment";
|
3 |
+
import { env } from "$env/dynamic/private";
|
4 |
|
5 |
let options: pino.LoggerOptions = {};
|
6 |
|
7 |
if (dev) {
|
8 |
options = {
|
|
|
9 |
transport: {
|
10 |
target: "pino-pretty",
|
11 |
options: {
|
|
|
15 |
};
|
16 |
}
|
17 |
|
18 |
+
export const logger = pino({ ...options, level: env.LOG_LEVEL ?? "info" });
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { collectDefaultMetrics, Registry } from "prom-client";
|
2 |
+
import express from "express";
|
3 |
+
import { logger } from "$lib/server/logger";
|
4 |
+
import { env } from "$env/dynamic/private";
|
5 |
+
|
6 |
+
export class MetricsServer {
|
7 |
+
private static instance: MetricsServer;
|
8 |
+
|
9 |
+
private constructor() {
|
10 |
+
const app = express();
|
11 |
+
const port = env.METRICS_PORT || "5565";
|
12 |
+
|
13 |
+
const server = app.listen(port, () => {
|
14 |
+
logger.info(`Metrics server listening on port ${port}`);
|
15 |
+
});
|
16 |
+
|
17 |
+
const register = new Registry();
|
18 |
+
collectDefaultMetrics({ register });
|
19 |
+
|
20 |
+
app.get("/metrics", (req, res) => {
|
21 |
+
register.metrics().then((metrics) => {
|
22 |
+
res.set("Content-Type", "text/plain");
|
23 |
+
res.send(metrics);
|
24 |
+
});
|
25 |
+
});
|
26 |
+
|
27 |
+
process.on("SIGINT", async () => {
|
28 |
+
logger.info("Sigint received, disconnect metrics server ...");
|
29 |
+
server.close(() => {
|
30 |
+
logger.info("Server stopped ...");
|
31 |
+
});
|
32 |
+
process.exit();
|
33 |
+
});
|
34 |
+
}
|
35 |
+
|
36 |
+
public static getInstance(): MetricsServer {
|
37 |
+
if (!MetricsServer.instance) {
|
38 |
+
MetricsServer.instance = new MetricsServer();
|
39 |
+
}
|
40 |
+
|
41 |
+
return MetricsServer.instance;
|
42 |
+
}
|
43 |
+
}
|
@@ -1,11 +1,4 @@
|
|
1 |
-
import {
|
2 |
-
HF_TOKEN,
|
3 |
-
HF_API_ROOT,
|
4 |
-
MODELS,
|
5 |
-
OLD_MODELS,
|
6 |
-
TASK_MODEL,
|
7 |
-
HF_ACCESS_TOKEN,
|
8 |
-
} from "$env/static/private";
|
9 |
import type { ChatTemplateInput } from "$lib/types/Template";
|
10 |
import { compileTemplate } from "$lib/utils/template";
|
11 |
import { z } from "zod";
|
@@ -72,7 +65,7 @@ const modelConfig = z.object({
|
|
72 |
embeddingModel: validateEmbeddingModelByName(embeddingModels).optional(),
|
73 |
});
|
74 |
|
75 |
-
const modelsRaw = z.array(modelConfig).parse(JSON5.parse(MODELS));
|
76 |
|
77 |
async function getChatPromptRender(
|
78 |
m: z.infer<typeof modelConfig>
|
@@ -147,8 +140,8 @@ const addEndpoint = (m: Awaited<ReturnType<typeof processModel>>) => ({
|
|
147 |
if (!m.endpoints) {
|
148 |
return endpointTgi({
|
149 |
type: "tgi",
|
150 |
-
url: `${HF_API_ROOT}/${m.name}`,
|
151 |
-
accessToken: HF_TOKEN ?? HF_ACCESS_TOKEN,
|
152 |
weight: 1,
|
153 |
model: m,
|
154 |
});
|
@@ -199,7 +192,7 @@ export const models = await Promise.all(modelsRaw.map((e) => processModel(e).the
|
|
199 |
export const defaultModel = models[0];
|
200 |
|
201 |
// Models that have been deprecated
|
202 |
-
export const oldModels = OLD_MODELS
|
203 |
? z
|
204 |
.array(
|
205 |
z.object({
|
@@ -208,7 +201,7 @@ export const oldModels = OLD_MODELS
|
|
208 |
displayName: z.string().min(1).optional(),
|
209 |
})
|
210 |
)
|
211 |
-
.parse(JSON5.parse(OLD_MODELS))
|
212 |
.map((m) => ({ ...m, id: m.id || m.name, displayName: m.displayName || m.name }))
|
213 |
: [];
|
214 |
|
@@ -219,9 +212,9 @@ export const validateModel = (_models: BackendModel[]) => {
|
|
219 |
|
220 |
// if `TASK_MODEL` is string & name of a model in `MODELS`, then we use `MODELS[TASK_MODEL]`, else we try to parse `TASK_MODEL` as a model config itself
|
221 |
|
222 |
-
export const smallModel = TASK_MODEL
|
223 |
-
? (models.find((m) => m.name === TASK_MODEL) ||
|
224 |
-
(await processModel(modelConfig.parse(JSON5.parse(TASK_MODEL))).then((m) =>
|
225 |
addEndpoint(m)
|
226 |
))) ??
|
227 |
defaultModel
|
|
|
1 |
+
import { env } from "$env/dynamic/private";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
import type { ChatTemplateInput } from "$lib/types/Template";
|
3 |
import { compileTemplate } from "$lib/utils/template";
|
4 |
import { z } from "zod";
|
|
|
65 |
embeddingModel: validateEmbeddingModelByName(embeddingModels).optional(),
|
66 |
});
|
67 |
|
68 |
+
const modelsRaw = z.array(modelConfig).parse(JSON5.parse(env.MODELS));
|
69 |
|
70 |
async function getChatPromptRender(
|
71 |
m: z.infer<typeof modelConfig>
|
|
|
140 |
if (!m.endpoints) {
|
141 |
return endpointTgi({
|
142 |
type: "tgi",
|
143 |
+
url: `${env.HF_API_ROOT}/${m.name}`,
|
144 |
+
accessToken: env.HF_TOKEN ?? env.HF_ACCESS_TOKEN,
|
145 |
weight: 1,
|
146 |
model: m,
|
147 |
});
|
|
|
192 |
export const defaultModel = models[0];
|
193 |
|
194 |
// Models that have been deprecated
|
195 |
+
export const oldModels = env.OLD_MODELS
|
196 |
? z
|
197 |
.array(
|
198 |
z.object({
|
|
|
201 |
displayName: z.string().min(1).optional(),
|
202 |
})
|
203 |
)
|
204 |
+
.parse(JSON5.parse(env.OLD_MODELS))
|
205 |
.map((m) => ({ ...m, id: m.id || m.name, displayName: m.displayName || m.name }))
|
206 |
: [];
|
207 |
|
|
|
212 |
|
213 |
// if `TASK_MODEL` is string & name of a model in `MODELS`, then we use `MODELS[TASK_MODEL]`, else we try to parse `TASK_MODEL` as a model config itself
|
214 |
|
215 |
+
export const smallModel = env.TASK_MODEL
|
216 |
+
? (models.find((m) => m.name === env.TASK_MODEL) ||
|
217 |
+
(await processModel(modelConfig.parse(JSON5.parse(env.TASK_MODEL))).then((m) =>
|
218 |
addEndpoint(m)
|
219 |
))) ??
|
220 |
defaultModel
|
@@ -1,10 +1,10 @@
|
|
1 |
-
import {
|
2 |
import { generateFromDefaultEndpoint } from "$lib/server/generateFromDefaultEndpoint";
|
3 |
import type { Message } from "$lib/types/Message";
|
4 |
import { logger } from "$lib/server/logger";
|
5 |
|
6 |
export async function summarize(prompt: string) {
|
7 |
-
if (!LLM_SUMMERIZATION) {
|
8 |
return prompt.split(/\s+/g).slice(0, 5).join(" ");
|
9 |
}
|
10 |
|
|
|
1 |
+
import { env } from "$env/dynamic/private";
|
2 |
import { generateFromDefaultEndpoint } from "$lib/server/generateFromDefaultEndpoint";
|
3 |
import type { Message } from "$lib/types/Message";
|
4 |
import { logger } from "$lib/server/logger";
|
5 |
|
6 |
export async function summarize(prompt: string) {
|
7 |
+
if (!env.LLM_SUMMERIZATION) {
|
8 |
return prompt.split(/\s+/g).slice(0, 5).join(" ");
|
9 |
}
|
10 |
|
@@ -1,5 +1,5 @@
|
|
1 |
import { z } from "zod";
|
2 |
-
import {
|
3 |
import JSON5 from "json5";
|
4 |
|
5 |
// RATE_LIMIT is the legacy way to define messages per minute limit
|
@@ -12,7 +12,7 @@ export const usageLimitsSchema = z
|
|
12 |
messagesPerMinute: z
|
13 |
.preprocess((val) => {
|
14 |
if (val === undefined) {
|
15 |
-
return RATE_LIMIT;
|
16 |
}
|
17 |
return val;
|
18 |
}, z.coerce.number().optional())
|
@@ -20,4 +20,4 @@ export const usageLimitsSchema = z
|
|
20 |
})
|
21 |
.optional();
|
22 |
|
23 |
-
export const usageLimits = usageLimitsSchema.parse(JSON5.parse(USAGE_LIMITS));
|
|
|
1 |
import { z } from "zod";
|
2 |
+
import { env } from "$env/dynamic/private";
|
3 |
import JSON5 from "json5";
|
4 |
|
5 |
// RATE_LIMIT is the legacy way to define messages per minute limit
|
|
|
12 |
messagesPerMinute: z
|
13 |
.preprocess((val) => {
|
14 |
if (val === undefined) {
|
15 |
+
return env.RATE_LIMIT;
|
16 |
}
|
17 |
return val;
|
18 |
}, z.coerce.number().optional())
|
|
|
20 |
})
|
21 |
.optional();
|
22 |
|
23 |
+
export const usageLimits = usageLimitsSchema.parse(JSON5.parse(env.USAGE_LIMITS));
|
@@ -5,7 +5,7 @@ import { chunk } from "$lib/utils/chunk";
|
|
5 |
import { findSimilarSentences } from "$lib/server/sentenceSimilarity";
|
6 |
import { getWebSearchProvider } from "./searchWeb";
|
7 |
import { defaultEmbeddingModel, embeddingModels } from "$lib/server/embeddingModels";
|
8 |
-
import {
|
9 |
|
10 |
import type { Conversation } from "$lib/types/Conversation";
|
11 |
import type { MessageUpdate } from "$lib/types/MessageUpdate";
|
@@ -22,8 +22,8 @@ const MAX_N_PAGES_EMBED = 5 as const;
|
|
22 |
|
23 |
const listSchema = z.array(z.string()).default([]);
|
24 |
|
25 |
-
const allowList = listSchema.parse(JSON5.parse(WEBSEARCH_ALLOWLIST));
|
26 |
-
const blockList = listSchema.parse(JSON5.parse(WEBSEARCH_BLOCKLIST));
|
27 |
|
28 |
export async function runWebSearch(
|
29 |
conv: Conversation,
|
@@ -52,7 +52,7 @@ export async function runWebSearch(
|
|
52 |
|
53 |
let linksToUse = [...ragSettings.allowedLinks];
|
54 |
|
55 |
-
if (ENABLE_LOCAL_FETCH !== "true") {
|
56 |
const localLinks = await Promise.all(
|
57 |
linksToUse.map(async (link) => {
|
58 |
try {
|
|
|
5 |
import { findSimilarSentences } from "$lib/server/sentenceSimilarity";
|
6 |
import { getWebSearchProvider } from "./searchWeb";
|
7 |
import { defaultEmbeddingModel, embeddingModels } from "$lib/server/embeddingModels";
|
8 |
+
import { env } from "$env/dynamic/private";
|
9 |
|
10 |
import type { Conversation } from "$lib/types/Conversation";
|
11 |
import type { MessageUpdate } from "$lib/types/MessageUpdate";
|
|
|
22 |
|
23 |
const listSchema = z.array(z.string()).default([]);
|
24 |
|
25 |
+
const allowList = listSchema.parse(JSON5.parse(env.WEBSEARCH_ALLOWLIST));
|
26 |
+
const blockList = listSchema.parse(JSON5.parse(env.WEBSEARCH_BLOCKLIST));
|
27 |
|
28 |
export async function runWebSearch(
|
29 |
conv: Conversation,
|
|
|
52 |
|
53 |
let linksToUse = [...ragSettings.allowedLinks];
|
54 |
|
55 |
+
if (env.ENABLE_LOCAL_FETCH !== "true") {
|
56 |
const localLinks = await Promise.all(
|
57 |
linksToUse.map(async (link) => {
|
58 |
try {
|
@@ -1,4 +1,4 @@
|
|
1 |
-
import {
|
2 |
import { logger } from "$lib/server/logger";
|
3 |
|
4 |
export async function searchSearxng(query: string) {
|
@@ -6,7 +6,7 @@ export async function searchSearxng(query: string) {
|
|
6 |
setTimeout(() => abortController.abort(), 10000);
|
7 |
|
8 |
// Insert the query into the URL template
|
9 |
-
let url = SEARXNG_QUERY_URL.replace("<query>", query);
|
10 |
|
11 |
// Check if "&format=json" already exists in the URL
|
12 |
if (!url.includes("&format=json")) {
|
|
|
1 |
+
import { env } from "$env/dynamic/private";
|
2 |
import { logger } from "$lib/server/logger";
|
3 |
|
4 |
export async function searchSearxng(query: string) {
|
|
|
6 |
setTimeout(() => abortController.abort(), 10000);
|
7 |
|
8 |
// Insert the query into the URL template
|
9 |
+
let url = env.SEARXNG_QUERY_URL.replace("<query>", query);
|
10 |
|
11 |
// Check if "&format=json" already exists in the URL
|
12 |
if (!url.includes("&format=json")) {
|
@@ -1,13 +1,6 @@
|
|
1 |
import type { YouWebSearch } from "../../types/WebSearch";
|
2 |
import { WebSearchProvider } from "../../types/WebSearch";
|
3 |
-
import {
|
4 |
-
SERPAPI_KEY,
|
5 |
-
SERPER_API_KEY,
|
6 |
-
SERPSTACK_API_KEY,
|
7 |
-
USE_LOCAL_WEBSEARCH,
|
8 |
-
SEARXNG_QUERY_URL,
|
9 |
-
YDC_API_KEY,
|
10 |
-
} from "$env/static/private";
|
11 |
import { getJson } from "serpapi";
|
12 |
import type { GoogleParameters } from "serpapi";
|
13 |
import { searchWebLocal } from "./searchWebLocal";
|
@@ -15,9 +8,9 @@ import { searchSearxng } from "./searchSearxng";
|
|
15 |
|
16 |
// get which SERP api is providing web results
|
17 |
export function getWebSearchProvider() {
|
18 |
-
if (YDC_API_KEY) {
|
19 |
return WebSearchProvider.YOU;
|
20 |
-
} else if (SEARXNG_QUERY_URL) {
|
21 |
return WebSearchProvider.SEARXNG;
|
22 |
} else {
|
23 |
return WebSearchProvider.GOOGLE;
|
@@ -26,22 +19,22 @@ export function getWebSearchProvider() {
|
|
26 |
|
27 |
// Show result as JSON
|
28 |
export async function searchWeb(query: string) {
|
29 |
-
if (USE_LOCAL_WEBSEARCH) {
|
30 |
return await searchWebLocal(query);
|
31 |
}
|
32 |
-
if (SEARXNG_QUERY_URL) {
|
33 |
return await searchSearxng(query);
|
34 |
}
|
35 |
-
if (SERPER_API_KEY) {
|
36 |
return await searchWebSerper(query);
|
37 |
}
|
38 |
-
if (YDC_API_KEY) {
|
39 |
return await searchWebYouApi(query);
|
40 |
}
|
41 |
-
if (SERPAPI_KEY) {
|
42 |
return await searchWebSerpApi(query);
|
43 |
}
|
44 |
-
if (SERPSTACK_API_KEY) {
|
45 |
return await searchSerpStack(query);
|
46 |
}
|
47 |
throw new Error("No You.com or Serper.dev or SerpAPI key found");
|
@@ -58,7 +51,7 @@ export async function searchWebSerper(query: string) {
|
|
58 |
method: "POST",
|
59 |
body: JSON.stringify(params),
|
60 |
headers: {
|
61 |
-
"x-api-key": SERPER_API_KEY,
|
62 |
"Content-type": "application/json; charset=UTF-8",
|
63 |
},
|
64 |
});
|
@@ -84,7 +77,7 @@ export async function searchWebSerpApi(query: string) {
|
|
84 |
hl: "en",
|
85 |
gl: "us",
|
86 |
google_domain: "google.com",
|
87 |
-
api_key: SERPAPI_KEY,
|
88 |
} satisfies GoogleParameters;
|
89 |
|
90 |
// Show result as JSON
|
@@ -97,7 +90,7 @@ export async function searchWebYouApi(query: string) {
|
|
97 |
const response = await fetch(`https://api.ydc-index.io/search?query=${query}`, {
|
98 |
method: "GET",
|
99 |
headers: {
|
100 |
-
"X-API-Key": YDC_API_KEY,
|
101 |
"Content-type": "application/json; charset=UTF-8",
|
102 |
},
|
103 |
});
|
@@ -123,7 +116,7 @@ export async function searchWebYouApi(query: string) {
|
|
123 |
|
124 |
export async function searchSerpStack(query: string) {
|
125 |
const response = await fetch(
|
126 |
-
`http://api.serpstack.com/search?access_key=${SERPSTACK_API_KEY}&query=${query}&hl=en&gl=us`,
|
127 |
{
|
128 |
method: "GET",
|
129 |
headers: {
|
|
|
1 |
import type { YouWebSearch } from "../../types/WebSearch";
|
2 |
import { WebSearchProvider } from "../../types/WebSearch";
|
3 |
+
import { env } from "$env/dynamic/private";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
import { getJson } from "serpapi";
|
5 |
import type { GoogleParameters } from "serpapi";
|
6 |
import { searchWebLocal } from "./searchWebLocal";
|
|
|
8 |
|
9 |
// get which SERP api is providing web results
|
10 |
export function getWebSearchProvider() {
|
11 |
+
if (env.YDC_API_KEY) {
|
12 |
return WebSearchProvider.YOU;
|
13 |
+
} else if (env.SEARXNG_QUERY_URL) {
|
14 |
return WebSearchProvider.SEARXNG;
|
15 |
} else {
|
16 |
return WebSearchProvider.GOOGLE;
|
|
|
19 |
|
20 |
// Show result as JSON
|
21 |
export async function searchWeb(query: string) {
|
22 |
+
if (env.USE_LOCAL_WEBSEARCH) {
|
23 |
return await searchWebLocal(query);
|
24 |
}
|
25 |
+
if (env.SEARXNG_QUERY_URL) {
|
26 |
return await searchSearxng(query);
|
27 |
}
|
28 |
+
if (env.SERPER_API_KEY) {
|
29 |
return await searchWebSerper(query);
|
30 |
}
|
31 |
+
if (env.YDC_API_KEY) {
|
32 |
return await searchWebYouApi(query);
|
33 |
}
|
34 |
+
if (env.SERPAPI_KEY) {
|
35 |
return await searchWebSerpApi(query);
|
36 |
}
|
37 |
+
if (env.SERPSTACK_API_KEY) {
|
38 |
return await searchSerpStack(query);
|
39 |
}
|
40 |
throw new Error("No You.com or Serper.dev or SerpAPI key found");
|
|
|
51 |
method: "POST",
|
52 |
body: JSON.stringify(params),
|
53 |
headers: {
|
54 |
+
"x-api-key": env.SERPER_API_KEY,
|
55 |
"Content-type": "application/json; charset=UTF-8",
|
56 |
},
|
57 |
});
|
|
|
77 |
hl: "en",
|
78 |
gl: "us",
|
79 |
google_domain: "google.com",
|
80 |
+
api_key: env.SERPAPI_KEY,
|
81 |
} satisfies GoogleParameters;
|
82 |
|
83 |
// Show result as JSON
|
|
|
90 |
const response = await fetch(`https://api.ydc-index.io/search?query=${query}`, {
|
91 |
method: "GET",
|
92 |
headers: {
|
93 |
+
"X-API-Key": env.YDC_API_KEY,
|
94 |
"Content-type": "application/json; charset=UTF-8",
|
95 |
},
|
96 |
});
|
|
|
116 |
|
117 |
export async function searchSerpStack(query: string) {
|
118 |
const response = await fetch(
|
119 |
+
`http://api.serpstack.com/search?access_key=${env.SERPSTACK_API_KEY}&query=${query}&hl=en&gl=us`,
|
120 |
{
|
121 |
method: "GET",
|
122 |
headers: {
|
@@ -1,6 +1,8 @@
|
|
1 |
import { base } from "$app/paths";
|
2 |
-
import {
|
3 |
|
4 |
export function getShareUrl(url: URL, shareId: string): string {
|
5 |
-
return `${
|
|
|
|
|
6 |
}
|
|
|
1 |
import { base } from "$app/paths";
|
2 |
+
import { env as envPublic } from "$env/dynamic/public";
|
3 |
|
4 |
export function getShareUrl(url: URL, shareId: string): string {
|
5 |
+
return `${
|
6 |
+
envPublic.PUBLIC_SHARE_PREFIX || `${envPublic.PUBLIC_ORIGIN || url.origin}${base}`
|
7 |
+
}/r/${shareId}`;
|
8 |
}
|
@@ -1,3 +1,3 @@
|
|
1 |
-
import {
|
2 |
|
3 |
-
export const isHuggingChat = PUBLIC_APP_ASSETS === "huggingchat";
|
|
|
1 |
+
import { env as envPublic } from "$env/dynamic/public";
|
2 |
|
3 |
+
export const isHuggingChat = envPublic.PUBLIC_APP_ASSETS === "huggingchat";
|
@@ -5,17 +5,7 @@ import { UrlDependency } from "$lib/types/UrlDependency";
|
|
5 |
import { defaultModel, models, oldModels, validateModel } from "$lib/server/models";
|
6 |
import { authCondition, requiresUser } from "$lib/server/auth";
|
7 |
import { DEFAULT_SETTINGS } from "$lib/types/Settings";
|
8 |
-
import {
|
9 |
-
SERPAPI_KEY,
|
10 |
-
SERPER_API_KEY,
|
11 |
-
SERPSTACK_API_KEY,
|
12 |
-
MESSAGES_BEFORE_LOGIN,
|
13 |
-
YDC_API_KEY,
|
14 |
-
USE_LOCAL_WEBSEARCH,
|
15 |
-
SEARXNG_QUERY_URL,
|
16 |
-
ENABLE_ASSISTANTS,
|
17 |
-
ENABLE_ASSISTANTS_RAG,
|
18 |
-
} from "$env/static/private";
|
19 |
import { ObjectId } from "mongodb";
|
20 |
import type { ConvSidebar } from "$lib/types/ConvSidebar";
|
21 |
|
@@ -47,7 +37,7 @@ export const load: LayoutServerLoad = async ({ locals, depends }) => {
|
|
47 |
});
|
48 |
}
|
49 |
|
50 |
-
const enableAssistants = ENABLE_ASSISTANTS === "true";
|
51 |
|
52 |
const assistantActive = !models.map(({ id }) => id).includes(settings?.activeModel ?? "");
|
53 |
|
@@ -87,7 +77,7 @@ export const load: LayoutServerLoad = async ({ locals, depends }) => {
|
|
87 |
|
88 |
const assistants = await collections.assistants.find({ _id: { $in: assistantIds } }).toArray();
|
89 |
|
90 |
-
const messagesBeforeLogin = MESSAGES_BEFORE_LOGIN ? parseInt(MESSAGES_BEFORE_LOGIN) : 0;
|
91 |
|
92 |
let loginRequired = false;
|
93 |
|
@@ -136,12 +126,12 @@ export const load: LayoutServerLoad = async ({ locals, depends }) => {
|
|
136 |
}) satisfies ConvSidebar[],
|
137 |
settings: {
|
138 |
searchEnabled: !!(
|
139 |
-
SERPAPI_KEY ||
|
140 |
-
SERPER_API_KEY ||
|
141 |
-
SERPSTACK_API_KEY ||
|
142 |
-
YDC_API_KEY ||
|
143 |
-
USE_LOCAL_WEBSEARCH ||
|
144 |
-
SEARXNG_QUERY_URL
|
145 |
),
|
146 |
ethicsModalAccepted: !!settings?.ethicsModalAcceptedAt,
|
147 |
ethicsModalAcceptedAt: settings?.ethicsModalAcceptedAt ?? null,
|
@@ -188,7 +178,7 @@ export const load: LayoutServerLoad = async ({ locals, depends }) => {
|
|
188 |
},
|
189 |
assistant,
|
190 |
enableAssistants,
|
191 |
-
enableAssistantsRAG: ENABLE_ASSISTANTS_RAG === "true",
|
192 |
loginRequired,
|
193 |
loginEnabled: requiresUser,
|
194 |
guestMode: requiresUser && messagesBeforeLogin > 0,
|
|
|
5 |
import { defaultModel, models, oldModels, validateModel } from "$lib/server/models";
|
6 |
import { authCondition, requiresUser } from "$lib/server/auth";
|
7 |
import { DEFAULT_SETTINGS } from "$lib/types/Settings";
|
8 |
+
import { env } from "$env/dynamic/private";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
import { ObjectId } from "mongodb";
|
10 |
import type { ConvSidebar } from "$lib/types/ConvSidebar";
|
11 |
|
|
|
37 |
});
|
38 |
}
|
39 |
|
40 |
+
const enableAssistants = env.ENABLE_ASSISTANTS === "true";
|
41 |
|
42 |
const assistantActive = !models.map(({ id }) => id).includes(settings?.activeModel ?? "");
|
43 |
|
|
|
77 |
|
78 |
const assistants = await collections.assistants.find({ _id: { $in: assistantIds } }).toArray();
|
79 |
|
80 |
+
const messagesBeforeLogin = env.MESSAGES_BEFORE_LOGIN ? parseInt(env.MESSAGES_BEFORE_LOGIN) : 0;
|
81 |
|
82 |
let loginRequired = false;
|
83 |
|
|
|
126 |
}) satisfies ConvSidebar[],
|
127 |
settings: {
|
128 |
searchEnabled: !!(
|
129 |
+
env.SERPAPI_KEY ||
|
130 |
+
env.SERPER_API_KEY ||
|
131 |
+
env.SERPSTACK_API_KEY ||
|
132 |
+
env.YDC_API_KEY ||
|
133 |
+
env.USE_LOCAL_WEBSEARCH ||
|
134 |
+
env.SEARXNG_QUERY_URL
|
135 |
),
|
136 |
ethicsModalAccepted: !!settings?.ethicsModalAcceptedAt,
|
137 |
ethicsModalAcceptedAt: settings?.ethicsModalAcceptedAt ?? null,
|
|
|
178 |
},
|
179 |
assistant,
|
180 |
enableAssistants,
|
181 |
+
enableAssistantsRAG: env.ENABLE_ASSISTANTS_RAG === "true",
|
182 |
loginRequired,
|
183 |
loginEnabled: requiresUser,
|
184 |
guestMode: requiresUser && messagesBeforeLogin > 0,
|
@@ -7,13 +7,7 @@
|
|
7 |
import { page } from "$app/stores";
|
8 |
import { browser } from "$app/environment";
|
9 |
|
10 |
-
import {
|
11 |
-
PUBLIC_APPLE_APP_ID,
|
12 |
-
PUBLIC_APP_DESCRIPTION,
|
13 |
-
PUBLIC_ORIGIN,
|
14 |
-
PUBLIC_PLAUSIBLE_SCRIPT_URL,
|
15 |
-
} from "$env/static/public";
|
16 |
-
import { PUBLIC_APP_ASSETS, PUBLIC_APP_NAME } from "$env/static/public";
|
17 |
|
18 |
import { error } from "$lib/stores/errors";
|
19 |
import { createSettingsStore } from "$lib/stores/settings";
|
@@ -134,7 +128,7 @@
|
|
134 |
</script>
|
135 |
|
136 |
<svelte:head>
|
137 |
-
<title>{PUBLIC_APP_NAME}</title>
|
138 |
<meta name="description" content="The first open source alternative to ChatGPT. 💪" />
|
139 |
<meta name="twitter:card" content="summary_large_image" />
|
140 |
<meta name="twitter:site" content="@huggingface" />
|
@@ -142,44 +136,49 @@
|
|
142 |
<!-- use those meta tags everywhere except on the share assistant page -->
|
143 |
<!-- feel free to refacto if there's a better way -->
|
144 |
{#if !$page.url.pathname.includes("/assistant/") && $page.route.id !== "/assistants" && !$page.url.pathname.includes("/models/")}
|
145 |
-
<meta property="og:title" content={PUBLIC_APP_NAME} />
|
146 |
<meta property="og:type" content="website" />
|
147 |
-
<meta property="og:url" content="{PUBLIC_ORIGIN || $page.url.origin}{base}" />
|
148 |
<meta
|
149 |
property="og:image"
|
150 |
-
content="{PUBLIC_ORIGIN ||
|
|
|
151 |
/>
|
152 |
-
<meta property="og:description" content={PUBLIC_APP_DESCRIPTION} />
|
153 |
{/if}
|
154 |
<link
|
155 |
rel="icon"
|
156 |
-
href="{PUBLIC_ORIGIN ||
|
|
|
157 |
sizes="32x32"
|
158 |
/>
|
159 |
<link
|
160 |
rel="icon"
|
161 |
-
href="{PUBLIC_ORIGIN ||
|
|
|
162 |
type="image/svg+xml"
|
163 |
/>
|
164 |
<link
|
165 |
rel="apple-touch-icon"
|
166 |
-
href="{PUBLIC_ORIGIN ||
|
|
|
167 |
/>
|
168 |
<link
|
169 |
rel="manifest"
|
170 |
-
href="{PUBLIC_ORIGIN ||
|
|
|
171 |
/>
|
172 |
|
173 |
-
{#if PUBLIC_PLAUSIBLE_SCRIPT_URL && PUBLIC_ORIGIN}
|
174 |
<script
|
175 |
defer
|
176 |
-
data-domain={new URL(PUBLIC_ORIGIN).hostname}
|
177 |
-
src={PUBLIC_PLAUSIBLE_SCRIPT_URL}
|
178 |
></script>
|
179 |
{/if}
|
180 |
|
181 |
-
{#if PUBLIC_APPLE_APP_ID}
|
182 |
-
<meta name="apple-itunes-app" content={`app-id=${PUBLIC_APPLE_APP_ID}`} />
|
183 |
{/if}
|
184 |
</svelte:head>
|
185 |
|
|
|
7 |
import { page } from "$app/stores";
|
8 |
import { browser } from "$app/environment";
|
9 |
|
10 |
+
import { env as envPublic } from "$env/dynamic/public";
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
import { error } from "$lib/stores/errors";
|
13 |
import { createSettingsStore } from "$lib/stores/settings";
|
|
|
128 |
</script>
|
129 |
|
130 |
<svelte:head>
|
131 |
+
<title>{envPublic.PUBLIC_APP_NAME}</title>
|
132 |
<meta name="description" content="The first open source alternative to ChatGPT. 💪" />
|
133 |
<meta name="twitter:card" content="summary_large_image" />
|
134 |
<meta name="twitter:site" content="@huggingface" />
|
|
|
136 |
<!-- use those meta tags everywhere except on the share assistant page -->
|
137 |
<!-- feel free to refacto if there's a better way -->
|
138 |
{#if !$page.url.pathname.includes("/assistant/") && $page.route.id !== "/assistants" && !$page.url.pathname.includes("/models/")}
|
139 |
+
<meta property="og:title" content={envPublic.PUBLIC_APP_NAME} />
|
140 |
<meta property="og:type" content="website" />
|
141 |
+
<meta property="og:url" content="{envPublic.PUBLIC_ORIGIN || $page.url.origin}{base}" />
|
142 |
<meta
|
143 |
property="og:image"
|
144 |
+
content="{envPublic.PUBLIC_ORIGIN ||
|
145 |
+
$page.url.origin}{base}/{envPublic.PUBLIC_APP_ASSETS}/thumbnail.png"
|
146 |
/>
|
147 |
+
<meta property="og:description" content={envPublic.PUBLIC_APP_DESCRIPTION} />
|
148 |
{/if}
|
149 |
<link
|
150 |
rel="icon"
|
151 |
+
href="{envPublic.PUBLIC_ORIGIN ||
|
152 |
+
$page.url.origin}{base}/{envPublic.PUBLIC_APP_ASSETS}/favicon.ico"
|
153 |
sizes="32x32"
|
154 |
/>
|
155 |
<link
|
156 |
rel="icon"
|
157 |
+
href="{envPublic.PUBLIC_ORIGIN ||
|
158 |
+
$page.url.origin}{base}/{envPublic.PUBLIC_APP_ASSETS}/icon.svg"
|
159 |
type="image/svg+xml"
|
160 |
/>
|
161 |
<link
|
162 |
rel="apple-touch-icon"
|
163 |
+
href="{envPublic.PUBLIC_ORIGIN ||
|
164 |
+
$page.url.origin}{base}/{envPublic.PUBLIC_APP_ASSETS}/apple-touch-icon.png"
|
165 |
/>
|
166 |
<link
|
167 |
rel="manifest"
|
168 |
+
href="{envPublic.PUBLIC_ORIGIN ||
|
169 |
+
$page.url.origin}{base}/{envPublic.PUBLIC_APP_ASSETS}/manifest.json"
|
170 |
/>
|
171 |
|
172 |
+
{#if envPublic.PUBLIC_PLAUSIBLE_SCRIPT_URL && envPublic.PUBLIC_ORIGIN}
|
173 |
<script
|
174 |
defer
|
175 |
+
data-domain={new URL(envPublic.PUBLIC_ORIGIN).hostname}
|
176 |
+
src={envPublic.PUBLIC_PLAUSIBLE_SCRIPT_URL}
|
177 |
></script>
|
178 |
{/if}
|
179 |
|
180 |
+
{#if envPublic.PUBLIC_APPLE_APP_ID}
|
181 |
+
<meta name="apple-itunes-app" content={`app-id=${envPublic.PUBLIC_APPLE_APP_ID}`} />
|
182 |
{/if}
|
183 |
</svelte:head>
|
184 |
|