From c62e7f091e020deabe460da75ae5f5a7e15586d2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Thu, 25 Jul 2024 20:39:43 +0530 Subject: [PATCH 001/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index de4cd43..7685909 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.8.0", + "version": "1.8.1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index 6d265c6..b5138df 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.8.0", + "version": "1.8.1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From 0a292377322aadd491d0e0eb2706303d4935d614 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Tue, 30 Jul 2024 10:06:52 +0530 Subject: [PATCH 002/282] feat(listLineOutputParser): handle invalid keys --- src/lib/outputParsers/listLineOutputParser.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/outputParsers/listLineOutputParser.ts b/src/lib/outputParsers/listLineOutputParser.ts index 57a9bbc..1e2f0f5 100644 --- a/src/lib/outputParsers/listLineOutputParser.ts +++ b/src/lib/outputParsers/listLineOutputParser.ts @@ -22,6 +22,11 @@ class LineListOutputParser extends BaseOutputParser { const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; const startKeyIndex = text.indexOf(`<${this.key}>`); const endKeyIndex = text.indexOf(``); + + if (startKeyIndex === -1 || endKeyIndex === -1) { + return []; + } + const questionsStartIndex = startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; From 9abb4b654dbeff4f00410bf07e41960bd6929050 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Tue, 30 Jul 2024 10:07:28 +0530 Subject: [PATCH 003/282] feat(app): handle unhandled exception & rejection --- src/app.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/app.ts b/src/app.ts index b8c2371..9c80baa 100644 --- a/src/app.ts +++ b/src/app.ts @@ -28,3 +28,11 @@ server.listen(port, () => { }); startWebSocketServer(server); + +process.on('uncaughtException', (err, origin) => { + logger.error(`Uncaught Exception at ${origin}: ${err}`) +}) + +process.on('unhandledRejection', (reason, promise) => { + logger.error(`Unhandled Rejection at: ${promise}, reason: ${reason}`) +}) \ No newline at end of file From 6f50e25bf3cb6a51a3b0a9283da9a52f1283b2e3 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Tue, 30 Jul 2024 10:08:29 +0530 Subject: [PATCH 004/282] feat(output-parsers): add line output parser --- src/lib/outputParsers/lineOutputParser.ts | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/lib/outputParsers/lineOutputParser.ts diff --git a/src/lib/outputParsers/lineOutputParser.ts b/src/lib/outputParsers/lineOutputParser.ts new file mode 100644 index 0000000..b50a20e --- /dev/null +++ b/src/lib/outputParsers/lineOutputParser.ts @@ -0,0 +1,46 @@ +import { BaseOutputParser } from '@langchain/core/output_parsers'; + +interface LineOutputParserArgs { + key?: string; +} + +class LineOutputParser extends BaseOutputParser { + private key = 'questions'; + + constructor(args?: LineOutputParserArgs) { + super(); + this.key = args.key ?? this.key; + } + + static lc_name() { + return 'LineOutputParser'; + } + + lc_namespace = ['langchain', 'output_parsers', 'line_output_parser']; + + async parse(text: string): Promise { + const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; + const startKeyIndex = text.indexOf(`<${this.key}>`); + const endKeyIndex = text.indexOf(``); + + if (startKeyIndex === -1 || endKeyIndex === -1) { + return ''; + } + + const questionsStartIndex = + startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; + const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; + const line = text + .slice(questionsStartIndex, questionsEndIndex) + .trim() + .replace(regex, ''); + + return line; + } + + getFormatInstructions(): string { + throw new Error('Not implemented.'); + } +} + +export default LineOutputParser; From 8e4f0c6a6d247fc075431346d09e7ad5e784bdb1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Tue, 30 Jul 2024 10:09:05 +0530 Subject: [PATCH 005/282] feat(web-search): add URL & PDF searching capibilities --- package.json | 4 + src/agents/webSearchAgent.ts | 148 ++++++++++++++++++++++++++++++----- src/lib/linkDocument.ts | 81 +++++++++++++++++++ yarn.lock | 124 +++++++++++++++++++++++++++++ 4 files changed, 338 insertions(+), 19 deletions(-) create mode 100644 src/lib/linkDocument.ts diff --git a/package.json b/package.json index 7685909..6abfb74 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "@types/better-sqlite3": "^7.6.10", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/html-to-text": "^9.0.4", + "@types/pdf-parse": "^1.1.4", "@types/readable-stream": "^4.0.11", "drizzle-kit": "^0.22.7", "nodemon": "^3.1.0", @@ -36,7 +38,9 @@ "dotenv": "^16.4.5", "drizzle-orm": "^0.31.2", "express": "^4.19.2", + "html-to-text": "^9.0.5", "langchain": "^0.1.30", + "pdf-parse": "^1.1.1", "winston": "^3.13.0", "ws": "^8.17.1", "zod": "^3.22.4" diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 9818d01..8d0ffb1 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -19,20 +19,47 @@ import formatChatHistoryAsString from '../utils/formatHistory'; import eventEmitter from 'events'; import computeSimilarity from '../utils/computeSimilarity'; import logger from '../utils/logger'; +import LineListOutputParser from '../lib/outputParsers/listLineOutputParser'; +import { getDocumentsFromLinks } from '../lib/linkDocument'; +import LineOutputParser from '../lib/outputParsers/lineOutputParser'; const basicSearchRetrieverPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. +If the question contains some links and asks to answer from those links or even if they don't you need to return the links inside 'links' XML block and the question inside 'question' XML block. If there are no links then you need to return the question without any XML block. +If the user asks to summarrize the content from some links you need to return \`Summarize\` as the question inside the 'question' XML block and the links inside the 'links' XML block. Example: 1. Follow up question: What is the capital of France? -Rephrased: Capital of france +Rephrased question: \`Capital of france\` 2. Follow up question: What is the population of New York City? -Rephrased: Population of New York City +Rephrased question: \`Population of New York City\` 3. Follow up question: What is Docker? -Rephrased: What is Docker +Rephrased question: \`What is Docker\` + +4. Follow up question: Can you tell me what is X from https://example.com +Rephrased question: \` + +Can you tell me what is X? + + + +https://example.com + +\` + +5. Follow up question: Summarize the content from https://example.com +Rephrased question: \` + +Summarize + + + +https://example.com + +\` Conversation: {chat_history} @@ -42,11 +69,13 @@ Rephrased question: `; const basicWebSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. + You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are also an expert at summarizing web pages or documents and searching for content in them. Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. + If the query contains some links and the user asks to answer from those links you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to answer the user's query. + If the user asks to summarize content from some links, you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to summarize the text. The content provided inside the \`context\` block will be already summarized by another model so you just need to use that content to answer the user's query. Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. @@ -59,7 +88,7 @@ const basicWebSearchResponsePrompt = ` {context} - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. + If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. You do not need to do this for summarization tasks. Anything between the \`context\` is retrieved from a search engine and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} `; @@ -112,23 +141,100 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { return { query: '', docs: [] }; } - const res = await searchSearxng(input, { - language: 'en', + const linksOutputParser = new LineListOutputParser({ + key: 'links', }); - const documents = res.results.map( - (result) => - new Document({ - pageContent: result.content, - metadata: { - title: result.title, - url: result.url, - ...(result.img_src && { img_src: result.img_src }), - }, - }), - ); + const questionOutputParser = new LineOutputParser({ + key: 'question', + }); - return { query: input, docs: documents }; + const links = await linksOutputParser.parse(input); + let question = await questionOutputParser.parse(input); + + if (links.length > 0) { + if (question.length === 0) { + question = 'Summarize'; + } + + let docs = [] + + const linkDocs = await getDocumentsFromLinks({ links }); + + const docGroups: Document[] = []; + + linkDocs.map((doc) => { + const URLDocExists = docGroups.find((d) => d.metadata.url === doc.metadata.url && d.metadata.totalDocs < 10); + + if (!URLDocExists) { + docGroups.push({ + ...doc, + metadata: { + ...doc.metadata, + totalDocs: 1 + } + }); + } + + const docIndex = docGroups.findIndex((d) => d.metadata.url === doc.metadata.url && d.metadata.totalDocs < 10); + + if (docIndex !== -1) { + docGroups[docIndex].pageContent = docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; + docGroups[docIndex].metadata.totalDocs += 1; + } + }) + + await Promise.all(docGroups.map(async (doc) => { + const res = await llm.invoke(` + You are a text summarizer. You need to summarize the text provided inside the \`text\` XML block. + You need to summarize the text into 1 or 2 sentences capturing the main idea of the text. + You need to make sure that you don't miss any point while summarizing the text. + You will also be given a \`query\` XML block which will contain the query of the user. Try to answer the query in the summary from the text provided. + If the query says Summarize then you just need to summarize the text without answering the query. + Only return the summarized text without any other messages, text or XML block. + + + ${question} + + + + ${doc.pageContent} + + + Make sure to answer the query in the summary. + `); + + const document = new Document({ + pageContent: res.content as string, + metadata: { + title: doc.metadata.title, + url: doc.metadata.url, + }, + }) + + docs.push(document) + })) + + return { query: question, docs: docs }; + } else { + const res = await searchSearxng(input, { + language: 'en', + }); + + const documents = res.results.map( + (result) => + new Document({ + pageContent: result.content, + metadata: { + title: result.title, + url: result.url, + ...(result.img_src && { img_src: result.img_src }), + }, + }), + ); + + return { query: input, docs: documents }; + } }), ]); }; @@ -156,6 +262,10 @@ const createBasicWebSearchAnsweringChain = ( return docs; } + if (query === 'Summarize') { + return docs; + } + const docsWithContent = docs.filter( (doc) => doc.pageContent && doc.pageContent.length > 0, ); diff --git a/src/lib/linkDocument.ts b/src/lib/linkDocument.ts new file mode 100644 index 0000000..1bbac62 --- /dev/null +++ b/src/lib/linkDocument.ts @@ -0,0 +1,81 @@ +import axios from 'axios'; +import { htmlToText } from 'html-to-text' +import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; +import { Document } from '@langchain/core/documents'; +import pdfParse from 'pdf-parse' + +export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { + const splitter = new RecursiveCharacterTextSplitter(); + + let docs: Document[] = []; + + await Promise.all( + links.map(async (link) => { + link = + link.startsWith('http://') || link.startsWith('https://') + ? link + : `https://${link}`; + + const res = await axios.get(link, { + responseType: 'arraybuffer', + }); + + const isPdf = res.headers['content-type'] === 'application/pdf'; + + if (isPdf) { + const pdfText = await pdfParse(res.data) + const parsedText = pdfText.text + .replace(/(\r\n|\n|\r)/gm, ' ') + .replace(/\s+/g, ' ') + .trim(); + + const splittedText = await splitter.splitText(parsedText); + const title = 'PDF Document' + + const linkDocs = splittedText.map((text) => { + return new Document({ + pageContent: text, + metadata: { + title: title, + url: link, + }, + }); + }); + + docs.push(...linkDocs); + return; + } + + const parsedText = htmlToText(res.data.toString('utf8'), { + selectors: [ + { + selector: 'a', + options: { + ignoreHref: true, + } + }, + ] + }) + .replace(/(\r\n|\n|\r)/gm, ' ') + .replace(/\s+/g, ' ') + .trim(); + + const splittedText = await splitter.splitText(parsedText); + const title = res.data.toString('utf8').match(/(.*?)<\/title>/)?.[1]; + + const linkDocs = splittedText.map((text) => { + return new Document({ + pageContent: text, + metadata: { + title: title || link, + url: link, + }, + }); + }); + + docs.push(...linkDocs); + }), + ); + + return docs; +}; diff --git a/yarn.lock b/yarn.lock index 1a25c1c..1c34e1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -509,6 +509,14 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@selderee/plugin-htmlparser2@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" + integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== + dependencies: + domhandler "^5.0.3" + selderee "^0.11.0" + "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" @@ -578,6 +586,11 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/html-to-text@^9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" + integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== + "@types/http-errors@*": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" @@ -622,6 +635,11 @@ dependencies: undici-types "~5.26.4" +"@types/pdf-parse@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" + integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== + "@types/qs@*": version "6.9.14" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" @@ -1092,6 +1110,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + debug@^4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -1123,6 +1148,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -1165,6 +1195,36 @@ digest-fetch@^1.3.0: base-64 "^0.1.0" md5 "^2.3.0" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dotenv@^16.4.5: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" @@ -1206,6 +1266,11 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -1529,6 +1594,27 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +html-to-text@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" + integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== + dependencies: + "@selderee/plugin-htmlparser2" "^0.11.0" + deepmerge "^4.3.1" + dom-serializer "^2.0.0" + htmlparser2 "^8.0.2" + selderee "^0.11.0" + +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -1727,6 +1813,11 @@ langsmith@~0.1.30: p-retry "4" uuid "^9.0.0" +leac@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -1907,6 +1998,11 @@ node-domexception@1.0.0: resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== +node-ensure@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" + integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== + node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -2071,6 +2167,14 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +parseley@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" + integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== + dependencies: + leac "^0.6.0" + peberminta "^0.9.0" + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -2081,6 +2185,19 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +pdf-parse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" + integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== + dependencies: + debug "^3.1.0" + node-ensure "^0.0.0" + +peberminta@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" + integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== + picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -2242,6 +2359,13 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +selderee@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" + integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== + dependencies: + parseley "^0.12.0" + semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" From 61dfeb89b429ae8c975a712d296bd16db1fd73b6 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <kushagra20103@gmail.com> Date: Tue, 30 Jul 2024 10:10:55 +0530 Subject: [PATCH 006/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6abfb74..db3d773 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.8.1", + "version": "1.9.0-rc1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index b5138df..1d892de 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.8.1", + "version": "1.9.0-rc1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From c4932c659a2f77cf77b7c72494209a0b36a1d14d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <kushagra20103@gmail.com> Date: Wed, 31 Jul 2024 20:17:57 +0530 Subject: [PATCH 007/282] feat(app): lint --- src/agents/webSearchAgent.ts | 47 +++++++++++++++++++++--------------- src/app.ts | 8 +++--- src/lib/linkDocument.ts | 16 ++++++------ 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 8d0ffb1..c93dabb 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -157,35 +157,43 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { question = 'Summarize'; } - let docs = [] + let docs = []; const linkDocs = await getDocumentsFromLinks({ links }); const docGroups: Document[] = []; linkDocs.map((doc) => { - const URLDocExists = docGroups.find((d) => d.metadata.url === doc.metadata.url && d.metadata.totalDocs < 10); + const URLDocExists = docGroups.find( + (d) => + d.metadata.url === doc.metadata.url && d.metadata.totalDocs < 10, + ); if (!URLDocExists) { docGroups.push({ ...doc, metadata: { ...doc.metadata, - totalDocs: 1 - } + totalDocs: 1, + }, }); } - const docIndex = docGroups.findIndex((d) => d.metadata.url === doc.metadata.url && d.metadata.totalDocs < 10); + const docIndex = docGroups.findIndex( + (d) => + d.metadata.url === doc.metadata.url && d.metadata.totalDocs < 10, + ); if (docIndex !== -1) { - docGroups[docIndex].pageContent = docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; + docGroups[docIndex].pageContent = + docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; docGroups[docIndex].metadata.totalDocs += 1; } - }) + }); - await Promise.all(docGroups.map(async (doc) => { - const res = await llm.invoke(` + await Promise.all( + docGroups.map(async (doc) => { + const res = await llm.invoke(` You are a text summarizer. You need to summarize the text provided inside the \`text\` XML block. You need to summarize the text into 1 or 2 sentences capturing the main idea of the text. You need to make sure that you don't miss any point while summarizing the text. @@ -204,16 +212,17 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { Make sure to answer the query in the summary. `); - const document = new Document({ - pageContent: res.content as string, - metadata: { - title: doc.metadata.title, - url: doc.metadata.url, - }, - }) - - docs.push(document) - })) + const document = new Document({ + pageContent: res.content as string, + metadata: { + title: doc.metadata.title, + url: doc.metadata.url, + }, + }); + + docs.push(document); + }), + ); return { query: question, docs: docs }; } else { diff --git a/src/app.ts b/src/app.ts index 9c80baa..96b3a0c 100644 --- a/src/app.ts +++ b/src/app.ts @@ -30,9 +30,9 @@ server.listen(port, () => { startWebSocketServer(server); process.on('uncaughtException', (err, origin) => { - logger.error(`Uncaught Exception at ${origin}: ${err}`) -}) + logger.error(`Uncaught Exception at ${origin}: ${err}`); +}); process.on('unhandledRejection', (reason, promise) => { - logger.error(`Unhandled Rejection at: ${promise}, reason: ${reason}`) -}) \ No newline at end of file + logger.error(`Unhandled Rejection at: ${promise}, reason: ${reason}`); +}); diff --git a/src/lib/linkDocument.ts b/src/lib/linkDocument.ts index 1bbac62..9607220 100644 --- a/src/lib/linkDocument.ts +++ b/src/lib/linkDocument.ts @@ -1,8 +1,8 @@ import axios from 'axios'; -import { htmlToText } from 'html-to-text' +import { htmlToText } from 'html-to-text'; import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; import { Document } from '@langchain/core/documents'; -import pdfParse from 'pdf-parse' +import pdfParse from 'pdf-parse'; export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { const splitter = new RecursiveCharacterTextSplitter(); @@ -23,14 +23,14 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { const isPdf = res.headers['content-type'] === 'application/pdf'; if (isPdf) { - const pdfText = await pdfParse(res.data) + const pdfText = await pdfParse(res.data); const parsedText = pdfText.text .replace(/(\r\n|\n|\r)/gm, ' ') .replace(/\s+/g, ' ') .trim(); const splittedText = await splitter.splitText(parsedText); - const title = 'PDF Document' + const title = 'PDF Document'; const linkDocs = splittedText.map((text) => { return new Document({ @@ -52,16 +52,18 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { selector: 'a', options: { ignoreHref: true, - } + }, }, - ] + ], }) .replace(/(\r\n|\n|\r)/gm, ' ') .replace(/\s+/g, ' ') .trim(); const splittedText = await splitter.splitText(parsedText); - const title = res.data.toString('utf8').match(/<title>(.*?)<\/title>/)?.[1]; + const title = res.data + .toString('utf8') + .match(/<title>(.*?)<\/title>/)?.[1]; const linkDocs = splittedText.map((text) => { return new Document({ From 9c1936ec2cb0a18389c6037895c30aab416243b9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 4 Aug 2024 18:14:46 +0530 Subject: [PATCH 008/282] feat(chat-window): lint & beautify --- ui/components/ChatWindow.tsx | 85 ++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 48 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index ea9a93d..5e6d382 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -38,53 +38,54 @@ const useSocket = ( 'embeddingModelProvider', ); + const providers = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/models`, + { + headers: { + 'Content-Type': 'application/json', + }, + }, + ).then(async (res) => await res.json()); + if ( !chatModel || !chatModelProvider || !embeddingModel || !embeddingModelProvider ) { - const providers = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/models`, - { - headers: { - 'Content-Type': 'application/json', - }, - }, - ).then(async (res) => await res.json()); + if (!chatModel || !chatModelProvider) { + const chatModelProviders = providers.chatModelProviders; - const chatModelProviders = providers.chatModelProviders; + chatModelProvider = Object.keys(chatModelProviders)[0]; - chatModelProvider = Object.keys(chatModelProviders)[0]; - - if (chatModelProvider === 'custom_openai') { - toast.error( - 'Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL', - ); - setError(true); - return; - } else { - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - - if ( - !chatModelProviders || - Object.keys(chatModelProviders).length === 0 - ) - return toast.error('No chat models available'); + if (chatModelProvider === 'custom_openai') { + toast.error('Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL'); + setError(true); + return; + } else { + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + if ( + !chatModelProviders || + Object.keys(chatModelProviders).length === 0 + ) + return toast.error('No chat models available'); + } } - const embeddingModelProviders = providers.embeddingModelProviders; + if (!embeddingModel || !embeddingModelProvider) { + const embeddingModelProviders = providers.embeddingModelProviders; - if ( - !embeddingModelProviders || - Object.keys(embeddingModelProviders).length === 0 - ) - return toast.error('No embedding models available'); + if ( + !embeddingModelProviders || + Object.keys(embeddingModelProviders).length === 0 + ) + return toast.error('No embedding models available'); - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + } localStorage.setItem('chatModel', chatModel!); localStorage.setItem('chatModelProvider', chatModelProvider); @@ -94,15 +95,6 @@ const useSocket = ( embeddingModelProvider, ); } else { - const providers = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/models`, - { - headers: { - 'Content-Type': 'app lication/json', - }, - }, - ).then(async (res) => await res.json()); - const chatModelProviders = providers.chatModelProviders; const embeddingModelProviders = providers.embeddingModelProviders; @@ -171,8 +163,6 @@ const useSocket = ( const timeoutId = setTimeout(() => { if (ws.readyState !== 1) { - ws.close(); - setError(true); toast.error( 'Failed to connect to the server. Please try again later.', ); @@ -182,7 +172,6 @@ const useSocket = ( ws.onopen = () => { console.log('[DEBUG] open'); clearTimeout(timeoutId); - setError(false); setIsWSReady(true); }; @@ -203,7 +192,7 @@ const useSocket = ( if (data.type === 'error') { toast.error(data.data); } - }); + }) setWs(ws); }; From e4faa82362348912516e17b5bbae3d9fe2c15413 Mon Sep 17 00:00:00 2001 From: Xie Yanbo <xieyanbo@gmail.com> Date: Fri, 9 Aug 2024 20:53:53 +0800 Subject: [PATCH 009/282] Fix #307, update outdated searxng/settings.yml --- searxng/settings.yml | 2345 +----------------------------------------- 1 file changed, 3 insertions(+), 2342 deletions(-) diff --git a/searxng/settings.yml b/searxng/settings.yml index da973c1..54d27c4 100644 --- a/searxng/settings.yml +++ b/searxng/settings.yml @@ -1,2356 +1,17 @@ -general: - # Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG} - debug: false - # displayed name - instance_name: 'searxng' - # For example: https://example.com/privacy - privacypolicy_url: false - # use true to use your own donation page written in searx/info/en/donate.md - # use false to disable the donation link - donation_url: false - # mailto:contact@example.com - contact_url: false - # record stats - enable_metrics: true +use_default_settings: true -brand: - new_issue_url: https://github.com/searxng/searxng/issues/new - docs_url: https://docs.searxng.org/ - public_instances: https://searx.space - wiki_url: https://github.com/searxng/searxng/wiki - issue_url: https://github.com/searxng/searxng/issues - # custom: - # maintainer: "Jon Doe" - # # Custom entries in the footer: [title]: [link] - # links: - # Uptime: https://uptime.searxng.org/history/darmarit-org - # About: "https://searxng.org" +general: + instance_name: 'searxng' search: - # Filter results. 0: None, 1: Moderate, 2: Strict - safe_search: 0 - # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "yandex", "mwmbl", - # "seznam", "startpage", "stract", "swisscows", "qwant", "wikipedia" - leave blank to turn it off - # by default. autocomplete: 'google' - # minimun characters to type before autocompleter starts - autocomplete_min: 4 - # Default search language - leave blank to detect from browser information or - # use codes from 'languages.py' - default_lang: 'auto' - # max_page: 0 # if engine supports paging, 0 means unlimited numbers of pages - # Available languages - # languages: - # - all - # - en - # - en-US - # - de - # - it-IT - # - fr - # - fr-BE - # ban time in seconds after engine errors - ban_time_on_fail: 5 - # max ban time in seconds after engine errors - max_ban_time_on_fail: 120 - suspended_times: - # Engine suspension time after error (in seconds; set to 0 to disable) - # For error "Access denied" and "HTTP error [402, 403]" - SearxEngineAccessDenied: 86400 - # For error "CAPTCHA" - SearxEngineCaptcha: 86400 - # For error "Too many request" and "HTTP error 429" - SearxEngineTooManyRequests: 3600 - # Cloudflare CAPTCHA - cf_SearxEngineCaptcha: 1296000 - cf_SearxEngineAccessDenied: 86400 - # ReCAPTCHA - recaptcha_SearxEngineCaptcha: 604800 - - # remove format to deny access, use lower case. - # formats: [html, csv, json, rss] formats: - html - json server: - # Is overwritten by ${SEARXNG_PORT} and ${SEARXNG_BIND_ADDRESS} - port: 8888 - bind_address: '127.0.0.1' - # public URL of the instance, to ensure correct inbound links. Is overwritten - # by ${SEARXNG_URL}. - base_url: / # "http://example.com/location" - limiter: false # rate limit the number of request on the instance, block some bots - public_instance: false # enable features designed only for public instances - - # If your instance owns a /etc/searxng/settings.yml file, then set the following - # values there. - secret_key: 'a2fb23f1b02e6ee83875b09826990de0f6bd908b6638e8c10277d415f6ab852b' # Is overwritten by ${SEARXNG_SECRET} - # Proxying image results through searx - image_proxy: false - # 1.0 and 1.1 are supported - http_protocol_version: '1.0' - # POST queries are more secure as they don't show up in history but may cause - # problems when using Firefox containers - method: 'POST' - default_http_headers: - X-Content-Type-Options: nosniff - X-Download-Options: noopen - X-Robots-Tag: noindex, nofollow - Referrer-Policy: no-referrer - -redis: - # URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}. - # https://docs.searxng.org/admin/settings/settings_redis.html#settings-redis - url: false - -ui: - # Custom static path - leave it blank if you didn't change - static_path: '' - static_use_hash: false - # Custom templates path - leave it blank if you didn't change - templates_path: '' - # query_in_title: When true, the result page's titles contains the query - # it decreases the privacy, since the browser can records the page titles. - query_in_title: false - # infinite_scroll: When true, automatically loads the next page when scrolling to bottom of the current page. - infinite_scroll: false - # ui theme - default_theme: simple - # center the results ? - center_alignment: false - # URL prefix of the internet archive, don't forget trailing slash (if needed). - # cache_url: "https://webcache.googleusercontent.com/search?q=cache:" - # Default interface locale - leave blank to detect from browser information or - # use codes from the 'locales' config section - default_locale: '' - # Open result links in a new tab by default - # results_on_new_tab: false - theme_args: - # style of simple theme: auto, light, dark - simple_style: auto - # Perform search immediately if a category selected. - # Disable to select multiple categories at once and start the search manually. - search_on_category_select: true - # Hotkeys: default or vim - hotkeys: default - -# Lock arbitrary settings on the preferences page. To find the ID of the user -# setting you want to lock, check the ID of the form on the page "preferences". -# -# preferences: -# lock: -# - language -# - autocomplete -# - method -# - query_in_title - -# searx supports result proxification using an external service: -# https://github.com/asciimoo/morty uncomment below section if you have running -# morty proxy the key is base64 encoded (keep the !!binary notation) -# Note: since commit af77ec3, morty accepts a base64 encoded key. -# -# result_proxy: -# url: http://127.0.0.1:3000/ -# # the key is a base64 encoded string, the YAML !!binary prefix is optional -# key: !!binary "your_morty_proxy_key" -# # [true|false] enable the "proxy" button next to each result -# proxify_results: true - -# communication with search engines -# -outgoing: - # default timeout in seconds, can be override by engine - request_timeout: 3.0 - # the maximum timeout in seconds - # max_request_timeout: 10.0 - # suffix of searx_useragent, could contain information like an email address - # to the administrator - useragent_suffix: '' - # The maximum number of concurrent connections that may be established. - pool_connections: 100 - # Allow the connection pool to maintain keep-alive connections below this - # point. - pool_maxsize: 20 - # See https://www.python-httpx.org/http2/ - enable_http2: true - # uncomment below section if you want to use a custom server certificate - # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults - # and https://www.python-httpx.org/compatibility/#ssl-configuration - # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer - # - # uncomment below section if you want to use a proxyq see: SOCKS proxies - # https://2.python-requests.org/en/latest/user/advanced/#proxies - # are also supported: see - # https://2.python-requests.org/en/latest/user/advanced/#socks - # - # proxies: - # all://: - # - http://proxy1:8080 - # - http://proxy2:8080 - # - # using_tor_proxy: true - # - # Extra seconds to add in order to account for the time taken by the proxy - # - # extra_proxy_timeout: 10.0 - # - # uncomment below section only if you have more than one network interface - # which can be the source of outgoing search requests - # - # source_ips: - # - 1.1.1.1 - # - 1.1.1.2 - # - fe80::/126 - -# External plugin configuration, for more details see -# https://docs.searxng.org/dev/plugins.html -# -# plugins: -# - plugin1 -# - plugin2 -# - ... - -# Comment or un-comment plugin to activate / deactivate by default. -# -# enabled_plugins: -# # these plugins are enabled if nothing is configured .. -# - 'Hash plugin' -# - 'Self Information' -# - 'Tracker URL remover' -# - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy -# # these plugins are disabled if nothing is configured .. -# - 'Hostname replace' # see hostname_replace configuration below -# - 'Open Access DOI rewrite' -# - 'Tor check plugin' -# # Read the docs before activate: auto-detection of the language could be -# # detrimental to users expectations / users can activate the plugin in the -# # preferences if they want. -# - 'Autodetect search language' - -# Configuration of the "Hostname replace" plugin: -# -# hostname_replace: -# '(.*\.)?youtube\.com$': 'invidious.example.com' -# '(.*\.)?youtu\.be$': 'invidious.example.com' -# '(.*\.)?youtube-noocookie\.com$': 'yotter.example.com' -# '(.*\.)?reddit\.com$': 'teddit.example.com' -# '(.*\.)?redd\.it$': 'teddit.example.com' -# '(www\.)?twitter\.com$': 'nitter.example.com' -# # to remove matching host names from result list, set value to false -# 'spam\.example\.com': false - -checker: - # disable checker when in debug mode - off_when_debug: true - - # use "scheduling: false" to disable scheduling - # scheduling: interval or int - - # to activate the scheduler: - # * uncomment "scheduling" section - # * add "cache2 = name=searxngcache,items=2000,blocks=2000,blocksize=4096,bitmap=1" - # to your uwsgi.ini - - # scheduling: - # start_after: [300, 1800] # delay to start the first run of the checker - # every: [86400, 90000] # how often the checker runs - - # additional tests: only for the YAML anchors (see the engines section) - # - additional_tests: - rosebud: &test_rosebud - matrix: - query: rosebud - lang: en - result_container: - - not_empty - - ['one_title_contains', 'citizen kane'] - test: - - unique_results - - android: &test_android - matrix: - query: ['android'] - lang: ['en', 'de', 'fr', 'zh-CN'] - result_container: - - not_empty - - ['one_title_contains', 'google'] - test: - - unique_results - - # tests: only for the YAML anchors (see the engines section) - tests: - infobox: &tests_infobox - infobox: - matrix: - query: ['linux', 'new york', 'bbc'] - result_container: - - has_infobox - -categories_as_tabs: - general: - images: - videos: - news: - map: - music: - it: - science: - files: - social media: engines: - - name: 9gag - engine: 9gag - shortcut: 9g - disabled: true - - - name: annas archive - engine: annas_archive - disabled: true - shortcut: aa - - # - name: annas articles - # engine: annas_archive - # shortcut: aaa - # # https://docs.searxng.org/dev/engines/online/annas_archive.html - # aa_content: 'journal_article' # book_any .. magazine, standards_document - # aa_ext: 'pdf' # pdf, epub, .. - # aa_sort: 'newest' # newest, oldest, largest, smallest - - - name: apk mirror - engine: apkmirror - timeout: 4.0 - shortcut: apkm - disabled: true - - - name: apple app store - engine: apple_app_store - shortcut: aps - disabled: true - - # Requires Tor - - name: ahmia - engine: ahmia - categories: onions - enable_http: true - shortcut: ah - - - name: anaconda - engine: xpath - paging: true - first_page_num: 0 - search_url: https://anaconda.org/search?q={query}&page={pageno} - results_xpath: //tbody/tr - url_xpath: ./td/h5/a[last()]/@href - title_xpath: ./td/h5 - content_xpath: ./td[h5]/text() - categories: it - timeout: 6.0 - shortcut: conda - disabled: true - - - name: arch linux wiki - engine: archlinux - shortcut: al - - - name: artic - engine: artic - shortcut: arc - timeout: 4.0 - - - name: arxiv - engine: arxiv - shortcut: arx - timeout: 4.0 - - - name: ask - engine: ask - shortcut: ask - disabled: true - - # tmp suspended: dh key too small - # - name: base - # engine: base - # shortcut: bs - - - name: bandcamp - engine: bandcamp - shortcut: bc - categories: music - - - name: wikipedia - engine: wikipedia - shortcut: wp - # add "list" to the array to get results in the results list - display_type: ['infobox'] - base_url: 'https://{language}.wikipedia.org/' - categories: [general] - - - name: bilibili - engine: bilibili - shortcut: bil - disabled: true - - - name: bing - engine: bing - shortcut: bi - disabled: true - - - name: bing images - engine: bing_images - shortcut: bii - - - name: bing news - engine: bing_news - shortcut: bin - - - name: bing videos - engine: bing_videos - shortcut: biv - - - name: bitbucket - engine: xpath - paging: true - search_url: https://bitbucket.org/repo/all/{pageno}?name={query} - url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href - title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] - content_xpath: //article[@class="repo-summary"]/p - categories: [it, repos] - timeout: 4.0 - disabled: true - shortcut: bb - about: - website: https://bitbucket.org/ - wikidata_id: Q2493781 - official_api_documentation: https://developer.atlassian.com/bitbucket - use_official_api: false - require_api_key: false - results: HTML - - - name: bpb - engine: bpb - shortcut: bpb - disabled: true - - - name: btdigg - engine: btdigg - shortcut: bt - disabled: true - - - name: ccc-tv - engine: xpath - paging: false - search_url: https://media.ccc.de/search/?q={query} - url_xpath: //div[@class="caption"]/h3/a/@href - title_xpath: //div[@class="caption"]/h3/a/text() - content_xpath: //div[@class="caption"]/h4/@title - categories: videos - disabled: true - shortcut: c3tv - about: - website: https://media.ccc.de/ - wikidata_id: Q80729951 - official_api_documentation: https://github.com/voc/voctoweb - use_official_api: false - require_api_key: false - results: HTML - # We don't set language: de here because media.ccc.de is not just - # for a German audience. It contains many English videos and many - # German videos have English subtitles. - - - name: openverse - engine: openverse - categories: images - shortcut: opv - - - name: chefkoch - engine: chefkoch - shortcut: chef - # to show premium or plus results too: - # skip_premium: false - - # - name: core.ac.uk - # engine: core - # categories: science - # shortcut: cor - # # get your API key from: https://core.ac.uk/api-keys/register/ - # api_key: 'unset' - - - name: crossref - engine: crossref - shortcut: cr - timeout: 30 - disabled: true - - - name: crowdview - engine: json_engine - shortcut: cv - categories: general - paging: false - search_url: https://crowdview-next-js.onrender.com/api/search-v3?query={query} - results_query: results - url_query: link - title_query: title - content_query: snippet - disabled: true - about: - website: https://crowdview.ai/ - - - name: yep - engine: yep - shortcut: yep - categories: general - search_type: web - disabled: true - - - name: yep images - engine: yep - shortcut: yepi - categories: images - search_type: images - disabled: true - - - name: yep news - engine: yep - shortcut: yepn - categories: news - search_type: news - disabled: true - - - name: curlie - engine: xpath - shortcut: cl - categories: general - disabled: true - paging: true - lang_all: '' - search_url: https://curlie.org/search?q={query}&lang={lang}&start={pageno}&stime=92452189 - page_size: 20 - results_xpath: //div[@id="site-list-content"]/div[@class="site-item"] - url_xpath: ./div[@class="title-and-desc"]/a/@href - title_xpath: ./div[@class="title-and-desc"]/a/div - content_xpath: ./div[@class="title-and-desc"]/div[@class="site-descr"] - about: - website: https://curlie.org/ - wikidata_id: Q60715723 - use_official_api: false - require_api_key: false - results: HTML - - - name: currency - engine: currency_convert - categories: general - shortcut: cc - - - name: bahnhof - engine: json_engine - search_url: https://www.bahnhof.de/api/stations/search/{query} - url_prefix: https://www.bahnhof.de/ - url_query: slug - title_query: name - content_query: state - shortcut: bf - disabled: true - about: - website: https://www.bahn.de - wikidata_id: Q22811603 - use_official_api: false - require_api_key: false - results: JSON - language: de - - - name: deezer - engine: deezer - shortcut: dz - disabled: true - - - name: destatis - engine: destatis - shortcut: destat - disabled: true - - - name: deviantart - engine: deviantart - shortcut: da - timeout: 3.0 - - - name: ddg definitions - engine: duckduckgo_definitions - shortcut: ddd - weight: 2 - disabled: true - tests: *tests_infobox - - # cloudflare protected - # - name: digbt - # engine: digbt - # shortcut: dbt - # timeout: 6.0 - # disabled: true - - - name: docker hub - engine: docker_hub - shortcut: dh - categories: [it, packages] - - - name: erowid - engine: xpath - paging: true - first_page_num: 0 - page_size: 30 - search_url: https://www.erowid.org/search.php?q={query}&s={pageno} - url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href - title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() - content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] - categories: [] - shortcut: ew - disabled: true - about: - website: https://www.erowid.org/ - wikidata_id: Q1430691 - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - # - name: elasticsearch - # shortcut: es - # engine: elasticsearch - # base_url: http://localhost:9200 - # username: elastic - # password: changeme - # index: my-index - # # available options: match, simple_query_string, term, terms, custom - # query_type: match - # # if query_type is set to custom, provide your query here - # #custom_query_json: {"query":{"match_all": {}}} - # #show_metadata: false - # disabled: true - - - name: wikidata - engine: wikidata - shortcut: wd - timeout: 3.0 - weight: 2 - # add "list" to the array to get results in the results list - display_type: ['infobox'] - tests: *tests_infobox - categories: [general] - - - name: duckduckgo - engine: duckduckgo - shortcut: ddg - - - name: duckduckgo images - engine: duckduckgo_extra - categories: [images, web] - ddg_category: images - shortcut: ddi - disabled: true - - - name: duckduckgo videos - engine: duckduckgo_extra - categories: [videos, web] - ddg_category: videos - shortcut: ddv - disabled: true - - - name: duckduckgo news - engine: duckduckgo_extra - categories: [news, web] - ddg_category: news - shortcut: ddn - disabled: true - - - name: duckduckgo weather - engine: duckduckgo_weather - shortcut: ddw - disabled: true - - - name: apple maps - engine: apple_maps - shortcut: apm - disabled: true - timeout: 5.0 - - - name: emojipedia - engine: emojipedia - timeout: 4.0 - shortcut: em - disabled: true - - - name: tineye - engine: tineye - shortcut: tin - timeout: 9.0 - disabled: true - - - name: etymonline - engine: xpath - paging: true - search_url: https://etymonline.com/search?page={pageno}&q={query} - url_xpath: //a[contains(@class, "word__name--")]/@href - title_xpath: //a[contains(@class, "word__name--")] - content_xpath: //section[contains(@class, "word__defination")] - first_page_num: 1 - shortcut: et - categories: [dictionaries] - about: - website: https://www.etymonline.com/ - wikidata_id: Q1188617 - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - # - name: ebay - # engine: ebay - # shortcut: eb - # base_url: 'https://www.ebay.com' - # disabled: true - # timeout: 5 - - - name: 1x - engine: www1x - shortcut: 1x - timeout: 3.0 - disabled: true - - - name: fdroid - engine: fdroid - shortcut: fd - disabled: true - - - name: flickr - categories: images - shortcut: fl - # You can use the engine using the official stable API, but you need an API - # key, see: https://www.flickr.com/services/apps/create/ - # engine: flickr - # api_key: 'apikey' # required! - # Or you can use the html non-stable engine, activated by default - engine: flickr_noapi - - - name: free software directory - engine: mediawiki - shortcut: fsd - categories: [it, software wikis] - base_url: https://directory.fsf.org/ - search_type: title - timeout: 5.0 - disabled: true - about: - website: https://directory.fsf.org/ - wikidata_id: Q2470288 - - # - name: freesound - # engine: freesound - # shortcut: fnd - # disabled: true - # timeout: 15.0 - # API key required, see: https://freesound.org/docs/api/overview.html - # api_key: MyAPIkey - - - name: frinkiac - engine: frinkiac - shortcut: frk - disabled: true - - - name: fyyd - engine: fyyd - shortcut: fy - timeout: 8.0 - disabled: true - - - name: genius - engine: genius - shortcut: gen - - - name: gentoo - engine: gentoo - shortcut: ge - timeout: 10.0 - - - name: gitlab - engine: json_engine - paging: true - search_url: https://gitlab.com/api/v4/projects?search={query}&page={pageno} - url_query: web_url - title_query: name_with_namespace - content_query: description - page_size: 20 - categories: [it, repos] - shortcut: gl - timeout: 10.0 - disabled: true - about: - website: https://about.gitlab.com/ - wikidata_id: Q16639197 - official_api_documentation: https://docs.gitlab.com/ee/api/ - use_official_api: false - require_api_key: false - results: JSON - - - name: github - engine: github - shortcut: gh - - # This a Gitea service. If you would like to use a different instance, - # change codeberg.org to URL of the desired Gitea host. Or you can create a - # new engine by copying this and changing the name, shortcut and search_url. - - - name: codeberg - engine: json_engine - search_url: https://codeberg.org/api/v1/repos/search?q={query}&limit=10 - url_query: html_url - title_query: name - content_query: description - categories: [it, repos] - shortcut: cb - disabled: true - about: - website: https://codeberg.org/ - wikidata_id: - official_api_documentation: https://try.gitea.io/api/swagger - use_official_api: false - require_api_key: false - results: JSON - - - name: goodreads - engine: goodreads - shortcut: good - timeout: 4.0 - disabled: true - - - name: google - engine: google - shortcut: go - # additional_tests: - # android: *test_android - - - name: google images - engine: google_images - shortcut: goi - # additional_tests: - # android: *test_android - # dali: - # matrix: - # query: ['Dali Christ'] - # lang: ['en', 'de', 'fr', 'zh-CN'] - # result_container: - # - ['one_title_contains', 'Salvador'] - - - name: google news - engine: google_news - shortcut: gon - # additional_tests: - # android: *test_android - - - name: google videos - engine: google_videos - shortcut: gov - # additional_tests: - # android: *test_android - - - name: google scholar - engine: google_scholar - shortcut: gos - - - name: google play apps - engine: google_play - categories: [files, apps] - shortcut: gpa - play_categ: apps - disabled: true - - - name: google play movies - engine: google_play - categories: videos - shortcut: gpm - play_categ: movies - disabled: true - - - name: material icons - engine: material_icons - categories: images - shortcut: mi - disabled: true - - - name: gpodder - engine: json_engine - shortcut: gpod - timeout: 4.0 - paging: false - search_url: https://gpodder.net/search.json?q={query} - url_query: url - title_query: title - content_query: description - page_size: 19 - categories: music - disabled: true - about: - website: https://gpodder.net - wikidata_id: Q3093354 - official_api_documentation: https://gpoddernet.readthedocs.io/en/latest/api/ - use_official_api: false - requires_api_key: false - results: JSON - - - name: habrahabr - engine: xpath - paging: true - search_url: https://habr.com/en/search/page{pageno}/?q={query} - results_xpath: //article[contains(@class, "tm-articles-list__item")] - url_xpath: .//a[@class="tm-title__link"]/@href - title_xpath: .//a[@class="tm-title__link"] - content_xpath: .//div[contains(@class, "article-formatted-body")] - categories: it - timeout: 4.0 - disabled: true - shortcut: habr - about: - website: https://habr.com/ - wikidata_id: Q4494434 - official_api_documentation: https://habr.com/en/docs/help/api/ - use_official_api: false - require_api_key: false - results: HTML - - - name: hackernews - engine: hackernews - shortcut: hn - disabled: true - - - name: hoogle - engine: xpath - paging: true - search_url: https://hoogle.haskell.org/?hoogle={query}&start={pageno} - results_xpath: '//div[@class="result"]' - title_xpath: './/div[@class="ans"]//a' - url_xpath: './/div[@class="ans"]//a/@href' - content_xpath: './/div[@class="from"]' - page_size: 20 - categories: [it, packages] - shortcut: ho - about: - website: https://hoogle.haskell.org/ - wikidata_id: Q34010 - official_api_documentation: https://hackage.haskell.org/api - use_official_api: false - require_api_key: false - results: JSON - - - name: imdb - engine: imdb - shortcut: imdb - timeout: 6.0 - disabled: true - - - name: imgur - engine: imgur - shortcut: img - disabled: true - - - name: ina - engine: ina - shortcut: in - timeout: 6.0 - disabled: true - - - name: invidious - engine: invidious - # Instanes will be selected randomly, see https://api.invidious.io/ for - # instances that are stable (good uptime) and close to you. - base_url: - - https://invidious.io.lol - - https://invidious.fdn.fr - - https://yt.artemislena.eu - - https://invidious.tiekoetter.com - - https://invidious.flokinet.to - - https://vid.puffyan.us - - https://invidious.privacydev.net - - https://inv.tux.pizza - shortcut: iv - timeout: 3.0 - disabled: true - - - name: jisho - engine: jisho - shortcut: js - timeout: 3.0 - disabled: true - - - name: kickass - engine: kickass - base_url: - - https://kickasstorrents.to - - https://kickasstorrents.cr - - https://kickasstorrent.cr - - https://kickass.sx - - https://kat.am - shortcut: kc - timeout: 4.0 - - - name: lemmy communities - engine: lemmy - lemmy_type: Communities - shortcut: leco - - - name: lemmy users - engine: lemmy - network: lemmy communities - lemmy_type: Users - shortcut: leus - - - name: lemmy posts - engine: lemmy - network: lemmy communities - lemmy_type: Posts - shortcut: lepo - - - name: lemmy comments - engine: lemmy - network: lemmy communities - lemmy_type: Comments - shortcut: lecom - - - name: library genesis - engine: xpath - # search_url: https://libgen.is/search.php?req={query} - search_url: https://libgen.rs/search.php?req={query} - url_xpath: //a[contains(@href,"book/index.php?md5")]/@href - title_xpath: //a[contains(@href,"book/")]/text()[1] - content_xpath: //td/a[1][contains(@href,"=author")]/text() - categories: files - timeout: 7.0 - disabled: true - shortcut: lg - about: - website: https://libgen.fun/ - wikidata_id: Q22017206 - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - - name: z-library - engine: zlibrary - shortcut: zlib - categories: files - timeout: 7.0 - - - name: library of congress - engine: loc - shortcut: loc - categories: images - - - name: lingva - engine: lingva - shortcut: lv - # set lingva instance in url, by default it will use the official instance - # url: https://lingva.thedaviddelta.com - - - name: lobste.rs - engine: xpath - search_url: https://lobste.rs/search?utf8=%E2%9C%93&q={query}&what=stories&order=relevance - results_xpath: //li[contains(@class, "story")] - url_xpath: .//a[@class="u-url"]/@href - title_xpath: .//a[@class="u-url"] - content_xpath: .//a[@class="domain"] - categories: it - shortcut: lo - timeout: 5.0 - disabled: true - about: - website: https://lobste.rs/ - wikidata_id: Q60762874 - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - - name: mastodon users - engine: mastodon - mastodon_type: accounts - base_url: https://mastodon.social - shortcut: mau - - - name: mastodon hashtags - engine: mastodon - mastodon_type: hashtags - base_url: https://mastodon.social - shortcut: mah - - # - name: matrixrooms - # engine: mrs - # # https://docs.searxng.org/dev/engines/online/mrs.html - # # base_url: https://mrs-api-host - # shortcut: mtrx - # disabled: true - - - name: mdn - shortcut: mdn - engine: json_engine - categories: [it] - paging: true - search_url: https://developer.mozilla.org/api/v1/search?q={query}&page={pageno} - results_query: documents - url_query: mdn_url - url_prefix: https://developer.mozilla.org - title_query: title - content_query: summary - about: - website: https://developer.mozilla.org - wikidata_id: Q3273508 - official_api_documentation: null - use_official_api: false - require_api_key: false - results: JSON - - - name: metacpan - engine: metacpan - shortcut: cpan - disabled: true - number_of_results: 20 - - # - name: meilisearch - # engine: meilisearch - # shortcut: mes - # enable_http: true - # base_url: http://localhost:7700 - # index: my-index - - - name: mixcloud - engine: mixcloud - shortcut: mc - - # MongoDB engine - # Required dependency: pymongo - # - name: mymongo - # engine: mongodb - # shortcut: md - # exact_match_only: false - # host: '127.0.0.1' - # port: 27017 - # enable_http: true - # results_per_page: 20 - # database: 'business' - # collection: 'reviews' # name of the db collection - # key: 'name' # key in the collection to search for - - - name: mozhi - engine: mozhi - base_url: - - https://mozhi.aryak.me - - https://translate.bus-hit.me - - https://nyc1.mz.ggtyler.dev - # mozhi_engine: google - see https://mozhi.aryak.me for supported engines - timeout: 4.0 - shortcut: mz - disabled: true - - - name: mwmbl - engine: mwmbl - # api_url: https://api.mwmbl.org - shortcut: mwm - disabled: true - - - name: npm - engine: json_engine - paging: true - first_page_num: 0 - search_url: https://api.npms.io/v2/search?q={query}&size=25&from={pageno} - results_query: results - url_query: package/links/npm - title_query: package/name - content_query: package/description - page_size: 25 - categories: [it, packages] - disabled: true - timeout: 5.0 - shortcut: npm - about: - website: https://npms.io/ - wikidata_id: Q7067518 - official_api_documentation: https://api-docs.npms.io/ - use_official_api: false - require_api_key: false - results: JSON - - - name: nyaa - engine: nyaa - shortcut: nt - disabled: true - - - name: mankier - engine: json_engine - search_url: https://www.mankier.com/api/v2/mans/?q={query} - results_query: results - url_query: url - title_query: name - content_query: description - categories: it - shortcut: man - about: - website: https://www.mankier.com/ - official_api_documentation: https://www.mankier.com/api - use_official_api: true - require_api_key: false - results: JSON - - - name: odysee - engine: odysee - shortcut: od - disabled: true - - - name: openairedatasets - engine: json_engine - paging: true - search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} - results_query: response/results/result - url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ - title_query: metadata/oaf:entity/oaf:result/title/$ - content_query: metadata/oaf:entity/oaf:result/description/$ - content_html_to_text: true - categories: 'science' - shortcut: oad - timeout: 5.0 - about: - website: https://www.openaire.eu/ - wikidata_id: Q25106053 - official_api_documentation: https://api.openaire.eu/ - use_official_api: false - require_api_key: false - results: JSON - - - name: openairepublications - engine: json_engine - paging: true - search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} - results_query: response/results/result - url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ - title_query: metadata/oaf:entity/oaf:result/title/$ - content_query: metadata/oaf:entity/oaf:result/description/$ - content_html_to_text: true - categories: science - shortcut: oap - timeout: 5.0 - about: - website: https://www.openaire.eu/ - wikidata_id: Q25106053 - official_api_documentation: https://api.openaire.eu/ - use_official_api: false - require_api_key: false - results: JSON - - # - name: opensemanticsearch - # engine: opensemantic - # shortcut: oss - # base_url: 'http://localhost:8983/solr/opensemanticsearch/' - - - name: openstreetmap - engine: openstreetmap - shortcut: osm - - - name: openrepos - engine: xpath - paging: true - search_url: https://openrepos.net/search/node/{query}?page={pageno} - url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href - title_xpath: //li[@class="search-result"]//h3[@class="title"]/a - content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] - categories: files - timeout: 4.0 - disabled: true - shortcut: or - about: - website: https://openrepos.net/ - wikidata_id: - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - - name: packagist - engine: json_engine - paging: true - search_url: https://packagist.org/search.json?q={query}&page={pageno} - results_query: results - url_query: url - title_query: name - content_query: description - categories: [it, packages] - disabled: true - timeout: 5.0 - shortcut: pack - about: - website: https://packagist.org - wikidata_id: Q108311377 - official_api_documentation: https://packagist.org/apidoc - use_official_api: true - require_api_key: false - results: JSON - - - name: pdbe - engine: pdbe - shortcut: pdb - # Hide obsolete PDB entries. Default is not to hide obsolete structures - # hide_obsolete: false - - - name: photon - engine: photon - shortcut: ph - - - name: pinterest - engine: pinterest - shortcut: pin - - - name: piped - engine: piped - shortcut: ppd - categories: videos - piped_filter: videos - timeout: 3.0 - - # URL to use as link and for embeds - frontend_url: https://srv.piped.video - # Instance will be selected randomly, for more see https://piped-instances.kavin.rocks/ - backend_url: - - https://pipedapi.kavin.rocks - - https://pipedapi-libre.kavin.rocks - - https://pipedapi.adminforge.de - - - name: piped.music - engine: piped - network: piped - shortcut: ppdm - categories: music - piped_filter: music_songs - timeout: 3.0 - - - name: piratebay - engine: piratebay - shortcut: tpb - # You may need to change this URL to a proxy if piratebay is blocked in your - # country - url: https://thepiratebay.org/ - timeout: 3.0 - - - name: podcastindex - engine: podcastindex - shortcut: podcast - - # Required dependency: psychopg2 - # - name: postgresql - # engine: postgresql - # database: postgres - # username: postgres - # password: postgres - # limit: 10 - # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' - # shortcut : psql - - - name: presearch - engine: presearch - search_type: search - categories: [general, web] - shortcut: ps - timeout: 4.0 - disabled: true - - - name: presearch images - engine: presearch - network: presearch - search_type: images - categories: [images, web] - timeout: 4.0 - shortcut: psimg - disabled: true - - - name: presearch videos - engine: presearch - network: presearch - search_type: videos - categories: [general, web] - timeout: 4.0 - shortcut: psvid - disabled: true - - - name: presearch news - engine: presearch - network: presearch - search_type: news - categories: [news, web] - timeout: 4.0 - shortcut: psnews - disabled: true - - - name: pub.dev - engine: xpath - shortcut: pd - search_url: https://pub.dev/packages?q={query}&page={pageno} - paging: true - results_xpath: //div[contains(@class,"packages-item")] - url_xpath: ./div/h3/a/@href - title_xpath: ./div/h3/a - content_xpath: ./div/div/div[contains(@class,"packages-description")]/span - categories: [packages, it] - timeout: 3.0 - disabled: true - first_page_num: 1 - about: - website: https://pub.dev/ - official_api_documentation: https://pub.dev/help/api - use_official_api: false - require_api_key: false - results: HTML - - - name: pubmed - engine: pubmed - shortcut: pub - timeout: 3.0 - - - name: pypi - shortcut: pypi - engine: xpath - paging: true - search_url: https://pypi.org/search/?q={query}&page={pageno} - results_xpath: /html/body/main/div/div/div/form/div/ul/li/a[@class="package-snippet"] - url_xpath: ./@href - title_xpath: ./h3/span[@class="package-snippet__name"] - content_xpath: ./p - suggestion_xpath: /html/body/main/div/div/div/form/div/div[@class="callout-block"]/p/span/a[@class="link"] - first_page_num: 1 - categories: [it, packages] - about: - website: https://pypi.org - wikidata_id: Q2984686 - official_api_documentation: https://warehouse.readthedocs.io/api-reference/index.html - use_official_api: false - require_api_key: false - results: HTML - - - name: qwant - qwant_categ: web - engine: qwant - shortcut: qw - categories: [general, web] - additional_tests: - rosebud: *test_rosebud - - - name: qwant news - qwant_categ: news - engine: qwant - shortcut: qwn - categories: news - network: qwant - - - name: qwant images - qwant_categ: images - engine: qwant - shortcut: qwi - categories: [images, web] - network: qwant - - - name: qwant videos - qwant_categ: videos - engine: qwant - shortcut: qwv - categories: [videos, web] - network: qwant - - # - name: library - # engine: recoll - # shortcut: lib - # base_url: 'https://recoll.example.org/' - # search_dir: '' - # mount_prefix: /export - # dl_prefix: 'https://download.example.org' - # timeout: 30.0 - # categories: files - # disabled: true - - # - name: recoll library reference - # engine: recoll - # base_url: 'https://recoll.example.org/' - # search_dir: reference - # mount_prefix: /export - # dl_prefix: 'https://download.example.org' - # shortcut: libr - # timeout: 30.0 - # categories: files - # disabled: true - - - name: radio browser - engine: radio_browser - shortcut: rb - - - name: reddit - engine: reddit - shortcut: re - page_size: 25 - - - name: rottentomatoes - engine: rottentomatoes - shortcut: rt - disabled: true - - # Required dependency: redis - # - name: myredis - # shortcut : rds - # engine: redis_server - # exact_match_only: false - # host: '127.0.0.1' - # port: 6379 - # enable_http: true - # password: '' - # db: 0 - - # tmp suspended: bad certificate - # - name: scanr structures - # shortcut: scs - # engine: scanr_structures - # disabled: true - - - name: sepiasearch - engine: sepiasearch - shortcut: sep - - - name: soundcloud - engine: soundcloud - shortcut: sc - - - name: stackoverflow - engine: stackexchange - shortcut: st - api_site: 'stackoverflow' - categories: [it, q&a] - - - name: askubuntu - engine: stackexchange - shortcut: ubuntu - api_site: 'askubuntu' - categories: [it, q&a] - - - name: internetarchivescholar - engine: internet_archive_scholar - shortcut: ias - timeout: 5.0 - - - name: superuser - engine: stackexchange - shortcut: su - api_site: 'superuser' - categories: [it, q&a] - - - name: searchcode code - engine: searchcode_code - shortcut: scc - disabled: true - - # - name: searx - # engine: searx_engine - # shortcut: se - # instance_urls : - # - http://127.0.0.1:8888/ - # - ... - # disabled: true - - - name: semantic scholar - engine: semantic_scholar - disabled: true - shortcut: se - - # Spotify needs API credentials - # - name: spotify - # engine: spotify - # shortcut: stf - # api_client_id: ******* - # api_client_secret: ******* - - # - name: solr - # engine: solr - # shortcut: slr - # base_url: http://localhost:8983 - # collection: collection_name - # sort: '' # sorting: asc or desc - # field_list: '' # comma separated list of field names to display on the UI - # default_fields: '' # default field to query - # query_fields: '' # query fields - # enable_http: true - - # - name: springer nature - # engine: springer - # # get your API key from: https://dev.springernature.com/signup - # # working API key, for test & debug: "a69685087d07eca9f13db62f65b8f601" - # api_key: 'unset' - # shortcut: springer - # timeout: 15.0 - - - name: startpage - engine: startpage - shortcut: sp - timeout: 6.0 - disabled: true - additional_tests: - rosebud: *test_rosebud - - - name: tokyotoshokan - engine: tokyotoshokan - shortcut: tt - timeout: 6.0 - disabled: true - - - name: solidtorrents - engine: solidtorrents - shortcut: solid - timeout: 4.0 - base_url: - - https://solidtorrents.to - - https://bitsearch.to - - # For this demo of the sqlite engine download: - # https://liste.mediathekview.de/filmliste-v2.db.bz2 - # and unpack into searx/data/filmliste-v2.db - # Query to test: "!demo concert" - # - # - name: demo - # engine: sqlite - # shortcut: demo - # categories: general - # result_template: default.html - # database: searx/data/filmliste-v2.db - # query_str: >- - # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, - # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, - # description AS content - # FROM film - # WHERE title LIKE :wildcard OR description LIKE :wildcard - # ORDER BY duration DESC - - - name: tagesschau - engine: tagesschau - # when set to false, display URLs from Tagesschau, and not the actual source - # (e.g. NDR, WDR, SWR, HR, ...) - use_source_url: true - shortcut: ts - disabled: true - - - name: tmdb - engine: xpath - paging: true - categories: movies - search_url: https://www.themoviedb.org/search?page={pageno}&query={query} - results_xpath: //div[contains(@class,"movie") or contains(@class,"tv")]//div[contains(@class,"card")] - url_xpath: .//div[contains(@class,"poster")]/a/@href - thumbnail_xpath: .//img/@src - title_xpath: .//div[contains(@class,"title")]//h2 - content_xpath: .//div[contains(@class,"overview")] - shortcut: tm - disabled: true - - # Requires Tor - - name: torch - engine: xpath - paging: true - search_url: http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and - results_xpath: //table//tr - url_xpath: ./td[2]/a - title_xpath: ./td[2]/b - content_xpath: ./td[2]/small - categories: onions - enable_http: true - shortcut: tch - - # torznab engine lets you query any torznab compatible indexer. Using this - # engine in combination with Jackett opens the possibility to query a lot of - # public and private indexers directly from SearXNG. More details at: - # https://docs.searxng.org/dev/engines/online/torznab.html - # - # - name: Torznab EZTV - # engine: torznab - # shortcut: eztv - # base_url: http://localhost:9117/api/v2.0/indexers/eztv/results/torznab - # enable_http: true # if using localhost - # api_key: xxxxxxxxxxxxxxx - # show_magnet_links: true - # show_torrent_files: false - # # https://github.com/Jackett/Jackett/wiki/Jackett-Categories - # torznab_categories: # optional - # - 2000 - # - 5000 - - # tmp suspended - too slow, too many errors - # - name: urbandictionary - # engine : xpath - # search_url : https://www.urbandictionary.com/define.php?term={query} - # url_xpath : //*[@class="word"]/@href - # title_xpath : //*[@class="def-header"] - # content_xpath: //*[@class="meaning"] - # shortcut: ud - - - name: unsplash - engine: unsplash - shortcut: us - - - name: yandex music - engine: yandex_music - shortcut: ydm - disabled: true - # https://yandex.com/support/music/access.html - inactive: true - - - name: yahoo - engine: yahoo - shortcut: yh - disabled: true - - - name: yahoo news - engine: yahoo_news - shortcut: yhn - - - name: youtube - shortcut: yt - # You can use the engine using the official stable API, but you need an API - # key See: https://console.developers.google.com/project - # - # engine: youtube_api - # api_key: 'apikey' # required! - # - # Or you can use the html non-stable engine, activated by default - engine: youtube_noapi - - - name: dailymotion - engine: dailymotion - shortcut: dm - - - name: vimeo - engine: vimeo - shortcut: vm - - - name: wiby - engine: json_engine - paging: true - search_url: https://wiby.me/json/?q={query}&p={pageno} - url_query: URL - title_query: Title - content_query: Snippet - categories: [general, web] - shortcut: wib - disabled: true - about: - website: https://wiby.me/ - - - name: alexandria - engine: json_engine - shortcut: alx - categories: general - paging: true - search_url: https://api.alexandria.org/?a=1&q={query}&p={pageno} - results_query: results - title_query: title - url_query: url - content_query: snippet - timeout: 1.5 - disabled: true - about: - website: https://alexandria.org/ - official_api_documentation: https://github.com/alexandria-org/alexandria-api/raw/master/README.md - use_official_api: true - require_api_key: false - results: JSON - - - name: wikibooks - engine: mediawiki - weight: 0.5 - shortcut: wb - categories: [general, wikimedia] - base_url: 'https://{language}.wikibooks.org/' - search_type: text - disabled: true - about: - website: https://www.wikibooks.org/ - wikidata_id: Q367 - - - name: wikinews - engine: mediawiki - shortcut: wn - categories: [news, wikimedia] - base_url: 'https://{language}.wikinews.org/' - search_type: text - srsort: create_timestamp_desc - about: - website: https://www.wikinews.org/ - wikidata_id: Q964 - - - name: wikiquote - engine: mediawiki - weight: 0.5 - shortcut: wq - categories: [general, wikimedia] - base_url: 'https://{language}.wikiquote.org/' - search_type: text - disabled: true - additional_tests: - rosebud: *test_rosebud - about: - website: https://www.wikiquote.org/ - wikidata_id: Q369 - - - name: wikisource - engine: mediawiki - weight: 0.5 - shortcut: ws - categories: [general, wikimedia] - base_url: 'https://{language}.wikisource.org/' - search_type: text - disabled: true - about: - website: https://www.wikisource.org/ - wikidata_id: Q263 - - - name: wikispecies - engine: mediawiki - shortcut: wsp - categories: [general, science, wikimedia] - base_url: 'https://species.wikimedia.org/' - search_type: text - disabled: true - about: - website: https://species.wikimedia.org/ - wikidata_id: Q13679 - - - name: wiktionary - engine: mediawiki - shortcut: wt - categories: [dictionaries, wikimedia] - base_url: 'https://{language}.wiktionary.org/' - search_type: text - about: - website: https://www.wiktionary.org/ - wikidata_id: Q151 - - - name: wikiversity - engine: mediawiki - weight: 0.5 - shortcut: wv - categories: [general, wikimedia] - base_url: 'https://{language}.wikiversity.org/' - search_type: text - disabled: true - about: - website: https://www.wikiversity.org/ - wikidata_id: Q370 - - - name: wikivoyage - engine: mediawiki - weight: 0.5 - shortcut: wy - categories: [general, wikimedia] - base_url: 'https://{language}.wikivoyage.org/' - search_type: text - disabled: true - about: - website: https://www.wikivoyage.org/ - wikidata_id: Q373 - - - name: wikicommons.images - engine: wikicommons - shortcut: wc - categories: images - number_of_results: 10 - - name: wolframalpha - shortcut: wa - # You can use the engine using the official stable API, but you need an API - # key. See: https://products.wolframalpha.com/api/ - # - # engine: wolframalpha_api - # api_key: '' - # - # Or you can use the html non-stable engine, activated by default - engine: wolframalpha_noapi - timeout: 6.0 - categories: general disabled: false - - - name: dictzone - engine: dictzone - shortcut: dc - - - name: mymemory translated - engine: translated - shortcut: tl - timeout: 5.0 - # You can use without an API key, but you are limited to 1000 words/day - # See: https://mymemory.translated.net/doc/usagelimits.php - # api_key: '' - - # Required dependency: mysql-connector-python - # - name: mysql - # engine: mysql_server - # database: mydatabase - # username: user - # password: pass - # limit: 10 - # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' - # shortcut: mysql - - - name: 1337x - engine: 1337x - shortcut: 1337x - disabled: true - - - name: duden - engine: duden - shortcut: du - disabled: true - - - name: seznam - shortcut: szn - engine: seznam - disabled: true - - # - name: deepl - # engine: deepl - # shortcut: dpl - # # You can use the engine using the official stable API, but you need an API key - # # See: https://www.deepl.com/pro-api?cta=header-pro-api - # api_key: '' # required! - # timeout: 5.0 - # disabled: true - - - name: mojeek - shortcut: mjk - engine: xpath - paging: true - categories: [general, web] - search_url: https://www.mojeek.com/search?q={query}&s={pageno}&lang={lang}&lb={lang} - results_xpath: //ul[@class="results-standard"]/li/a[@class="ob"] - url_xpath: ./@href - title_xpath: ../h2/a - content_xpath: ..//p[@class="s"] - suggestion_xpath: //div[@class="top-info"]/p[@class="top-info spell"]/em/a - first_page_num: 0 - page_size: 10 - max_page: 100 - disabled: true - about: - website: https://www.mojeek.com/ - wikidata_id: Q60747299 - official_api_documentation: https://www.mojeek.com/services/api.html/ - use_official_api: false - require_api_key: false - results: HTML - - - name: moviepilot - engine: moviepilot - shortcut: mp - disabled: true - - - name: naver - shortcut: nvr - categories: [general, web] - engine: xpath - paging: true - search_url: https://search.naver.com/search.naver?where=webkr&sm=osp_hty&ie=UTF-8&query={query}&start={pageno} - url_xpath: //a[@class="link_tit"]/@href - title_xpath: //a[@class="link_tit"] - content_xpath: //a[@class="total_dsc"]/div - first_page_num: 1 - page_size: 10 - disabled: true - about: - website: https://www.naver.com/ - wikidata_id: Q485639 - official_api_documentation: https://developers.naver.com/docs/nmt/examples/ - use_official_api: false - require_api_key: false - results: HTML - language: ko - - - name: rubygems - shortcut: rbg - engine: xpath - paging: true - search_url: https://rubygems.org/search?page={pageno}&query={query} - results_xpath: /html/body/main/div/a[@class="gems__gem"] - url_xpath: ./@href - title_xpath: ./span/h2 - content_xpath: ./span/p - suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a - first_page_num: 1 - categories: [it, packages] - disabled: true - about: - website: https://rubygems.org/ - wikidata_id: Q1853420 - official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ - use_official_api: false - require_api_key: false - results: HTML - - - name: peertube - engine: peertube - shortcut: ptb - paging: true - # alternatives see: https://instances.joinpeertube.org/instances - # base_url: https://tube.4aem.com - categories: videos - disabled: true - timeout: 6.0 - - - name: mediathekviewweb - engine: mediathekviewweb - shortcut: mvw - disabled: true - - - name: yacy - engine: yacy - categories: general - search_type: text - base_url: https://yacy.searchlab.eu - shortcut: ya - disabled: true - # required if you aren't using HTTPS for your local yacy instance - # https://docs.searxng.org/dev/engines/online/yacy.html - # enable_http: true - # timeout: 3.0 - # search_mode: 'global' - - - name: yacy images - engine: yacy - categories: images - search_type: image - base_url: https://yacy.searchlab.eu - shortcut: yai - disabled: true - - - name: rumble - engine: rumble - shortcut: ru - base_url: https://rumble.com/ - paging: true - categories: videos - disabled: true - - - name: livespace - engine: livespace - shortcut: ls - categories: videos - disabled: true - timeout: 5.0 - - - name: wordnik - engine: wordnik - shortcut: def - base_url: https://www.wordnik.com/ - categories: [dictionaries] - timeout: 5.0 - - - name: woxikon.de synonyme - engine: xpath - shortcut: woxi - categories: [dictionaries] - timeout: 5.0 - disabled: true - search_url: https://synonyme.woxikon.de/synonyme/{query}.php - url_xpath: //div[@class="upper-synonyms"]/a/@href - content_xpath: //div[@class="synonyms-list-group"] - title_xpath: //div[@class="upper-synonyms"]/a - no_result_for_http_status: [404] - about: - website: https://www.woxikon.de/ - wikidata_id: # No Wikidata ID - use_official_api: false - require_api_key: false - results: HTML - language: de - - - name: seekr news - engine: seekr - shortcut: senews - categories: news - seekr_category: news - disabled: true - - - name: seekr images - engine: seekr - network: seekr news - shortcut: seimg - categories: images - seekr_category: images - disabled: true - - - name: seekr videos - engine: seekr - network: seekr news - shortcut: sevid - categories: videos - seekr_category: videos - disabled: true - - - name: sjp.pwn - engine: sjp - shortcut: sjp - base_url: https://sjp.pwn.pl/ - timeout: 5.0 - disabled: true - - - name: stract - engine: stract - shortcut: str - disabled: true - - - name: svgrepo - engine: svgrepo - shortcut: svg - timeout: 10.0 - disabled: true - - - name: tootfinder - engine: tootfinder - shortcut: toot - - - name: wallhaven - engine: wallhaven - # api_key: abcdefghijklmnopqrstuvwxyz - shortcut: wh - - # wikimini: online encyclopedia for children - # The fulltext and title parameter is necessary for Wikimini because - # sometimes it will not show the results and redirect instead - - name: wikimini - engine: xpath - shortcut: wkmn - search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search - url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href - title_xpath: //li//div[@class="mw-search-result-heading"]/a - content_xpath: //li/div[@class="searchresult"] - categories: general - disabled: true - about: - website: https://wikimini.org/ - wikidata_id: Q3568032 - use_official_api: false - require_api_key: false - results: HTML - language: fr - - - name: wttr.in - engine: wttr - shortcut: wttr - timeout: 9.0 - - - name: yummly - engine: yummly - shortcut: yum - disabled: true - - - name: brave - engine: brave - shortcut: br - time_range_support: true - paging: true - categories: [general, web] - brave_category: search - # brave_spellcheck: true - - - name: brave.images - engine: brave - network: brave - shortcut: brimg - categories: [images, web] - brave_category: images - - - name: brave.videos - engine: brave - network: brave - shortcut: brvid - categories: [videos, web] - brave_category: videos - - - name: brave.news - engine: brave - network: brave - shortcut: brnews - categories: news - brave_category: news - - # - name: brave.goggles - # engine: brave - # network: brave - # shortcut: brgog - # time_range_support: true - # paging: true - # categories: [general, web] - # brave_category: goggles - # Goggles: # required! This should be a URL ending in .goggle - - - name: lib.rs - shortcut: lrs - engine: xpath - search_url: https://lib.rs/search?q={query} - results_xpath: /html/body/main/div/ol/li/a - url_xpath: ./@href - title_xpath: ./div[@class="h"]/h4 - content_xpath: ./div[@class="h"]/p - categories: [it, packages] - disabled: true - about: - website: https://lib.rs - wikidata_id: Q113486010 - use_official_api: false - require_api_key: false - results: HTML - - - name: sourcehut - shortcut: srht - engine: xpath - paging: true - search_url: https://sr.ht/projects?page={pageno}&search={query} - results_xpath: (//div[@class="event-list"])[1]/div[@class="event"] - url_xpath: ./h4/a[2]/@href - title_xpath: ./h4/a[2] - content_xpath: ./p - first_page_num: 1 - categories: [it, repos] - disabled: true - about: - website: https://sr.ht - wikidata_id: Q78514485 - official_api_documentation: https://man.sr.ht/ - use_official_api: false - require_api_key: false - results: HTML - - - name: goo - shortcut: goo - engine: xpath - paging: true - search_url: https://search.goo.ne.jp/web.jsp?MT={query}&FR={pageno}0 - url_xpath: //div[@class="result"]/p[@class='title fsL1']/a/@href - title_xpath: //div[@class="result"]/p[@class='title fsL1']/a - content_xpath: //p[contains(@class,'url fsM')]/following-sibling::p - first_page_num: 0 - categories: [general, web] - disabled: true - timeout: 4.0 - about: - website: https://search.goo.ne.jp - wikidata_id: Q249044 - use_official_api: false - require_api_key: false - results: HTML - language: ja - - - name: bt4g - engine: bt4g - shortcut: bt4g - - - name: pkg.go.dev - engine: xpath - shortcut: pgo - search_url: https://pkg.go.dev/search?limit=100&m=package&q={query} - results_xpath: /html/body/main/div[contains(@class,"SearchResults")]/div[not(@class)]/div[@class="SearchSnippet"] - url_xpath: ./div[@class="SearchSnippet-headerContainer"]/h2/a/@href - title_xpath: ./div[@class="SearchSnippet-headerContainer"]/h2/a - content_xpath: ./p[@class="SearchSnippet-synopsis"] - categories: [packages, it] - timeout: 3.0 - disabled: true - about: - website: https://pkg.go.dev/ - use_official_api: false - require_api_key: false - results: HTML - -# Doku engine lets you access to any Doku wiki instance: -# A public one or a privete/corporate one. -# - name: ubuntuwiki -# engine: doku -# shortcut: uw -# base_url: 'https://doc.ubuntu-fr.org' - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: git grep -# engine: command -# command: ['git', 'grep', '{{QUERY}}'] -# shortcut: gg -# tokens: [] -# disabled: true -# delimiter: -# chars: ':' -# keys: ['filepath', 'code'] - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: locate -# engine: command -# command: ['locate', '{{QUERY}}'] -# shortcut: loc -# tokens: [] -# disabled: true -# delimiter: -# chars: ' ' -# keys: ['line'] - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: find -# engine: command -# command: ['find', '.', '-name', '{{QUERY}}'] -# query_type: path -# shortcut: fnd -# tokens: [] -# disabled: true -# delimiter: -# chars: ' ' -# keys: ['line'] - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: pattern search in files -# engine: command -# command: ['fgrep', '{{QUERY}}'] -# shortcut: fgr -# tokens: [] -# disabled: true -# delimiter: -# chars: ' ' -# keys: ['line'] - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: regex search in files -# engine: command -# command: ['grep', '{{QUERY}}'] -# shortcut: gr -# tokens: [] -# disabled: true -# delimiter: -# chars: ' ' -# keys: ['line'] - -doi_resolvers: - oadoi.org: 'https://oadoi.org/' - doi.org: 'https://doi.org/' - doai.io: 'https://dissem.in/' - sci-hub.se: 'https://sci-hub.se/' - sci-hub.st: 'https://sci-hub.st/' - sci-hub.ru: 'https://sci-hub.ru/' - -default_doi_resolver: 'oadoi.org' From 51939ff842928bfe6793a4087bfeeb8b78f719f9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 24 Aug 2024 21:48:27 +0530 Subject: [PATCH 010/282] feat(webSearchAgent): fix typo, closes #313 --- src/agents/webSearchAgent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index c93dabb..803ae23 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -27,7 +27,7 @@ const basicSearchRetrieverPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. If the question contains some links and asks to answer from those links or even if they don't you need to return the links inside 'links' XML block and the question inside 'question' XML block. If there are no links then you need to return the question without any XML block. -If the user asks to summarrize the content from some links you need to return \`Summarize\` as the question inside the 'question' XML block and the links inside the 'links' XML block. +If the user asks to summarize the content from some links you need to return \`Summarize\` as the question inside the 'question' XML block and the links inside the 'links' XML block. Example: 1. Follow up question: What is the capital of France? From 8bb3e4f016cfb98698efdad9d5242e03d8a41c16 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 25 Aug 2024 12:03:32 +0530 Subject: [PATCH 011/282] feat(agents): update types --- src/agents/academicSearchAgent.ts | 2 +- src/agents/redditSearchAgent.ts | 2 +- src/agents/webSearchAgent.ts | 3 ++- src/agents/wolframAlphaSearchAgent.ts | 2 +- src/agents/writingAssistant.ts | 2 +- src/agents/youtubeSearchAgent.ts | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/agents/academicSearchAgent.ts b/src/agents/academicSearchAgent.ts index d797119..a64f9b9 100644 --- a/src/agents/academicSearchAgent.ts +++ b/src/agents/academicSearchAgent.ts @@ -66,7 +66,7 @@ const basicAcademicSearchResponsePrompt = ` const strParser = new StringOutputParser(); const handleStream = async ( - stream: AsyncGenerator<StreamEvent, any, unknown>, + stream: IterableReadableStream<StreamEvent>, emitter: eventEmitter, ) => { for await (const event of stream) { diff --git a/src/agents/redditSearchAgent.ts b/src/agents/redditSearchAgent.ts index 578e2bb..bbb4e92 100644 --- a/src/agents/redditSearchAgent.ts +++ b/src/agents/redditSearchAgent.ts @@ -66,7 +66,7 @@ const basicRedditSearchResponsePrompt = ` const strParser = new StringOutputParser(); const handleStream = async ( - stream: AsyncGenerator<StreamEvent, any, unknown>, + stream: IterableReadableStream<StreamEvent>, emitter: eventEmitter, ) => { for await (const event of stream) { diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index c93dabb..1a356c8 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -22,6 +22,7 @@ import logger from '../utils/logger'; import LineListOutputParser from '../lib/outputParsers/listLineOutputParser'; import { getDocumentsFromLinks } from '../lib/linkDocument'; import LineOutputParser from '../lib/outputParsers/lineOutputParser'; +import { IterableReadableStream } from '@langchain/core/utils/stream'; const basicSearchRetrieverPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. @@ -95,7 +96,7 @@ const basicWebSearchResponsePrompt = ` const strParser = new StringOutputParser(); const handleStream = async ( - stream: AsyncGenerator<StreamEvent, any, unknown>, + stream: IterableReadableStream<StreamEvent>, emitter: eventEmitter, ) => { for await (const event of stream) { diff --git a/src/agents/wolframAlphaSearchAgent.ts b/src/agents/wolframAlphaSearchAgent.ts index b80fcf3..07d8857 100644 --- a/src/agents/wolframAlphaSearchAgent.ts +++ b/src/agents/wolframAlphaSearchAgent.ts @@ -65,7 +65,7 @@ const basicWolframAlphaSearchResponsePrompt = ` const strParser = new StringOutputParser(); const handleStream = async ( - stream: AsyncGenerator<StreamEvent, any, unknown>, + stream: IterableReadableStream<StreamEvent>, emitter: eventEmitter, ) => { for await (const event of stream) { diff --git a/src/agents/writingAssistant.ts b/src/agents/writingAssistant.ts index 7c2cb49..5fd1f36 100644 --- a/src/agents/writingAssistant.ts +++ b/src/agents/writingAssistant.ts @@ -19,7 +19,7 @@ Since you are a writing assistant, you would not perform web searches. If you th const strParser = new StringOutputParser(); const handleStream = async ( - stream: AsyncGenerator<StreamEvent, any, unknown>, + stream: IterableReadableStream<StreamEvent>, emitter: eventEmitter, ) => { for await (const event of stream) { diff --git a/src/agents/youtubeSearchAgent.ts b/src/agents/youtubeSearchAgent.ts index 4133157..b0da25b 100644 --- a/src/agents/youtubeSearchAgent.ts +++ b/src/agents/youtubeSearchAgent.ts @@ -66,7 +66,7 @@ const basicYoutubeSearchResponsePrompt = ` const strParser = new StringOutputParser(); const handleStream = async ( - stream: AsyncGenerator<StreamEvent, any, unknown>, + stream: IterableReadableStream<StreamEvent>, emitter: eventEmitter, ) => { for await (const event of stream) { From c521b032a7dbbd841e86db1d6ffd6cd33e87a15d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 25 Aug 2024 15:08:30 +0530 Subject: [PATCH 012/282] feat(agents): fix unresloved types --- src/agents/academicSearchAgent.ts | 1 + src/agents/redditSearchAgent.ts | 1 + src/agents/webSearchAgent.ts | 2 +- src/agents/wolframAlphaSearchAgent.ts | 1 + src/agents/writingAssistant.ts | 1 + src/agents/youtubeSearchAgent.ts | 1 + 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/agents/academicSearchAgent.ts b/src/agents/academicSearchAgent.ts index a64f9b9..a72e3a2 100644 --- a/src/agents/academicSearchAgent.ts +++ b/src/agents/academicSearchAgent.ts @@ -19,6 +19,7 @@ import formatChatHistoryAsString from '../utils/formatHistory'; import eventEmitter from 'events'; import computeSimilarity from '../utils/computeSimilarity'; import logger from '../utils/logger'; +import { IterableReadableStream } from '@langchain/core/utils/stream'; const basicAcademicSearchRetrieverPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. diff --git a/src/agents/redditSearchAgent.ts b/src/agents/redditSearchAgent.ts index bbb4e92..9c2c443 100644 --- a/src/agents/redditSearchAgent.ts +++ b/src/agents/redditSearchAgent.ts @@ -19,6 +19,7 @@ import formatChatHistoryAsString from '../utils/formatHistory'; import eventEmitter from 'events'; import computeSimilarity from '../utils/computeSimilarity'; import logger from '../utils/logger'; +import { IterableReadableStream } from '@langchain/core/utils/stream'; const basicRedditSearchRetrieverPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 9c0d97f..f7a6d7e 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -96,7 +96,7 @@ const basicWebSearchResponsePrompt = ` const strParser = new StringOutputParser(); const handleStream = async ( - stream: IterableReadableStream<StreamEvent>, + stream: IterableReadableStream<StreamEvent>, emitter: eventEmitter, ) => { for await (const event of stream) { diff --git a/src/agents/wolframAlphaSearchAgent.ts b/src/agents/wolframAlphaSearchAgent.ts index 07d8857..1de8d0f 100644 --- a/src/agents/wolframAlphaSearchAgent.ts +++ b/src/agents/wolframAlphaSearchAgent.ts @@ -18,6 +18,7 @@ import type { Embeddings } from '@langchain/core/embeddings'; import formatChatHistoryAsString from '../utils/formatHistory'; import eventEmitter from 'events'; import logger from '../utils/logger'; +import { IterableReadableStream } from '@langchain/core/utils/stream'; const basicWolframAlphaSearchRetrieverPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. diff --git a/src/agents/writingAssistant.ts b/src/agents/writingAssistant.ts index 5fd1f36..7e275df 100644 --- a/src/agents/writingAssistant.ts +++ b/src/agents/writingAssistant.ts @@ -10,6 +10,7 @@ import eventEmitter from 'events'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; import type { Embeddings } from '@langchain/core/embeddings'; import logger from '../utils/logger'; +import { IterableReadableStream } from '@langchain/core/utils/stream'; const writingAssistantPrompt = ` You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are currently set on focus mode 'Writing Assistant', this means you will be helping the user write a response to a given query. diff --git a/src/agents/youtubeSearchAgent.ts b/src/agents/youtubeSearchAgent.ts index b0da25b..e9b6553 100644 --- a/src/agents/youtubeSearchAgent.ts +++ b/src/agents/youtubeSearchAgent.ts @@ -19,6 +19,7 @@ import formatChatHistoryAsString from '../utils/formatHistory'; import eventEmitter from 'events'; import computeSimilarity from '../utils/computeSimilarity'; import logger from '../utils/logger'; +import { IterableReadableStream } from '@langchain/core/utils/stream'; const basicYoutubeSearchRetrieverPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. From ff34d1043fd3501f15e1e1ab2425b022c917911e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 25 Aug 2024 15:08:47 +0530 Subject: [PATCH 013/282] feat(app): lint & format --- ui/components/ChatWindow.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 5e6d382..0ace2dd 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -59,7 +59,9 @@ const useSocket = ( chatModelProvider = Object.keys(chatModelProviders)[0]; if (chatModelProvider === 'custom_openai') { - toast.error('Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL'); + toast.error( + 'Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL', + ); setError(true); return; } else { @@ -192,7 +194,7 @@ const useSocket = ( if (data.type === 'error') { toast.error(data.data); } - }) + }); setWs(ws); }; From 806c47e70592356193bacc487f6fe0b148e84337 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 Aug 2024 09:53:06 +0530 Subject: [PATCH 014/282] feat(chatwindow): fix infinite loading --- ui/components/ChatWindow.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 0ace2dd..cc93da8 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -201,13 +201,6 @@ const useSocket = ( connectWs(); } - - return () => { - if (ws?.readyState === 1) { - ws?.close(); - console.log('[DEBUG] closed'); - } - }; }, [ws, url, setIsWSReady, setError]); return ws; From 2873093fee1fbb7b473b4ab2c1f3e1d7116d95ee Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 Aug 2024 10:00:05 +0530 Subject: [PATCH 015/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index db3d773..c09454c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.9.0-rc1", + "version": "1.9.0-rc2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index 1d892de..23afda2 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.9.0-rc1", + "version": "1.9.0-rc2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From e8ed4df31aaac4001192f64a66701c48bc6e9378 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 Aug 2024 14:27:22 +0530 Subject: [PATCH 016/282] feat(chat-window): close socket on unmount --- ui/components/ChatWindow.tsx | 410 ++++++++++++++++++----------------- 1 file changed, 208 insertions(+), 202 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index cc93da8..9a1fe3c 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -1,42 +1,42 @@ -'use client'; +'use client' -import { useEffect, useRef, useState } from 'react'; -import { Document } from '@langchain/core/documents'; -import Navbar from './Navbar'; -import Chat from './Chat'; -import EmptyChat from './EmptyChat'; -import crypto from 'crypto'; -import { toast } from 'sonner'; -import { useSearchParams } from 'next/navigation'; -import { getSuggestions } from '@/lib/actions'; -import Error from 'next/error'; +import { useEffect, useRef, useState } from 'react' +import { Document } from '@langchain/core/documents' +import Navbar from './Navbar' +import Chat from './Chat' +import EmptyChat from './EmptyChat' +import crypto from 'crypto' +import { toast } from 'sonner' +import { useSearchParams } from 'next/navigation' +import { getSuggestions } from '@/lib/actions' +import Error from 'next/error' export type Message = { - messageId: string; - chatId: string; - createdAt: Date; - content: string; - role: 'user' | 'assistant'; - suggestions?: string[]; - sources?: Document[]; -}; + messageId: string + chatId: string + createdAt: Date + content: string + role: 'user' | 'assistant' + suggestions?: string[] + sources?: Document[] +} const useSocket = ( url: string, setIsWSReady: (ready: boolean) => void, setError: (error: boolean) => void, ) => { - const [ws, setWs] = useState<WebSocket | null>(null); + const [ws, setWs] = useState<WebSocket | null>(null) useEffect(() => { if (!ws) { const connectWs = async () => { - let chatModel = localStorage.getItem('chatModel'); - let chatModelProvider = localStorage.getItem('chatModelProvider'); - let embeddingModel = localStorage.getItem('embeddingModel'); + let chatModel = localStorage.getItem('chatModel') + let chatModelProvider = localStorage.getItem('chatModelProvider') + let embeddingModel = localStorage.getItem('embeddingModel') let embeddingModelProvider = localStorage.getItem( 'embeddingModelProvider', - ); + ) const providers = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/models`, @@ -45,7 +45,7 @@ const useSocket = ( 'Content-Type': 'application/json', }, }, - ).then(async (res) => await res.json()); + ).then(async res => await res.json()) if ( !chatModel || @@ -54,58 +54,55 @@ const useSocket = ( !embeddingModelProvider ) { if (!chatModel || !chatModelProvider) { - const chatModelProviders = providers.chatModelProviders; + const chatModelProviders = providers.chatModelProviders - chatModelProvider = Object.keys(chatModelProviders)[0]; + chatModelProvider = Object.keys(chatModelProviders)[0] if (chatModelProvider === 'custom_openai') { toast.error( 'Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL', - ); - setError(true); - return; + ) + setError(true) + return } else { - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0] if ( !chatModelProviders || Object.keys(chatModelProviders).length === 0 ) - return toast.error('No chat models available'); + return toast.error('No chat models available') } } if (!embeddingModel || !embeddingModelProvider) { - const embeddingModelProviders = providers.embeddingModelProviders; + const embeddingModelProviders = providers.embeddingModelProviders if ( !embeddingModelProviders || Object.keys(embeddingModelProviders).length === 0 ) - return toast.error('No embedding models available'); + return toast.error('No embedding models available') - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + embeddingModelProvider = Object.keys(embeddingModelProviders)[0] embeddingModel = Object.keys( embeddingModelProviders[embeddingModelProvider], - )[0]; + )[0] } - localStorage.setItem('chatModel', chatModel!); - localStorage.setItem('chatModelProvider', chatModelProvider); - localStorage.setItem('embeddingModel', embeddingModel!); - localStorage.setItem( - 'embeddingModelProvider', - embeddingModelProvider, - ); + localStorage.setItem('chatModel', chatModel!) + localStorage.setItem('chatModelProvider', chatModelProvider) + localStorage.setItem('embeddingModel', embeddingModel!) + localStorage.setItem('embeddingModelProvider', embeddingModelProvider) } else { - const chatModelProviders = providers.chatModelProviders; - const embeddingModelProviders = providers.embeddingModelProviders; + const chatModelProviders = providers.chatModelProviders + const embeddingModelProviders = providers.embeddingModelProviders if ( Object.keys(chatModelProviders).length > 0 && !chatModelProviders[chatModelProvider] ) { - chatModelProvider = Object.keys(chatModelProviders)[0]; - localStorage.setItem('chatModelProvider', chatModelProvider); + chatModelProvider = Object.keys(chatModelProviders)[0] + localStorage.setItem('chatModelProvider', chatModelProvider) } if ( @@ -113,19 +110,19 @@ const useSocket = ( chatModelProvider != 'custom_openai' && !chatModelProviders[chatModelProvider][chatModel] ) { - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - localStorage.setItem('chatModel', chatModel); + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0] + localStorage.setItem('chatModel', chatModel) } if ( Object.keys(embeddingModelProviders).length > 0 && !embeddingModelProviders[embeddingModelProvider] ) { - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + embeddingModelProvider = Object.keys(embeddingModelProviders)[0] localStorage.setItem( 'embeddingModelProvider', embeddingModelProvider, - ); + ) } if ( @@ -134,77 +131,77 @@ const useSocket = ( ) { embeddingModel = Object.keys( embeddingModelProviders[embeddingModelProvider], - )[0]; - localStorage.setItem('embeddingModel', embeddingModel); + )[0] + localStorage.setItem('embeddingModel', embeddingModel) } } - const wsURL = new URL(url); - const searchParams = new URLSearchParams({}); + const wsURL = new URL(url) + const searchParams = new URLSearchParams({}) - searchParams.append('chatModel', chatModel!); - searchParams.append('chatModelProvider', chatModelProvider); + searchParams.append('chatModel', chatModel!) + searchParams.append('chatModelProvider', chatModelProvider) if (chatModelProvider === 'custom_openai') { searchParams.append( 'openAIApiKey', localStorage.getItem('openAIApiKey')!, - ); + ) searchParams.append( 'openAIBaseURL', localStorage.getItem('openAIBaseURL')!, - ); + ) } - searchParams.append('embeddingModel', embeddingModel!); - searchParams.append('embeddingModelProvider', embeddingModelProvider); + searchParams.append('embeddingModel', embeddingModel!) + searchParams.append('embeddingModelProvider', embeddingModelProvider) - wsURL.search = searchParams.toString(); + wsURL.search = searchParams.toString() - const ws = new WebSocket(wsURL.toString()); + const ws = new WebSocket(wsURL.toString()) const timeoutId = setTimeout(() => { if (ws.readyState !== 1) { toast.error( 'Failed to connect to the server. Please try again later.', - ); + ) } - }, 10000); + }, 10000) ws.onopen = () => { - console.log('[DEBUG] open'); - clearTimeout(timeoutId); - setIsWSReady(true); - }; + console.log('[DEBUG] open') + clearTimeout(timeoutId) + setIsWSReady(true) + } ws.onerror = () => { - clearTimeout(timeoutId); - setError(true); - toast.error('WebSocket connection error.'); - }; + clearTimeout(timeoutId) + setError(true) + toast.error('WebSocket connection error.') + } ws.onclose = () => { - clearTimeout(timeoutId); - setError(true); - console.log('[DEBUG] closed'); - }; + clearTimeout(timeoutId) + setError(true) + console.log('[DEBUG] closed') + } - ws.addEventListener('message', (e) => { - const data = JSON.parse(e.data); + ws.addEventListener('message', e => { + const data = JSON.parse(e.data) if (data.type === 'error') { - toast.error(data.data); + toast.error(data.data) } - }); + }) - setWs(ws); - }; + setWs(ws) + } - connectWs(); + connectWs() } - }, [ws, url, setIsWSReady, setError]); + }, [ws, url, setIsWSReady, setError]) - return ws; -}; + return ws +} const loadMessages = async ( chatId: string, @@ -222,66 +219,66 @@ const loadMessages = async ( 'Content-Type': 'application/json', }, }, - ); + ) if (res.status === 404) { - setNotFound(true); - setIsMessagesLoaded(true); - return; + setNotFound(true) + setIsMessagesLoaded(true) + return } - const data = await res.json(); + const data = await res.json() const messages = data.messages.map((msg: any) => { return { ...msg, ...JSON.parse(msg.metadata), - }; - }) as Message[]; + } + }) as Message[] - setMessages(messages); + setMessages(messages) - const history = messages.map((msg) => { - return [msg.role, msg.content]; - }) as [string, string][]; + const history = messages.map(msg => { + return [msg.role, msg.content] + }) as [string, string][] - console.log('[DEBUG] messages loaded'); + console.log('[DEBUG] messages loaded') - document.title = messages[0].content; + document.title = messages[0].content - setChatHistory(history); - setFocusMode(data.chat.focusMode); - setIsMessagesLoaded(true); -}; + setChatHistory(history) + setFocusMode(data.chat.focusMode) + setIsMessagesLoaded(true) +} const ChatWindow = ({ id }: { id?: string }) => { - const searchParams = useSearchParams(); - const initialMessage = searchParams.get('q'); + const searchParams = useSearchParams() + const initialMessage = searchParams.get('q') - const [chatId, setChatId] = useState<string | undefined>(id); - const [newChatCreated, setNewChatCreated] = useState(false); + const [chatId, setChatId] = useState<string | undefined>(id) + const [newChatCreated, setNewChatCreated] = useState(false) - const [hasError, setHasError] = useState(false); - const [isReady, setIsReady] = useState(false); + const [hasError, setHasError] = useState(false) + const [isReady, setIsReady] = useState(false) - const [isWSReady, setIsWSReady] = useState(false); + const [isWSReady, setIsWSReady] = useState(false) const ws = useSocket( process.env.NEXT_PUBLIC_WS_URL!, setIsWSReady, setHasError, - ); + ) - const [loading, setLoading] = useState(false); - const [messageAppeared, setMessageAppeared] = useState(false); + const [loading, setLoading] = useState(false) + const [messageAppeared, setMessageAppeared] = useState(false) - const [chatHistory, setChatHistory] = useState<[string, string][]>([]); - const [messages, setMessages] = useState<Message[]>([]); + const [chatHistory, setChatHistory] = useState<[string, string][]>([]) + const [messages, setMessages] = useState<Message[]>([]) - const [focusMode, setFocusMode] = useState('webSearch'); + const [focusMode, setFocusMode] = useState('webSearch') - const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); + const [isMessagesLoaded, setIsMessagesLoaded] = useState(false) - const [notFound, setNotFound] = useState(false); + const [notFound, setNotFound] = useState(false) useEffect(() => { if ( @@ -297,37 +294,46 @@ const ChatWindow = ({ id }: { id?: string }) => { setChatHistory, setFocusMode, setNotFound, - ); + ) } else if (!chatId) { - setNewChatCreated(true); - setIsMessagesLoaded(true); - setChatId(crypto.randomBytes(20).toString('hex')); + setNewChatCreated(true) + setIsMessagesLoaded(true) + setChatId(crypto.randomBytes(20).toString('hex')) } // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const messagesRef = useRef<Message[]>([]); + }, []) useEffect(() => { - messagesRef.current = messages; - }, [messages]); + return () => { + if (ws?.readyState === 1) { + ws.close() + console.log('[DEBUG] closed') + } + } + }, []) + + const messagesRef = useRef<Message[]>([]) + + useEffect(() => { + messagesRef.current = messages + }, [messages]) useEffect(() => { if (isMessagesLoaded && isWSReady) { - setIsReady(true); + setIsReady(true) } - }, [isMessagesLoaded, isWSReady]); + }, [isMessagesLoaded, isWSReady]) const sendMessage = async (message: string) => { - if (loading) return; - setLoading(true); - setMessageAppeared(false); + if (loading) return + setLoading(true) + setMessageAppeared(false) - let sources: Document[] | undefined = undefined; - let recievedMessage = ''; - let added = false; + let sources: Document[] | undefined = undefined + let recievedMessage = '' + let added = false - const messageId = crypto.randomBytes(7).toString('hex'); + const messageId = crypto.randomBytes(7).toString('hex') ws?.send( JSON.stringify({ @@ -339,9 +345,9 @@ const ChatWindow = ({ id }: { id?: string }) => { focusMode: focusMode, history: [...chatHistory, ['human', message]], }), - ); + ) - setMessages((prevMessages) => [ + setMessages(prevMessages => [ ...prevMessages, { content: message, @@ -350,21 +356,21 @@ const ChatWindow = ({ id }: { id?: string }) => { role: 'user', createdAt: new Date(), }, - ]); + ]) const messageHandler = async (e: MessageEvent) => { - const data = JSON.parse(e.data); + const data = JSON.parse(e.data) if (data.type === 'error') { - toast.error(data.data); - setLoading(false); - return; + toast.error(data.data) + setLoading(false) + return } if (data.type === 'sources') { - sources = data.data; + sources = data.data if (!added) { - setMessages((prevMessages) => [ + setMessages(prevMessages => [ ...prevMessages, { content: '', @@ -374,15 +380,15 @@ const ChatWindow = ({ id }: { id?: string }) => { sources: sources, createdAt: new Date(), }, - ]); - added = true; + ]) + added = true } - setMessageAppeared(true); + setMessageAppeared(true) } if (data.type === 'message') { if (!added) { - setMessages((prevMessages) => [ + setMessages(prevMessages => [ ...prevMessages, { content: data.data, @@ -392,35 +398,35 @@ const ChatWindow = ({ id }: { id?: string }) => { sources: sources, createdAt: new Date(), }, - ]); - added = true; + ]) + added = true } - setMessages((prev) => - prev.map((message) => { + setMessages(prev => + prev.map(message => { if (message.messageId === data.messageId) { - return { ...message, content: message.content + data.data }; + return { ...message, content: message.content + data.data } } - return message; + return message }), - ); + ) - recievedMessage += data.data; - setMessageAppeared(true); + recievedMessage += data.data + setMessageAppeared(true) } if (data.type === 'messageEnd') { - setChatHistory((prevHistory) => [ + setChatHistory(prevHistory => [ ...prevHistory, ['human', message], ['assistant', recievedMessage], - ]); + ]) - ws?.removeEventListener('message', messageHandler); - setLoading(false); + ws?.removeEventListener('message', messageHandler) + setLoading(false) - const lastMsg = messagesRef.current[messagesRef.current.length - 1]; + const lastMsg = messagesRef.current[messagesRef.current.length - 1] if ( lastMsg.role === 'assistant' && @@ -428,54 +434,54 @@ const ChatWindow = ({ id }: { id?: string }) => { lastMsg.sources.length > 0 && !lastMsg.suggestions ) { - const suggestions = await getSuggestions(messagesRef.current); - setMessages((prev) => - prev.map((msg) => { + const suggestions = await getSuggestions(messagesRef.current) + setMessages(prev => + prev.map(msg => { if (msg.messageId === lastMsg.messageId) { - return { ...msg, suggestions: suggestions }; + return { ...msg, suggestions: suggestions } } - return msg; + return msg }), - ); + ) } } - }; + } - ws?.addEventListener('message', messageHandler); - }; + ws?.addEventListener('message', messageHandler) + } const rewrite = (messageId: string) => { - const index = messages.findIndex((msg) => msg.messageId === messageId); + const index = messages.findIndex(msg => msg.messageId === messageId) - if (index === -1) return; + if (index === -1) return - const message = messages[index - 1]; + const message = messages[index - 1] - setMessages((prev) => { - return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; - }); - setChatHistory((prev) => { - return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; - }); + setMessages(prev => { + return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)] + }) + setChatHistory(prev => { + return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)] + }) - sendMessage(message.content); - }; + sendMessage(message.content) + } useEffect(() => { if (isReady && initialMessage) { - sendMessage(initialMessage); + sendMessage(initialMessage) } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isReady, initialMessage]); + }, [isReady, initialMessage]) if (hasError) { return ( - <div className="flex flex-col items-center justify-center min-h-screen"> - <p className="dark:text-white/70 text-black/70 text-sm"> + <div className='flex flex-col items-center justify-center min-h-screen'> + <p className='dark:text-white/70 text-black/70 text-sm'> Failed to connect to the server. Please try again later. </p> </div> - ); + ) } return isReady ? ( @@ -504,25 +510,25 @@ const ChatWindow = ({ id }: { id?: string }) => { </div> ) ) : ( - <div className="flex flex-row items-center justify-center min-h-screen"> + <div className='flex flex-row items-center justify-center min-h-screen'> <svg - aria-hidden="true" - className="w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]" - viewBox="0 0 100 101" - fill="none" - xmlns="http://www.w3.org/2000/svg" + aria-hidden='true' + className='w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]' + viewBox='0 0 100 101' + fill='none' + xmlns='http://www.w3.org/2000/svg' > <path - d="M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z" - fill="currentColor" + d='M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z' + fill='currentColor' /> <path - d="M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z" - fill="currentFill" + d='M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z' + fill='currentFill' /> </svg> </div> - ); -}; + ) +} -export default ChatWindow; +export default ChatWindow From f620252406f828c67555d9393fe3c6a49440e42f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:51:12 +0530 Subject: [PATCH 017/282] feat(linkDocument): add error handling --- src/lib/linkDocument.ts | 98 ++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 41 deletions(-) diff --git a/src/lib/linkDocument.ts b/src/lib/linkDocument.ts index 9607220..5e90571 100644 --- a/src/lib/linkDocument.ts +++ b/src/lib/linkDocument.ts @@ -3,6 +3,7 @@ import { htmlToText } from 'html-to-text'; import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; import { Document } from '@langchain/core/documents'; import pdfParse from 'pdf-parse'; +import logger from '../utils/logger'; export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { const splitter = new RecursiveCharacterTextSplitter(); @@ -16,66 +17,81 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { ? link : `https://${link}`; - const res = await axios.get(link, { - responseType: 'arraybuffer', - }); + try { + const res = await axios.get(link, { + responseType: 'arraybuffer', + }); - const isPdf = res.headers['content-type'] === 'application/pdf'; + const isPdf = res.headers['content-type'] === 'application/pdf'; - if (isPdf) { - const pdfText = await pdfParse(res.data); - const parsedText = pdfText.text + if (isPdf) { + const pdfText = await pdfParse(res.data); + const parsedText = pdfText.text + .replace(/(\r\n|\n|\r)/gm, ' ') + .replace(/\s+/g, ' ') + .trim(); + + const splittedText = await splitter.splitText(parsedText); + const title = 'PDF Document'; + + const linkDocs = splittedText.map((text) => { + return new Document({ + pageContent: text, + metadata: { + title: title, + url: link, + }, + }); + }); + + docs.push(...linkDocs); + return; + } + + const parsedText = htmlToText(res.data.toString('utf8'), { + selectors: [ + { + selector: 'a', + options: { + ignoreHref: true, + }, + }, + ], + }) .replace(/(\r\n|\n|\r)/gm, ' ') .replace(/\s+/g, ' ') .trim(); const splittedText = await splitter.splitText(parsedText); - const title = 'PDF Document'; + const title = res.data + .toString('utf8') + .match(/<title>(.*?)<\/title>/)?.[1]; const linkDocs = splittedText.map((text) => { return new Document({ pageContent: text, metadata: { - title: title, + title: title || link, url: link, }, }); }); docs.push(...linkDocs); - return; - } - - const parsedText = htmlToText(res.data.toString('utf8'), { - selectors: [ - { - selector: 'a', - options: { - ignoreHref: true, + } catch (err) { + logger.error( + `Error at generating documents from links: ${err.message}`, + ); + docs.push( + new Document({ + pageContent: `Failed to retrieve content from the link: ${err.message}`, + metadata: { + title: 'Failed to retrieve content', + url: link, }, - }, - ], - }) - .replace(/(\r\n|\n|\r)/gm, ' ') - .replace(/\s+/g, ' ') - .trim(); - - const splittedText = await splitter.splitText(parsedText); - const title = res.data - .toString('utf8') - .match(/<title>(.*?)<\/title>/)?.[1]; - - const linkDocs = splittedText.map((text) => { - return new Document({ - pageContent: text, - metadata: { - title: title || link, - url: link, - }, - }); - }); - - docs.push(...linkDocs); + }), + ); + } }), ); From 449684c4192105ef39dcfe74dc0bc053780c4e15 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:51:42 +0530 Subject: [PATCH 018/282] feat(webSearchAgent): update retriever prompt & change temp --- src/agents/webSearchAgent.ts | 59 ++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index f7a6d7e..159023e 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -23,22 +23,37 @@ import LineListOutputParser from '../lib/outputParsers/listLineOutputParser'; import { getDocumentsFromLinks } from '../lib/linkDocument'; import LineOutputParser from '../lib/outputParsers/lineOutputParser'; import { IterableReadableStream } from '@langchain/core/utils/stream'; +import { ChatOpenAI } from '@langchain/openai'; const basicSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. -If the question contains some links and asks to answer from those links or even if they don't you need to return the links inside 'links' XML block and the question inside 'question' XML block. If there are no links then you need to return the question without any XML block. -If the user asks to summarize the content from some links you need to return \`Summarize\` as the question inside the 'question' XML block and the links inside the 'links' XML block. +You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. +If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). +If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. +You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. -Example: -1. Follow up question: What is the capital of France? -Rephrased question: \`Capital of france\` +There are several examples attached for your reference inside the below \`examples\` XML block -2. Follow up question: What is the population of New York City? -Rephrased question: \`Population of New York City\` +<examples> +1. Follow up question: What is the capital of France +Rephrased question:\` +<question> +Capital of france +</question> +\` + +2. Hi, how are you? +Rephrased question\` +<question> +not_needed +</question> +\` 3. Follow up question: What is Docker? -Rephrased question: \`What is Docker\` +Rephrased question: \` +<question> +What is Docker +</question> +\` 4. Follow up question: Can you tell me what is X from https://example.com Rephrased question: \` @@ -54,16 +69,20 @@ https://example.com 5. Follow up question: Summarize the content from https://example.com Rephrased question: \` <question> -Summarize +summarize </question> <links> https://example.com </links> \` +</examples> -Conversation: +Anything below is the part of the actual conversation and you need to use conversation and the follow-up question to rephrase the follow-up question as a standalone question based on the guidelines shared above. + +<conversation> {chat_history} +</conversation> Follow up question: {query} Rephrased question: @@ -133,15 +152,13 @@ type BasicChainInput = { }; const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { + (llm as unknown as ChatOpenAI).temperature = 0; + return RunnableSequence.from([ PromptTemplate.fromTemplate(basicSearchRetrieverPrompt), llm, strParser, RunnableLambda.from(async (input: string) => { - if (input === 'not_needed') { - return { query: '', docs: [] }; - } - const linksOutputParser = new LineListOutputParser({ key: 'links', }); @@ -153,9 +170,13 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { const links = await linksOutputParser.parse(input); let question = await questionOutputParser.parse(input); + if (question === 'not_needed') { + return { query: '', docs: [] }; + } + if (links.length > 0) { if (question.length === 0) { - question = 'Summarize'; + question = 'summarize'; } let docs = []; @@ -272,7 +293,7 @@ const createBasicWebSearchAnsweringChain = ( return docs; } - if (query === 'Summarize') { + if (query.toLocaleLowerCase() === 'summarize') { return docs; } @@ -295,7 +316,7 @@ const createBasicWebSearchAnsweringChain = ( }); const sortedDocs = similarity - .filter((sim) => sim.similarity > 0.5) + .filter((sim) => sim.similarity > 0.3) .sort((a, b) => b.similarity - a.similarity) .slice(0, 15) .map((sim) => docsWithContent[sim.index]); From c952469f087c9d0577d9421308eaaf2d1d9217a7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:51:59 +0530 Subject: [PATCH 019/282] feat(chaWindow): lint & beautify --- ui/components/ChatWindow.tsx | 407 ++++++++++++++++++----------------- 1 file changed, 205 insertions(+), 202 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 9a1fe3c..b3d0089 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -1,42 +1,42 @@ -'use client' +'use client'; -import { useEffect, useRef, useState } from 'react' -import { Document } from '@langchain/core/documents' -import Navbar from './Navbar' -import Chat from './Chat' -import EmptyChat from './EmptyChat' -import crypto from 'crypto' -import { toast } from 'sonner' -import { useSearchParams } from 'next/navigation' -import { getSuggestions } from '@/lib/actions' -import Error from 'next/error' +import { useEffect, useRef, useState } from 'react'; +import { Document } from '@langchain/core/documents'; +import Navbar from './Navbar'; +import Chat from './Chat'; +import EmptyChat from './EmptyChat'; +import crypto from 'crypto'; +import { toast } from 'sonner'; +import { useSearchParams } from 'next/navigation'; +import { getSuggestions } from '@/lib/actions'; +import Error from 'next/error'; export type Message = { - messageId: string - chatId: string - createdAt: Date - content: string - role: 'user' | 'assistant' - suggestions?: string[] - sources?: Document[] -} + messageId: string; + chatId: string; + createdAt: Date; + content: string; + role: 'user' | 'assistant'; + suggestions?: string[]; + sources?: Document[]; +}; const useSocket = ( url: string, setIsWSReady: (ready: boolean) => void, setError: (error: boolean) => void, ) => { - const [ws, setWs] = useState<WebSocket | null>(null) + const [ws, setWs] = useState<WebSocket | null>(null); useEffect(() => { if (!ws) { const connectWs = async () => { - let chatModel = localStorage.getItem('chatModel') - let chatModelProvider = localStorage.getItem('chatModelProvider') - let embeddingModel = localStorage.getItem('embeddingModel') + let chatModel = localStorage.getItem('chatModel'); + let chatModelProvider = localStorage.getItem('chatModelProvider'); + let embeddingModel = localStorage.getItem('embeddingModel'); let embeddingModelProvider = localStorage.getItem( 'embeddingModelProvider', - ) + ); const providers = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/models`, @@ -45,7 +45,7 @@ const useSocket = ( 'Content-Type': 'application/json', }, }, - ).then(async res => await res.json()) + ).then(async (res) => await res.json()); if ( !chatModel || @@ -54,55 +54,58 @@ const useSocket = ( !embeddingModelProvider ) { if (!chatModel || !chatModelProvider) { - const chatModelProviders = providers.chatModelProviders + const chatModelProviders = providers.chatModelProviders; - chatModelProvider = Object.keys(chatModelProviders)[0] + chatModelProvider = Object.keys(chatModelProviders)[0]; if (chatModelProvider === 'custom_openai') { toast.error( 'Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL', - ) - setError(true) - return + ); + setError(true); + return; } else { - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0] + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; if ( !chatModelProviders || Object.keys(chatModelProviders).length === 0 ) - return toast.error('No chat models available') + return toast.error('No chat models available'); } } if (!embeddingModel || !embeddingModelProvider) { - const embeddingModelProviders = providers.embeddingModelProviders + const embeddingModelProviders = providers.embeddingModelProviders; if ( !embeddingModelProviders || Object.keys(embeddingModelProviders).length === 0 ) - return toast.error('No embedding models available') + return toast.error('No embedding models available'); - embeddingModelProvider = Object.keys(embeddingModelProviders)[0] + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; embeddingModel = Object.keys( embeddingModelProviders[embeddingModelProvider], - )[0] + )[0]; } - localStorage.setItem('chatModel', chatModel!) - localStorage.setItem('chatModelProvider', chatModelProvider) - localStorage.setItem('embeddingModel', embeddingModel!) - localStorage.setItem('embeddingModelProvider', embeddingModelProvider) + localStorage.setItem('chatModel', chatModel!); + localStorage.setItem('chatModelProvider', chatModelProvider); + localStorage.setItem('embeddingModel', embeddingModel!); + localStorage.setItem( + 'embeddingModelProvider', + embeddingModelProvider, + ); } else { - const chatModelProviders = providers.chatModelProviders - const embeddingModelProviders = providers.embeddingModelProviders + const chatModelProviders = providers.chatModelProviders; + const embeddingModelProviders = providers.embeddingModelProviders; if ( Object.keys(chatModelProviders).length > 0 && !chatModelProviders[chatModelProvider] ) { - chatModelProvider = Object.keys(chatModelProviders)[0] - localStorage.setItem('chatModelProvider', chatModelProvider) + chatModelProvider = Object.keys(chatModelProviders)[0]; + localStorage.setItem('chatModelProvider', chatModelProvider); } if ( @@ -110,19 +113,19 @@ const useSocket = ( chatModelProvider != 'custom_openai' && !chatModelProviders[chatModelProvider][chatModel] ) { - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0] - localStorage.setItem('chatModel', chatModel) + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + localStorage.setItem('chatModel', chatModel); } if ( Object.keys(embeddingModelProviders).length > 0 && !embeddingModelProviders[embeddingModelProvider] ) { - embeddingModelProvider = Object.keys(embeddingModelProviders)[0] + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; localStorage.setItem( 'embeddingModelProvider', embeddingModelProvider, - ) + ); } if ( @@ -131,77 +134,77 @@ const useSocket = ( ) { embeddingModel = Object.keys( embeddingModelProviders[embeddingModelProvider], - )[0] - localStorage.setItem('embeddingModel', embeddingModel) + )[0]; + localStorage.setItem('embeddingModel', embeddingModel); } } - const wsURL = new URL(url) - const searchParams = new URLSearchParams({}) + const wsURL = new URL(url); + const searchParams = new URLSearchParams({}); - searchParams.append('chatModel', chatModel!) - searchParams.append('chatModelProvider', chatModelProvider) + searchParams.append('chatModel', chatModel!); + searchParams.append('chatModelProvider', chatModelProvider); if (chatModelProvider === 'custom_openai') { searchParams.append( 'openAIApiKey', localStorage.getItem('openAIApiKey')!, - ) + ); searchParams.append( 'openAIBaseURL', localStorage.getItem('openAIBaseURL')!, - ) + ); } - searchParams.append('embeddingModel', embeddingModel!) - searchParams.append('embeddingModelProvider', embeddingModelProvider) + searchParams.append('embeddingModel', embeddingModel!); + searchParams.append('embeddingModelProvider', embeddingModelProvider); - wsURL.search = searchParams.toString() + wsURL.search = searchParams.toString(); - const ws = new WebSocket(wsURL.toString()) + const ws = new WebSocket(wsURL.toString()); const timeoutId = setTimeout(() => { if (ws.readyState !== 1) { toast.error( 'Failed to connect to the server. Please try again later.', - ) + ); } - }, 10000) + }, 10000); ws.onopen = () => { - console.log('[DEBUG] open') - clearTimeout(timeoutId) - setIsWSReady(true) - } + console.log('[DEBUG] open'); + clearTimeout(timeoutId); + setIsWSReady(true); + }; ws.onerror = () => { - clearTimeout(timeoutId) - setError(true) - toast.error('WebSocket connection error.') - } + clearTimeout(timeoutId); + setError(true); + toast.error('WebSocket connection error.'); + }; ws.onclose = () => { - clearTimeout(timeoutId) - setError(true) - console.log('[DEBUG] closed') - } + clearTimeout(timeoutId); + setError(true); + console.log('[DEBUG] closed'); + }; - ws.addEventListener('message', e => { - const data = JSON.parse(e.data) + ws.addEventListener('message', (e) => { + const data = JSON.parse(e.data); if (data.type === 'error') { - toast.error(data.data) + toast.error(data.data); } - }) + }); - setWs(ws) - } + setWs(ws); + }; - connectWs() + connectWs(); } - }, [ws, url, setIsWSReady, setError]) + }, [ws, url, setIsWSReady, setError]); - return ws -} + return ws; +}; const loadMessages = async ( chatId: string, @@ -219,66 +222,66 @@ const loadMessages = async ( 'Content-Type': 'application/json', }, }, - ) + ); if (res.status === 404) { - setNotFound(true) - setIsMessagesLoaded(true) - return + setNotFound(true); + setIsMessagesLoaded(true); + return; } - const data = await res.json() + const data = await res.json(); const messages = data.messages.map((msg: any) => { return { ...msg, ...JSON.parse(msg.metadata), - } - }) as Message[] + }; + }) as Message[]; - setMessages(messages) + setMessages(messages); - const history = messages.map(msg => { - return [msg.role, msg.content] - }) as [string, string][] + const history = messages.map((msg) => { + return [msg.role, msg.content]; + }) as [string, string][]; - console.log('[DEBUG] messages loaded') + console.log('[DEBUG] messages loaded'); - document.title = messages[0].content + document.title = messages[0].content; - setChatHistory(history) - setFocusMode(data.chat.focusMode) - setIsMessagesLoaded(true) -} + setChatHistory(history); + setFocusMode(data.chat.focusMode); + setIsMessagesLoaded(true); +}; const ChatWindow = ({ id }: { id?: string }) => { - const searchParams = useSearchParams() - const initialMessage = searchParams.get('q') + const searchParams = useSearchParams(); + const initialMessage = searchParams.get('q'); - const [chatId, setChatId] = useState<string | undefined>(id) - const [newChatCreated, setNewChatCreated] = useState(false) + const [chatId, setChatId] = useState<string | undefined>(id); + const [newChatCreated, setNewChatCreated] = useState(false); - const [hasError, setHasError] = useState(false) - const [isReady, setIsReady] = useState(false) + const [hasError, setHasError] = useState(false); + const [isReady, setIsReady] = useState(false); - const [isWSReady, setIsWSReady] = useState(false) + const [isWSReady, setIsWSReady] = useState(false); const ws = useSocket( process.env.NEXT_PUBLIC_WS_URL!, setIsWSReady, setHasError, - ) + ); - const [loading, setLoading] = useState(false) - const [messageAppeared, setMessageAppeared] = useState(false) + const [loading, setLoading] = useState(false); + const [messageAppeared, setMessageAppeared] = useState(false); - const [chatHistory, setChatHistory] = useState<[string, string][]>([]) - const [messages, setMessages] = useState<Message[]>([]) + const [chatHistory, setChatHistory] = useState<[string, string][]>([]); + const [messages, setMessages] = useState<Message[]>([]); - const [focusMode, setFocusMode] = useState('webSearch') + const [focusMode, setFocusMode] = useState('webSearch'); - const [isMessagesLoaded, setIsMessagesLoaded] = useState(false) + const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); - const [notFound, setNotFound] = useState(false) + const [notFound, setNotFound] = useState(false); useEffect(() => { if ( @@ -294,46 +297,46 @@ const ChatWindow = ({ id }: { id?: string }) => { setChatHistory, setFocusMode, setNotFound, - ) + ); } else if (!chatId) { - setNewChatCreated(true) - setIsMessagesLoaded(true) - setChatId(crypto.randomBytes(20).toString('hex')) + setNewChatCreated(true); + setIsMessagesLoaded(true); + setChatId(crypto.randomBytes(20).toString('hex')); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) + }, []); useEffect(() => { return () => { if (ws?.readyState === 1) { - ws.close() - console.log('[DEBUG] closed') + ws.close(); + console.log('[DEBUG] closed'); } - } - }, []) + }; + }, []); - const messagesRef = useRef<Message[]>([]) + const messagesRef = useRef<Message[]>([]); useEffect(() => { - messagesRef.current = messages - }, [messages]) + messagesRef.current = messages; + }, [messages]); useEffect(() => { if (isMessagesLoaded && isWSReady) { - setIsReady(true) + setIsReady(true); } - }, [isMessagesLoaded, isWSReady]) + }, [isMessagesLoaded, isWSReady]); const sendMessage = async (message: string) => { - if (loading) return - setLoading(true) - setMessageAppeared(false) + if (loading) return; + setLoading(true); + setMessageAppeared(false); - let sources: Document[] | undefined = undefined - let recievedMessage = '' - let added = false + let sources: Document[] | undefined = undefined; + let recievedMessage = ''; + let added = false; - const messageId = crypto.randomBytes(7).toString('hex') + const messageId = crypto.randomBytes(7).toString('hex'); ws?.send( JSON.stringify({ @@ -345,9 +348,9 @@ const ChatWindow = ({ id }: { id?: string }) => { focusMode: focusMode, history: [...chatHistory, ['human', message]], }), - ) + ); - setMessages(prevMessages => [ + setMessages((prevMessages) => [ ...prevMessages, { content: message, @@ -356,21 +359,21 @@ const ChatWindow = ({ id }: { id?: string }) => { role: 'user', createdAt: new Date(), }, - ]) + ]); const messageHandler = async (e: MessageEvent) => { - const data = JSON.parse(e.data) + const data = JSON.parse(e.data); if (data.type === 'error') { - toast.error(data.data) - setLoading(false) - return + toast.error(data.data); + setLoading(false); + return; } if (data.type === 'sources') { - sources = data.data + sources = data.data; if (!added) { - setMessages(prevMessages => [ + setMessages((prevMessages) => [ ...prevMessages, { content: '', @@ -380,15 +383,15 @@ const ChatWindow = ({ id }: { id?: string }) => { sources: sources, createdAt: new Date(), }, - ]) - added = true + ]); + added = true; } - setMessageAppeared(true) + setMessageAppeared(true); } if (data.type === 'message') { if (!added) { - setMessages(prevMessages => [ + setMessages((prevMessages) => [ ...prevMessages, { content: data.data, @@ -398,35 +401,35 @@ const ChatWindow = ({ id }: { id?: string }) => { sources: sources, createdAt: new Date(), }, - ]) - added = true + ]); + added = true; } - setMessages(prev => - prev.map(message => { + setMessages((prev) => + prev.map((message) => { if (message.messageId === data.messageId) { - return { ...message, content: message.content + data.data } + return { ...message, content: message.content + data.data }; } - return message + return message; }), - ) + ); - recievedMessage += data.data - setMessageAppeared(true) + recievedMessage += data.data; + setMessageAppeared(true); } if (data.type === 'messageEnd') { - setChatHistory(prevHistory => [ + setChatHistory((prevHistory) => [ ...prevHistory, ['human', message], ['assistant', recievedMessage], - ]) + ]); - ws?.removeEventListener('message', messageHandler) - setLoading(false) + ws?.removeEventListener('message', messageHandler); + setLoading(false); - const lastMsg = messagesRef.current[messagesRef.current.length - 1] + const lastMsg = messagesRef.current[messagesRef.current.length - 1]; if ( lastMsg.role === 'assistant' && @@ -434,54 +437,54 @@ const ChatWindow = ({ id }: { id?: string }) => { lastMsg.sources.length > 0 && !lastMsg.suggestions ) { - const suggestions = await getSuggestions(messagesRef.current) - setMessages(prev => - prev.map(msg => { + const suggestions = await getSuggestions(messagesRef.current); + setMessages((prev) => + prev.map((msg) => { if (msg.messageId === lastMsg.messageId) { - return { ...msg, suggestions: suggestions } + return { ...msg, suggestions: suggestions }; } - return msg + return msg; }), - ) + ); } } - } + }; - ws?.addEventListener('message', messageHandler) - } + ws?.addEventListener('message', messageHandler); + }; const rewrite = (messageId: string) => { - const index = messages.findIndex(msg => msg.messageId === messageId) + const index = messages.findIndex((msg) => msg.messageId === messageId); - if (index === -1) return + if (index === -1) return; - const message = messages[index - 1] + const message = messages[index - 1]; - setMessages(prev => { - return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)] - }) - setChatHistory(prev => { - return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)] - }) + setMessages((prev) => { + return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; + }); + setChatHistory((prev) => { + return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; + }); - sendMessage(message.content) - } + sendMessage(message.content); + }; useEffect(() => { if (isReady && initialMessage) { - sendMessage(initialMessage) + sendMessage(initialMessage); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isReady, initialMessage]) + }, [isReady, initialMessage]); if (hasError) { return ( - <div className='flex flex-col items-center justify-center min-h-screen'> - <p className='dark:text-white/70 text-black/70 text-sm'> + <div className="flex flex-col items-center justify-center min-h-screen"> + <p className="dark:text-white/70 text-black/70 text-sm"> Failed to connect to the server. Please try again later. </p> </div> - ) + ); } return isReady ? ( @@ -510,25 +513,25 @@ const ChatWindow = ({ id }: { id?: string }) => { </div> ) ) : ( - <div className='flex flex-row items-center justify-center min-h-screen'> + <div className="flex flex-row items-center justify-center min-h-screen"> <svg - aria-hidden='true' - className='w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]' - viewBox='0 0 100 101' - fill='none' - xmlns='http://www.w3.org/2000/svg' + aria-hidden="true" + className="w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]" + viewBox="0 0 100 101" + fill="none" + xmlns="http://www.w3.org/2000/svg" > <path - d='M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z' - fill='currentColor' + d="M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z" + fill="currentColor" /> <path - d='M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z' - fill='currentFill' + d="M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z" + fill="currentFill" /> </svg> </div> - ) -} + ); +}; -export default ChatWindow +export default ChatWindow; From 92abbc5b981b9809466c00363c7f90ecbcd1d857 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:54:37 +0530 Subject: [PATCH 020/282] feat(webSearchRetriever): use `question` instead of `input` --- src/agents/webSearchAgent.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 159023e..77ec181 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -248,7 +248,7 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { return { query: question, docs: docs }; } else { - const res = await searchSearxng(input, { + const res = await searchSearxng(question, { language: 'en', }); @@ -264,7 +264,7 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { }), ); - return { query: input, docs: documents }; + return { query: question, docs: documents }; } }), ]); From c4f52adb456d16ddc957edeafa82de27c3a9f953 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:44:40 +0530 Subject: [PATCH 021/282] feat(textarea): handle "/" keys --- ui/components/EmptyChatMessageInput.tsx | 21 ++++++++++++++------- ui/components/MessageInput.tsx | 21 ++++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index 0ff9b2e..39d3f16 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -18,14 +18,21 @@ const EmptyChatMessageInput = ({ const inputRef = useRef<HTMLTextAreaElement | null>(null); - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === '/') { - e.preventDefault(); - inputRef.current?.focus(); - } - }; - useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + const activeElement = document.activeElement; + + const isInputFocused = + activeElement?.tagName === 'INPUT' || + activeElement?.tagName === 'TEXTAREA' || + activeElement?.hasAttribute('contenteditable'); + + if (e.key === '/' && !isInputFocused) { + e.preventDefault(); + inputRef.current?.focus(); + } + }; + document.addEventListener('keydown', handleKeyDown); return () => { diff --git a/ui/components/MessageInput.tsx b/ui/components/MessageInput.tsx index 2229cdf..05d44a6 100644 --- a/ui/components/MessageInput.tsx +++ b/ui/components/MessageInput.tsx @@ -27,14 +27,21 @@ const MessageInput = ({ const inputRef = useRef<HTMLTextAreaElement | null>(null); - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === '/') { - e.preventDefault(); - inputRef.current?.focus(); - } - }; - useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + const activeElement = document.activeElement; + + const isInputFocused = + activeElement?.tagName === 'INPUT' || + activeElement?.tagName === 'TEXTAREA' || + activeElement?.hasAttribute('contenteditable'); + + if (e.key === '/' && !isInputFocused) { + e.preventDefault(); + inputRef.current?.focus(); + } + }; + document.addEventListener('keydown', handleKeyDown); return () => { From 07e5615860ad420e147410731f9f350839f97bf7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 4 Sep 2024 18:54:54 +0530 Subject: [PATCH 022/282] feat(docker-compose): link `config.toml` as vol. --- docker-compose.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index d6f9203..d3892e5 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -21,6 +21,7 @@ services: - 3001:3001 volumes: - backend-dbstore:/home/perplexica/data + - ./config.toml:/home/perplexica/config.toml extra_hosts: - 'host.docker.internal:host-gateway' networks: From 1fcd64ad421450bd1015e8cc52697c3a35d89c11 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:40:07 +0530 Subject: [PATCH 023/282] feat(docker-file): use SearXNG URL from env --- backend.dockerfile | 3 +-- src/config.ts | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend.dockerfile b/backend.dockerfile index 4886573..0169218 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -1,6 +1,7 @@ FROM node:slim ARG SEARXNG_API_URL +ENV SEARXNG_API_URL=${SEARXNG_API_URL} WORKDIR /home/perplexica @@ -11,8 +12,6 @@ COPY drizzle.config.ts /home/perplexica/ COPY package.json /home/perplexica/ COPY yarn.lock /home/perplexica/ -RUN sed -i "s|SEARXNG = \".*\"|SEARXNG = \"${SEARXNG_API_URL}\"|g" /home/perplexica/config.toml - RUN mkdir /home/perplexica/data RUN yarn install diff --git a/src/config.ts b/src/config.ts index 9ebc182..bb69335 100644 --- a/src/config.ts +++ b/src/config.ts @@ -40,7 +40,8 @@ export const getGroqApiKey = () => loadConfig().API_KEYS.GROQ; export const getAnthropicApiKey = () => loadConfig().API_KEYS.ANTHROPIC; -export const getSearxngApiEndpoint = () => loadConfig().API_ENDPOINTS.SEARXNG; +export const getSearxngApiEndpoint = () => + process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; export const getOllamaApiEndpoint = () => loadConfig().API_ENDPOINTS.OLLAMA; From 40f551c426e0ca67a76d2438d6404b7b7e77f877 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 15 Sep 2024 10:16:20 +0530 Subject: [PATCH 024/282] feat(search-button): add empty check --- ui/components/SearchImages.tsx | 2 +- ui/components/SearchVideos.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/components/SearchImages.tsx b/ui/components/SearchImages.tsx index b53b8b0..6025925 100644 --- a/ui/components/SearchImages.tsx +++ b/ui/components/SearchImages.tsx @@ -51,7 +51,7 @@ const SearchImages = ({ const data = await res.json(); - const images = data.images; + const images = data.images ?? []; setImages(images); setSlides( images.map((image: Image) => { diff --git a/ui/components/SearchVideos.tsx b/ui/components/SearchVideos.tsx index 2646322..74d4381 100644 --- a/ui/components/SearchVideos.tsx +++ b/ui/components/SearchVideos.tsx @@ -64,7 +64,7 @@ const Searchvideos = ({ const data = await res.json(); - const videos = data.videos; + const videos = data.videos ?? []; setVideos(videos); setSlides( videos.map((video: Video) => { From 1589f16d5a00e913acc7d56f6fcb5f858a426048 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 24 Sep 2024 22:34:43 +0530 Subject: [PATCH 025/282] feat(providers): add `displayName` property --- src/lib/providers/anthropic.ts | 52 ++++++---- src/lib/providers/groq.ts | 161 ++++++++++++++++------------- src/lib/providers/ollama.ts | 26 +++-- src/lib/providers/openai.ts | 87 ++++++++++------ src/lib/providers/transformers.ts | 27 +++-- src/routes/config.ts | 64 +++++++----- src/routes/images.ts | 2 +- src/routes/suggestions.ts | 2 +- src/routes/videos.ts | 2 +- src/websocket/connectionManager.ts | 7 +- ui/components/SearchVideos.tsx | 2 +- ui/components/SettingsDialog.tsx | 28 +++-- 12 files changed, 277 insertions(+), 183 deletions(-) diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index 58cd164..90460c6 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -9,26 +9,38 @@ export const loadAnthropicChatModels = async () => { try { const chatModels = { - 'Claude 3.5 Sonnet': new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-5-sonnet-20240620', - }), - 'Claude 3 Opus': new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-opus-20240229', - }), - 'Claude 3 Sonnet': new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-sonnet-20240229', - }), - 'Claude 3 Haiku': new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-haiku-20240307', - }), + 'claude-3-5-sonnet-20240620': { + displayName: 'Claude 3.5 Sonnet', + model: new ChatAnthropic({ + temperature: 0.7, + anthropicApiKey: anthropicApiKey, + model: 'claude-3-5-sonnet-20240620', + }), + }, + 'claude-3-opus-20240229': { + displayName: 'Claude 3 Opus', + model: new ChatAnthropic({ + temperature: 0.7, + anthropicApiKey: anthropicApiKey, + model: 'claude-3-opus-20240229', + }), + }, + 'claude-3-sonnet-20240229': { + displayName: 'Claude 3 Sonnet', + model: new ChatAnthropic({ + temperature: 0.7, + anthropicApiKey: anthropicApiKey, + model: 'claude-3-sonnet-20240229', + }), + }, + 'claude-3-haiku-20240307': { + displayName: 'Claude 3 Haiku', + model: new ChatAnthropic({ + temperature: 0.7, + anthropicApiKey: anthropicApiKey, + model: 'claude-3-haiku-20240307', + }), + }, }; return chatModels; diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index ffe8f6c..6249267 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -9,76 +9,97 @@ export const loadGroqChatModels = async () => { try { const chatModels = { - 'Llama 3.1 70B': new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.1-70b-versatile', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - 'Llama 3.1 8B': new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.1-8b-instant', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - 'LLaMA3 8b': new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama3-8b-8192', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - 'LLaMA3 70b': new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama3-70b-8192', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - 'Mixtral 8x7b': new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'mixtral-8x7b-32768', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - 'Gemma 7b': new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'gemma-7b-it', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - 'Gemma2 9b': new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'gemma2-9b-it', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), + 'llama-3.1-70b-versatile': { + displayName: 'Llama 3.1 70B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'llama-3.1-70b-versatile', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, + 'llama-3.1-8b-instant': { + displayName: 'Llama 3.1 8B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'llama-3.1-8b-instant', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, + 'llama3-8b-8192': { + displayName: 'LLaMA3 8B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'llama3-8b-8192', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, + 'llama3-70b-8192': { + displayName: 'LLaMA3 70B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'llama3-70b-8192', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, + 'mixtral-8x7b-32768': { + displayName: 'Mixtral 8x7B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'mixtral-8x7b-32768', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, + 'gemma-7b-it': { + displayName: 'Gemma 7B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'gemma-7b-it', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, + 'gemma2-9b-it': { + displayName: 'Gemma2 9B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'gemma2-9b-it', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, }; return chatModels; diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index b2901ff..ed68bfa 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -18,11 +18,15 @@ export const loadOllamaChatModels = async () => { const { models: ollamaModels } = (await response.json()) as any; const chatModels = ollamaModels.reduce((acc, model) => { - acc[model.model] = new ChatOllama({ - baseUrl: ollamaEndpoint, - model: model.model, - temperature: 0.7, - }); + acc[model.model] = { + displayName: model.name, + model: new ChatOllama({ + baseUrl: ollamaEndpoint, + model: model.model, + temperature: 0.7, + }), + }; + return acc; }, {}); @@ -48,10 +52,14 @@ export const loadOllamaEmbeddingsModels = async () => { const { models: ollamaModels } = (await response.json()) as any; const embeddingsModels = ollamaModels.reduce((acc, model) => { - acc[model.model] = new OllamaEmbeddings({ - baseUrl: ollamaEndpoint, - model: model.model, - }); + acc[model.model] = { + displayName: model.name, + model: new OllamaEmbeddings({ + baseUrl: ollamaEndpoint, + model: model.model, + }), + }; + return acc; }, {}); diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 8673954..3747e37 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -9,31 +9,46 @@ export const loadOpenAIChatModels = async () => { try { const chatModels = { - 'GPT-3.5 turbo': new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-3.5-turbo', - temperature: 0.7, - }), - 'GPT-4': new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4', - temperature: 0.7, - }), - 'GPT-4 turbo': new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4-turbo', - temperature: 0.7, - }), - 'GPT-4 omni': new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4o', - temperature: 0.7, - }), - 'GPT-4 omni mini': new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4o-mini', - temperature: 0.7, - }), + 'gpt-3.5-turbo': { + displayName: 'GPT-3.5 Turbo', + model: new ChatOpenAI({ + openAIApiKey, + modelName: 'gpt-3.5-turbo', + temperature: 0.7, + }), + }, + 'gpt-4': { + displayName: 'GPT-4', + model: new ChatOpenAI({ + openAIApiKey, + modelName: 'gpt-4', + temperature: 0.7, + }), + }, + 'gpt-4-turbo': { + displayName: 'GPT-4 turbo', + model: new ChatOpenAI({ + openAIApiKey, + modelName: 'gpt-4-turbo', + temperature: 0.7, + }), + }, + 'gpt-4o': { + displayName: 'GPT-4 omni', + model: new ChatOpenAI({ + openAIApiKey, + modelName: 'gpt-4o', + temperature: 0.7, + }), + }, + 'gpt-4o-mini': { + displayName: 'GPT-4 omni mini', + model: new ChatOpenAI({ + openAIApiKey, + modelName: 'gpt-4o-mini', + temperature: 0.7, + }), + }, }; return chatModels; @@ -50,14 +65,20 @@ export const loadOpenAIEmbeddingsModels = async () => { try { const embeddingModels = { - 'Text embedding 3 small': new OpenAIEmbeddings({ - openAIApiKey, - modelName: 'text-embedding-3-small', - }), - 'Text embedding 3 large': new OpenAIEmbeddings({ - openAIApiKey, - modelName: 'text-embedding-3-large', - }), + 'text-embedding-3-small': { + displayName: 'Text Embedding 3 Small', + model: new OpenAIEmbeddings({ + openAIApiKey, + modelName: 'text-embedding-3-small', + }), + }, + 'text-embedding-3-large': { + displayName: 'Text Embedding 3 Large', + model: new OpenAIEmbeddings({ + openAIApiKey, + modelName: 'text-embedding-3-large', + }), + }, }; return embeddingModels; diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts index 0ec7052..8a3417d 100644 --- a/src/lib/providers/transformers.ts +++ b/src/lib/providers/transformers.ts @@ -4,15 +4,24 @@ import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; export const loadTransformersEmbeddingsModels = async () => { try { const embeddingModels = { - 'BGE Small': new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/bge-small-en-v1.5', - }), - 'GTE Small': new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/gte-small', - }), - 'Bert Multilingual': new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/bert-base-multilingual-uncased', - }), + 'xenova-bge-small-en-v1.5': { + displayName: 'BGE Small', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/bge-small-en-v1.5', + }), + }, + 'xenova-gte-small': { + displayName: 'GTE Small', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/gte-small', + }), + }, + 'xenova-bert-base-multilingual-uncased': { + displayName: 'Bert Multilingual', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/bert-base-multilingual-uncased', + }), + }, }; return embeddingModels; diff --git a/src/routes/config.ts b/src/routes/config.ts index f255560..f635e4b 100644 --- a/src/routes/config.ts +++ b/src/routes/config.ts @@ -10,38 +10,54 @@ import { getOpenaiApiKey, updateConfig, } from '../config'; +import logger from '../utils/logger'; const router = express.Router(); router.get('/', async (_, res) => { - const config = {}; + try { + const config = {}; - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); - config['chatModelProviders'] = {}; - config['embeddingModelProviders'] = {}; + config['chatModelProviders'] = {}; + config['embeddingModelProviders'] = {}; - for (const provider in chatModelProviders) { - config['chatModelProviders'][provider] = Object.keys( - chatModelProviders[provider], - ); + for (const provider in chatModelProviders) { + config['chatModelProviders'][provider] = Object.keys( + chatModelProviders[provider], + ).map((model) => { + return { + name: model, + displayName: chatModelProviders[provider][model].displayName, + }; + }); + } + + for (const provider in embeddingModelProviders) { + config['embeddingModelProviders'][provider] = Object.keys( + embeddingModelProviders[provider], + ).map((model) => { + return { + name: model, + displayName: embeddingModelProviders[provider][model].displayName, + }; + }); + } + + config['openaiApiKey'] = getOpenaiApiKey(); + config['ollamaApiUrl'] = getOllamaApiEndpoint(); + config['anthropicApiKey'] = getAnthropicApiKey(); + config['groqApiKey'] = getGroqApiKey(); + + res.status(200).json(config); + } catch (err: any) { + res.status(500).json({ message: 'An error has occurred.' }); + logger.error(`Error getting config: ${err.message}`); } - - for (const provider in embeddingModelProviders) { - config['embeddingModelProviders'][provider] = Object.keys( - embeddingModelProviders[provider], - ); - } - - config['openaiApiKey'] = getOpenaiApiKey(); - config['ollamaApiUrl'] = getOllamaApiEndpoint(); - config['anthropicApiKey'] = getAnthropicApiKey(); - config['groqApiKey'] = getGroqApiKey(); - - res.status(200).json(config); }); router.post('/', async (req, res) => { diff --git a/src/routes/images.ts b/src/routes/images.ts index 6bd43d3..7806ce7 100644 --- a/src/routes/images.ts +++ b/src/routes/images.ts @@ -26,7 +26,7 @@ router.post('/', async (req, res) => { let llm: BaseChatModel | undefined; if (chatModels[provider] && chatModels[provider][chatModel]) { - llm = chatModels[provider][chatModel] as BaseChatModel | undefined; + llm = chatModels[provider][chatModel].model as BaseChatModel | undefined; } if (!llm) { diff --git a/src/routes/suggestions.ts b/src/routes/suggestions.ts index b15ff5f..a75657e 100644 --- a/src/routes/suggestions.ts +++ b/src/routes/suggestions.ts @@ -26,7 +26,7 @@ router.post('/', async (req, res) => { let llm: BaseChatModel | undefined; if (chatModels[provider] && chatModels[provider][chatModel]) { - llm = chatModels[provider][chatModel] as BaseChatModel | undefined; + llm = chatModels[provider][chatModel].model as BaseChatModel | undefined; } if (!llm) { diff --git a/src/routes/videos.ts b/src/routes/videos.ts index 0ffdb2c..9d43fd2 100644 --- a/src/routes/videos.ts +++ b/src/routes/videos.ts @@ -26,7 +26,7 @@ router.post('/', async (req, res) => { let llm: BaseChatModel | undefined; if (chatModels[provider] && chatModels[provider][chatModel]) { - llm = chatModels[provider][chatModel] as BaseChatModel | undefined; + llm = chatModels[provider][chatModel].model as BaseChatModel | undefined; } if (!llm) { diff --git a/src/websocket/connectionManager.ts b/src/websocket/connectionManager.ts index 70e20d9..04797c5 100644 --- a/src/websocket/connectionManager.ts +++ b/src/websocket/connectionManager.ts @@ -45,9 +45,8 @@ export const handleConnection = async ( chatModelProviders[chatModelProvider][chatModel] && chatModelProvider != 'custom_openai' ) { - llm = chatModelProviders[chatModelProvider][chatModel] as unknown as - | BaseChatModel - | undefined; + llm = chatModelProviders[chatModelProvider][chatModel] + .model as unknown as BaseChatModel | undefined; } else if (chatModelProvider == 'custom_openai') { llm = new ChatOpenAI({ modelName: chatModel, @@ -65,7 +64,7 @@ export const handleConnection = async ( ) { embeddings = embeddingModelProviders[embeddingModelProvider][ embeddingModel - ] as Embeddings | undefined; + ].model as Embeddings | undefined; } if (!llm || !embeddings) { diff --git a/ui/components/SearchVideos.tsx b/ui/components/SearchVideos.tsx index 74d4381..fec229c 100644 --- a/ui/components/SearchVideos.tsx +++ b/ui/components/SearchVideos.tsx @@ -64,7 +64,7 @@ const Searchvideos = ({ const data = await res.json(); - const videos = data.videos ?? []; + const videos = data.videos ?? []; setVideos(videos); setSlides( videos.map((video: Video) => { diff --git a/ui/components/SettingsDialog.tsx b/ui/components/SettingsDialog.tsx index 171e812..02358c5 100644 --- a/ui/components/SettingsDialog.tsx +++ b/ui/components/SettingsDialog.tsx @@ -49,10 +49,10 @@ export const Select = ({ className, options, ...restProps }: SelectProps) => { interface SettingsType { chatModelProviders: { - [key: string]: string[]; + [key: string]: [Record<string, any>]; }; embeddingModelProviders: { - [key: string]: string[]; + [key: string]: [Record<string, any>]; }; openaiApiKey: string; groqApiKey: string; @@ -68,6 +68,10 @@ const SettingsDialog = ({ setIsOpen: (isOpen: boolean) => void; }) => { const [config, setConfig] = useState<SettingsType | null>(null); + const [chatModels, setChatModels] = useState<Record<string, any>>({}); + const [embeddingModels, setEmbeddingModels] = useState<Record<string, any>>( + {}, + ); const [selectedChatModelProvider, setSelectedChatModelProvider] = useState< string | null >(null); @@ -118,7 +122,7 @@ const SettingsDialog = ({ const chatModel = localStorage.getItem('chatModel') || (data.chatModelProviders && - data.chatModelProviders[chatModelProvider]?.[0]) || + data.chatModelProviders[chatModelProvider]?.[0].name) || ''; const embeddingModelProvider = localStorage.getItem('embeddingModelProvider') || @@ -127,7 +131,7 @@ const SettingsDialog = ({ const embeddingModel = localStorage.getItem('embeddingModel') || (data.embeddingModelProviders && - data.embeddingModelProviders[embeddingModelProvider]?.[0]) || + data.embeddingModelProviders[embeddingModelProvider]?.[0].name) || ''; setSelectedChatModelProvider(chatModelProvider); @@ -136,6 +140,8 @@ const SettingsDialog = ({ setSelectedEmbeddingModel(embeddingModel); setCustomOpenAIApiKey(localStorage.getItem('openAIApiKey') || ''); setCustomOpenAIBaseURL(localStorage.getItem('openAIBaseURL') || ''); + setChatModels(data.chatModelProviders || {}); + setEmbeddingModels(data.embeddingModelProviders || {}); setIsLoading(false); }; @@ -229,7 +235,8 @@ const SettingsDialog = ({ setSelectedChatModel(''); } else { setSelectedChatModel( - config.chatModelProviders[e.target.value][0], + config.chatModelProviders[e.target.value][0] + .name, ); } }} @@ -264,8 +271,8 @@ const SettingsDialog = ({ return chatModelProvider ? chatModelProvider.length > 0 ? chatModelProvider.map((model) => ({ - value: model, - label: model, + value: model.name, + label: model.displayName, })) : [ { @@ -341,7 +348,8 @@ const SettingsDialog = ({ onChange={(e) => { setSelectedEmbeddingModelProvider(e.target.value); setSelectedEmbeddingModel( - config.embeddingModelProviders[e.target.value][0], + config.embeddingModelProviders[e.target.value][0] + .name, ); }} options={Object.keys( @@ -374,8 +382,8 @@ const SettingsDialog = ({ return embeddingModelProvider ? embeddingModelProvider.length > 0 ? embeddingModelProvider.map((model) => ({ - label: model, - value: model, + label: model.displayName, + value: model.name, })) : [ { From 2785cdd97a9e913d335f01eda6a5a7f5e6fe1f06 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 25 Sep 2024 15:27:48 +0530 Subject: [PATCH 026/282] feat(routes): add search route --- src/routes/index.ts | 2 + src/routes/search.ts | 150 ++++++++++++++++++++++++++++++++ src/websocket/messageHandler.ts | 2 +- 3 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 src/routes/search.ts diff --git a/src/routes/index.ts b/src/routes/index.ts index af928ab..6e82e54 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -5,6 +5,7 @@ import configRouter from './config'; import modelsRouter from './models'; import suggestionsRouter from './suggestions'; import chatsRouter from './chats'; +import searchRouter from './search'; const router = express.Router(); @@ -14,5 +15,6 @@ router.use('/config', configRouter); router.use('/models', modelsRouter); router.use('/suggestions', suggestionsRouter); router.use('/chats', chatsRouter); +router.use('/search', searchRouter); export default router; diff --git a/src/routes/search.ts b/src/routes/search.ts new file mode 100644 index 0000000..8eb2490 --- /dev/null +++ b/src/routes/search.ts @@ -0,0 +1,150 @@ +import express from 'express'; +import logger from '../utils/logger'; +import { BaseChatModel } from 'langchain/chat_models/base'; +import { Embeddings } from 'langchain/embeddings/base'; +import { ChatOpenAI } from '@langchain/openai'; +import { + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '../lib/providers'; +import { searchHandlers } from '../websocket/messageHandler'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; + +const router = express.Router(); + +interface chatModel { + provider: string; + model: string; + customOpenAIBaseURL?: string; + customOpenAIKey?: string; +} + +interface embeddingModel { + provider: string; + model: string; +} + +interface RequestBody { + focusMode: string; + chatModel?: chatModel; + embeddingModel?: embeddingModel; + query: string; + history: Array<[string, string]>; +} + +router.post('/', async (req, res) => { + try { + const body: RequestBody = req.body; + + if (!body.focusMode || !body.query) { + return res.status(400).json({ message: 'Missing focus mode or query' }); + } + + body.history = body.history || []; + + const history: BaseMessage[] = body.history.map((msg) => { + if (msg[0] === 'human') { + return new HumanMessage({ + content: msg[1], + }); + } else { + return new AIMessage({ + content: msg[1], + }); + } + }); + + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); + + const chatModelProvider = + body.chatModel?.provider || Object.keys(chatModelProviders)[0]; + const chatModel = + body.chatModel?.model || + Object.keys(chatModelProviders[chatModelProvider])[0]; + + const embeddingModelProvider = + body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0]; + const embeddingModel = + body.embeddingModel?.model || + Object.keys(embeddingModelProviders[embeddingModelProvider])[0]; + + let llm: BaseChatModel | undefined; + let embeddings: Embeddings | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + if ( + !body.chatModel?.customOpenAIBaseURL || + !body.chatModel?.customOpenAIKey + ) { + return res + .status(400) + .json({ message: 'Missing custom OpenAI base URL or key' }); + } + + llm = new ChatOpenAI({ + modelName: body.chatModel.model, + openAIApiKey: body.chatModel.customOpenAIKey, + temperature: 0.7, + configuration: { + baseURL: body.chatModel.customOpenAIBaseURL, + }, + }) as unknown as BaseChatModel; + } else if ( + chatModelProviders[chatModelProvider] && + chatModelProviders[chatModelProvider][chatModel] + ) { + llm = chatModelProviders[chatModelProvider][chatModel] + .model as unknown as BaseChatModel | undefined; + } + + if ( + embeddingModelProviders[embeddingModelProvider] && + embeddingModelProviders[embeddingModelProvider][embeddingModel] + ) { + embeddings = embeddingModelProviders[embeddingModelProvider][ + embeddingModel + ].model as Embeddings | undefined; + } + + if (!llm || !embeddings) { + return res.status(400).json({ message: 'Invalid model selected' }); + } + + const searchHandler = searchHandlers[body.focusMode]; + + if (!searchHandler) { + return res.status(400).json({ message: 'Invalid focus mode' }); + } + + const emitter = searchHandler(body.query, history, llm, embeddings); + + let message = ''; + let sources = []; + + emitter.on('data', (data) => { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + message += parsedData.data; + } else if (parsedData.type === 'sources') { + sources = parsedData.data; + } + }); + + emitter.on('end', () => { + res.status(200).json({ message, sources }); + }); + + emitter.on('error', (data) => { + const parsedData = JSON.parse(data); + res.status(500).json({ message: parsedData.data }); + }); + } catch (err: any) { + logger.error(`Error in getting search results: ${err.message}`); + res.status(500).json({ message: 'An error has occurred.' }); + } +}); + +export default router; diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index 0afda9f..332910c 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -28,7 +28,7 @@ type WSMessage = { history: Array<[string, string]>; }; -const searchHandlers = { +export const searchHandlers = { webSearch: handleWebSearch, academicSearch: handleAcademicSearch, writingAssistant: handleWritingAssistant, From c52d6ac290dd22c7b3d762bb11448b100c8c919f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:54:07 +0530 Subject: [PATCH 027/282] feat(docs): add search API docs --- README.md | 9 ++++ docs/API/SEARCH.md | 105 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 docs/API/SEARCH.md diff --git a/README.md b/README.md index 3c87acc..38cc1c2 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ - [Non-Docker Installation](#non-docker-installation) - [Ollama Connection Errors](#ollama-connection-errors) - [Using as a Search Engine](#using-as-a-search-engine) +- [Using Perplexica's API](#using-perplexicas-api) - [One-Click Deployment](#one-click-deployment) - [Upcoming Features](#upcoming-features) - [Support Us](#support-us) @@ -45,6 +46,7 @@ Want to know more about its architecture and how it works? You can read it [here - **Wolfram Alpha Search Mode:** Answers queries that need calculations or data analysis using Wolfram Alpha. - **Reddit Search Mode:** Searches Reddit for discussions and opinions related to the query. - **Current Information:** Some search tools might give you outdated info because they use data from crawling bots and convert them into embeddings and store them in a index. Unlike them, Perplexica uses SearxNG, a metasearch engine to get the results and rerank and get the most relevant source out of it, ensuring you always get the latest information without the overhead of daily data updates. +- **API**: Integrate Perplexica into your existing applications and make use of its capibilities. It has many more features like image and video search. Some of the planned features are mentioned in [upcoming features](#upcoming-features). @@ -125,6 +127,12 @@ If you wish to use Perplexica as an alternative to traditional search engines li 3. Add a new site search with the following URL: `http://localhost:3000/?q=%s`. Replace `localhost` with your IP address or domain name, and `3000` with the port number if Perplexica is not hosted locally. 4. Click the add button. Now, you can use Perplexica directly from your browser's search bar. +## Using Perplexica's API + +Perplexica also provides an API for developers looking to integrate its powerful search engine into their own applications. You can run searches, customize models, and get results tailored to your needs. + +For more details, check out the full documentation [here](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/API/SEARCH.md). + ## One-Click Deployment [![Deploy to RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploylobe.svg)](https://repocloud.io/details/?app_id=267) @@ -135,6 +143,7 @@ If you wish to use Perplexica as an alternative to traditional search engines li - [x] Adding support for local LLMs - [x] History Saving features - [x] Introducing various Focus Modes +- [x] Adding API support - [ ] Finalizing Copilot Mode - [ ] Adding Discover diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md new file mode 100644 index 0000000..d3391c9 --- /dev/null +++ b/docs/API/SEARCH.md @@ -0,0 +1,105 @@ +# Perplexica Search API Documentation + +## Overview + +Perplexica’s Search API makes it easy to use our AI-powered search engine. You can run different types of searches, pick the models you want to use, and get the most recent info. Follow the following headings to learn more about Perplexica's search API. + +## Endpoint + +### **POST** `/api/search` + +### Request + +The API accepts a JSON object in the request body, where you define the focus mode, chat models, embedding models, and your query. + +#### Request Body Structure + +```json +{ + "chatModel": { + "provider": "openai", + "model": "gpt-4o-mini" + }, + "embeddingModel": { + "provider": "openai", + "model": "text-embedding-3-large" + }, + "focusMode": "webSearch", + "query": "What is Perplexica", + "history": [] +} +``` + +### Request Parameters + +- **`chatModel`** (object, optional): Defines the chat model to be used for the query. + + - `provider`: Specifies the provider for the chat model (e.g., `openai`, `ollama`). + - `model`: The specific model from the chosen provider (e.g., `gpt-4o-mini`). + - Optional fields for custom OpenAI configuration: + - `customOpenAIBaseURL`: If you’re using a custom OpenAI instance, provide the base URL. + - `customOpenAIKey`: The API key for a custom OpenAI instance. + +- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. + + - `provider`: The provider for the embedding model (e.g., `openai`). + - `model`: The specific embedding model (e.g., `text-embedding-3-large`). + +- **`focusMode`** (string, required): Specifies which focus mode to use. Available modes: + + - `webSearch`, `academicSearch`, `writingAssistant`, `wolframAlphaSearch`, `youtubeSearch`, `redditSearch`. + +- **`query`** (string, required): The search query or question. + +- **`history`** (array, optional): An array of message pairs representing the conversation history. Each pair consists of a role (either 'human' or 'assistant') and the message content. This allows the system to use the context of the conversation to refine results. Example: + ```json + [ + ["human", "What is Perplexica?"], + ["assistant", "Perplexica is an AI-powered search engine..."] + ] + ``` + +### Response + +The response from the API includes both the final message and the sources used to generate that message. + +#### Example Response + +```json +{ + "message": "Perplexica is an innovative, open-source AI-powered search engine designed to enhance the way users search for information online. Here are some key features and characteristics of Perplexica:\n\n- **AI-Powered Technology**: It utilizes advanced machine learning algorithms to not only retrieve information but also to understand the context and intent behind user queries, providing more relevant results [1][5].\n\n- **Open-Source**: Being open-source, Perplexica offers flexibility and transparency, allowing users to explore its functionalities without the constraints of proprietary software [3][10].", + "sources": [ + { + "pageContent": "Perplexica is an innovative, open-source AI-powered search engine designed to enhance the way users search for information online.", + "metadata": { + "title": "What is Perplexica, and how does it function as an AI-powered search ...", + "url": "https://askai.glarity.app/search/What-is-Perplexica--and-how-does-it-function-as-an-AI-powered-search-engine" + } + }, + { + "pageContent": "Perplexica is an open-source AI-powered search tool that dives deep into the internet to find precise answers.", + "metadata": { + "title": "Sahar Mor's Post", + "url": "https://www.linkedin.com/posts/sahar-mor_a-new-open-source-project-called-perplexica-activity-7204489745668694016-ncja" + } + } + .... + ] +} +``` + +### Fields in the Response + +- **`message`** (string): The search result, generated based on the query and focus mode. +- **`sources`** (array): A list of sources that were used to generate the search result. Each source includes: + - `pageContent`: A snippet of the relevant content from the source. + - `metadata`: Metadata about the source, including: + - `title`: The title of the webpage. + - `url`: The URL of the webpage. + +### Error Handling + +If an error occurs during the search process, the API will return an appropriate error message with an HTTP status code. + +- **400**: If the request is malformed or missing required fields (e.g., no focus mode or query). +- **500**: If an internal server error occurs during the search. From ead2d98a9fb4eaf80fe126e004e86f7263b9afdc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:54:19 +0530 Subject: [PATCH 028/282] feat(search): update types --- src/routes/search.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/search.ts b/src/routes/search.ts index 8eb2490..9eec29f 100644 --- a/src/routes/search.ts +++ b/src/routes/search.ts @@ -24,7 +24,7 @@ interface embeddingModel { model: string; } -interface RequestBody { +interface ChatRequestBody { focusMode: string; chatModel?: chatModel; embeddingModel?: embeddingModel; @@ -34,7 +34,7 @@ interface RequestBody { router.post('/', async (req, res) => { try { - const body: RequestBody = req.body; + const body: ChatRequestBody = req.body; if (!body.focusMode || !body.query) { return res.status(400).json({ message: 'Missing focus mode or query' }); From 1cfa3398a3f2bfdb5fa9129a5d3115a97cdc813a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:54:44 +0530 Subject: [PATCH 029/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c09454c..ab45174 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.9.0-rc2", + "version": "1.9.0-rc3", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index 23afda2..04512b6 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.9.0-rc2", + "version": "1.9.0-rc3", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From a0aad69f62d3ac4c210e11e6aeb09c952fe8c219 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:56:41 +0530 Subject: [PATCH 030/282] feat(readme): update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38cc1c2..f66e8b1 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ If you wish to use Perplexica as an alternative to traditional search engines li ## Using Perplexica's API -Perplexica also provides an API for developers looking to integrate its powerful search engine into their own applications. You can run searches, customize models, and get results tailored to your needs. +Perplexica also provides an API for developers looking to integrate its powerful search engine into their own applications. You can run searches, use multiple models and get answers to your queries. For more details, check out the full documentation [here](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/API/SEARCH.md). From 15203c123dff84685d5a9c57286bf35e7462f452 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:49:16 +0530 Subject: [PATCH 031/282] feat(docs): update search docs --- docs/API/SEARCH.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index d3391c9..714cbd8 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -6,7 +6,9 @@ Perplexica’s Search API makes it easy to use our AI-powered search engine. You ## Endpoint -### **POST** `/api/search` +### **POST** `http://localhost:3001/api/search` + +**Note**: Replace `3001` with any other port if you've changed the default PORT ### Request From 8902abdcee7a1f7fe964381f7afb9e31acfb6136 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:54:35 +0530 Subject: [PATCH 032/282] Update SEARCH.md --- docs/API/SEARCH.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 714cbd8..56d34ce 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -28,7 +28,10 @@ The API accepts a JSON object in the request body, where you define the focus mo }, "focusMode": "webSearch", "query": "What is Perplexica", - "history": [] + "history": [ + ["human", "Hi, how are you?"], + ["assistant", "I am doing well, how can I help you today?"] + ] } ``` From e3488366c16ded6e8d60d3b77eb3ff2860db6026 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:56:19 +0530 Subject: [PATCH 033/282] Update SEARCH.md --- docs/API/SEARCH.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 56d34ce..996a88b 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -37,7 +37,7 @@ The API accepts a JSON object in the request body, where you define the focus mo ### Request Parameters -- **`chatModel`** (object, optional): Defines the chat model to be used for the query. +- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3001/api/models`. - `provider`: Specifies the provider for the chat model (e.g., `openai`, `ollama`). - `model`: The specific model from the chosen provider (e.g., `gpt-4o-mini`). @@ -45,7 +45,8 @@ The API accepts a JSON object in the request body, where you define the focus mo - `customOpenAIBaseURL`: If you’re using a custom OpenAI instance, provide the base URL. - `customOpenAIKey`: The API key for a custom OpenAI instance. -- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. +- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3001/api/models`. + - `provider`: The provider for the embedding model (e.g., `openai`). - `model`: The specific embedding model (e.g., `text-embedding-3-large`). From 425a08432b29b96ed50378af0f87cba8272f1e03 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 26 Sep 2024 21:37:05 +0530 Subject: [PATCH 034/282] feat(groq): add Llama 3.2 --- src/lib/providers/groq.ts | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 6249267..69db4f7 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -9,6 +9,45 @@ export const loadGroqChatModels = async () => { try { const chatModels = { + 'llama-3.2-3b-preview': { + displayName: 'Llama 3.2 3B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'llama-3.2-3b-preview', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, + 'llama-3.2-11b-text-preview': { + displayName: 'Llama 3.2 11B Text', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'llama-3.2-11b-text-preview', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, + 'llama-3.2-90b-text-preview': { + displayName: 'Llama 3.2 90B Text', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'llama-3.2-90b-text-preview', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, 'llama-3.1-70b-versatile': { displayName: 'Llama 3.1 70B', model: new ChatOpenAI( From fc5e35b1b10c3e05303a457e64c9f84404dba748 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Oct 2024 21:59:40 +0530 Subject: [PATCH 035/282] feat(docker): add prebuilt images --- .github/workflows/docker-build.yaml | 46 +++++++++++++++++++++++++++++ backend.dockerfile | 1 - docker-compose.yaml | 2 ++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/docker-build.yaml diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml new file mode 100644 index 0000000..90ccbe4 --- /dev/null +++ b/.github/workflows/docker-build.yaml @@ -0,0 +1,46 @@ +name: Build & Push Docker Image + +on: + push: + branches: + - main + release: + types: [published] + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract version from release tag + if: github.event_name == 'release' + id: version + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + - name: Build and push Docker image + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + run: | + docker build -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:main . + docker build -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:main . + docker push itzcrazykns1337/perplexica-backend:main + docker push itzcrazykns1337/perplexica-frontend:main + + - name: Build and push release Docker image + if: github.event_name == 'release' + run: | + docker build -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:${{ env.RELEASE_VERSION }} . + docker build -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:${{ env.RELEASE_VERSION }} . + docker push itzcrazykns1337/perplexica-backend:${{ env.RELEASE_VERSION }} + docker push itzcrazykns1337/perplexica-frontend:${{ env.RELEASE_VERSION }} \ No newline at end of file diff --git a/backend.dockerfile b/backend.dockerfile index 0169218..66de9dc 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -7,7 +7,6 @@ WORKDIR /home/perplexica COPY src /home/perplexica/src COPY tsconfig.json /home/perplexica/ -COPY config.toml /home/perplexica/ COPY drizzle.config.ts /home/perplexica/ COPY package.json /home/perplexica/ COPY yarn.lock /home/perplexica/ diff --git a/docker-compose.yaml b/docker-compose.yaml index d3892e5..ad61ec2 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -15,6 +15,7 @@ services: dockerfile: backend.dockerfile args: - SEARXNG_API_URL=http://searxng:8080 + image: itzcrazykns1337/perplexica-backend:main depends_on: - searxng ports: @@ -35,6 +36,7 @@ services: args: - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 + image: itzcrazykns1337/perplexica-frontend:main depends_on: - perplexica-backend ports: From dcfe43ebda6b46b83eda33d2f8b049901d80df3e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:00:04 +0530 Subject: [PATCH 036/282] trigger build --- docs/API/SEARCH.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 996a88b..a573021 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -47,7 +47,6 @@ The API accepts a JSON object in the request body, where you define the focus mo - **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3001/api/models`. - - `provider`: The provider for the embedding model (e.g., `openai`). - `model`: The specific embedding model (e.g., `text-embedding-3-large`). From 4bba674134d2acce0d6a3d7f577125215a440546 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:00:46 +0530 Subject: [PATCH 037/282] feat(build-workflow): update branch --- .github/workflows/docker-build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index 90ccbe4..ac855e1 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -3,7 +3,7 @@ name: Build & Push Docker Image on: push: branches: - - main + - master release: types: [published] From 1aaf172246e3900dc44ecfa0f8f34ce0a07893ed Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:01:49 +0530 Subject: [PATCH 038/282] feat(build-workflow): update head --- .github/workflows/docker-build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index ac855e1..6bf2c64 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -30,7 +30,7 @@ jobs: run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - name: Build and push Docker image - if: github.ref == 'refs/heads/main' && github.event_name == 'push' + if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | docker build -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:main . docker build -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:main . From c233362e70aebf04fdfbb2da67e612ecc421ede3 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:53:45 +0530 Subject: [PATCH 039/282] feat(dockerfile): specify default args --- .gitignore | 3 ++- app.dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index a3dd5cc..8391d19 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,5 @@ logs/ Thumbs.db # Db -db.sqlite \ No newline at end of file +db.sqlite +/searxng diff --git a/app.dockerfile b/app.dockerfile index 105cf86..8337171 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,7 +1,7 @@ FROM node:alpine -ARG NEXT_PUBLIC_WS_URL -ARG NEXT_PUBLIC_API_URL +ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 +ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api ENV NEXT_PUBLIC_WS_URL=${NEXT_PUBLIC_WS_URL} ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} From 9f88d16ef1dbbc3100f6fa76dd7538ea6da04383 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:54:00 +0530 Subject: [PATCH 040/282] feat(docker-compose): use env vars from compose --- backend.dockerfile | 3 --- docker-compose.yaml | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/backend.dockerfile b/backend.dockerfile index 66de9dc..70c30e8 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -1,8 +1,5 @@ FROM node:slim -ARG SEARXNG_API_URL -ENV SEARXNG_API_URL=${SEARXNG_API_URL} - WORKDIR /home/perplexica COPY src /home/perplexica/src diff --git a/docker-compose.yaml b/docker-compose.yaml index ad61ec2..46d82c6 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -13,9 +13,9 @@ services: build: context: . dockerfile: backend.dockerfile - args: - - SEARXNG_API_URL=http://searxng:8080 image: itzcrazykns1337/perplexica-backend:main + environment: + - SEARXNG_API_URL=http://searxng:8080 depends_on: - searxng ports: From ae3fc5f80285b34d7e289498a9f6e1c61bef20aa Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:54:16 +0530 Subject: [PATCH 041/282] feat(docs): modify updating docs --- docs/installation/UPDATING.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/installation/UPDATING.md b/docs/installation/UPDATING.md index df67775..031a3e8 100644 --- a/docs/installation/UPDATING.md +++ b/docs/installation/UPDATING.md @@ -10,15 +10,21 @@ To update Perplexica to the latest version, follow these steps: git clone https://github.com/ItzCrazyKns/Perplexica.git ``` -2. Navigate to the Project Directory +2. Navigate to the Project Directory. -3. Update and Rebuild Docker Containers: +3. Pull latest images from registry. ```bash -docker compose up -d --build +docker compose pull ``` -4. Once the command completes running go to http://localhost:3000 and verify the latest changes. +4. Update and Recreate containers. + +```bash +docker compose up -d +``` + +5. Once the command completes running go to http://localhost:3000 and verify the latest changes. ## For non Docker users From 66f1e19ce88eaf167f09f66bbd196eaa89a9ffa5 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 3 Oct 2024 09:37:15 +0530 Subject: [PATCH 042/282] feat(image-build): use Docker buildx, publish multi arch images --- .github/workflows/docker-build.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index 6bf2c64..63210ff 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -17,6 +17,8 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 + with: + install: true - name: Log in to DockerHub uses: docker/login-action@v2 @@ -32,15 +34,13 @@ jobs: - name: Build and push Docker image if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | - docker build -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:main . - docker build -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:main . - docker push itzcrazykns1337/perplexica-backend:main - docker push itzcrazykns1337/perplexica-frontend:main + docker buildx create --use + docker buildx build --platform linux/amd64,linux/arm64 -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:main --push . + docker buildx build --platform linux/amd64,linux/arm64 -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:main --push . - name: Build and push release Docker image if: github.event_name == 'release' run: | - docker build -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:${{ env.RELEASE_VERSION }} . - docker build -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:${{ env.RELEASE_VERSION }} . - docker push itzcrazykns1337/perplexica-backend:${{ env.RELEASE_VERSION }} - docker push itzcrazykns1337/perplexica-frontend:${{ env.RELEASE_VERSION }} \ No newline at end of file + docker buildx create --use + docker buildx build --platform linux/amd64,linux/arm64 -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:${{ env.RELEASE_VERSION }} --push . + docker buildx build --platform linux/amd64,linux/arm64 -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:${{ env.RELEASE_VERSION }} --push . \ No newline at end of file From 1680a1786e7e81122c36743d580a4caafe19612e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 3 Oct 2024 10:41:05 +0530 Subject: [PATCH 043/282] feat(image-build): improve build time by caching --- .github/workflows/docker-build.yaml | 40 +++++++++++++++++++++++------ app.dockerfile | 2 +- backend.dockerfile | 2 +- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index 63210ff..3cd9044 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -1,4 +1,4 @@ -name: Build & Push Docker Image +name: Build & Push Docker Images on: push: @@ -10,7 +10,9 @@ on: jobs: build-and-push: runs-on: ubuntu-latest - + strategy: + matrix: + service: [backend, app] steps: - name: Checkout code uses: actions/checkout@v3 @@ -31,16 +33,38 @@ jobs: id: version run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - name: Build and push Docker image + - name: Build and push Docker image for ${{ matrix.service }} if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | docker buildx create --use - docker buildx build --platform linux/amd64,linux/arm64 -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:main --push . - docker buildx build --platform linux/amd64,linux/arm64 -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:main --push . + if [[ "${{ matrix.service }}" == "backend" ]]; then \ + DOCKERFILE=backend.dockerfile; \ + IMAGE_NAME=perplexica-backend; \ + else \ + DOCKERFILE=app.dockerfile; \ + IMAGE_NAME=perplexica-frontend; \ + fi + docker buildx build --platform linux/amd64,linux/arm64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:main \ + --cache-to=type=inline \ + -f $DOCKERFILE \ + -t itzcrazykns1337/${IMAGE_NAME}:main \ + --push . - - name: Build and push release Docker image + - name: Build and push release Docker image for ${{ matrix.service }} if: github.event_name == 'release' run: | docker buildx create --use - docker buildx build --platform linux/amd64,linux/arm64 -f backend.dockerfile -t itzcrazykns1337/perplexica-backend:${{ env.RELEASE_VERSION }} --push . - docker buildx build --platform linux/amd64,linux/arm64 -f app.dockerfile -t itzcrazykns1337/perplexica-frontend:${{ env.RELEASE_VERSION }} --push . \ No newline at end of file + if [[ "${{ matrix.service }}" == "backend" ]]; then \ + DOCKERFILE=backend.dockerfile; \ + IMAGE_NAME=perplexica-backend; \ + else \ + DOCKERFILE=app.dockerfile; \ + IMAGE_NAME=perplexica-frontend; \ + fi + docker buildx build --platform linux/amd64,linux/arm64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ + --cache-to=type=inline \ + -f $DOCKERFILE \ + -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ + --push . diff --git a/app.dockerfile b/app.dockerfile index 8337171..ff1824d 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -9,7 +9,7 @@ WORKDIR /home/perplexica COPY ui /home/perplexica/ -RUN yarn install +RUN yarn install --frozen-lockfile RUN yarn build CMD ["yarn", "start"] \ No newline at end of file diff --git a/backend.dockerfile b/backend.dockerfile index 70c30e8..b8d0155 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -10,7 +10,7 @@ COPY yarn.lock /home/perplexica/ RUN mkdir /home/perplexica/data -RUN yarn install +RUN yarn install --frozen-lockfile RUN yarn build CMD ["yarn", "start"] \ No newline at end of file From 877735b8529d23e9120c1bb72737ca193996ec6d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 11 Oct 2024 10:35:33 +0530 Subject: [PATCH 044/282] feat(package): update `headlessui` --- ui/components/DeleteChat.tsx | 30 +++-- ui/components/MessageInputActions/Focus.tsx | 25 ++-- ui/components/MessageSources.tsx | 20 ++- ui/components/SettingsDialog.tsx | 24 ++-- ui/package.json | 2 +- ui/yarn.lock | 138 +++++++++++++++++--- 6 files changed, 185 insertions(+), 54 deletions(-) diff --git a/ui/components/DeleteChat.tsx b/ui/components/DeleteChat.tsx index 165f86e..f981e32 100644 --- a/ui/components/DeleteChat.tsx +++ b/ui/components/DeleteChat.tsx @@ -1,5 +1,13 @@ -import { Delete, Trash } from 'lucide-react'; -import { Dialog, Transition } from '@headlessui/react'; +import { Trash } from 'lucide-react'; +import { + Description, + Dialog, + DialogBackdrop, + DialogPanel, + DialogTitle, + Transition, + TransitionChild, +} from '@headlessui/react'; import { Fragment, useState } from 'react'; import { toast } from 'sonner'; import { Chat } from '@/app/library/page'; @@ -64,10 +72,10 @@ const DeleteChat = ({ } }} > - <Dialog.Backdrop className="fixed inset-0 bg-black/30" /> + <DialogBackdrop className="fixed inset-0 bg-black/30" /> <div className="fixed inset-0 overflow-y-auto"> <div className="flex min-h-full items-center justify-center p-4 text-center"> - <Transition.Child + <TransitionChild as={Fragment} enter="ease-out duration-200" enterFrom="opacity-0 scale-95" @@ -76,13 +84,13 @@ const DeleteChat = ({ leaveFrom="opacity-100 scale-200" leaveTo="opacity-0 scale-95" > - <Dialog.Panel className="w-full max-w-md transform rounded-2xl bg-light-secondary dark:bg-dark-secondary border border-light-200 dark:border-dark-200 p-6 text-left align-middle shadow-xl transition-all"> - <Dialog.Title className="text-lg font-medium leading-6 dark:text-white"> + <DialogPanel className="w-full max-w-md transform rounded-2xl bg-light-secondary dark:bg-dark-secondary border border-light-200 dark:border-dark-200 p-6 text-left align-middle shadow-xl transition-all"> + <DialogTitle className="text-lg font-medium leading-6 dark:text-white"> Delete Confirmation - </Dialog.Title> - <Dialog.Description className="text-sm dark:text-white/70 text-black/70"> + </DialogTitle> + <Description className="text-sm dark:text-white/70 text-black/70"> Are you sure you want to delete this chat? - </Dialog.Description> + </Description> <div className="flex flex-row items-end justify-end space-x-4 mt-6"> <button onClick={() => { @@ -101,8 +109,8 @@ const DeleteChat = ({ Delete </button> </div> - </Dialog.Panel> - </Transition.Child> + </DialogPanel> + </TransitionChild> </div> </div> </Dialog> diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index 86fca44..e471630 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -7,7 +7,12 @@ import { SwatchBook, } from 'lucide-react'; import { cn } from '@/lib/utils'; -import { Popover, Transition } from '@headlessui/react'; +import { + Popover, + PopoverButton, + PopoverPanel, + Transition, +} from '@headlessui/react'; import { SiReddit, SiYoutube } from '@icons-pack/react-simple-icons'; import { Fragment } from 'react'; @@ -70,10 +75,10 @@ const Focus = ({ setFocusMode: (mode: string) => void; }) => { return ( - <Popover className="fixed w-full max-w-[15rem] md:max-w-md lg:max-w-lg"> - <Popover.Button + <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg"> + <PopoverButton type="button" - className="p-2 text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary active:scale-95 transition duration-200 hover:text-black dark:hover:text-white" + className=" text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary active:scale-95 transition duration-200 hover:text-black dark:hover:text-white" > {focusMode !== 'webSearch' ? ( <div className="flex flex-row items-center space-x-1"> @@ -86,7 +91,7 @@ const Focus = ({ ) : ( <ScanEye /> )} - </Popover.Button> + </PopoverButton> <Transition as={Fragment} enter="transition ease-out duration-150" @@ -96,10 +101,10 @@ const Focus = ({ leaveFrom="opacity-100 translate-y-0" leaveTo="opacity-0 translate-y-1" > - <Popover.Panel className="absolute z-10 w-full"> - <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-1 bg-light-primary dark:bg-dark-primary border rounded-lg border-light-200 dark:border-dark-200 w-full p-2 max-h-[200px] md:max-h-none overflow-y-auto"> + <PopoverPanel className="absolute z-10 w-64 md:w-[500px] left-0"> + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2 bg-light-primary dark:bg-dark-primary border rounded-lg border-light-200 dark:border-dark-200 w-full p-4 max-h-[200px] md:max-h-none overflow-y-auto"> {focusModes.map((mode, i) => ( - <Popover.Button + <PopoverButton onClick={() => setFocusMode(mode.key)} key={i} className={cn( @@ -123,10 +128,10 @@ const Focus = ({ <p className="text-black/70 dark:text-white/70 text-xs"> {mode.description} </p> - </Popover.Button> + </PopoverButton> ))} </div> - </Popover.Panel> + </PopoverPanel> </Transition> </Popover> ); diff --git a/ui/components/MessageSources.tsx b/ui/components/MessageSources.tsx index 71eebf8..e9cc1ba 100644 --- a/ui/components/MessageSources.tsx +++ b/ui/components/MessageSources.tsx @@ -1,5 +1,11 @@ /* eslint-disable @next/next/no-img-element */ -import { Dialog, Transition } from '@headlessui/react'; +import { + Dialog, + DialogPanel, + DialogTitle, + Transition, + TransitionChild, +} from '@headlessui/react'; import { Document } from '@langchain/core/documents'; import { Fragment, useState } from 'react'; @@ -74,7 +80,7 @@ const MessageSources = ({ sources }: { sources: Document[] }) => { <Dialog as="div" className="relative z-50" onClose={closeModal}> <div className="fixed inset-0 overflow-y-auto"> <div className="flex min-h-full items-center justify-center p-4 text-center"> - <Transition.Child + <TransitionChild as={Fragment} enter="ease-out duration-200" enterFrom="opacity-0 scale-95" @@ -83,10 +89,10 @@ const MessageSources = ({ sources }: { sources: Document[] }) => { leaveFrom="opacity-100 scale-200" leaveTo="opacity-0 scale-95" > - <Dialog.Panel className="w-full max-w-md transform rounded-2xl bg-light-secondary dark:bg-dark-secondary border border-light-200 dark:border-dark-200 p-6 text-left align-middle shadow-xl transition-all"> - <Dialog.Title className="text-lg font-medium leading-6 dark:text-white"> + <DialogPanel className="w-full max-w-md transform rounded-2xl bg-light-secondary dark:bg-dark-secondary border border-light-200 dark:border-dark-200 p-6 text-left align-middle shadow-xl transition-all"> + <DialogTitle className="text-lg font-medium leading-6 dark:text-white"> Sources - </Dialog.Title> + </DialogTitle> <div className="grid grid-cols-2 gap-2 overflow-auto max-h-[300px] mt-2 pr-2"> {sources.map((source, i) => ( <a @@ -122,8 +128,8 @@ const MessageSources = ({ sources }: { sources: Document[] }) => { </a> ))} </div> - </Dialog.Panel> - </Transition.Child> + </DialogPanel> + </TransitionChild> </div> </div> </Dialog> diff --git a/ui/components/SettingsDialog.tsx b/ui/components/SettingsDialog.tsx index 02358c5..34ef26c 100644 --- a/ui/components/SettingsDialog.tsx +++ b/ui/components/SettingsDialog.tsx @@ -1,5 +1,11 @@ import { cn } from '@/lib/utils'; -import { Dialog, Transition } from '@headlessui/react'; +import { + Dialog, + DialogPanel, + DialogTitle, + Transition, + TransitionChild, +} from '@headlessui/react'; import { CloudUpload, RefreshCcw, RefreshCw } from 'lucide-react'; import React, { Fragment, @@ -188,7 +194,7 @@ const SettingsDialog = ({ className="relative z-50" onClose={() => setIsOpen(false)} > - <Transition.Child + <TransitionChild as={Fragment} enter="ease-out duration-300" enterFrom="opacity-0" @@ -198,10 +204,10 @@ const SettingsDialog = ({ leaveTo="opacity-0" > <div className="fixed inset-0 bg-white/50 dark:bg-black/50" /> - </Transition.Child> + </TransitionChild> <div className="fixed inset-0 overflow-y-auto"> <div className="flex min-h-full items-center justify-center p-4 text-center"> - <Transition.Child + <TransitionChild as={Fragment} enter="ease-out duration-200" enterFrom="opacity-0 scale-95" @@ -210,10 +216,10 @@ const SettingsDialog = ({ leaveFrom="opacity-100 scale-200" leaveTo="opacity-0 scale-95" > - <Dialog.Panel className="w-full max-w-md transform rounded-2xl bg-light-secondary dark:bg-dark-secondary border border-light-200 dark:border-dark-200 p-6 text-left align-middle shadow-xl transition-all"> - <Dialog.Title className="text-xl font-medium leading-6 dark:text-white"> + <DialogPanel className="w-full max-w-md transform rounded-2xl bg-light-secondary dark:bg-dark-secondary border border-light-200 dark:border-dark-200 p-6 text-left align-middle shadow-xl transition-all"> + <DialogTitle className="text-xl font-medium leading-6 dark:text-white"> Settings - </Dialog.Title> + </DialogTitle> {config && !isLoading && ( <div className="flex flex-col space-y-4 mt-6"> <div className="flex flex-col space-y-1"> @@ -491,8 +497,8 @@ const SettingsDialog = ({ )} </button> </div> - </Dialog.Panel> - </Transition.Child> + </DialogPanel> + </TransitionChild> </div> </div> </Dialog> diff --git a/ui/package.json b/ui/package.json index 04512b6..e5dc677 100644 --- a/ui/package.json +++ b/ui/package.json @@ -11,7 +11,7 @@ "format:write": "prettier . --write" }, "dependencies": { - "@headlessui/react": "^1.7.18", + "@headlessui/react": "^2.1.9", "@icons-pack/react-simple-icons": "^9.4.0", "@langchain/openai": "^0.0.25", "@tailwindcss/typography": "^0.5.12", diff --git a/ui/yarn.lock b/ui/yarn.lock index d348a8c..fad2596 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -66,13 +66,51 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@headlessui/react@^1.7.18": - version "1.7.18" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.18.tgz#30af4634d2215b2ca1aa29d07f33d02bea82d9d7" - integrity sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ== +"@floating-ui/core@^1.6.0": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== dependencies: - "@tanstack/react-virtual" "^3.0.0-beta.60" - client-only "^0.0.1" + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/dom@^1.0.0": + version "1.6.11" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.11.tgz#8631857838d34ee5712339eb7cbdfb8ad34da723" + integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/react-dom@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.16": + version "0.26.24" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.24.tgz#072b9dfeca4e79ef4e3000ef1c28e0ffc86f4ed4" + integrity sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw== + dependencies: + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.8" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== + +"@headlessui/react@^2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.1.9.tgz#d8d3ff64255177a87706cc4f24f42aeac65b1695" + integrity sha512-ckWw7vlKtnoa1fL2X0fx1a3t/Li9MIKDVXn3SgG65YlxvDAsNrY39PPCxVM7sQRA7go2fJsuHSSauKFNaJHH7A== + dependencies: + "@floating-ui/react" "^0.26.16" + "@react-aria/focus" "^3.17.1" + "@react-aria/interactions" "^3.21.3" + "@tanstack/react-virtual" "^3.8.1" "@humanwhocodes/config-array@^0.11.14": version "0.11.14" @@ -278,6 +316,57 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@react-aria/focus@^3.17.1": + version "3.18.3" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.3.tgz#4fe32de1e7530beab8da2e7b89f0f17d22a47e5e" + integrity sha512-WKUElg+5zS0D3xlVn8MntNnkzJql2J6MuzAMP8Sv5WTgFDse/XGR842dsxPTIyKKdrWVCRegCuwa4m3n/GzgJw== + dependencies: + "@react-aria/interactions" "^3.22.3" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.3": + version "3.22.3" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.3.tgz#3ba50db12f6ed443ae061eed79e41509eaa3d8e6" + integrity sha512-RRUb/aG+P0IKTIWikY/SylB6bIbLZeztnZY2vbe7RAG5MgVaCgn5HQ45SI15GlTmhsFG8CnF6slJsUFJiNHpbQ== + dependencies: + "@react-aria/ssr" "^3.9.6" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/ssr@^3.9.6": + version "3.9.6" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.6.tgz#a9e8b351acdc8238f2b5215b0ce904636c6ea690" + integrity sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-aria/utils@^3.25.3": + version "3.25.3" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.25.3.tgz#cad9bffc07b045cdc283df2cb65c18747acbf76d" + integrity sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA== + dependencies: + "@react-aria/ssr" "^3.9.6" + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-stately/utils@^3.10.4": + version "3.10.4" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.4.tgz#310663a834b67048d305e1680ed258130092fe51" + integrity sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-types/shared@^3.25.0": + version "3.25.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.25.0.tgz#7223baf72256e918a3c29081bb1ecc6fad4fbf58" + integrity sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ== + "@rushstack/eslint-patch@^1.3.3": version "1.10.1" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf" @@ -290,6 +379,13 @@ dependencies: tslib "^2.4.0" +"@swc/helpers@^0.5.0": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" + integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== + dependencies: + tslib "^2.4.0" + "@tailwindcss/typography@^0.5.12": version "0.5.12" resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.12.tgz#c0532fd594427b7f4e8e38eff7bf272c63a1dca4" @@ -300,17 +396,17 @@ lodash.merge "^4.6.2" postcss-selector-parser "6.0.10" -"@tanstack/react-virtual@^3.0.0-beta.60": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.2.0.tgz#fb70f9c6baee753a5a0f7618ac886205d5a02af9" - integrity sha512-OEdMByf2hEfDa6XDbGlZN8qO6bTjlNKqjM3im9JG+u3mCL8jALy0T/67oDI001raUUPh1Bdmfn4ZvPOV5knpcg== +"@tanstack/react-virtual@^3.8.1": + version "3.10.8" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.8.tgz#bf4b06f157ed298644a96ab7efc1a2b01ab36e3c" + integrity sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA== dependencies: - "@tanstack/virtual-core" "3.2.0" + "@tanstack/virtual-core" "3.10.8" -"@tanstack/virtual-core@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.2.0.tgz#874d36135e4badce2719e7bdc556ce240cbaff14" - integrity sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ== +"@tanstack/virtual-core@3.10.8": + version "3.10.8" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.8.tgz#975446a667755222f62884c19e5c3c66d959b8b4" + integrity sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA== "@types/json5@^0.0.29": version "0.0.29" @@ -779,11 +875,16 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -client-only@0.0.1, client-only@^0.0.1: +client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + clsx@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" @@ -2995,6 +3096,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + tailwind-merge@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.2.2.tgz#87341e7604f0e20499939e152cd2841f41f7a3df" From 7cce853618f323f4471e89418ccb99f36d00e976 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 11 Oct 2024 10:35:59 +0530 Subject: [PATCH 045/282] feat(providers): add optimization modes --- src/agents/academicSearchAgent.ts | 57 ++++++---- src/agents/redditSearchAgent.ts | 53 +++++---- src/agents/webSearchAgent.ts | 86 +++++++++++---- src/agents/youtubeSearchAgent.ts | 53 +++++---- src/websocket/messageHandler.ts | 3 +- ui/components/ChatWindow.tsx | 4 + ui/components/EmptyChat.tsx | 6 + ui/components/EmptyChatMessageInput.tsx | 16 ++- .../MessageInputActions/Optimization.tsx | 104 ++++++++++++++++++ 9 files changed, 294 insertions(+), 88 deletions(-) create mode 100644 ui/components/MessageInputActions/Optimization.tsx diff --git a/src/agents/academicSearchAgent.ts b/src/agents/academicSearchAgent.ts index a72e3a2..4a10c98 100644 --- a/src/agents/academicSearchAgent.ts +++ b/src/agents/academicSearchAgent.ts @@ -118,7 +118,6 @@ const createBasicAcademicSearchRetrieverChain = (llm: BaseChatModel) => { engines: [ 'arxiv', 'google scholar', - 'internetarchivescholar', 'pubmed', ], }); @@ -143,6 +142,7 @@ const createBasicAcademicSearchRetrieverChain = (llm: BaseChatModel) => { const createBasicAcademicSearchAnsweringChain = ( llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { const basicAcademicSearchRetrieverChain = createBasicAcademicSearchRetrieverChain(llm); @@ -168,26 +168,33 @@ const createBasicAcademicSearchAnsweringChain = ( (doc) => doc.pageContent && doc.pageContent.length > 0, ); - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments(docsWithContent.map((doc) => doc.pageContent)), - embeddings.embedQuery(query), - ]); + if (optimizationMode === 'speed') { + return docsWithContent.slice(0, 15); + } else if (optimizationMode === 'balanced') { + console.log('Balanced mode'); + const [docEmbeddings, queryEmbedding] = await Promise.all([ + embeddings.embedDocuments( + docsWithContent.map((doc) => doc.pageContent), + ), + embeddings.embedQuery(query), + ]); - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); + const similarity = docEmbeddings.map((docEmbedding, i) => { + const sim = computeSimilarity(queryEmbedding, docEmbedding); - return { - index: i, - similarity: sim, - }; - }); + return { + index: i, + similarity: sim, + }; + }); - const sortedDocs = similarity - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); + const sortedDocs = similarity + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => docsWithContent[sim.index]); - return sortedDocs; + return sortedDocs; + } }; return RunnableSequence.from([ @@ -224,12 +231,17 @@ const basicAcademicSearch = ( history: BaseMessage[], llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { const emitter = new eventEmitter(); try { const basicAcademicSearchAnsweringChain = - createBasicAcademicSearchAnsweringChain(llm, embeddings); + createBasicAcademicSearchAnsweringChain( + llm, + embeddings, + optimizationMode, + ); const stream = basicAcademicSearchAnsweringChain.streamEvents( { @@ -258,8 +270,15 @@ const handleAcademicSearch = ( history: BaseMessage[], llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { - const emitter = basicAcademicSearch(message, history, llm, embeddings); + const emitter = basicAcademicSearch( + message, + history, + llm, + embeddings, + optimizationMode, + ); return emitter; }; diff --git a/src/agents/redditSearchAgent.ts b/src/agents/redditSearchAgent.ts index 9c2c443..2c44c13 100644 --- a/src/agents/redditSearchAgent.ts +++ b/src/agents/redditSearchAgent.ts @@ -138,6 +138,7 @@ const createBasicRedditSearchRetrieverChain = (llm: BaseChatModel) => { const createBasicRedditSearchAnsweringChain = ( llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { const basicRedditSearchRetrieverChain = createBasicRedditSearchRetrieverChain(llm); @@ -163,27 +164,33 @@ const createBasicRedditSearchAnsweringChain = ( (doc) => doc.pageContent && doc.pageContent.length > 0, ); - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments(docsWithContent.map((doc) => doc.pageContent)), - embeddings.embedQuery(query), - ]); + if (optimizationMode === 'speed') { + return docsWithContent.slice(0, 15); + } else if (optimizationMode === 'balanced') { + const [docEmbeddings, queryEmbedding] = await Promise.all([ + embeddings.embedDocuments( + docsWithContent.map((doc) => doc.pageContent), + ), + embeddings.embedQuery(query), + ]); - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); + const similarity = docEmbeddings.map((docEmbedding, i) => { + const sim = computeSimilarity(queryEmbedding, docEmbedding); - return { - index: i, - similarity: sim, - }; - }); + return { + index: i, + similarity: sim, + }; + }); - const sortedDocs = similarity - .filter((sim) => sim.similarity > 0.3) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); + const sortedDocs = similarity + .filter((sim) => sim.similarity > 0.3) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => docsWithContent[sim.index]); - return sortedDocs; + return sortedDocs; + } }; return RunnableSequence.from([ @@ -220,12 +227,13 @@ const basicRedditSearch = ( history: BaseMessage[], llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { const emitter = new eventEmitter(); try { const basicRedditSearchAnsweringChain = - createBasicRedditSearchAnsweringChain(llm, embeddings); + createBasicRedditSearchAnsweringChain(llm, embeddings, optimizationMode); const stream = basicRedditSearchAnsweringChain.streamEvents( { chat_history: history, @@ -253,8 +261,15 @@ const handleRedditSearch = ( history: BaseMessage[], llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { - const emitter = basicRedditSearch(message, history, llm, embeddings); + const emitter = basicRedditSearch( + message, + history, + llm, + embeddings, + optimizationMode, + ); return emitter; }; diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 77ec181..51653a0 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -216,12 +216,34 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { await Promise.all( docGroups.map(async (doc) => { const res = await llm.invoke(` - You are a text summarizer. You need to summarize the text provided inside the \`text\` XML block. - You need to summarize the text into 1 or 2 sentences capturing the main idea of the text. - You need to make sure that you don't miss any point while summarizing the text. - You will also be given a \`query\` XML block which will contain the query of the user. Try to answer the query in the summary from the text provided. - If the query says Summarize then you just need to summarize the text without answering the query. - Only return the summarized text without any other messages, text or XML block. + You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the + text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query. + If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary. + + - **Journalistic tone**: The summary should sound professional and journalistic, not too casual or vague. + - **Thorough and detailed**: Ensure that every key point from the text is captured and that the summary directly answers the query. + - **Not too lengthy, but detailed**: The summary should be informative but not excessively long. Focus on providing detailed information in a concise format. + + The text will be shared inside the \`text\` XML tag, and the query inside the \`query\` XML tag. + + <example> + <text> + Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers. + It was first released in 2013 and is developed by Docker, Inc. Docker is designed to make it easier to create, deploy, and run applications + by using containers. + </text> + + <query> + What is Docker and how does it work? + </query> + + Response: + Docker is a revolutionary platform-as-a-service product developed by Docker, Inc., that uses container technology to make application + deployment more efficient. It allows developers to package their software with all necessary dependencies, making it easier to run in + any environment. Released in 2013, Docker has transformed the way applications are built, deployed, and managed. + </example> + + Everything below is the actual data you will be working with. Good luck! <query> ${question} @@ -273,6 +295,7 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { const createBasicWebSearchAnsweringChain = ( llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { const basicWebSearchRetrieverChain = createBasicWebSearchRetrieverChain(llm); @@ -301,27 +324,33 @@ const createBasicWebSearchAnsweringChain = ( (doc) => doc.pageContent && doc.pageContent.length > 0, ); - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments(docsWithContent.map((doc) => doc.pageContent)), - embeddings.embedQuery(query), - ]); + if (optimizationMode === 'speed') { + return docsWithContent.slice(0, 15); + } else if (optimizationMode === 'balanced') { + const [docEmbeddings, queryEmbedding] = await Promise.all([ + embeddings.embedDocuments( + docsWithContent.map((doc) => doc.pageContent), + ), + embeddings.embedQuery(query), + ]); - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); + const similarity = docEmbeddings.map((docEmbedding, i) => { + const sim = computeSimilarity(queryEmbedding, docEmbedding); - return { - index: i, - similarity: sim, - }; - }); + return { + index: i, + similarity: sim, + }; + }); - const sortedDocs = similarity - .filter((sim) => sim.similarity > 0.3) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); + const sortedDocs = similarity + .filter((sim) => sim.similarity > 0.3) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => docsWithContent[sim.index]); - return sortedDocs; + return sortedDocs; + } }; return RunnableSequence.from([ @@ -358,6 +387,7 @@ const basicWebSearch = ( history: BaseMessage[], llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { const emitter = new eventEmitter(); @@ -365,6 +395,7 @@ const basicWebSearch = ( const basicWebSearchAnsweringChain = createBasicWebSearchAnsweringChain( llm, embeddings, + optimizationMode, ); const stream = basicWebSearchAnsweringChain.streamEvents( @@ -394,8 +425,15 @@ const handleWebSearch = ( history: BaseMessage[], llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { - const emitter = basicWebSearch(message, history, llm, embeddings); + const emitter = basicWebSearch( + message, + history, + llm, + embeddings, + optimizationMode, + ); return emitter; }; diff --git a/src/agents/youtubeSearchAgent.ts b/src/agents/youtubeSearchAgent.ts index e9b6553..2f53bc9 100644 --- a/src/agents/youtubeSearchAgent.ts +++ b/src/agents/youtubeSearchAgent.ts @@ -138,6 +138,7 @@ const createBasicYoutubeSearchRetrieverChain = (llm: BaseChatModel) => { const createBasicYoutubeSearchAnsweringChain = ( llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { const basicYoutubeSearchRetrieverChain = createBasicYoutubeSearchRetrieverChain(llm); @@ -163,27 +164,33 @@ const createBasicYoutubeSearchAnsweringChain = ( (doc) => doc.pageContent && doc.pageContent.length > 0, ); - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments(docsWithContent.map((doc) => doc.pageContent)), - embeddings.embedQuery(query), - ]); + if (optimizationMode === 'speed') { + return docsWithContent.slice(0, 15); + } else { + const [docEmbeddings, queryEmbedding] = await Promise.all([ + embeddings.embedDocuments( + docsWithContent.map((doc) => doc.pageContent), + ), + embeddings.embedQuery(query), + ]); - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); + const similarity = docEmbeddings.map((docEmbedding, i) => { + const sim = computeSimilarity(queryEmbedding, docEmbedding); - return { - index: i, - similarity: sim, - }; - }); + return { + index: i, + similarity: sim, + }; + }); - const sortedDocs = similarity - .filter((sim) => sim.similarity > 0.3) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); + const sortedDocs = similarity + .filter((sim) => sim.similarity > 0.3) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => docsWithContent[sim.index]); - return sortedDocs; + return sortedDocs; + } }; return RunnableSequence.from([ @@ -220,12 +227,13 @@ const basicYoutubeSearch = ( history: BaseMessage[], llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { const emitter = new eventEmitter(); try { const basicYoutubeSearchAnsweringChain = - createBasicYoutubeSearchAnsweringChain(llm, embeddings); + createBasicYoutubeSearchAnsweringChain(llm, embeddings, optimizationMode); const stream = basicYoutubeSearchAnsweringChain.streamEvents( { @@ -254,8 +262,15 @@ const handleYoutubeSearch = ( history: BaseMessage[], llm: BaseChatModel, embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', ) => { - const emitter = basicYoutubeSearch(message, history, llm, embeddings); + const emitter = basicYoutubeSearch( + message, + history, + llm, + embeddings, + optimizationMode, + ); return emitter; }; diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index 332910c..d230386 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -22,7 +22,7 @@ type Message = { type WSMessage = { message: Message; - copilot: boolean; + optimizationMode: string; type: string; focusMode: string; history: Array<[string, string]>; @@ -138,6 +138,7 @@ export const handleMessage = async ( history, llm, embeddings, + parsedWSMessage.optimizationMode, ); handleEmitterEvents(emitter, ws, id, parsedMessage.chatId); diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index b3d0089..b67ca3a 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -278,6 +278,7 @@ const ChatWindow = ({ id }: { id?: string }) => { const [messages, setMessages] = useState<Message[]>([]); const [focusMode, setFocusMode] = useState('webSearch'); + const [optimizationMode, setOptimizationMode] = useState('speed'); const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); @@ -346,6 +347,7 @@ const ChatWindow = ({ id }: { id?: string }) => { content: message, }, focusMode: focusMode, + optimizationMode: optimizationMode, history: [...chatHistory, ['human', message]], }), ); @@ -508,6 +510,8 @@ const ChatWindow = ({ id }: { id?: string }) => { sendMessage={sendMessage} focusMode={focusMode} setFocusMode={setFocusMode} + optimizationMode={optimizationMode} + setOptimizationMode={setOptimizationMode} /> )} </div> diff --git a/ui/components/EmptyChat.tsx b/ui/components/EmptyChat.tsx index ea3642b..63f186c 100644 --- a/ui/components/EmptyChat.tsx +++ b/ui/components/EmptyChat.tsx @@ -4,10 +4,14 @@ const EmptyChat = ({ sendMessage, focusMode, setFocusMode, + optimizationMode, + setOptimizationMode, }: { sendMessage: (message: string) => void; focusMode: string; setFocusMode: (mode: string) => void; + optimizationMode: string; + setOptimizationMode: (mode: string) => void; }) => { return ( <div className="relative"> @@ -19,6 +23,8 @@ const EmptyChat = ({ sendMessage={sendMessage} focusMode={focusMode} setFocusMode={setFocusMode} + optimizationMode={optimizationMode} + setOptimizationMode={setOptimizationMode} /> </div> </div> diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index 39d3f16..845bed9 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -3,15 +3,20 @@ import { useEffect, useRef, useState } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; import CopilotToggle from './MessageInputActions/Copilot'; import Focus from './MessageInputActions/Focus'; +import Optimization from './MessageInputActions/Optimization'; const EmptyChatMessageInput = ({ sendMessage, focusMode, setFocusMode, + optimizationMode, + setOptimizationMode, }: { sendMessage: (message: string) => void; focusMode: string; setFocusMode: (mode: string) => void; + optimizationMode: string; + setOptimizationMode: (mode: string) => void; }) => { const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); @@ -66,14 +71,13 @@ const EmptyChatMessageInput = ({ placeholder="Ask anything..." /> <div className="flex flex-row items-center justify-between mt-4"> - <div className="flex flex-row items-center space-x-1 -mx-2"> + <div className="flex flex-row items-center space-x-4"> <Focus focusMode={focusMode} setFocusMode={setFocusMode} /> - {/* <Attach /> */} </div> - <div className="flex flex-row items-center space-x-4 -mx-2"> - <CopilotToggle - copilotEnabled={copilotEnabled} - setCopilotEnabled={setCopilotEnabled} + <div className="flex flex-row items-center space-x-1 sm:space-x-4"> + <Optimization + optimizationMode={optimizationMode} + setOptimizationMode={setOptimizationMode} /> <button disabled={message.trim().length === 0} diff --git a/ui/components/MessageInputActions/Optimization.tsx b/ui/components/MessageInputActions/Optimization.tsx new file mode 100644 index 0000000..ac8a7b0 --- /dev/null +++ b/ui/components/MessageInputActions/Optimization.tsx @@ -0,0 +1,104 @@ +import { ChevronDown, Sliders, Star, Zap } from 'lucide-react'; +import { cn } from '@/lib/utils'; +import { + Popover, + PopoverButton, + PopoverPanel, + Transition, +} from '@headlessui/react'; +import { Fragment } from 'react'; + +const OptimizationModes = [ + { + key: 'speed', + title: 'Speed', + description: 'Prioritize speed and get the quickest possible answer.', + icon: <Zap size={20} className="text-[#FF9800]" />, + }, + { + key: 'balanced', + title: 'Balanced', + description: 'Find the right balance between speed and accuracy', + icon: <Sliders size={20} className="text-[#4CAF50]" />, + }, + { + key: 'quality', + title: 'Quality (Soon)', + description: 'Get the most thorough and accurate answer', + icon: ( + <Star + size={16} + className="text-[#2196F3] dark:text-[#BBDEFB] fill-[#BBDEFB] dark:fill-[#2196F3]" + /> + ), + }, +]; + +const Optimization = ({ + optimizationMode, + setOptimizationMode, +}: { + optimizationMode: string; + setOptimizationMode: (mode: string) => void; +}) => { + return ( + <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg"> + <PopoverButton + type="button" + className="p-2 text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary active:scale-95 transition duration-200 hover:text-black dark:hover:text-white" + > + <div className="flex flex-row items-center space-x-1"> + { + OptimizationModes.find((mode) => mode.key === optimizationMode) + ?.icon + } + <p className="text-xs font-medium"> + { + OptimizationModes.find((mode) => mode.key === optimizationMode) + ?.title + } + </p> + <ChevronDown size={20} /> + </div> + </PopoverButton> + <Transition + as={Fragment} + enter="transition ease-out duration-150" + enterFrom="opacity-0 translate-y-1" + enterTo="opacity-100 translate-y-0" + leave="transition ease-in duration-150" + leaveFrom="opacity-100 translate-y-0" + leaveTo="opacity-0 translate-y-1" + > + <PopoverPanel className="absolute z-10 w-64 md:w-[250px] right-0"> + <div className="flex flex-col gap-2 bg-light-primary dark:bg-dark-primary border rounded-lg border-light-200 dark:border-dark-200 w-full p-4 max-h-[200px] md:max-h-none overflow-y-auto"> + {OptimizationModes.map((mode, i) => ( + <PopoverButton + onClick={() => setOptimizationMode(mode.key)} + key={i} + disabled={mode.key === 'quality'} + className={cn( + 'p-2 rounded-lg flex flex-col items-start justify-start text-start space-y-1 duration-200 cursor-pointer transition', + optimizationMode === mode.key + ? 'bg-light-secondary dark:bg-dark-secondary' + : 'hover:bg-light-secondary dark:hover:bg-dark-secondary', + mode.key === 'quality' && 'opacity-50 cursor-not-allowed', + )} + > + <div className="flex flex-row items-center space-x-1 text-black dark:text-white"> + {mode.icon} + <p className="text-sm font-medium">{mode.title}</p> + </div> + <p className="text-black/70 dark:text-white/70 text-xs"> + {mode.description} + </p> + </PopoverButton> + ))} + </div> + </PopoverPanel> + </Transition> + </Popover> + ); +}; + +export default Optimization; From 0a7167eb04305f84a0171834ae40ebb8767e3c59 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 11 Oct 2024 10:54:08 +0530 Subject: [PATCH 046/282] feat(search-api): add `optimizationMode` --- docs/API/SEARCH.md | 11 +++++++++-- src/routes/models.ts | 14 +++++++++++++- src/routes/search.ts | 4 +++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index a573021..f87e788 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -26,6 +26,7 @@ The API accepts a JSON object in the request body, where you define the focus mo "provider": "openai", "model": "text-embedding-3-large" }, + "optimizationMode": "speed", "focusMode": "webSearch", "query": "What is Perplexica", "history": [ @@ -37,7 +38,7 @@ The API accepts a JSON object in the request body, where you define the focus mo ### Request Parameters -- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3001/api/models`. +- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3001/api/models`. Make sure to use the key value (For example "gpt-4o-mini" instead of the display name "GPT 4 omni mini"). - `provider`: Specifies the provider for the chat model (e.g., `openai`, `ollama`). - `model`: The specific model from the chosen provider (e.g., `gpt-4o-mini`). @@ -45,7 +46,7 @@ The API accepts a JSON object in the request body, where you define the focus mo - `customOpenAIBaseURL`: If you’re using a custom OpenAI instance, provide the base URL. - `customOpenAIKey`: The API key for a custom OpenAI instance. -- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3001/api/models`. +- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3001/api/models`. Make sure to use the key value (For example "text-embedding-3-large" instead of the display name "Text Embedding 3 Large"). - `provider`: The provider for the embedding model (e.g., `openai`). - `model`: The specific embedding model (e.g., `text-embedding-3-large`). @@ -54,9 +55,15 @@ The API accepts a JSON object in the request body, where you define the focus mo - `webSearch`, `academicSearch`, `writingAssistant`, `wolframAlphaSearch`, `youtubeSearch`, `redditSearch`. +- **`optimizationMode`** (string, optional): Specifies the optimization mode to control the balance between performance and quality. Available modes: + + - `speed`: Prioritize speed and return the fastest answer. + - `balanced`: Provide a balanced answer with good speed and reasonable quality. + - **`query`** (string, required): The search query or question. - **`history`** (array, optional): An array of message pairs representing the conversation history. Each pair consists of a role (either 'human' or 'assistant') and the message content. This allows the system to use the context of the conversation to refine results. Example: + ```json [ ["human", "What is Perplexica?"], diff --git a/src/routes/models.ts b/src/routes/models.ts index 36df25a..c4f5d40 100644 --- a/src/routes/models.ts +++ b/src/routes/models.ts @@ -12,7 +12,19 @@ router.get('/', async (req, res) => { const [chatModelProviders, embeddingModelProviders] = await Promise.all([ getAvailableChatModelProviders(), getAvailableEmbeddingModelProviders(), - ]); + ]); + + Object.keys(chatModelProviders).forEach((provider) => { + Object.keys(chatModelProviders[provider]).forEach((model) => { + delete chatModelProviders[provider][model].model; + }); + }); + + Object.keys(embeddingModelProviders).forEach((provider) => { + Object.keys(embeddingModelProviders[provider]).forEach((model) => { + delete embeddingModelProviders[provider][model].model; + }); + }); res.status(200).json({ chatModelProviders, embeddingModelProviders }); } catch (err) { diff --git a/src/routes/search.ts b/src/routes/search.ts index 9eec29f..6684632 100644 --- a/src/routes/search.ts +++ b/src/routes/search.ts @@ -25,6 +25,7 @@ interface embeddingModel { } interface ChatRequestBody { + optimizationMode: 'speed' | 'balanced'; focusMode: string; chatModel?: chatModel; embeddingModel?: embeddingModel; @@ -41,6 +42,7 @@ router.post('/', async (req, res) => { } body.history = body.history || []; + body.optimizationMode = body.optimizationMode || 'balanced'; const history: BaseMessage[] = body.history.map((msg) => { if (msg[0] === 'human') { @@ -119,7 +121,7 @@ router.post('/', async (req, res) => { return res.status(400).json({ message: 'Invalid focus mode' }); } - const emitter = searchHandler(body.query, history, llm, embeddings); + const emitter = searchHandler(body.query, history, llm, embeddings, body.optimizationMode); let message = ''; let sources = []; From 61c0347ef29256fc70311f40a6b4a20ddd6f9b7e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:20:45 +0530 Subject: [PATCH 047/282] feat(app): add discover --- src/routes/discover.ts | 48 +++++++++++++++++ src/routes/index.ts | 2 + ui/app/discover/page.tsx | 112 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 src/routes/discover.ts create mode 100644 ui/app/discover/page.tsx diff --git a/src/routes/discover.ts b/src/routes/discover.ts new file mode 100644 index 0000000..b6f8ff9 --- /dev/null +++ b/src/routes/discover.ts @@ -0,0 +1,48 @@ +import express from 'express'; +import { searchSearxng } from '../lib/searxng'; +import logger from '../utils/logger'; + +const router = express.Router(); + +router.get('/', async (req, res) => { + try { + const data = ( + await Promise.all([ + searchSearxng('site:businessinsider.com AI', { + engines: ['bing news'], + pageno: 1, + }), + searchSearxng('site:www.exchangewire.com AI', { + engines: ['bing news'], + pageno: 1, + }), + searchSearxng('site:yahoo.com AI', { + engines: ['bing news'], + pageno: 1, + }), + searchSearxng('site:businessinsider.com tech', { + engines: ['bing news'], + pageno: 1, + }), + searchSearxng('site:www.exchangewire.com tech', { + engines: ['bing news'], + pageno: 1, + }), + searchSearxng('site:yahoo.com tech', { + engines: ['bing news'], + pageno: 1, + }), + ]) + ) + .map((result) => result.results) + .flat() + .sort(() => Math.random() - 0.5); + + return res.json({ blogs: data }); + } catch (err: any) { + logger.error(`Error in discover route: ${err.message}`); + return res.status(500).json({ message: 'An error has occurred' }); + } +}); + +export default router; diff --git a/src/routes/index.ts b/src/routes/index.ts index 6e82e54..28c297f 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -6,6 +6,7 @@ import modelsRouter from './models'; import suggestionsRouter from './suggestions'; import chatsRouter from './chats'; import searchRouter from './search'; +import discoverRouter from './discover'; const router = express.Router(); @@ -16,5 +17,6 @@ router.use('/models', modelsRouter); router.use('/suggestions', suggestionsRouter); router.use('/chats', chatsRouter); router.use('/search', searchRouter); +router.use('/discover', discoverRouter); export default router; diff --git a/ui/app/discover/page.tsx b/ui/app/discover/page.tsx new file mode 100644 index 0000000..7788d0d --- /dev/null +++ b/ui/app/discover/page.tsx @@ -0,0 +1,112 @@ +'use client'; + +import { Search } from 'lucide-react'; +import { useEffect, useState } from 'react'; +import Link from 'next/link'; +import { toast } from 'sonner'; + +interface Discover { + title: string; + content: string; + url: string; + thumbnail: string; +} + +const Page = () => { + const [discover, setDiscover] = useState<Discover[] | null>(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchData = async () => { + try { + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/discover`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.message); + } + + data.blogs = data.blogs.filter((blog: Discover) => blog.thumbnail); + + setDiscover(data.blogs); + } catch (err: any) { + console.error('Error fetching data:', err.message); + toast.error('Error fetching data'); + } finally { + setLoading(false); + } + }; + + fetchData(); + }, []); + + return loading ? ( + <div className="flex flex-row items-center justify-center min-h-screen"> + <svg + aria-hidden="true" + className="w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]" + viewBox="0 0 100 101" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z" + fill="currentColor" + /> + <path + d="M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z" + fill="currentFill" + /> + </svg> + </div> + ) : ( + <> + <div> + <div className="flex flex-col pt-4"> + <div className="flex items-center"> + <Search /> + <h1 className="text-3xl font-medium p-2">Discover</h1> + </div> + <hr className="border-t border-[#2B2C2C] my-4 w-full" /> + </div> + + <div className="grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-4 pb-28 lg:pb-8 w-full justify-items-center lg:justify-items-start"> + {discover && + discover?.map((item, i) => ( + <Link + href={`/?q=Summary: ${item.url}`} + key={i} + className="max-w-sm rounded-lg overflow-hidden bg-light-secondary dark:bg-dark-secondary hover:-translate-y-[1px] transition duration-200" + > + <img + className="object-cover w-full aspect-video" + src={ + new URL(item.thumbnail).origin + + new URL(item.thumbnail).pathname + + `?id=${new URL(item.thumbnail).searchParams.get('id')}` + } + alt={item.title} + /> + <div className="px-6 py-4"> + <div className="font-bold text-lg mb-2"> + {item.title.slice(0, 100)}... + </div> + <p className="text-black-70 dark:text-white/70 text-sm"> + {item.content.slice(0, 100)}... + </p> + </div> + </Link> + ))} + </div> + </div> + </> + ); +}; + +export default Page; From 19bf71cefc8e76d952add1e53c8761c591d76f18 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:21:00 +0530 Subject: [PATCH 048/282] feat(chat-window): only send init msg if ready --- ui/components/ChatWindow.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index b67ca3a..6a56f7e 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -473,11 +473,11 @@ const ChatWindow = ({ id }: { id?: string }) => { }; useEffect(() => { - if (isReady && initialMessage) { + if (isReady && initialMessage && ws?.readyState === 1) { sendMessage(initialMessage); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isReady, initialMessage]); + }, [isReady, initialMessage, ws?.readyState]); if (hasError) { return ( From 9db847c366b88202ccb29809e06fe88fbc4dc3dd Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:21:15 +0530 Subject: [PATCH 049/282] feat(library): enhance UI --- ui/app/library/page.tsx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/ui/app/library/page.tsx b/ui/app/library/page.tsx index 8294fc1..379596c 100644 --- a/ui/app/library/page.tsx +++ b/ui/app/library/page.tsx @@ -1,7 +1,7 @@ 'use client'; import DeleteChat from '@/components/DeleteChat'; -import { formatTimeDifference } from '@/lib/utils'; +import { cn, formatTimeDifference } from '@/lib/utils'; import { BookOpenText, ClockIcon, Delete, ScanEye } from 'lucide-react'; import Link from 'next/link'; import { useEffect, useState } from 'react'; @@ -58,13 +58,12 @@ const Page = () => { </div> ) : ( <div> - <div className="fixed z-40 top-0 left-0 right-0 lg:pl-[104px] lg:pr-6 lg:px-8 px-4 py-4 lg:py-6 border-b border-light-200 dark:border-dark-200"> - <div className="flex flex-row items-center space-x-2 max-w-screen-lg lg:mx-auto"> + <div className="flex flex-col pt-4"> + <div className="flex items-center"> <BookOpenText /> - <h2 className="text-black dark:text-white lg:text-3xl lg:font-medium"> - Library - </h2> + <h1 className="text-3xl font-medium p-2">Library</h1> </div> + <hr className="border-t border-[#2B2C2C] my-4 w-full" /> </div> {chats.length === 0 && ( <div className="flex flex-row items-center justify-center min-h-screen"> @@ -74,10 +73,15 @@ const Page = () => { </div> )} {chats.length > 0 && ( - <div className="flex flex-col pt-16 lg:pt-24"> + <div className="flex flex-col pb-20 lg:pb-2"> {chats.map((chat, i) => ( <div - className="flex flex-col space-y-4 border-b border-white-200 dark:border-dark-200 py-6 lg:mx-4" + className={cn( + 'flex flex-col space-y-4 py-6', + i !== chats.length - 1 + ? 'border-b border-white-200 dark:border-dark-200' + : '', + )} key={i} > <Link From b9509a5d4194160d243538ba2f0f25de917de42b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:21:29 +0530 Subject: [PATCH 050/282] feat(app): lint & beautify --- src/agents/academicSearchAgent.ts | 6 +----- src/routes/models.ts | 2 +- src/routes/search.ts | 8 +++++++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/agents/academicSearchAgent.ts b/src/agents/academicSearchAgent.ts index 4a10c98..fc95d3c 100644 --- a/src/agents/academicSearchAgent.ts +++ b/src/agents/academicSearchAgent.ts @@ -115,11 +115,7 @@ const createBasicAcademicSearchRetrieverChain = (llm: BaseChatModel) => { const res = await searchSearxng(input, { language: 'en', - engines: [ - 'arxiv', - 'google scholar', - 'pubmed', - ], + engines: ['arxiv', 'google scholar', 'pubmed'], }); const documents = res.results.map( diff --git a/src/routes/models.ts b/src/routes/models.ts index c4f5d40..b5fbe12 100644 --- a/src/routes/models.ts +++ b/src/routes/models.ts @@ -12,7 +12,7 @@ router.get('/', async (req, res) => { const [chatModelProviders, embeddingModelProviders] = await Promise.all([ getAvailableChatModelProviders(), getAvailableEmbeddingModelProviders(), - ]); + ]); Object.keys(chatModelProviders).forEach((provider) => { Object.keys(chatModelProviders[provider]).forEach((model) => { diff --git a/src/routes/search.ts b/src/routes/search.ts index 6684632..70fe228 100644 --- a/src/routes/search.ts +++ b/src/routes/search.ts @@ -121,7 +121,13 @@ router.post('/', async (req, res) => { return res.status(400).json({ message: 'Invalid focus mode' }); } - const emitter = searchHandler(body.query, history, llm, embeddings, body.optimizationMode); + const emitter = searchHandler( + body.query, + history, + llm, + embeddings, + body.optimizationMode, + ); let message = ''; let sources = []; From 7532c436db88ca1caf718048f6da1fef35ab9f0d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:23:13 +0530 Subject: [PATCH 051/282] feat(package): bump version --- README.md | 2 +- package.json | 2 +- ui/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f66e8b1..c96e1a4 100644 --- a/README.md +++ b/README.md @@ -144,8 +144,8 @@ For more details, check out the full documentation [here](https://github.com/Itz - [x] History Saving features - [x] Introducing various Focus Modes - [x] Adding API support +- [x] Adding Discover - [ ] Finalizing Copilot Mode -- [ ] Adding Discover ## Support Us diff --git a/package.json b/package.json index ab45174..17cbe41 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.9.0-rc3", + "version": "1.9.0", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index e5dc677..70a144a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.9.0-rc3", + "version": "1.9.0", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From 3a01eebc040f84ee28310f5129210bffb2cee5ee Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Oct 2024 18:04:50 +0530 Subject: [PATCH 052/282] feat(chat): prevent ws not open errors --- package.json | 1 + src/agents/academicSearchAgent.ts | 1 - src/agents/webSearchAgent.ts | 22 ++++++++++++++++++++- src/websocket/connectionManager.ts | 12 ++++++++++++ ui/components/ChatWindow.tsx | 31 +++++++++++++++++------------- yarn.lock | 7 +++++++ 6 files changed, 59 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 17cbe41..48efd23 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@types/html-to-text": "^9.0.4", "@types/pdf-parse": "^1.1.4", "@types/readable-stream": "^4.0.11", + "@types/ws": "^8.5.12", "drizzle-kit": "^0.22.7", "nodemon": "^3.1.0", "prettier": "^3.2.5", diff --git a/src/agents/academicSearchAgent.ts b/src/agents/academicSearchAgent.ts index fc95d3c..bad4065 100644 --- a/src/agents/academicSearchAgent.ts +++ b/src/agents/academicSearchAgent.ts @@ -167,7 +167,6 @@ const createBasicAcademicSearchAnsweringChain = ( if (optimizationMode === 'speed') { return docsWithContent.slice(0, 15); } else if (optimizationMode === 'balanced') { - console.log('Balanced mode'); const [docEmbeddings, queryEmbedding] = await Promise.all([ embeddings.embedDocuments( docsWithContent.map((doc) => doc.pageContent), diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 51653a0..1ff3354 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -227,7 +227,7 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { The text will be shared inside the \`text\` XML tag, and the query inside the \`query\` XML tag. <example> - <text> + 1. \`<text> Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers. It was first released in 2013 and is developed by Docker, Inc. Docker is designed to make it easier to create, deploy, and run applications by using containers. @@ -241,6 +241,26 @@ const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { Docker is a revolutionary platform-as-a-service product developed by Docker, Inc., that uses container technology to make application deployment more efficient. It allows developers to package their software with all necessary dependencies, making it easier to run in any environment. Released in 2013, Docker has transformed the way applications are built, deployed, and managed. + \` + 2. \`<text> + The theory of relativity, or simply relativity, encompasses two interrelated theories of Albert Einstein: special relativity and general + relativity. However, the word "relativity" is sometimes used in reference to Galilean invariance. The term "theory of relativity" was based + on the expression "relative theory" used by Max Planck in 1906. The theory of relativity usually encompasses two interrelated theories by + Albert Einstein: special relativity and general relativity. Special relativity applies to all physical phenomena in the absence of gravity. + General relativity explains the law of gravitation and its relation to other forces of nature. It applies to the cosmological and astrophysical + realm, including astronomy. + </text> + + <query> + summarize + </query> + + Response: + The theory of relativity, developed by Albert Einstein, encompasses two main theories: special relativity and general relativity. Special + relativity applies to all physical phenomena in the absence of gravity, while general relativity explains the law of gravitation and its + relation to other forces of nature. The theory of relativity is based on the concept of "relative theory," as introduced by Max Planck in + 1906. It is a fundamental theory in physics that has revolutionized our understanding of the universe. + \` </example> Everything below is the actual data you will be working with. Good luck! diff --git a/src/websocket/connectionManager.ts b/src/websocket/connectionManager.ts index 04797c5..d980500 100644 --- a/src/websocket/connectionManager.ts +++ b/src/websocket/connectionManager.ts @@ -78,6 +78,18 @@ export const handleConnection = async ( ws.close(); } + const interval = setInterval(() => { + if (ws.readyState === ws.OPEN) { + ws.send( + JSON.stringify({ + type: 'signal', + data: 'open', + }), + ); + clearInterval(interval); + } + }, 5); + ws.on( 'message', async (message) => diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 6a56f7e..a80a5c9 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -171,11 +171,22 @@ const useSocket = ( } }, 10000); - ws.onopen = () => { - console.log('[DEBUG] open'); - clearTimeout(timeoutId); - setIsWSReady(true); - }; + ws.addEventListener('message', (e) => { + const data = JSON.parse(e.data); + if (data.type === 'signal' && data.data === 'open') { + const interval = setInterval(() => { + if (ws.readyState === 1) { + setIsWSReady(true); + clearInterval(interval); + } + }, 5); + clearTimeout(timeoutId); + console.log('[DEBUG] opened'); + } + if (data.type === 'error') { + toast.error(data.data); + } + }); ws.onerror = () => { clearTimeout(timeoutId); @@ -189,13 +200,6 @@ const useSocket = ( console.log('[DEBUG] closed'); }; - ws.addEventListener('message', (e) => { - const data = JSON.parse(e.data); - if (data.type === 'error') { - toast.error(data.data); - } - }); - setWs(ws); }; @@ -325,6 +329,7 @@ const ChatWindow = ({ id }: { id?: string }) => { useEffect(() => { if (isMessagesLoaded && isWSReady) { setIsReady(true); + console.log('[DEBUG] ready'); } }, [isMessagesLoaded, isWSReady]); @@ -477,7 +482,7 @@ const ChatWindow = ({ id }: { id?: string }) => { sendMessage(initialMessage); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isReady, initialMessage, ws?.readyState]); + }, [ws?.readyState, isReady, initialMessage, isWSReady]); if (hasError) { return ( diff --git a/yarn.lock b/yarn.lock index 1c34e1d..deb35ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -690,6 +690,13 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== +"@types/ws@^8.5.12": + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + dependencies: + "@types/node" "*" + "@xenova/transformers@^2.17.1": version "2.17.1" resolved "https://registry.yarnpkg.com/@xenova/transformers/-/transformers-2.17.1.tgz#712f7a72c76c8aa2075749382f83dc7dd4e5a9a5" From c7abd96b053769d6114576411fd66e97e971cc1a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 17 Oct 2024 10:01:00 +0530 Subject: [PATCH 053/282] feat(readme): add networking --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index c96e1a4..4aa17cb 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ - [Ollama Connection Errors](#ollama-connection-errors) - [Using as a Search Engine](#using-as-a-search-engine) - [Using Perplexica's API](#using-perplexicas-api) +- [Expose Perplexica to a network](#expose-perplexica-to-network) - [One-Click Deployment](#one-click-deployment) - [Upcoming Features](#upcoming-features) - [Support Us](#support-us) @@ -133,6 +134,10 @@ Perplexica also provides an API for developers looking to integrate its powerful For more details, check out the full documentation [here](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/API/SEARCH.md). +## Expose Perplexica to network + +You can access Perplexica over your home network by following our networking guide [here](https://github.com/ItzCrazyKns/Perplexica/blob/master/docs/installation/NETWORKING.md). + ## One-Click Deployment [![Deploy to RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploylobe.svg)](https://repocloud.io/details/?app_id=267) From 24e1919c5e10ca9e48703f9838882e515816231e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 17 Oct 2024 10:46:18 +0530 Subject: [PATCH 054/282] feat(dockerfile): update image to prevent python errors --- backend.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend.dockerfile b/backend.dockerfile index b8d0155..e835b40 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -1,4 +1,4 @@ -FROM node:slim +FROM node:20-buster WORKDIR /home/perplexica From 5aad2febda1c8228368dbf72169a0289c0b21d20 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 17 Oct 2024 18:50:43 +0530 Subject: [PATCH 055/282] feat(messageHandler): fix duplicate messageIDs --- src/websocket/messageHandler.ts | 47 +++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index d230386..e915b22 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -10,8 +10,8 @@ import type { BaseChatModel } from '@langchain/core/language_models/chat_models' import type { Embeddings } from '@langchain/core/embeddings'; import logger from '../utils/logger'; import db from '../db'; -import { chats, messages } from '../db/schema'; -import { eq } from 'drizzle-orm'; +import { chats, messages as messagesSchema } from '../db/schema'; +import { eq, asc, gt } from 'drizzle-orm'; import crypto from 'crypto'; type Message = { @@ -71,7 +71,7 @@ const handleEmitterEvents = ( emitter.on('end', () => { ws.send(JSON.stringify({ type: 'messageEnd', messageId: messageId })); - db.insert(messages) + db.insert(messagesSchema) .values({ content: recievedMessage, chatId: chatId, @@ -106,7 +106,9 @@ export const handleMessage = async ( const parsedWSMessage = JSON.parse(message) as WSMessage; const parsedMessage = parsedWSMessage.message; - const id = crypto.randomBytes(7).toString('hex'); + const humanMessageId = + parsedMessage.messageId ?? crypto.randomBytes(7).toString('hex'); + const aiMessageId = crypto.randomBytes(7).toString('hex'); if (!parsedMessage.content) return ws.send( @@ -141,7 +143,7 @@ export const handleMessage = async ( parsedWSMessage.optimizationMode, ); - handleEmitterEvents(emitter, ws, id, parsedMessage.chatId); + handleEmitterEvents(emitter, ws, aiMessageId, parsedMessage.chatId); const chat = await db.query.chats.findFirst({ where: eq(chats.id, parsedMessage.chatId), @@ -159,18 +161,29 @@ export const handleMessage = async ( .execute(); } - await db - .insert(messages) - .values({ - content: parsedMessage.content, - chatId: parsedMessage.chatId, - messageId: id, - role: 'user', - metadata: JSON.stringify({ - createdAt: new Date(), - }), - }) - .execute(); + const messageExists = await db.query.messages.findFirst({ + where: eq(messagesSchema.messageId, humanMessageId), + }); + + if (!messageExists) { + await db + .insert(messagesSchema) + .values({ + content: parsedMessage.content, + chatId: parsedMessage.chatId, + messageId: humanMessageId, + role: 'user', + metadata: JSON.stringify({ + createdAt: new Date(), + }), + }) + .execute(); + } else { + await db + .delete(messagesSchema) + .where(gt(messagesSchema.id, messageExists.id)) + .execute(); + } } else { ws.send( JSON.stringify({ From 3e6e57dab04e562fabcde4e7cc333569f13c6107 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 17 Oct 2024 18:51:11 +0530 Subject: [PATCH 056/282] feat(chat-window): fix rewrite, use messageID --- ui/components/ChatWindow.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index a80a5c9..986f8ae 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -333,8 +333,9 @@ const ChatWindow = ({ id }: { id?: string }) => { } }, [isMessagesLoaded, isWSReady]); - const sendMessage = async (message: string) => { + const sendMessage = async (message: string, messageId?: string) => { if (loading) return; + setLoading(true); setMessageAppeared(false); @@ -342,12 +343,13 @@ const ChatWindow = ({ id }: { id?: string }) => { let recievedMessage = ''; let added = false; - const messageId = crypto.randomBytes(7).toString('hex'); + messageId = messageId ?? crypto.randomBytes(7).toString('hex'); ws?.send( JSON.stringify({ type: 'message', message: { + messageId: messageId, chatId: chatId!, content: message, }, @@ -474,7 +476,7 @@ const ChatWindow = ({ id }: { id?: string }) => { return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; }); - sendMessage(message.content); + sendMessage(message.content, message.messageId); }; useEffect(() => { From 54e0bb317a916a1b782e3db8744c68c0ef31f856 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:05:57 +0530 Subject: [PATCH 057/282] feat(groq): update deprecated models --- src/lib/providers/groq.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 69db4f7..62ca2d7 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -22,12 +22,12 @@ export const loadGroqChatModels = async () => { }, ), }, - 'llama-3.2-11b-text-preview': { - displayName: 'Llama 3.2 11B Text', + 'llama-3.2-11b-vision-preview': { + displayName: 'Llama 3.2 11B Vision', model: new ChatOpenAI( { openAIApiKey: groqApiKey, - modelName: 'llama-3.2-11b-text-preview', + modelName: 'llama-3.2-11b-vision-preview', temperature: 0.7, }, { @@ -35,12 +35,12 @@ export const loadGroqChatModels = async () => { }, ), }, - 'llama-3.2-90b-text-preview': { - displayName: 'Llama 3.2 90B Text', + 'llama-3.2-90b-vision-preview': { + displayName: 'Llama 3.2 90B Vision', model: new ChatOpenAI( { openAIApiKey: groqApiKey, - modelName: 'llama-3.2-90b-text-preview', + modelName: 'llama-3.2-90b-vision-preview', temperature: 0.7, }, { From 6e0d3baef69647e097d2d6462a277f35cef2aa70 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:50:56 +0530 Subject: [PATCH 058/282] feat(dockerfile): update docker image --- backend.dockerfile | 2 +- src/agents/webSearchAgent.ts | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/backend.dockerfile b/backend.dockerfile index e835b40..c25ddd8 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -1,4 +1,4 @@ -FROM node:20-buster +FROM node:18-slim WORKDIR /home/perplexica diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 1ff3354..02ad12a 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -89,18 +89,21 @@ Rephrased question: `; const basicWebSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are also an expert at summarizing web pages or documents and searching for content in them. + You are Perplexica, an advanced AI designed to deliver highly detailed, informative answers based on web search results. You are + tasked with generating long, comprehensive responses that thoroughly answer the user's query, providing all relevant details and + additional information where appropriate. + + - **Detailed and informative**: Your response should cover all aspects of the user's query in depth. Include extra details that add value to the answer. + - **Journalistic tone**: Write in a neutral, journalistic style that is professional and informative. + - **Use markdown**: Format your response using markdown for readability. Avoid bullet points—focus on paragraphs with appropriate headings and subheadings. + - **Lengthy, blog-style answers**: Your responses should be extensive and read like a detailed blog post. The answer should be long, thorough, and include any additional information the user may find helpful. Don't put the first biggest heading like in blog posts, just start with the answer and you can use smaller headings to break down the answer. - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - If the query contains some links and the user asks to answer from those links you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to answer the user's query. - If the user asks to summarize content from some links, you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to summarize the text. The content provided inside the \`context\` block will be already summarized by another model so you just need to use that content to answer the user's query. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + - **Never return references to the search results**: You should never return references to the search results in your response. The user has been shared the search results and you should only provide the answer with citations. + Anything inside the following \`context\` HTML block provided below is for your knowledge returned by the search engine and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to talk about the context in your response. From 8fe1b7c5e35b0d4ecfd8f85083d8d3151d76795d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 12:01:56 +0530 Subject: [PATCH 059/282] feat(webSearchAgent): revert prompt --- src/agents/webSearchAgent.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 02ad12a..1ff3354 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -89,21 +89,18 @@ Rephrased question: `; const basicWebSearchResponsePrompt = ` - You are Perplexica, an advanced AI designed to deliver highly detailed, informative answers based on web search results. You are - tasked with generating long, comprehensive responses that thoroughly answer the user's query, providing all relevant details and - additional information where appropriate. - - - **Detailed and informative**: Your response should cover all aspects of the user's query in depth. Include extra details that add value to the answer. - - **Journalistic tone**: Write in a neutral, journalistic style that is professional and informative. - - **Use markdown**: Format your response using markdown for readability. Avoid bullet points—focus on paragraphs with appropriate headings and subheadings. - - **Lengthy, blog-style answers**: Your responses should be extensive and read like a detailed blog post. The answer should be long, thorough, and include any additional information the user may find helpful. Don't put the first biggest heading like in blog posts, just start with the answer and you can use smaller headings to break down the answer. + You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are also an expert at summarizing web pages or documents and searching for content in them. + Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). + You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. + You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. + If the query contains some links and the user asks to answer from those links you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to answer the user's query. + If the user asks to summarize content from some links, you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to summarize the text. The content provided inside the \`context\` block will be already summarized by another model so you just need to use that content to answer the user's query. + Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. - - **Never return references to the search results**: You should never return references to the search results in your response. The user has been shared the search results and you should only provide the answer with citations. - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by the search engine and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to talk about the context in your response. From c7c0ebe5b6775f607e0666b4863166d2a9cd2fc9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 12:15:04 +0530 Subject: [PATCH 060/282] feat(dockerfile): use NPM registry --- backend.dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend.dockerfile b/backend.dockerfile index c25ddd8..bfcee63 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -10,6 +10,8 @@ COPY yarn.lock /home/perplexica/ RUN mkdir /home/perplexica/data +RUN yarn config set registry https://registry.npmjs.org/ + RUN yarn install --frozen-lockfile RUN yarn build From 71fc19f5259b34c5b608f06a079e3457ad02bf3a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 12:24:55 +0530 Subject: [PATCH 061/282] feat(dockerfile): update registry --- backend.dockerfile | 2 - yarn.lock | 806 ++++++++++++++++++++++----------------------- 2 files changed, 403 insertions(+), 405 deletions(-) diff --git a/backend.dockerfile b/backend.dockerfile index bfcee63..c25ddd8 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -10,8 +10,6 @@ COPY yarn.lock /home/perplexica/ RUN mkdir /home/perplexica/data -RUN yarn config set registry https://registry.npmjs.org/ - RUN yarn install --frozen-lockfile RUN yarn build diff --git a/yarn.lock b/yarn.lock index deb35ea..502dc90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@anthropic-ai/sdk@^0.22.0": version "0.22.0" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.22.0.tgz#548e4218d9810fd494e595d4e57cb2d46d301a1a" + resolved "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.22.0.tgz#548e4218d9810fd494e595d4e57cb2d46d301a1a" integrity sha512-dv4BCC6FZJw3w66WNLsHlUFjhu19fS1L/5jMPApwhZLa/Oy1j0A2i3RypmDtHEPp4Wwg3aZkSHksp7VzYWjzmw== dependencies: "@types/node" "^18.11.18" @@ -18,7 +18,7 @@ "@anthropic-ai/sdk@^0.9.1": version "0.9.1" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" + resolved "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA== dependencies: "@types/node" "^18.11.18" @@ -33,19 +33,19 @@ "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@dabh/diagnostics@^2.0.2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== dependencies: colorspace "1.1.x" @@ -54,7 +54,7 @@ "@esbuild-kit/core-utils@^3.3.2": version "3.3.2" - resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" + resolved "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" integrity sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ== dependencies: esbuild "~0.18.20" @@ -62,7 +62,7 @@ "@esbuild-kit/esm-loader@^2.5.5": version "2.6.5" - resolved "https://registry.yarnpkg.com/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" + resolved "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" integrity sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA== dependencies: "@esbuild-kit/core-utils" "^3.3.2" @@ -70,252 +70,252 @@ "@esbuild/aix-ppc64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== "@esbuild/android-arm64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== "@esbuild/android-arm64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== "@esbuild/android-arm@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== "@esbuild/android-arm@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== "@esbuild/android-x64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== "@esbuild/android-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== "@esbuild/darwin-arm64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== "@esbuild/darwin-arm64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== "@esbuild/darwin-x64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== "@esbuild/darwin-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== "@esbuild/freebsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== "@esbuild/freebsd-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== "@esbuild/linux-arm64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== "@esbuild/linux-arm64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== "@esbuild/linux-arm@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== "@esbuild/linux-arm@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== "@esbuild/linux-ia32@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== "@esbuild/linux-ia32@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== "@esbuild/linux-loong64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== "@esbuild/linux-loong64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== "@esbuild/linux-mips64el@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== "@esbuild/linux-mips64el@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== "@esbuild/linux-ppc64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== "@esbuild/linux-ppc64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== "@esbuild/linux-riscv64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== "@esbuild/linux-riscv64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== "@esbuild/linux-s390x@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== "@esbuild/linux-s390x@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== "@esbuild/linux-x64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== "@esbuild/linux-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== "@esbuild/netbsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== "@esbuild/netbsd-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== "@esbuild/openbsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== "@esbuild/openbsd-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== "@esbuild/sunos-x64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== "@esbuild/sunos-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== "@esbuild/win32-arm64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== "@esbuild/win32-arm64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== "@esbuild/win32-ia32@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== "@esbuild/win32-ia32@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== "@esbuild/win32-x64@0.18.20": version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== "@esbuild/win32-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== "@huggingface/jinja@^0.2.2": version "0.2.2" - resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" + resolved "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" integrity sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA== "@iarna/toml@^2.2.5": version "2.2.5" - resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -323,7 +323,7 @@ "@langchain/anthropic@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.2.3.tgz#1505da939f47c90e53dfede0407c497b8177bdf0" + resolved "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.3.tgz#1505da939f47c90e53dfede0407c497b8177bdf0" integrity sha512-f2fqzLGcvsXXUyZ1vl8cgwkKDGLshOGrPuR9hkhGuBG5m91eq755OqPBxWJuS1TFtNU813cXft3xh0MQbxavwg== dependencies: "@anthropic-ai/sdk" "^0.22.0" @@ -334,7 +334,7 @@ "@langchain/community@^0.2.16": version "0.2.16" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.2.16.tgz#5888baf7fc7ea272c5f91aaa0e71bc444167262d" + resolved "https://registry.npmjs.org/@langchain/community/-/community-0.2.16.tgz#5888baf7fc7ea272c5f91aaa0e71bc444167262d" integrity sha512-dFDcMabKACvuRd0w6EIRLWf1ubPGZEeEwFt9v1jiEr4HCFxH0OF+iM1QUCcVRbB2fK5lqmKeTD1XAeZV8+AyXA== dependencies: "@langchain/core" "~0.2.11" @@ -351,7 +351,7 @@ "@langchain/community@~0.0.41": version "0.0.43" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.43.tgz#017e2f9b3209b3999482f10df5aec2520731a63c" + resolved "https://registry.npmjs.org/@langchain/community/-/community-0.0.43.tgz#017e2f9b3209b3999482f10df5aec2520731a63c" integrity sha512-60TjV3knGGOPHfbJxLpuwARr8oA0r6Txm8wTFvFx+TjRUrloyBUcWSbJIdm62gAwBJDEHmdjjyWOOzU+eewcuA== dependencies: "@langchain/core" "~0.1.44" @@ -364,7 +364,7 @@ "@langchain/core@>0.1.56 <0.3.0", "@langchain/core@>0.2.0 <0.3.0", "@langchain/core@>=0.2.5 <0.3.0", "@langchain/core@~0.2.0", "@langchain/core@~0.2.11": version "0.2.11" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.11.tgz#5f47467e20e56b250831baef20083657c6facb4c" + resolved "https://registry.npmjs.org/@langchain/core/-/core-0.2.11.tgz#5f47467e20e56b250831baef20083657c6facb4c" integrity sha512-d4SNL7WI0c3oHrV4WxCRH1/TNqdePXEzYjYwIb4aEH6lW1aM0utGhLbNthX+aYkOL4Ynx2FoG4h91ECIipiKWQ== dependencies: ansi-styles "^5.0.0" @@ -382,7 +382,7 @@ "@langchain/core@>=0.2.9 <0.3.0": version "0.2.15" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.15.tgz#1bb99ac4fffe935c7ba37edcaa91abfba3c82219" + resolved "https://registry.npmjs.org/@langchain/core/-/core-0.2.15.tgz#1bb99ac4fffe935c7ba37edcaa91abfba3c82219" integrity sha512-L096itIBQ5XNsy5BCCPqIQEk/x4rzI+U4BhYT+fDBYtljESshIi/WzXdmiGfY/6MpVjB76jNuaRgMDmo1m9NeQ== dependencies: ansi-styles "^5.0.0" @@ -400,7 +400,7 @@ "@langchain/core@~0.1.44", "@langchain/core@~0.1.45": version "0.1.52" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.52.tgz#7619310b83ffa841628efe2e1eda873ca714d068" + resolved "https://registry.npmjs.org/@langchain/core/-/core-0.1.52.tgz#7619310b83ffa841628efe2e1eda873ca714d068" integrity sha512-AEyP99r7jijF33pyzaWtqCkiO9crotgethqq7jznAGlIojMCL9BT/id2DjVyN32SGFTpet273kkjsmEdFSHqpA== dependencies: ansi-styles "^5.0.0" @@ -417,7 +417,7 @@ "@langchain/openai@^0.0.25", "@langchain/openai@~0.0.19": version "0.0.25" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" + resolved "https://registry.npmjs.org/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q== dependencies: "@langchain/core" "~0.1.45" @@ -428,7 +428,7 @@ "@langchain/openai@~0.0.28": version "0.0.34" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.34.tgz#36c9bca0721ab9f7e5d40927e7c0429cacbd5b56" + resolved "https://registry.npmjs.org/@langchain/openai/-/openai-0.0.34.tgz#36c9bca0721ab9f7e5d40927e7c0429cacbd5b56" integrity sha512-M+CW4oXle5fdoz2T2SwdOef8pl3/1XmUx1vjn2mXUVM/128aO0l23FMF0SNBsAbRV6P+p/TuzjodchJbi0Ht/A== dependencies: "@langchain/core" ">0.1.56 <0.3.0" @@ -439,7 +439,7 @@ "@langchain/openai@~0.1.0": version "0.1.3" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.1.3.tgz#6eb0994e970d85ffa9aaeafb94449024ccf6ca63" + resolved "https://registry.npmjs.org/@langchain/openai/-/openai-0.1.3.tgz#6eb0994e970d85ffa9aaeafb94449024ccf6ca63" integrity sha512-riv/JC9x2A8b7GcHu8sx+mlZJ8KAwSSi231IPTlcciYnKozmrQ5H0vrtiD31fxiDbaRsk7tyCpkSBIOQEo7CyQ== dependencies: "@langchain/core" ">=0.2.5 <0.3.0" @@ -450,7 +450,7 @@ "@langchain/textsplitters@~0.0.0": version "0.0.3" - resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.0.3.tgz#1a3cc93dd2ab330edb225400ded190a22fea14e3" + resolved "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.0.3.tgz#1a3cc93dd2ab330edb225400ded190a22fea14e3" integrity sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA== dependencies: "@langchain/core" ">0.2.0 <0.3.0" @@ -458,27 +458,27 @@ "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== "@protobufjs/codegen@^2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== "@protobufjs/eventemitter@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== "@protobufjs/fetch@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" @@ -486,32 +486,32 @@ "@protobufjs/float@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/inquire@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== "@selderee/plugin-htmlparser2@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" + resolved "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== dependencies: domhandler "^5.0.3" @@ -519,34 +519,34 @@ "@tsconfig/node10@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/better-sqlite3@^7.6.10": version "7.6.10" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz#1818e56490953404acfd44cdde0464f201be6105" + resolved "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz#1818e56490953404acfd44cdde0464f201be6105" integrity sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw== dependencies: "@types/node" "*" "@types/body-parser@*": version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" @@ -554,21 +554,21 @@ "@types/connect@*": version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/cors@^2.8.17": version "2.8.17" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== dependencies: "@types/node" "*" "@types/express-serve-static-core@^4.17.33": version "4.17.43" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== dependencies: "@types/node" "*" @@ -578,7 +578,7 @@ "@types/express@^4.17.21": version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" @@ -588,27 +588,27 @@ "@types/html-to-text@^9.0.4": version "9.0.4" - resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" + resolved "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== "@types/http-errors@*": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/long@^4.0.1": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/mime@^1": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node-fetch@^2.6.4": version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== dependencies: "@types/node" "*" @@ -616,43 +616,43 @@ "@types/node@*": version "20.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" + resolved "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== dependencies: undici-types "~5.26.4" "@types/node@>=13.7.0": version "20.12.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.9.tgz#d7234f2e7839b55fcab5048404aef0195684adff" + resolved "https://registry.npmjs.org/@types/node/-/node-20.12.9.tgz#d7234f2e7839b55fcab5048404aef0195684adff" integrity sha512-o93r47yu04MHumPBCFg0bMPBMNgtMg3jzbhl7e68z50+BMHmRMGDJv13eBlUgOdc9i/uoJXGMGYLtJV4ReTXEg== dependencies: undici-types "~5.26.4" "@types/node@^18.11.18": version "18.19.28" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.28.tgz#c64a2c992c8ebbf61100a4570e4eebc1934ae030" + resolved "https://registry.npmjs.org/@types/node/-/node-18.19.28.tgz#c64a2c992c8ebbf61100a4570e4eebc1934ae030" integrity sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw== dependencies: undici-types "~5.26.4" "@types/pdf-parse@^1.1.4": version "1.1.4" - resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" + resolved "https://registry.npmjs.org/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== "@types/qs@*": version "6.9.14" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" integrity sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA== "@types/range-parser@*": version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/readable-stream@^4.0.11": version "4.0.11" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.11.tgz#684f1e947c90cb6a8ad3904523d650bb66cdbb84" + resolved "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.11.tgz#684f1e947c90cb6a8ad3904523d650bb66cdbb84" integrity sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ== dependencies: "@types/node" "*" @@ -660,12 +660,12 @@ "@types/retry@0.12.0": version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/send@*": version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" @@ -673,7 +673,7 @@ "@types/serve-static@*": version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: "@types/http-errors" "*" @@ -682,24 +682,24 @@ "@types/triple-beam@^1.3.2": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== "@types/uuid@^9.0.1": version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== "@types/ws@^8.5.12": version "8.5.12" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== dependencies: "@types/node" "*" "@xenova/transformers@^2.17.1": version "2.17.1" - resolved "https://registry.yarnpkg.com/@xenova/transformers/-/transformers-2.17.1.tgz#712f7a72c76c8aa2075749382f83dc7dd4e5a9a5" + resolved "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.17.1.tgz#712f7a72c76c8aa2075749382f83dc7dd4e5a9a5" integrity sha512-zo702tQAFZXhzeD2GCYUNUqeqkoueOdiSbQWa4s0q7ZE4z8WBIwIsMMPGobpgdqjQ2u0Qulo08wuqVEUrBXjkQ== dependencies: "@huggingface/jinja" "^0.2.2" @@ -710,19 +710,19 @@ abbrev@1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -730,29 +730,29 @@ accepts@~1.3.8: acorn-walk@^8.1.1: version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== acorn@^8.4.1: version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== agentkeepalive@^4.2.1: version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: humanize-ms "^1.2.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -760,32 +760,32 @@ anymatch@~3.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== async@^3.2.3: version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^1.6.8: version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + resolved "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== dependencies: follow-redirects "^1.15.6" @@ -794,22 +794,22 @@ axios@^1.6.8: b4a@^1.6.4: version "1.6.6" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.0.0, bare-events@^2.2.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" + resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" integrity sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ== bare-fs@^2.1.1: version "2.3.0" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.0.tgz#0872f8e33cf291c9fd527d827154f156a298d402" + resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.0.tgz#0872f8e33cf291c9fd527d827154f156a298d402" integrity sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw== dependencies: bare-events "^2.0.0" @@ -818,36 +818,36 @@ bare-fs@^2.1.1: bare-os@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.3.0.tgz#718e680b139effff0624a7421c098e7a2c2d63da" + resolved "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz#718e680b139effff0624a7421c098e7a2c2d63da" integrity sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg== bare-path@^2.0.0, bare-path@^2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.2.tgz#7a0940d34ebe65f7e179fa61ed8d49d9dc151d67" + resolved "https://registry.npmjs.org/bare-path/-/bare-path-2.1.2.tgz#7a0940d34ebe65f7e179fa61ed8d49d9dc151d67" integrity sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig== dependencies: bare-os "^2.1.0" bare-stream@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-1.0.0.tgz#25c3e56198d922187320c3f8c52d75c4051178b4" + resolved "https://registry.npmjs.org/bare-stream/-/bare-stream-1.0.0.tgz#25c3e56198d922187320c3f8c52d75c4051178b4" integrity sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ== dependencies: streamx "^2.16.1" base-64@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + resolved "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== better-sqlite3@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.0.0.tgz#12083acfe0ded6abdba908ed73520f2003e3ea0e" + resolved "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.0.0.tgz#12083acfe0ded6abdba908ed73520f2003e3ea0e" integrity sha512-1NnNhmT3EZTsKtofJlMox1jkMxdedILury74PwUbQBjWgo4tL4kf7uTAjU55mgQwjdzqakSTjkf+E1imrFwjnA== dependencies: bindings "^1.5.0" @@ -855,24 +855,24 @@ better-sqlite3@^11.0.0: binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== binary-search@^1.3.5: version "1.3.6" - resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" + resolved "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== bindings@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" bl@^4.0.3: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -881,7 +881,7 @@ bl@^4.0.3: body-parser@1.20.2: version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" @@ -899,7 +899,7 @@ body-parser@1.20.2: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -907,19 +907,19 @@ brace-expansion@^1.1.7: braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.5.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -927,12 +927,12 @@ buffer@^5.5.0: bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -943,17 +943,17 @@ call-bind@^1.0.7: camelcase@6: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== charenc@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== chokidar@^3.5.2: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -968,36 +968,36 @@ chokidar@^3.5.2: chownr@^1.1.1: version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0, color-string@^1.9.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -1005,7 +1005,7 @@ color-string@^1.6.0, color-string@^1.9.0: color@^3.1.3: version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -1013,7 +1013,7 @@ color@^3.1.3: color@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: color-convert "^2.0.1" @@ -1021,7 +1021,7 @@ color@^4.2.3: colorspace@1.1.x: version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== dependencies: color "^3.1.3" @@ -1029,19 +1029,19 @@ colorspace@1.1.x: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^10.0.1: version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== compute-cosine-similarity@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" + resolved "https://registry.npmjs.org/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" integrity sha512-FXhNx0ILLjGi9Z9+lglLzM12+0uoTnYkHm7GiadXDAr0HGVLm25OivUS1B/LPkbzzvlcXz/1EvWg9ZYyJSdhTw== dependencies: compute-dot "^1.1.0" @@ -1051,7 +1051,7 @@ compute-cosine-similarity@^1.1.0: compute-dot@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-dot/-/compute-dot-1.1.0.tgz#01a5ba2c7af73b99002acb258459c9576a8232dc" + resolved "https://registry.npmjs.org/compute-dot/-/compute-dot-1.1.0.tgz#01a5ba2c7af73b99002acb258459c9576a8232dc" integrity sha512-L5Ocet4DdMrXboss13K59OK23GXjiSia7+7Ukc7q4Bl+RVpIXK2W9IHMbWDZkh+JUEvJAwOKRaJDiFUa1LTnJg== dependencies: validate.io-array "^1.0.3" @@ -1059,7 +1059,7 @@ compute-dot@^1.1.0: compute-l2norm@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-l2norm/-/compute-l2norm-1.1.0.tgz#bd09131c6b36c8d70c68334e176009a4e0a989ac" + resolved "https://registry.npmjs.org/compute-l2norm/-/compute-l2norm-1.1.0.tgz#bd09131c6b36c8d70c68334e176009a4e0a989ac" integrity sha512-6EHh1Elj90eU28SXi+h2PLnTQvZmkkHWySpoFz+WOlVNLz3DQoC4ISUHSV9n5jMxPHtKGJ01F4uu2PsXBB8sSg== dependencies: validate.io-array "^1.0.3" @@ -1067,34 +1067,34 @@ compute-l2norm@^1.1.0: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== cors@^2.8.5: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -1102,67 +1102,67 @@ cors@^2.8.5: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== crypt@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" debug@^4.3.4: version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" decamelize@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deepmerge@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1171,32 +1171,32 @@ define-data-property@^1.1.4: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== destroy@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-libc@^2.0.0, detect-libc@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== digest-fetch@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" + resolved "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA== dependencies: base-64 "^0.1.0" @@ -1204,7 +1204,7 @@ digest-fetch@^1.3.0: dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" @@ -1213,19 +1213,19 @@ dom-serializer@^2.0.0: domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" domutils@^3.0.1: version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" @@ -1234,12 +1234,12 @@ domutils@^3.0.1: dotenv@^16.4.5: version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== drizzle-kit@^0.22.7: version "0.22.7" - resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.22.7.tgz#4339c3e24c6555ea8cbad605f005b3db3e604a9c" + resolved "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.22.7.tgz#4339c3e24c6555ea8cbad605f005b3db3e604a9c" integrity sha512-9THPCb2l1GPt7wxhws9LvTR0YG565ZlVgTuqGMwjs590Kch1pXu4GyjEArVijSF5m0OBj3qgdeKmuJXhKXgWFw== dependencies: "@esbuild-kit/esm-loader" "^2.5.5" @@ -1248,58 +1248,58 @@ drizzle-kit@^0.22.7: drizzle-orm@^0.31.2: version "0.31.2" - resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.31.2.tgz#221a257dd487bab49ddb88a17bd82388600cf655" + resolved "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.31.2.tgz#221a257dd487bab49ddb88a17bd82388600cf655" integrity sha512-QnenevbnnAzmbNzQwbhklvIYrDE8YER8K7kSrAWQSV1YvFCdSQPzj+jzqRdTSsV2cDqSpQ0NXGyL1G9I43LDLg== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== enabled@2.0.x: version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" entities@^4.2.0, entities@^4.4.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== esbuild-register@^3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.5.0.tgz#449613fb29ab94325c722f560f800dd946dc8ea8" + resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz#449613fb29ab94325c722f560f800dd946dc8ea8" integrity sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A== dependencies: debug "^4.3.4" esbuild@^0.19.7: version "0.19.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== optionalDependencies: "@esbuild/aix-ppc64" "0.19.12" @@ -1328,7 +1328,7 @@ esbuild@^0.19.7: esbuild@~0.18.20: version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: "@esbuild/android-arm" "0.18.20" @@ -1356,37 +1356,37 @@ esbuild@~0.18.20: escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter3@^4.0.4: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== expand-template@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== expr-eval@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" + resolved "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== express@^4.19.2: version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + resolved "https://registry.npmjs.org/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" @@ -1423,36 +1423,36 @@ express@^4.19.2: fast-fifo@^1.1.0, fast-fifo@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-xml-parser@^4.3.5: version "4.4.0" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" integrity sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg== dependencies: strnum "^1.0.5" fecha@^4.2.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== file-uri-to-path@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" @@ -1465,32 +1465,32 @@ finalhandler@1.2.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatbuffers@^1.12.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-1.12.0.tgz#72e87d1726cb1b216e839ef02658aa87dcef68aa" + resolved "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz#72e87d1726cb1b216e839ef02658aa87dcef68aa" integrity sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ== fn.name@1.x.x: version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.15.6: version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== form-data-encoder@1.7.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -1499,7 +1499,7 @@ form-data@^4.0.0: formdata-node@^4.3.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" + resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== dependencies: node-domexception "1.0.0" @@ -1507,32 +1507,32 @@ formdata-node@^4.3.2: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -1543,67 +1543,67 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: get-tsconfig@^4.7.0: version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== dependencies: resolve-pkg-maps "^1.0.0" github-from-package@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" guid-typescript@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" + resolved "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" integrity sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== hasown@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" html-to-text@^9.0.5: version "9.0.5" - resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" + resolved "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== dependencies: "@selderee/plugin-htmlparser2" "^0.11.0" @@ -1614,7 +1614,7 @@ html-to-text@^9.0.5: htmlparser2@^8.0.2: version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: domelementtype "^2.3.0" @@ -1624,7 +1624,7 @@ htmlparser2@^8.0.2: http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -1635,121 +1635,121 @@ http-errors@2.0.0: humanize-ms@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-by-default@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-any-array@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" + resolved "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-buffer@~1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== js-tiktoken@^1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211" + resolved "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211" integrity sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ== dependencies: base64-js "^1.5.1" js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: version "1.0.10" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" + resolved "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" integrity sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA== dependencies: base64-js "^1.5.1" js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsonpointer@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== kuler@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== langchain@0.2.3: version "0.2.3" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.2.3.tgz#c14bb05cf871b21bd63b84b3ab89580b1d62539f" + resolved "https://registry.npmjs.org/langchain/-/langchain-0.2.3.tgz#c14bb05cf871b21bd63b84b3ab89580b1d62539f" integrity sha512-T9xR7zd+Nj0oXy6WoYKmZLy0DlQiDLFPGYWdOXDxy+AvqlujoPdVQgDSpdqiOHvAjezrByAoKxoHCz5XMwTP/Q== dependencies: "@langchain/core" "~0.2.0" @@ -1771,7 +1771,7 @@ langchain@0.2.3: langchain@^0.1.30: version "0.1.30" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.30.tgz#e1adb3f1849fcd5c596c668300afd5dc8cb37a97" + resolved "https://registry.npmjs.org/langchain/-/langchain-0.1.30.tgz#e1adb3f1849fcd5c596c668300afd5dc8cb37a97" integrity sha512-5h/vNMmutQ98tbB0sPDlAileZVca6A2McFgGa3+D56Dm8mSSCzTQL2DngPA6h09DlKDpSr7+6PdFw5Hoj0ZDSw== dependencies: "@anthropic-ai/sdk" "^0.9.1" @@ -1794,12 +1794,12 @@ langchain@^0.1.30: langchainhub@~0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" + resolved "https://registry.npmjs.org/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== langsmith@~0.1.1, langsmith@~0.1.7: version "0.1.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" + resolved "https://registry.npmjs.org/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" integrity sha512-iEzQLLB7/0nRpAwNBAR7B7N64fyByg5UsNjSvLaCCkQ9AS68PSafjB8xQkyI8QXXrGjU1dEqDRoa8m4SUuRdUw== dependencies: "@types/uuid" "^9.0.1" @@ -1810,7 +1810,7 @@ langsmith@~0.1.1, langsmith@~0.1.7: langsmith@~0.1.30: version "0.1.34" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.34.tgz#801310495fef258ed9c22bb5575120e2c06d51cf" + resolved "https://registry.npmjs.org/langsmith/-/langsmith-0.1.34.tgz#801310495fef258ed9c22bb5575120e2c06d51cf" integrity sha512-aMv2k8kEaovhTuZnK6/6DMCoM7Jurvm1AzdESn+yN+HramRxp3sK32jFRz3ogkXP6GjAjOIofcnNkzhHXSUXGA== dependencies: "@types/uuid" "^9.0.1" @@ -1822,17 +1822,17 @@ langsmith@~0.1.30: leac@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + resolved "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== lodash.set@^4.3.2: version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + resolved "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== logform@^2.3.2, logform@^2.4.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + resolved "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== dependencies: "@colors/colors" "1.6.0" @@ -1844,24 +1844,24 @@ logform@^2.3.2, logform@^2.4.0: long@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== md5@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== dependencies: charenc "0.0.2" @@ -1870,80 +1870,80 @@ md5@^2.3.0: media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.3: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== ml-array-mean@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" + resolved "https://registry.npmjs.org/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== dependencies: ml-array-sum "^1.1.6" ml-array-sum@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" + resolved "https://registry.npmjs.org/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== dependencies: is-any-array "^2.0.0" ml-distance-euclidean@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" + resolved "https://registry.npmjs.org/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== ml-distance@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" + resolved "https://registry.npmjs.org/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw== dependencies: ml-array-mean "^1.1.6" @@ -1952,7 +1952,7 @@ ml-distance@^4.0.0: ml-tree-similarity@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" + resolved "https://registry.npmjs.org/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== dependencies: binary-search "^1.3.5" @@ -1960,66 +1960,66 @@ ml-tree-similarity@^1.0.0: ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mustache@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== napi-build-utils@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== node-abi@^3.3.0: version "3.62.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.62.0.tgz#017958ed120f89a3a14a7253da810f5d724e3f36" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz#017958ed120f89a3a14a7253da810f5d724e3f36" integrity sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g== dependencies: semver "^7.3.5" node-addon-api@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== node-domexception@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-ensure@^0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" + resolved "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== node-fetch@^2.6.7: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" nodemon@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" + resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA== dependencies: chokidar "^3.5.2" @@ -2035,74 +2035,74 @@ nodemon@^3.1.0: nopt@~1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== num-sort@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" + resolved "https://registry.npmjs.org/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== object-assign@^4: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1: version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== on-finished@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" one-time@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== dependencies: fn.name "1.x.x" onnx-proto@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/onnx-proto/-/onnx-proto-4.0.4.tgz#2431a25bee25148e915906dda0687aafe3b9e044" + resolved "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz#2431a25bee25148e915906dda0687aafe3b9e044" integrity sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA== dependencies: protobufjs "^6.8.8" onnxruntime-common@~1.14.0: version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz#2bb5dac5261269779aa5fb6536ca379657de8bf6" + resolved "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz#2bb5dac5261269779aa5fb6536ca379657de8bf6" integrity sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew== onnxruntime-node@1.14.0: version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz#c4ae6c355cfae7d83abaf36dd39a905c4a010217" + resolved "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz#c4ae6c355cfae7d83abaf36dd39a905c4a010217" integrity sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w== dependencies: onnxruntime-common "~1.14.0" onnxruntime-web@1.14.0: version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz#c8cee538781b1d4c1c6b043934f4a3e6ddf1466e" + resolved "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz#c8cee538781b1d4c1c6b043934f4a3e6ddf1466e" integrity sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw== dependencies: flatbuffers "^1.12.0" @@ -2114,7 +2114,7 @@ onnxruntime-web@1.14.0: openai@^4.26.0: version "4.31.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.31.0.tgz#5d96045c4eb244fa21f0fff0981043a2c9f09e8c" + resolved "https://registry.npmjs.org/openai/-/openai-4.31.0.tgz#5d96045c4eb244fa21f0fff0981043a2c9f09e8c" integrity sha512-JebkRnRGEGLnJt3+bJ5B7au8nBeZvJjs9baVxDmUZ5+BgafAdy6KDxJGSuyaw/IA+ErqY3jmOH5cDC2mCDJF2w== dependencies: "@types/node" "^18.11.18" @@ -2129,7 +2129,7 @@ openai@^4.26.0: openai@^4.41.1, openai@^4.49.1: version "4.52.2" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.52.2.tgz#5d67271f3df84c0b54676b08990eaa9402151759" + resolved "https://registry.npmjs.org/openai/-/openai-4.52.2.tgz#5d67271f3df84c0b54676b08990eaa9402151759" integrity sha512-mMc0XgFuVSkcm0lRIi8zaw++otC82ZlfkCur1qguXYWPETr/+ZwL9A/vvp3YahX+shpaT6j03dwsmUyLAfmEfg== dependencies: "@types/node" "^18.11.18" @@ -2143,17 +2143,17 @@ openai@^4.41.1, openai@^4.49.1: openapi-types@^12.1.3: version "12.1.3" - resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-queue@^6.6.2: version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: eventemitter3 "^4.0.4" @@ -2161,7 +2161,7 @@ p-queue@^6.6.2: p-retry@4: version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: "@types/retry" "0.12.0" @@ -2169,14 +2169,14 @@ p-retry@4: p-timeout@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== dependencies: p-finally "^1.0.0" parseley@^0.12.0: version "0.12.1" - resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" + resolved "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== dependencies: leac "^0.6.0" @@ -2184,17 +2184,17 @@ parseley@^0.12.0: parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== pdf-parse@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" + resolved "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== dependencies: debug "^3.1.0" @@ -2202,22 +2202,22 @@ pdf-parse@^1.1.1: peberminta@^0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" + resolved "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== platform@^1.3.6: version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + resolved "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== prebuild-install@^7.1.1: version "7.1.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== dependencies: detect-libc "^2.0.0" @@ -2235,12 +2235,12 @@ prebuild-install@^7.1.1: prettier@^3.2.5: version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== protobufjs@^6.8.8: version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== dependencies: "@protobufjs/aspromise" "^1.1.2" @@ -2259,7 +2259,7 @@ protobufjs@^6.8.8: proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -2267,17 +2267,17 @@ proxy-addr@~2.0.7: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pstree.remy@^1.1.8: version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -2285,24 +2285,24 @@ pump@^3.0.0: qs@6.11.0: version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" queue-tick@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -2312,7 +2312,7 @@ raw-body@2.5.2: rc@^1.2.7: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -2322,7 +2322,7 @@ rc@^1.2.7: readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -2331,58 +2331,58 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== retry@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-stable-stringify@^2.3.1: version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== selderee@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" + resolved "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== dependencies: parseley "^0.12.0" semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" send@0.18.0: version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" @@ -2401,7 +2401,7 @@ send@0.18.0: serve-static@1.15.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" @@ -2411,7 +2411,7 @@ serve-static@1.15.0: set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -2423,12 +2423,12 @@ set-function-length@^1.2.1: setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sharp@^0.32.0: version "0.32.6" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + resolved "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== dependencies: color "^4.2.3" @@ -2442,7 +2442,7 @@ sharp@^0.32.0: side-channel@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -2452,12 +2452,12 @@ side-channel@^1.0.4: simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^4.0.0, simple-get@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: decompress-response "^6.0.0" @@ -2466,21 +2466,21 @@ simple-get@^4.0.0, simple-get@^4.0.1: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" simple-update-notifier@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== dependencies: semver "^7.5.3" source-map-support@^0.5.21: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -2488,22 +2488,22 @@ source-map-support@^0.5.21: source-map@^0.6.0: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== streamx@^2.15.0, streamx@^2.16.1: version "2.16.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== dependencies: fast-fifo "^1.1.0" @@ -2513,31 +2513,31 @@ streamx@^2.15.0, streamx@^2.16.1: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== strnum@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" tar-fs@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" @@ -2547,7 +2547,7 @@ tar-fs@^2.0.0: tar-fs@^3.0.4: version "3.0.6" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== dependencies: pump "^3.0.0" @@ -2558,7 +2558,7 @@ tar-fs@^3.0.4: tar-stream@^2.1.4: version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -2569,7 +2569,7 @@ tar-stream@^2.1.4: tar-stream@^3.1.5: version "3.1.7" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== dependencies: b4a "^1.6.4" @@ -2578,41 +2578,41 @@ tar-stream@^3.1.5: text-hex@1.0.x: version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== touch@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + resolved "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== dependencies: nopt "~1.0.10" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== triple-beam@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-node@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -2631,14 +2631,14 @@ ts-node@^10.9.2: tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -2646,82 +2646,82 @@ type-is@~1.6.18: typescript@^5.4.3: version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== undefsafe@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + resolved "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== uuid@^9.0.0: version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== validate.io-array@^1.0.3, validate.io-array@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + resolved "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== validate.io-function@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + resolved "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== web-streams-polyfill@^3.2.1: version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -2729,7 +2729,7 @@ whatwg-url@^5.0.0: winston-transport@^4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== dependencies: logform "^2.3.2" @@ -2738,7 +2738,7 @@ winston-transport@^4.7.0: winston@^3.13.0: version "3.13.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" + resolved "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== dependencies: "@colors/colors" "^1.6.0" @@ -2755,40 +2755,40 @@ winston@^3.13.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@^8.17.1: version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.2.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== zod-to-json-schema@^3.22.3: version "3.22.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" + resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== zod-to-json-schema@^3.22.4, zod-to-json-schema@^3.22.5: version "3.23.1" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.23.1.tgz#5225925b8ed5fa20096bd99be076c4b29b53d309" + resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.1.tgz#5225925b8ed5fa20096bd99be076c4b29b53d309" integrity sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw== zod@^3.22.3, zod@^3.22.4: version "3.22.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + resolved "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== From 36bb265e1f6d88d21fd9b838ea152a2243e829de Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 12:27:56 +0530 Subject: [PATCH 062/282] feat(dockerfile): revert base image --- backend.dockerfile | 2 +- yarn.lock | 806 ++++++++++++++++++++++----------------------- 2 files changed, 404 insertions(+), 404 deletions(-) diff --git a/backend.dockerfile b/backend.dockerfile index c25ddd8..e835b40 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -1,4 +1,4 @@ -FROM node:18-slim +FROM node:20-buster WORKDIR /home/perplexica diff --git a/yarn.lock b/yarn.lock index 502dc90..deb35ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@anthropic-ai/sdk@^0.22.0": version "0.22.0" - resolved "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.22.0.tgz#548e4218d9810fd494e595d4e57cb2d46d301a1a" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.22.0.tgz#548e4218d9810fd494e595d4e57cb2d46d301a1a" integrity sha512-dv4BCC6FZJw3w66WNLsHlUFjhu19fS1L/5jMPApwhZLa/Oy1j0A2i3RypmDtHEPp4Wwg3aZkSHksp7VzYWjzmw== dependencies: "@types/node" "^18.11.18" @@ -18,7 +18,7 @@ "@anthropic-ai/sdk@^0.9.1": version "0.9.1" - resolved "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA== dependencies: "@types/node" "^18.11.18" @@ -33,19 +33,19 @@ "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@dabh/diagnostics@^2.0.2": version "2.0.3" - resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== dependencies: colorspace "1.1.x" @@ -54,7 +54,7 @@ "@esbuild-kit/core-utils@^3.3.2": version "3.3.2" - resolved "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" + resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" integrity sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ== dependencies: esbuild "~0.18.20" @@ -62,7 +62,7 @@ "@esbuild-kit/esm-loader@^2.5.5": version "2.6.5" - resolved "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" + resolved "https://registry.yarnpkg.com/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" integrity sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA== dependencies: "@esbuild-kit/core-utils" "^3.3.2" @@ -70,252 +70,252 @@ "@esbuild/aix-ppc64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== "@esbuild/android-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== "@esbuild/android-arm64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== "@esbuild/android-arm@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== "@esbuild/android-arm@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== "@esbuild/android-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== "@esbuild/android-x64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== "@esbuild/darwin-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== "@esbuild/darwin-arm64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== "@esbuild/darwin-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== "@esbuild/darwin-x64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== "@esbuild/freebsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== "@esbuild/freebsd-x64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== "@esbuild/linux-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== "@esbuild/linux-arm64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== "@esbuild/linux-arm@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== "@esbuild/linux-arm@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== "@esbuild/linux-ia32@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== "@esbuild/linux-ia32@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== "@esbuild/linux-loong64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== "@esbuild/linux-loong64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== "@esbuild/linux-mips64el@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== "@esbuild/linux-mips64el@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== "@esbuild/linux-ppc64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== "@esbuild/linux-ppc64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== "@esbuild/linux-riscv64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== "@esbuild/linux-riscv64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== "@esbuild/linux-s390x@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== "@esbuild/linux-s390x@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== "@esbuild/linux-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== "@esbuild/linux-x64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== "@esbuild/netbsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== "@esbuild/netbsd-x64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== "@esbuild/openbsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== "@esbuild/openbsd-x64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== "@esbuild/sunos-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== "@esbuild/sunos-x64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== "@esbuild/win32-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== "@esbuild/win32-arm64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== "@esbuild/win32-ia32@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== "@esbuild/win32-ia32@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== "@esbuild/win32-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== "@esbuild/win32-x64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== "@huggingface/jinja@^0.2.2": version "0.2.2" - resolved "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" + resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" integrity sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA== "@iarna/toml@^2.2.5": version "2.2.5" - resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -323,7 +323,7 @@ "@langchain/anthropic@^0.2.3": version "0.2.3" - resolved "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.3.tgz#1505da939f47c90e53dfede0407c497b8177bdf0" + resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.2.3.tgz#1505da939f47c90e53dfede0407c497b8177bdf0" integrity sha512-f2fqzLGcvsXXUyZ1vl8cgwkKDGLshOGrPuR9hkhGuBG5m91eq755OqPBxWJuS1TFtNU813cXft3xh0MQbxavwg== dependencies: "@anthropic-ai/sdk" "^0.22.0" @@ -334,7 +334,7 @@ "@langchain/community@^0.2.16": version "0.2.16" - resolved "https://registry.npmjs.org/@langchain/community/-/community-0.2.16.tgz#5888baf7fc7ea272c5f91aaa0e71bc444167262d" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.2.16.tgz#5888baf7fc7ea272c5f91aaa0e71bc444167262d" integrity sha512-dFDcMabKACvuRd0w6EIRLWf1ubPGZEeEwFt9v1jiEr4HCFxH0OF+iM1QUCcVRbB2fK5lqmKeTD1XAeZV8+AyXA== dependencies: "@langchain/core" "~0.2.11" @@ -351,7 +351,7 @@ "@langchain/community@~0.0.41": version "0.0.43" - resolved "https://registry.npmjs.org/@langchain/community/-/community-0.0.43.tgz#017e2f9b3209b3999482f10df5aec2520731a63c" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.43.tgz#017e2f9b3209b3999482f10df5aec2520731a63c" integrity sha512-60TjV3knGGOPHfbJxLpuwARr8oA0r6Txm8wTFvFx+TjRUrloyBUcWSbJIdm62gAwBJDEHmdjjyWOOzU+eewcuA== dependencies: "@langchain/core" "~0.1.44" @@ -364,7 +364,7 @@ "@langchain/core@>0.1.56 <0.3.0", "@langchain/core@>0.2.0 <0.3.0", "@langchain/core@>=0.2.5 <0.3.0", "@langchain/core@~0.2.0", "@langchain/core@~0.2.11": version "0.2.11" - resolved "https://registry.npmjs.org/@langchain/core/-/core-0.2.11.tgz#5f47467e20e56b250831baef20083657c6facb4c" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.11.tgz#5f47467e20e56b250831baef20083657c6facb4c" integrity sha512-d4SNL7WI0c3oHrV4WxCRH1/TNqdePXEzYjYwIb4aEH6lW1aM0utGhLbNthX+aYkOL4Ynx2FoG4h91ECIipiKWQ== dependencies: ansi-styles "^5.0.0" @@ -382,7 +382,7 @@ "@langchain/core@>=0.2.9 <0.3.0": version "0.2.15" - resolved "https://registry.npmjs.org/@langchain/core/-/core-0.2.15.tgz#1bb99ac4fffe935c7ba37edcaa91abfba3c82219" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.15.tgz#1bb99ac4fffe935c7ba37edcaa91abfba3c82219" integrity sha512-L096itIBQ5XNsy5BCCPqIQEk/x4rzI+U4BhYT+fDBYtljESshIi/WzXdmiGfY/6MpVjB76jNuaRgMDmo1m9NeQ== dependencies: ansi-styles "^5.0.0" @@ -400,7 +400,7 @@ "@langchain/core@~0.1.44", "@langchain/core@~0.1.45": version "0.1.52" - resolved "https://registry.npmjs.org/@langchain/core/-/core-0.1.52.tgz#7619310b83ffa841628efe2e1eda873ca714d068" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.52.tgz#7619310b83ffa841628efe2e1eda873ca714d068" integrity sha512-AEyP99r7jijF33pyzaWtqCkiO9crotgethqq7jznAGlIojMCL9BT/id2DjVyN32SGFTpet273kkjsmEdFSHqpA== dependencies: ansi-styles "^5.0.0" @@ -417,7 +417,7 @@ "@langchain/openai@^0.0.25", "@langchain/openai@~0.0.19": version "0.0.25" - resolved "https://registry.npmjs.org/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q== dependencies: "@langchain/core" "~0.1.45" @@ -428,7 +428,7 @@ "@langchain/openai@~0.0.28": version "0.0.34" - resolved "https://registry.npmjs.org/@langchain/openai/-/openai-0.0.34.tgz#36c9bca0721ab9f7e5d40927e7c0429cacbd5b56" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.34.tgz#36c9bca0721ab9f7e5d40927e7c0429cacbd5b56" integrity sha512-M+CW4oXle5fdoz2T2SwdOef8pl3/1XmUx1vjn2mXUVM/128aO0l23FMF0SNBsAbRV6P+p/TuzjodchJbi0Ht/A== dependencies: "@langchain/core" ">0.1.56 <0.3.0" @@ -439,7 +439,7 @@ "@langchain/openai@~0.1.0": version "0.1.3" - resolved "https://registry.npmjs.org/@langchain/openai/-/openai-0.1.3.tgz#6eb0994e970d85ffa9aaeafb94449024ccf6ca63" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.1.3.tgz#6eb0994e970d85ffa9aaeafb94449024ccf6ca63" integrity sha512-riv/JC9x2A8b7GcHu8sx+mlZJ8KAwSSi231IPTlcciYnKozmrQ5H0vrtiD31fxiDbaRsk7tyCpkSBIOQEo7CyQ== dependencies: "@langchain/core" ">=0.2.5 <0.3.0" @@ -450,7 +450,7 @@ "@langchain/textsplitters@~0.0.0": version "0.0.3" - resolved "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.0.3.tgz#1a3cc93dd2ab330edb225400ded190a22fea14e3" + resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.0.3.tgz#1a3cc93dd2ab330edb225400ded190a22fea14e3" integrity sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA== dependencies: "@langchain/core" ">0.2.0 <0.3.0" @@ -458,27 +458,27 @@ "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== "@protobufjs/codegen@^2.0.4": version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== "@protobufjs/eventemitter@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== "@protobufjs/fetch@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" @@ -486,32 +486,32 @@ "@protobufjs/float@^1.0.2": version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/inquire@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== "@selderee/plugin-htmlparser2@^0.11.0": version "0.11.0" - resolved "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== dependencies: domhandler "^5.0.3" @@ -519,34 +519,34 @@ "@tsconfig/node10@^1.0.7": version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/better-sqlite3@^7.6.10": version "7.6.10" - resolved "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz#1818e56490953404acfd44cdde0464f201be6105" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz#1818e56490953404acfd44cdde0464f201be6105" integrity sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw== dependencies: "@types/node" "*" "@types/body-parser@*": version "1.19.5" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" @@ -554,21 +554,21 @@ "@types/connect@*": version "3.4.38" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/cors@^2.8.17": version "2.8.17" - resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== dependencies: "@types/node" "*" "@types/express-serve-static-core@^4.17.33": version "4.17.43" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== dependencies: "@types/node" "*" @@ -578,7 +578,7 @@ "@types/express@^4.17.21": version "4.17.21" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" @@ -588,27 +588,27 @@ "@types/html-to-text@^9.0.4": version "9.0.4" - resolved "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" + resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== "@types/http-errors@*": version "2.0.4" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/long@^4.0.1": version "4.0.2" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/mime@^1": version "1.3.5" - resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node-fetch@^2.6.4": version "2.6.11" - resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== dependencies: "@types/node" "*" @@ -616,43 +616,43 @@ "@types/node@*": version "20.12.2" - resolved "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== dependencies: undici-types "~5.26.4" "@types/node@>=13.7.0": version "20.12.9" - resolved "https://registry.npmjs.org/@types/node/-/node-20.12.9.tgz#d7234f2e7839b55fcab5048404aef0195684adff" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.9.tgz#d7234f2e7839b55fcab5048404aef0195684adff" integrity sha512-o93r47yu04MHumPBCFg0bMPBMNgtMg3jzbhl7e68z50+BMHmRMGDJv13eBlUgOdc9i/uoJXGMGYLtJV4ReTXEg== dependencies: undici-types "~5.26.4" "@types/node@^18.11.18": version "18.19.28" - resolved "https://registry.npmjs.org/@types/node/-/node-18.19.28.tgz#c64a2c992c8ebbf61100a4570e4eebc1934ae030" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.28.tgz#c64a2c992c8ebbf61100a4570e4eebc1934ae030" integrity sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw== dependencies: undici-types "~5.26.4" "@types/pdf-parse@^1.1.4": version "1.1.4" - resolved "https://registry.npmjs.org/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" + resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== "@types/qs@*": version "6.9.14" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" integrity sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA== "@types/range-parser@*": version "1.2.7" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/readable-stream@^4.0.11": version "4.0.11" - resolved "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.11.tgz#684f1e947c90cb6a8ad3904523d650bb66cdbb84" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.11.tgz#684f1e947c90cb6a8ad3904523d650bb66cdbb84" integrity sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ== dependencies: "@types/node" "*" @@ -660,12 +660,12 @@ "@types/retry@0.12.0": version "0.12.0" - resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/send@*": version "0.17.4" - resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" @@ -673,7 +673,7 @@ "@types/serve-static@*": version "1.15.7" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: "@types/http-errors" "*" @@ -682,24 +682,24 @@ "@types/triple-beam@^1.3.2": version "1.3.5" - resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== "@types/uuid@^9.0.1": version "9.0.8" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== "@types/ws@^8.5.12": version "8.5.12" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== dependencies: "@types/node" "*" "@xenova/transformers@^2.17.1": version "2.17.1" - resolved "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.17.1.tgz#712f7a72c76c8aa2075749382f83dc7dd4e5a9a5" + resolved "https://registry.yarnpkg.com/@xenova/transformers/-/transformers-2.17.1.tgz#712f7a72c76c8aa2075749382f83dc7dd4e5a9a5" integrity sha512-zo702tQAFZXhzeD2GCYUNUqeqkoueOdiSbQWa4s0q7ZE4z8WBIwIsMMPGobpgdqjQ2u0Qulo08wuqVEUrBXjkQ== dependencies: "@huggingface/jinja" "^0.2.2" @@ -710,19 +710,19 @@ abbrev@1: version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" accepts@~1.3.8: version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -730,29 +730,29 @@ accepts@~1.3.8: acorn-walk@^8.1.1: version "8.3.2" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== acorn@^8.4.1: version "8.11.3" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== agentkeepalive@^4.2.1: version "4.5.0" - resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: humanize-ms "^1.2.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -760,32 +760,32 @@ anymatch@~3.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== async@^3.2.3: version "3.2.5" - resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^1.6.8: version "1.6.8" - resolved "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== dependencies: follow-redirects "^1.15.6" @@ -794,22 +794,22 @@ axios@^1.6.8: b4a@^1.6.4: version "1.6.6" - resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.0.0, bare-events@^2.2.0: version "2.2.2" - resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" integrity sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ== bare-fs@^2.1.1: version "2.3.0" - resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.0.tgz#0872f8e33cf291c9fd527d827154f156a298d402" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.0.tgz#0872f8e33cf291c9fd527d827154f156a298d402" integrity sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw== dependencies: bare-events "^2.0.0" @@ -818,36 +818,36 @@ bare-fs@^2.1.1: bare-os@^2.1.0: version "2.3.0" - resolved "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz#718e680b139effff0624a7421c098e7a2c2d63da" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.3.0.tgz#718e680b139effff0624a7421c098e7a2c2d63da" integrity sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg== bare-path@^2.0.0, bare-path@^2.1.0: version "2.1.2" - resolved "https://registry.npmjs.org/bare-path/-/bare-path-2.1.2.tgz#7a0940d34ebe65f7e179fa61ed8d49d9dc151d67" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.2.tgz#7a0940d34ebe65f7e179fa61ed8d49d9dc151d67" integrity sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig== dependencies: bare-os "^2.1.0" bare-stream@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/bare-stream/-/bare-stream-1.0.0.tgz#25c3e56198d922187320c3f8c52d75c4051178b4" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-1.0.0.tgz#25c3e56198d922187320c3f8c52d75c4051178b4" integrity sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ== dependencies: streamx "^2.16.1" base-64@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== better-sqlite3@^11.0.0: version "11.0.0" - resolved "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.0.0.tgz#12083acfe0ded6abdba908ed73520f2003e3ea0e" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.0.0.tgz#12083acfe0ded6abdba908ed73520f2003e3ea0e" integrity sha512-1NnNhmT3EZTsKtofJlMox1jkMxdedILury74PwUbQBjWgo4tL4kf7uTAjU55mgQwjdzqakSTjkf+E1imrFwjnA== dependencies: bindings "^1.5.0" @@ -855,24 +855,24 @@ better-sqlite3@^11.0.0: binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== binary-search@^1.3.5: version "1.3.6" - resolved "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" + resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== bindings@^1.5.0: version "1.5.0" - resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" bl@^4.0.3: version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -881,7 +881,7 @@ bl@^4.0.3: body-parser@1.20.2: version "1.20.2" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" @@ -899,7 +899,7 @@ body-parser@1.20.2: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -907,19 +907,19 @@ brace-expansion@^1.1.7: braces@~3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.5.0: version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -927,12 +927,12 @@ buffer@^5.5.0: bytes@3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -943,17 +943,17 @@ call-bind@^1.0.7: camelcase@6: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== charenc@0.0.2: version "0.0.2" - resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== chokidar@^3.5.2: version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -968,36 +968,36 @@ chokidar@^3.5.2: chownr@^1.1.1: version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0, color-string@^1.9.0: version "1.9.1" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -1005,7 +1005,7 @@ color-string@^1.6.0, color-string@^1.9.0: color@^3.1.3: version "3.2.1" - resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -1013,7 +1013,7 @@ color@^3.1.3: color@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: color-convert "^2.0.1" @@ -1021,7 +1021,7 @@ color@^4.2.3: colorspace@1.1.x: version "1.1.4" - resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== dependencies: color "^3.1.3" @@ -1029,19 +1029,19 @@ colorspace@1.1.x: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^10.0.1: version "10.0.1" - resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== compute-cosine-similarity@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" + resolved "https://registry.yarnpkg.com/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" integrity sha512-FXhNx0ILLjGi9Z9+lglLzM12+0uoTnYkHm7GiadXDAr0HGVLm25OivUS1B/LPkbzzvlcXz/1EvWg9ZYyJSdhTw== dependencies: compute-dot "^1.1.0" @@ -1051,7 +1051,7 @@ compute-cosine-similarity@^1.1.0: compute-dot@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/compute-dot/-/compute-dot-1.1.0.tgz#01a5ba2c7af73b99002acb258459c9576a8232dc" + resolved "https://registry.yarnpkg.com/compute-dot/-/compute-dot-1.1.0.tgz#01a5ba2c7af73b99002acb258459c9576a8232dc" integrity sha512-L5Ocet4DdMrXboss13K59OK23GXjiSia7+7Ukc7q4Bl+RVpIXK2W9IHMbWDZkh+JUEvJAwOKRaJDiFUa1LTnJg== dependencies: validate.io-array "^1.0.3" @@ -1059,7 +1059,7 @@ compute-dot@^1.1.0: compute-l2norm@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/compute-l2norm/-/compute-l2norm-1.1.0.tgz#bd09131c6b36c8d70c68334e176009a4e0a989ac" + resolved "https://registry.yarnpkg.com/compute-l2norm/-/compute-l2norm-1.1.0.tgz#bd09131c6b36c8d70c68334e176009a4e0a989ac" integrity sha512-6EHh1Elj90eU28SXi+h2PLnTQvZmkkHWySpoFz+WOlVNLz3DQoC4ISUHSV9n5jMxPHtKGJ01F4uu2PsXBB8sSg== dependencies: validate.io-array "^1.0.3" @@ -1067,34 +1067,34 @@ compute-l2norm@^1.1.0: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== cors@^2.8.5: version "2.8.5" - resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -1102,67 +1102,67 @@ cors@^2.8.5: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== crypt@0.0.2: version "0.0.2" - resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== debug@2.6.9: version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.1.0: version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4: version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" debug@^4.3.4: version "4.3.5" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" decamelize@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deepmerge@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1171,32 +1171,32 @@ define-data-property@^1.1.4: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== destroy@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-libc@^2.0.0, detect-libc@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== diff@^4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== digest-fetch@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" + resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA== dependencies: base-64 "^0.1.0" @@ -1204,7 +1204,7 @@ digest-fetch@^1.3.0: dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" @@ -1213,19 +1213,19 @@ dom-serializer@^2.0.0: domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" domutils@^3.0.1: version "3.1.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" @@ -1234,12 +1234,12 @@ domutils@^3.0.1: dotenv@^16.4.5: version "16.4.5" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== drizzle-kit@^0.22.7: version "0.22.7" - resolved "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.22.7.tgz#4339c3e24c6555ea8cbad605f005b3db3e604a9c" + resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.22.7.tgz#4339c3e24c6555ea8cbad605f005b3db3e604a9c" integrity sha512-9THPCb2l1GPt7wxhws9LvTR0YG565ZlVgTuqGMwjs590Kch1pXu4GyjEArVijSF5m0OBj3qgdeKmuJXhKXgWFw== dependencies: "@esbuild-kit/esm-loader" "^2.5.5" @@ -1248,58 +1248,58 @@ drizzle-kit@^0.22.7: drizzle-orm@^0.31.2: version "0.31.2" - resolved "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.31.2.tgz#221a257dd487bab49ddb88a17bd82388600cf655" + resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.31.2.tgz#221a257dd487bab49ddb88a17bd82388600cf655" integrity sha512-QnenevbnnAzmbNzQwbhklvIYrDE8YER8K7kSrAWQSV1YvFCdSQPzj+jzqRdTSsV2cDqSpQ0NXGyL1G9I43LDLg== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== enabled@2.0.x: version "2.0.0" - resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" entities@^4.2.0, entities@^4.4.0: version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== esbuild-register@^3.5.0: version "3.5.0" - resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz#449613fb29ab94325c722f560f800dd946dc8ea8" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.5.0.tgz#449613fb29ab94325c722f560f800dd946dc8ea8" integrity sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A== dependencies: debug "^4.3.4" esbuild@^0.19.7: version "0.19.12" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== optionalDependencies: "@esbuild/aix-ppc64" "0.19.12" @@ -1328,7 +1328,7 @@ esbuild@^0.19.7: esbuild@~0.18.20: version "0.18.20" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: "@esbuild/android-arm" "0.18.20" @@ -1356,37 +1356,37 @@ esbuild@~0.18.20: escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== etag@~1.8.1: version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter3@^4.0.4: version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== expand-template@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== expr-eval@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" + resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== express@^4.19.2: version "4.19.2" - resolved "https://registry.npmjs.org/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" @@ -1423,36 +1423,36 @@ express@^4.19.2: fast-fifo@^1.1.0, fast-fifo@^1.2.0: version "1.3.2" - resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-xml-parser@^4.3.5: version "4.4.0" - resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" integrity sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg== dependencies: strnum "^1.0.5" fecha@^4.2.0: version "4.2.3" - resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== file-uri-to-path@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" @@ -1465,32 +1465,32 @@ finalhandler@1.2.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatbuffers@^1.12.0: version "1.12.0" - resolved "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz#72e87d1726cb1b216e839ef02658aa87dcef68aa" + resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-1.12.0.tgz#72e87d1726cb1b216e839ef02658aa87dcef68aa" integrity sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ== fn.name@1.x.x: version "1.1.0" - resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.15.6: version "1.15.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== form-data-encoder@1.7.2: version "1.7.2" - resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== form-data@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -1499,7 +1499,7 @@ form-data@^4.0.0: formdata-node@^4.3.2: version "4.4.1" - resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" + resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== dependencies: node-domexception "1.0.0" @@ -1507,32 +1507,32 @@ formdata-node@^4.3.2: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -1543,67 +1543,67 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: get-tsconfig@^4.7.0: version "4.7.5" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== dependencies: resolve-pkg-maps "^1.0.0" github-from-package@0.0.0: version "0.0.0" - resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" gopd@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" guid-typescript@^1.0.9: version "1.0.9" - resolved "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" + resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" integrity sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1: version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== hasown@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" html-to-text@^9.0.5: version "9.0.5" - resolved "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== dependencies: "@selderee/plugin-htmlparser2" "^0.11.0" @@ -1614,7 +1614,7 @@ html-to-text@^9.0.5: htmlparser2@^8.0.2: version "8.0.2" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: domelementtype "^2.3.0" @@ -1624,7 +1624,7 @@ htmlparser2@^8.0.2: http-errors@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -1635,121 +1635,121 @@ http-errors@2.0.0: humanize-ms@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-by-default@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@~1.3.0: version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-any-array@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" + resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-buffer@~1.1.6: version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== js-tiktoken@^1.0.12: version "1.0.12" - resolved "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211" integrity sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ== dependencies: base64-js "^1.5.1" js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: version "1.0.10" - resolved "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" integrity sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA== dependencies: base64-js "^1.5.1" js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsonpointer@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== kuler@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== langchain@0.2.3: version "0.2.3" - resolved "https://registry.npmjs.org/langchain/-/langchain-0.2.3.tgz#c14bb05cf871b21bd63b84b3ab89580b1d62539f" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.2.3.tgz#c14bb05cf871b21bd63b84b3ab89580b1d62539f" integrity sha512-T9xR7zd+Nj0oXy6WoYKmZLy0DlQiDLFPGYWdOXDxy+AvqlujoPdVQgDSpdqiOHvAjezrByAoKxoHCz5XMwTP/Q== dependencies: "@langchain/core" "~0.2.0" @@ -1771,7 +1771,7 @@ langchain@0.2.3: langchain@^0.1.30: version "0.1.30" - resolved "https://registry.npmjs.org/langchain/-/langchain-0.1.30.tgz#e1adb3f1849fcd5c596c668300afd5dc8cb37a97" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.30.tgz#e1adb3f1849fcd5c596c668300afd5dc8cb37a97" integrity sha512-5h/vNMmutQ98tbB0sPDlAileZVca6A2McFgGa3+D56Dm8mSSCzTQL2DngPA6h09DlKDpSr7+6PdFw5Hoj0ZDSw== dependencies: "@anthropic-ai/sdk" "^0.9.1" @@ -1794,12 +1794,12 @@ langchain@^0.1.30: langchainhub@~0.0.8: version "0.0.8" - resolved "https://registry.npmjs.org/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" + resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== langsmith@~0.1.1, langsmith@~0.1.7: version "0.1.14" - resolved "https://registry.npmjs.org/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" integrity sha512-iEzQLLB7/0nRpAwNBAR7B7N64fyByg5UsNjSvLaCCkQ9AS68PSafjB8xQkyI8QXXrGjU1dEqDRoa8m4SUuRdUw== dependencies: "@types/uuid" "^9.0.1" @@ -1810,7 +1810,7 @@ langsmith@~0.1.1, langsmith@~0.1.7: langsmith@~0.1.30: version "0.1.34" - resolved "https://registry.npmjs.org/langsmith/-/langsmith-0.1.34.tgz#801310495fef258ed9c22bb5575120e2c06d51cf" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.34.tgz#801310495fef258ed9c22bb5575120e2c06d51cf" integrity sha512-aMv2k8kEaovhTuZnK6/6DMCoM7Jurvm1AzdESn+yN+HramRxp3sK32jFRz3ogkXP6GjAjOIofcnNkzhHXSUXGA== dependencies: "@types/uuid" "^9.0.1" @@ -1822,17 +1822,17 @@ langsmith@~0.1.30: leac@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== lodash.set@^4.3.2: version "4.3.2" - resolved "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== logform@^2.3.2, logform@^2.4.0: version "2.6.0" - resolved "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== dependencies: "@colors/colors" "1.6.0" @@ -1844,24 +1844,24 @@ logform@^2.3.2, logform@^2.4.0: long@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" make-error@^1.1.1: version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== md5@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== dependencies: charenc "0.0.2" @@ -1870,80 +1870,80 @@ md5@^2.3.0: media-typer@0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== methods@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.3: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" - resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== ml-array-mean@^1.1.6: version "1.1.6" - resolved "https://registry.npmjs.org/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" + resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== dependencies: ml-array-sum "^1.1.6" ml-array-sum@^1.1.6: version "1.1.6" - resolved "https://registry.npmjs.org/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" + resolved "https://registry.yarnpkg.com/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== dependencies: is-any-array "^2.0.0" ml-distance-euclidean@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" + resolved "https://registry.yarnpkg.com/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== ml-distance@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" + resolved "https://registry.yarnpkg.com/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw== dependencies: ml-array-mean "^1.1.6" @@ -1952,7 +1952,7 @@ ml-distance@^4.0.0: ml-tree-similarity@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" + resolved "https://registry.yarnpkg.com/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== dependencies: binary-search "^1.3.5" @@ -1960,66 +1960,66 @@ ml-tree-similarity@^1.0.0: ms@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mustache@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== napi-build-utils@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== node-abi@^3.3.0: version "3.62.0" - resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz#017958ed120f89a3a14a7253da810f5d724e3f36" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.62.0.tgz#017958ed120f89a3a14a7253da810f5d724e3f36" integrity sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g== dependencies: semver "^7.3.5" node-addon-api@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== node-domexception@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-ensure@^0.0.0: version "0.0.0" - resolved "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" + resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== node-fetch@^2.6.7: version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" nodemon@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA== dependencies: chokidar "^3.5.2" @@ -2035,74 +2035,74 @@ nodemon@^3.1.0: nopt@~1.0.10: version "1.0.10" - resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== num-sort@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" + resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== object-assign@^4: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1: version "1.13.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== on-finished@2.4.1: version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" one-time@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== dependencies: fn.name "1.x.x" onnx-proto@^4.0.4: version "4.0.4" - resolved "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz#2431a25bee25148e915906dda0687aafe3b9e044" + resolved "https://registry.yarnpkg.com/onnx-proto/-/onnx-proto-4.0.4.tgz#2431a25bee25148e915906dda0687aafe3b9e044" integrity sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA== dependencies: protobufjs "^6.8.8" onnxruntime-common@~1.14.0: version "1.14.0" - resolved "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz#2bb5dac5261269779aa5fb6536ca379657de8bf6" + resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz#2bb5dac5261269779aa5fb6536ca379657de8bf6" integrity sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew== onnxruntime-node@1.14.0: version "1.14.0" - resolved "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz#c4ae6c355cfae7d83abaf36dd39a905c4a010217" + resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz#c4ae6c355cfae7d83abaf36dd39a905c4a010217" integrity sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w== dependencies: onnxruntime-common "~1.14.0" onnxruntime-web@1.14.0: version "1.14.0" - resolved "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz#c8cee538781b1d4c1c6b043934f4a3e6ddf1466e" + resolved "https://registry.yarnpkg.com/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz#c8cee538781b1d4c1c6b043934f4a3e6ddf1466e" integrity sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw== dependencies: flatbuffers "^1.12.0" @@ -2114,7 +2114,7 @@ onnxruntime-web@1.14.0: openai@^4.26.0: version "4.31.0" - resolved "https://registry.npmjs.org/openai/-/openai-4.31.0.tgz#5d96045c4eb244fa21f0fff0981043a2c9f09e8c" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.31.0.tgz#5d96045c4eb244fa21f0fff0981043a2c9f09e8c" integrity sha512-JebkRnRGEGLnJt3+bJ5B7au8nBeZvJjs9baVxDmUZ5+BgafAdy6KDxJGSuyaw/IA+ErqY3jmOH5cDC2mCDJF2w== dependencies: "@types/node" "^18.11.18" @@ -2129,7 +2129,7 @@ openai@^4.26.0: openai@^4.41.1, openai@^4.49.1: version "4.52.2" - resolved "https://registry.npmjs.org/openai/-/openai-4.52.2.tgz#5d67271f3df84c0b54676b08990eaa9402151759" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.52.2.tgz#5d67271f3df84c0b54676b08990eaa9402151759" integrity sha512-mMc0XgFuVSkcm0lRIi8zaw++otC82ZlfkCur1qguXYWPETr/+ZwL9A/vvp3YahX+shpaT6j03dwsmUyLAfmEfg== dependencies: "@types/node" "^18.11.18" @@ -2143,17 +2143,17 @@ openai@^4.41.1, openai@^4.49.1: openapi-types@^12.1.3: version "12.1.3" - resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-queue@^6.6.2: version "6.6.2" - resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: eventemitter3 "^4.0.4" @@ -2161,7 +2161,7 @@ p-queue@^6.6.2: p-retry@4: version "4.6.2" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: "@types/retry" "0.12.0" @@ -2169,14 +2169,14 @@ p-retry@4: p-timeout@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== dependencies: p-finally "^1.0.0" parseley@^0.12.0: version "0.12.1" - resolved "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== dependencies: leac "^0.6.0" @@ -2184,17 +2184,17 @@ parseley@^0.12.0: parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== pdf-parse@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" + resolved "https://registry.yarnpkg.com/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== dependencies: debug "^3.1.0" @@ -2202,22 +2202,22 @@ pdf-parse@^1.1.1: peberminta@^0.9.0: version "0.9.0" - resolved "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" + resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== platform@^1.3.6: version "1.3.6" - resolved "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== prebuild-install@^7.1.1: version "7.1.2" - resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== dependencies: detect-libc "^2.0.0" @@ -2235,12 +2235,12 @@ prebuild-install@^7.1.1: prettier@^3.2.5: version "3.2.5" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== protobufjs@^6.8.8: version "6.11.4" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== dependencies: "@protobufjs/aspromise" "^1.1.2" @@ -2259,7 +2259,7 @@ protobufjs@^6.8.8: proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -2267,17 +2267,17 @@ proxy-addr@~2.0.7: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pstree.remy@^1.1.8: version "1.1.8" - resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== pump@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -2285,24 +2285,24 @@ pump@^3.0.0: qs@6.11.0: version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" queue-tick@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.5.2: version "2.5.2" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -2312,7 +2312,7 @@ raw-body@2.5.2: rc@^1.2.7: version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -2322,7 +2322,7 @@ rc@^1.2.7: readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -2331,58 +2331,58 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== retry@^0.13.1: version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-stable-stringify@^2.3.1: version "2.4.3" - resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== selderee@^0.11.0: version "0.11.0" - resolved "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== dependencies: parseley "^0.12.0" semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" send@0.18.0: version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" @@ -2401,7 +2401,7 @@ send@0.18.0: serve-static@1.15.0: version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" @@ -2411,7 +2411,7 @@ serve-static@1.15.0: set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -2423,12 +2423,12 @@ set-function-length@^1.2.1: setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sharp@^0.32.0: version "0.32.6" - resolved "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== dependencies: color "^4.2.3" @@ -2442,7 +2442,7 @@ sharp@^0.32.0: side-channel@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -2452,12 +2452,12 @@ side-channel@^1.0.4: simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^4.0.0, simple-get@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: decompress-response "^6.0.0" @@ -2466,21 +2466,21 @@ simple-get@^4.0.0, simple-get@^4.0.1: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" simple-update-notifier@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== dependencies: semver "^7.5.3" source-map-support@^0.5.21: version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -2488,22 +2488,22 @@ source-map-support@^0.5.21: source-map@^0.6.0: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== statuses@2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== streamx@^2.15.0, streamx@^2.16.1: version "2.16.1" - resolved "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== dependencies: fast-fifo "^1.1.0" @@ -2513,31 +2513,31 @@ streamx@^2.15.0, streamx@^2.16.1: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== strnum@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" tar-fs@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" @@ -2547,7 +2547,7 @@ tar-fs@^2.0.0: tar-fs@^3.0.4: version "3.0.6" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== dependencies: pump "^3.0.0" @@ -2558,7 +2558,7 @@ tar-fs@^3.0.4: tar-stream@^2.1.4: version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -2569,7 +2569,7 @@ tar-stream@^2.1.4: tar-stream@^3.1.5: version "3.1.7" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== dependencies: b4a "^1.6.4" @@ -2578,41 +2578,41 @@ tar-stream@^3.1.5: text-hex@1.0.x: version "1.0.0" - resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== touch@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== dependencies: nopt "~1.0.10" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== triple-beam@^1.3.0: version "1.4.1" - resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-node@^10.9.2: version "10.9.2" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -2631,14 +2631,14 @@ ts-node@^10.9.2: tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" type-is@~1.6.18: version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -2646,82 +2646,82 @@ type-is@~1.6.18: typescript@^5.4.3: version "5.4.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== undefsafe@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^10.0.0: version "10.0.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== uuid@^9.0.0: version "9.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== validate.io-array@^1.0.3, validate.io-array@^1.0.5: version "1.0.6" - resolved "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== validate.io-function@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" - resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== web-streams-polyfill@^3.2.1: version "3.3.3" - resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -2729,7 +2729,7 @@ whatwg-url@^5.0.0: winston-transport@^4.7.0: version "4.7.0" - resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== dependencies: logform "^2.3.2" @@ -2738,7 +2738,7 @@ winston-transport@^4.7.0: winston@^3.13.0: version "3.13.0" - resolved "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== dependencies: "@colors/colors" "^1.6.0" @@ -2755,40 +2755,40 @@ winston@^3.13.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@^8.17.1: version "8.17.1" - resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.2.1: version "2.4.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== yn@3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== zod-to-json-schema@^3.22.3: version "3.22.5" - resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== zod-to-json-schema@^3.22.4, zod-to-json-schema@^3.22.5: version "3.23.1" - resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.1.tgz#5225925b8ed5fa20096bd99be076c4b29b53d309" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.23.1.tgz#5225925b8ed5fa20096bd99be076c4b29b53d309" integrity sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw== zod@^3.22.3, zod@^3.22.4: version "3.22.4" - resolved "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== From 8057f28b20a8fcb26f5c546d17bcf316384d219c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 17:07:09 +0530 Subject: [PATCH 063/282] feat(settings): handle no models --- ui/components/SettingsDialog.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/components/SettingsDialog.tsx b/ui/components/SettingsDialog.tsx index 34ef26c..716dd7d 100644 --- a/ui/components/SettingsDialog.tsx +++ b/ui/components/SettingsDialog.tsx @@ -128,7 +128,9 @@ const SettingsDialog = ({ const chatModel = localStorage.getItem('chatModel') || (data.chatModelProviders && - data.chatModelProviders[chatModelProvider]?.[0].name) || + data.chatModelProviders[chatModelProvider]?.length > 0 + ? data.chatModelProviders[chatModelProvider][0].name + : undefined) || ''; const embeddingModelProvider = localStorage.getItem('embeddingModelProvider') || From 4576d3de1334ec14b7688865736e58c4620d06c5 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 17:26:02 +0530 Subject: [PATCH 064/282] feat(dockerfile): update docker image --- .github/workflows/docker-build.yaml | 3 +++ app.dockerfile | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index 3cd9044..f658c29 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -17,6 +17,9 @@ jobs: - name: Checkout code uses: actions/checkout@v3 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 with: diff --git a/app.dockerfile b/app.dockerfile index ff1824d..fb91a54 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,4 +1,4 @@ -FROM node:alpine +FROM node:18-slim ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api @@ -9,7 +9,7 @@ WORKDIR /home/perplexica COPY ui /home/perplexica/ -RUN yarn install --frozen-lockfile +RUN yarn install --frozen-lockfile --network-timeout 600000 RUN yarn build CMD ["yarn", "start"] \ No newline at end of file From c8cd959496fa66a6cd36eb5bb79bad8e17c1c458 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 17:29:26 +0530 Subject: [PATCH 065/282] feat(dockerfile): update backend image --- app.dockerfile | 4 ++-- backend.dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app.dockerfile b/app.dockerfile index fb91a54..ff1824d 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,4 +1,4 @@ -FROM node:18-slim +FROM node:alpine ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api @@ -9,7 +9,7 @@ WORKDIR /home/perplexica COPY ui /home/perplexica/ -RUN yarn install --frozen-lockfile --network-timeout 600000 +RUN yarn install --frozen-lockfile RUN yarn build CMD ["yarn", "start"] \ No newline at end of file diff --git a/backend.dockerfile b/backend.dockerfile index e835b40..87cd21c 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -1,4 +1,4 @@ -FROM node:20-buster +FROM node:18-slim WORKDIR /home/perplexica @@ -10,7 +10,7 @@ COPY yarn.lock /home/perplexica/ RUN mkdir /home/perplexica/data -RUN yarn install --frozen-lockfile +RUN yarn install --frozen-lockfile --network-timeout 600000 RUN yarn build CMD ["yarn", "start"] \ No newline at end of file From dfb532e4d3c293664f6d61cf6ff0e540377226fa Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Oct 2024 18:45:23 +0530 Subject: [PATCH 066/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 48efd23..e449fca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.9.0", + "version": "1.9.1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index 70a144a..7f1255f 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.9.0", + "version": "1.9.1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From 687cbb365fd60d90f9a7b18387c6c03fa9636f17 Mon Sep 17 00:00:00 2001 From: sjiampojamarn <18257803+sjiampojamarn@users.noreply.github.com> Date: Sun, 20 Oct 2024 17:00:20 -0700 Subject: [PATCH 067/282] Discover link to new page --- ui/app/discover/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/app/discover/page.tsx b/ui/app/discover/page.tsx index 7788d0d..eb94040 100644 --- a/ui/app/discover/page.tsx +++ b/ui/app/discover/page.tsx @@ -83,6 +83,7 @@ const Page = () => { href={`/?q=Summary: ${item.url}`} key={i} className="max-w-sm rounded-lg overflow-hidden bg-light-secondary dark:bg-dark-secondary hover:-translate-y-[1px] transition duration-200" + target="_blank" > <img className="object-cover w-full aspect-video" From 03d0ff2ca41f2e9ad8c0ae606b1136860fedbc9c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Oct 2024 19:59:58 +0530 Subject: [PATCH 068/282] feat(navbar): make delete & plus button work --- ui/components/ChatWindow.tsx | 2 +- ui/components/DeleteChat.tsx | 9 +++++++++ ui/components/Navbar.tsx | 24 +++++++++++++++++------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 986f8ae..7b2ce88 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -503,7 +503,7 @@ const ChatWindow = ({ id }: { id?: string }) => { <div> {messages.length > 0 ? ( <> - <Navbar messages={messages} /> + <Navbar chatId={chatId!} messages={messages} /> <Chat loading={loading} messages={messages} diff --git a/ui/components/DeleteChat.tsx b/ui/components/DeleteChat.tsx index f981e32..984db70 100644 --- a/ui/components/DeleteChat.tsx +++ b/ui/components/DeleteChat.tsx @@ -11,19 +11,24 @@ import { import { Fragment, useState } from 'react'; import { toast } from 'sonner'; import { Chat } from '@/app/library/page'; +import { useRouter } from 'next/navigation'; const DeleteChat = ({ chatId, chats, setChats, + redirect = false, }: { chatId: string; chats: Chat[]; setChats: (chats: Chat[]) => void; + redirect?: boolean; }) => { const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false); const [loading, setLoading] = useState(false); + const router = useRouter(); + const handleDelete = async () => { setLoading(true); try { @@ -44,6 +49,10 @@ const DeleteChat = ({ const newChats = chats.filter((chat) => chat.id !== chatId); setChats(newChats); + + if (redirect) { + router.push('/'); + } } catch (err: any) { toast.error(err.message); } finally { diff --git a/ui/components/Navbar.tsx b/ui/components/Navbar.tsx index 020dfb4..ca57a8b 100644 --- a/ui/components/Navbar.tsx +++ b/ui/components/Navbar.tsx @@ -2,8 +2,15 @@ import { Clock, Edit, Share, Trash } from 'lucide-react'; import { Message } from './ChatWindow'; import { useEffect, useState } from 'react'; import { formatTimeDifference } from '@/lib/utils'; +import DeleteChat from './DeleteChat'; -const Navbar = ({ messages }: { messages: Message[] }) => { +const Navbar = ({ + chatId, + messages, +}: { + messages: Message[]; + chatId: string; +}) => { const [title, setTitle] = useState<string>(''); const [timeAgo, setTimeAgo] = useState<string>(''); @@ -39,10 +46,12 @@ const Navbar = ({ messages }: { messages: Message[] }) => { return ( <div className="fixed z-40 top-0 left-0 right-0 px-4 lg:pl-[104px] lg:pr-6 lg:px-8 flex flex-row items-center justify-between w-full py-4 text-sm text-black dark:text-white/70 border-b bg-light-primary dark:bg-dark-primary border-light-100 dark:border-dark-200"> - <Edit - size={17} + <a + href="/" className="active:scale-95 transition duration-100 cursor-pointer lg:hidden" - /> + > + <Edit size={17} /> + </a> <div className="hidden lg:flex flex-row items-center justify-center space-x-2"> <Clock size={17} /> <p className="text-xs">{timeAgo} ago</p> @@ -54,10 +63,11 @@ const Navbar = ({ messages }: { messages: Message[] }) => { size={17} className="active:scale-95 transition duration-100 cursor-pointer" /> - <Trash + {/* <Trash size={17} - className="text-red-400 active:scale-95 transition duration-100 cursor-pointer" - /> + className='text-red-400 active:scale-95 transition duration-100 cursor-pointer' + /> */} + <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} /> </div> </div> ); From b33e5fefba5a120288abea2f205ccb6757b30ca9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:00:31 +0530 Subject: [PATCH 069/282] feat(navbar): remove comments --- ui/components/Navbar.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/components/Navbar.tsx b/ui/components/Navbar.tsx index ca57a8b..13f2da3 100644 --- a/ui/components/Navbar.tsx +++ b/ui/components/Navbar.tsx @@ -63,10 +63,6 @@ const Navbar = ({ size={17} className="active:scale-95 transition duration-100 cursor-pointer" /> - {/* <Trash - size={17} - className='text-red-400 active:scale-95 transition duration-100 cursor-pointer' - /> */} <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} /> </div> </div> From f1c0b5435b65c4c19b22a976b9cc686100458e07 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 30 Oct 2024 09:11:48 +0530 Subject: [PATCH 070/282] feat(delete-chat): use `window.location` to refresh page --- ui/components/DeleteChat.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ui/components/DeleteChat.tsx b/ui/components/DeleteChat.tsx index 984db70..2857fc8 100644 --- a/ui/components/DeleteChat.tsx +++ b/ui/components/DeleteChat.tsx @@ -11,7 +11,6 @@ import { import { Fragment, useState } from 'react'; import { toast } from 'sonner'; import { Chat } from '@/app/library/page'; -import { useRouter } from 'next/navigation'; const DeleteChat = ({ chatId, @@ -27,8 +26,6 @@ const DeleteChat = ({ const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false); const [loading, setLoading] = useState(false); - const router = useRouter(); - const handleDelete = async () => { setLoading(true); try { @@ -51,7 +48,7 @@ const DeleteChat = ({ setChats(newChats); if (redirect) { - router.push('/'); + window.location.href = '/'; } } catch (err: any) { toast.error(err.message); From 540f38ae6841860d30fbc55faa8ea5677b44f550 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 30 Oct 2024 09:14:09 +0530 Subject: [PATCH 071/282] feat(empty-chat): add settings for mobile --- ui/components/ChatWindow.tsx | 1 + ui/components/EmptyChat.tsx | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 7b2ce88..f9bd583 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -318,6 +318,7 @@ const ChatWindow = ({ id }: { id?: string }) => { console.log('[DEBUG] closed'); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const messagesRef = useRef<Message[]>([]); diff --git a/ui/components/EmptyChat.tsx b/ui/components/EmptyChat.tsx index 63f186c..6b2412b 100644 --- a/ui/components/EmptyChat.tsx +++ b/ui/components/EmptyChat.tsx @@ -1,4 +1,7 @@ +import { Settings } from 'lucide-react'; import EmptyChatMessageInput from './EmptyChatMessageInput'; +import SettingsDialog from './SettingsDialog'; +import { useState } from 'react'; const EmptyChat = ({ sendMessage, @@ -13,8 +16,17 @@ const EmptyChat = ({ optimizationMode: string; setOptimizationMode: (mode: string) => void; }) => { + const [isSettingsOpen, setIsSettingsOpen] = useState(false); + return ( <div className="relative"> + <SettingsDialog isOpen={isSettingsOpen} setIsOpen={setIsSettingsOpen} /> + <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5"> + <Settings + className="cursor-pointer lg:hidden" + onClick={() => setIsSettingsOpen(true)} + /> + </div> <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-8"> <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> Research begins here. From 7c6ee2ead1ee0489ffdfaf6ca04e31ddc7ff20d9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:28:31 +0530 Subject: [PATCH 072/282] feat(video-search): handle custom OpenAI --- src/routes/videos.ts | 62 ++++++++++++++++++++++++++++------ ui/components/MessageBox.tsx | 4 +-- ui/components/SearchImages.tsx | 19 ++++++++--- ui/components/SearchVideos.tsx | 19 ++++++++--- ui/lib/actions.ts | 15 ++++++-- 5 files changed, 94 insertions(+), 25 deletions(-) diff --git a/src/routes/videos.ts b/src/routes/videos.ts index 9d43fd2..a2555f5 100644 --- a/src/routes/videos.ts +++ b/src/routes/videos.ts @@ -4,14 +4,28 @@ import { getAvailableChatModelProviders } from '../lib/providers'; import { HumanMessage, AIMessage } from '@langchain/core/messages'; import logger from '../utils/logger'; import handleVideoSearch from '../agents/videoSearchAgent'; +import { ChatOpenAI } from '@langchain/openai'; const router = express.Router(); +interface ChatModel { + provider: string; + model: string; + customOpenAIBaseURL?: string; + customOpenAIKey?: string; +} + +interface VideoSearchBody { + query: string; + chatHistory: any[]; + chatModel?: ChatModel; +} + router.post('/', async (req, res) => { try { - let { query, chat_history, chat_model_provider, chat_model } = req.body; + let body: VideoSearchBody = req.body; - chat_history = chat_history.map((msg: any) => { + const chatHistory = body.chatHistory.map((msg: any) => { if (msg.role === 'user') { return new HumanMessage(msg.content); } else if (msg.role === 'assistant') { @@ -19,22 +33,50 @@ router.post('/', async (req, res) => { } }); - const chatModels = await getAvailableChatModelProviders(); - const provider = chat_model_provider ?? Object.keys(chatModels)[0]; - const chatModel = chat_model ?? Object.keys(chatModels[provider])[0]; + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + body.chatModel?.provider || Object.keys(chatModelProviders)[0]; + const chatModel = + body.chatModel?.model || + Object.keys(chatModelProviders[chatModelProvider])[0]; let llm: BaseChatModel | undefined; - if (chatModels[provider] && chatModels[provider][chatModel]) { - llm = chatModels[provider][chatModel].model as BaseChatModel | undefined; + if (body.chatModel?.provider === 'custom_openai') { + if ( + !body.chatModel?.customOpenAIBaseURL || + !body.chatModel?.customOpenAIKey + ) { + return res + .status(400) + .json({ message: 'Missing custom OpenAI base URL or key' }); + } + + llm = new ChatOpenAI({ + modelName: body.chatModel.model, + openAIApiKey: body.chatModel.customOpenAIKey, + temperature: 0.7, + configuration: { + baseURL: body.chatModel.customOpenAIBaseURL, + }, + }) as unknown as BaseChatModel; + } else if ( + chatModelProviders[chatModelProvider] && + chatModelProviders[chatModelProvider][chatModel] + ) { + llm = chatModelProviders[chatModelProvider][chatModel] + .model as unknown as BaseChatModel | undefined; } if (!llm) { - res.status(500).json({ message: 'Invalid LLM model selected' }); - return; + return res.status(400).json({ message: 'Invalid model selected' }); } - const videos = await handleVideoSearch({ chat_history, query }, llm); + const videos = await handleVideoSearch( + { chat_history: chatHistory, query: body.query }, + llm, + ); res.status(200).json({ videos }); } catch (err) { diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index b111088..5222c7c 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -186,10 +186,10 @@ const MessageBox = ({ <div className="lg:sticky lg:top-20 flex flex-col items-center space-y-3 w-full lg:w-3/12 z-30 h-full pb-4"> <SearchImages query={history[messageIndex - 1].content} - chat_history={history.slice(0, messageIndex - 1)} + chatHistory={history.slice(0, messageIndex - 1)} /> <SearchVideos - chat_history={history.slice(0, messageIndex - 1)} + chatHistory={history.slice(0, messageIndex - 1)} query={history[messageIndex - 1].content} /> </div> diff --git a/ui/components/SearchImages.tsx b/ui/components/SearchImages.tsx index 6025925..b083af7 100644 --- a/ui/components/SearchImages.tsx +++ b/ui/components/SearchImages.tsx @@ -13,10 +13,10 @@ type Image = { const SearchImages = ({ query, - chat_history, + chatHistory, }: { query: string; - chat_history: Message[]; + chatHistory: Message[]; }) => { const [images, setImages] = useState<Image[] | null>(null); const [loading, setLoading] = useState(false); @@ -33,6 +33,9 @@ const SearchImages = ({ const chatModelProvider = localStorage.getItem('chatModelProvider'); const chatModel = localStorage.getItem('chatModel'); + const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); + const customOpenAIKey = localStorage.getItem('openAIApiKey'); + const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/images`, { @@ -42,9 +45,15 @@ const SearchImages = ({ }, body: JSON.stringify({ query: query, - chat_history: chat_history, - chat_model_provider: chatModelProvider, - chat_model: chatModel, + chatHistory: chatHistory, + chatModel: { + provider: chatModelProvider, + model: chatModel, + ...(chatModelProvider === 'custom_openai' && { + customOpenAIBaseURL: customOpenAIBaseURL, + customOpenAIKey: customOpenAIKey, + }), + }, }), }, ); diff --git a/ui/components/SearchVideos.tsx b/ui/components/SearchVideos.tsx index fec229c..2d820ef 100644 --- a/ui/components/SearchVideos.tsx +++ b/ui/components/SearchVideos.tsx @@ -26,10 +26,10 @@ declare module 'yet-another-react-lightbox' { const Searchvideos = ({ query, - chat_history, + chatHistory, }: { query: string; - chat_history: Message[]; + chatHistory: Message[]; }) => { const [videos, setVideos] = useState<Video[] | null>(null); const [loading, setLoading] = useState(false); @@ -46,6 +46,9 @@ const Searchvideos = ({ const chatModelProvider = localStorage.getItem('chatModelProvider'); const chatModel = localStorage.getItem('chatModel'); + const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); + const customOpenAIKey = localStorage.getItem('openAIApiKey'); + const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/videos`, { @@ -55,9 +58,15 @@ const Searchvideos = ({ }, body: JSON.stringify({ query: query, - chat_history: chat_history, - chat_model_provider: chatModelProvider, - chat_model: chatModel, + chatHistory: chatHistory, + chatModel: { + provider: chatModelProvider, + model: chatModel, + ...(chatModelProvider === 'custom_openai' && { + customOpenAIBaseURL: customOpenAIBaseURL, + customOpenAIKey: customOpenAIKey, + }), + }, }), }, ); diff --git a/ui/lib/actions.ts b/ui/lib/actions.ts index d7eb71f..a4409b0 100644 --- a/ui/lib/actions.ts +++ b/ui/lib/actions.ts @@ -4,15 +4,24 @@ export const getSuggestions = async (chatHisory: Message[]) => { const chatModel = localStorage.getItem('chatModel'); const chatModelProvider = localStorage.getItem('chatModelProvider'); + const customOpenAIKey = localStorage.getItem('openAIApiKey'); + const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/suggestions`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ - chat_history: chatHisory, - chat_model: chatModel, - chat_model_provider: chatModelProvider, + chatHistory: chatHisory, + chatModel: { + provider: chatModelProvider, + model: chatModel, + ...(chatModelProvider === 'custom_openai' && { + customOpenAIKey, + customOpenAIBaseURL, + }), + }, }), }); From 3e7645614f1262c7584294c35cbd3880a474dbdc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:28:40 +0530 Subject: [PATCH 073/282] feat(image-search): handle custom OpenAI --- src/routes/images.ts | 62 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 10 deletions(-) diff --git a/src/routes/images.ts b/src/routes/images.ts index 7806ce7..c54dc40 100644 --- a/src/routes/images.ts +++ b/src/routes/images.ts @@ -4,14 +4,28 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { getAvailableChatModelProviders } from '../lib/providers'; import { HumanMessage, AIMessage } from '@langchain/core/messages'; import logger from '../utils/logger'; +import { ChatOpenAI } from '@langchain/openai'; const router = express.Router(); +interface ChatModel { + provider: string; + model: string; + customOpenAIBaseURL?: string; + customOpenAIKey?: string; +} + +interface ImageSearchBody { + query: string; + chatHistory: any[]; + chatModel?: ChatModel; +} + router.post('/', async (req, res) => { try { - let { query, chat_history, chat_model_provider, chat_model } = req.body; + let body: ImageSearchBody = req.body; - chat_history = chat_history.map((msg: any) => { + const chatHistory = body.chatHistory.map((msg: any) => { if (msg.role === 'user') { return new HumanMessage(msg.content); } else if (msg.role === 'assistant') { @@ -19,22 +33,50 @@ router.post('/', async (req, res) => { } }); - const chatModels = await getAvailableChatModelProviders(); - const provider = chat_model_provider ?? Object.keys(chatModels)[0]; - const chatModel = chat_model ?? Object.keys(chatModels[provider])[0]; + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + body.chatModel?.provider || Object.keys(chatModelProviders)[0]; + const chatModel = + body.chatModel?.model || + Object.keys(chatModelProviders[chatModelProvider])[0]; let llm: BaseChatModel | undefined; - if (chatModels[provider] && chatModels[provider][chatModel]) { - llm = chatModels[provider][chatModel].model as BaseChatModel | undefined; + if (body.chatModel?.provider === 'custom_openai') { + if ( + !body.chatModel?.customOpenAIBaseURL || + !body.chatModel?.customOpenAIKey + ) { + return res + .status(400) + .json({ message: 'Missing custom OpenAI base URL or key' }); + } + + llm = new ChatOpenAI({ + modelName: body.chatModel.model, + openAIApiKey: body.chatModel.customOpenAIKey, + temperature: 0.7, + configuration: { + baseURL: body.chatModel.customOpenAIBaseURL, + }, + }) as unknown as BaseChatModel; + } else if ( + chatModelProviders[chatModelProvider] && + chatModelProviders[chatModelProvider][chatModel] + ) { + llm = chatModelProviders[chatModelProvider][chatModel] + .model as unknown as BaseChatModel | undefined; } if (!llm) { - res.status(500).json({ message: 'Invalid LLM model selected' }); - return; + return res.status(400).json({ message: 'Invalid model selected' }); } - const images = await handleImageSearch({ query, chat_history }, llm); + const images = await handleImageSearch( + { query: body.query, chat_history: chatHistory }, + llm, + ); res.status(200).json({ images }); } catch (err) { From 65d057a05ec24ae717e97347d9dee4544c2273e1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:29:06 +0530 Subject: [PATCH 074/282] feat(suggestions): handle custom OpenAI --- src/routes/suggestions.ts | 61 ++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/src/routes/suggestions.ts b/src/routes/suggestions.ts index a75657e..e997b1e 100644 --- a/src/routes/suggestions.ts +++ b/src/routes/suggestions.ts @@ -4,14 +4,27 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { getAvailableChatModelProviders } from '../lib/providers'; import { HumanMessage, AIMessage } from '@langchain/core/messages'; import logger from '../utils/logger'; +import { ChatOpenAI } from '@langchain/openai'; const router = express.Router(); +interface ChatModel { + provider: string; + model: string; + customOpenAIBaseURL?: string; + customOpenAIKey?: string; +} + +interface SuggestionsBody { + chatHistory: any[]; + chatModel?: ChatModel; +} + router.post('/', async (req, res) => { try { - let { chat_history, chat_model, chat_model_provider } = req.body; + let body: SuggestionsBody = req.body; - chat_history = chat_history.map((msg: any) => { + const chatHistory = body.chatHistory.map((msg: any) => { if (msg.role === 'user') { return new HumanMessage(msg.content); } else if (msg.role === 'assistant') { @@ -19,22 +32,50 @@ router.post('/', async (req, res) => { } }); - const chatModels = await getAvailableChatModelProviders(); - const provider = chat_model_provider ?? Object.keys(chatModels)[0]; - const chatModel = chat_model ?? Object.keys(chatModels[provider])[0]; + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + body.chatModel?.provider || Object.keys(chatModelProviders)[0]; + const chatModel = + body.chatModel?.model || + Object.keys(chatModelProviders[chatModelProvider])[0]; let llm: BaseChatModel | undefined; - if (chatModels[provider] && chatModels[provider][chatModel]) { - llm = chatModels[provider][chatModel].model as BaseChatModel | undefined; + if (body.chatModel?.provider === 'custom_openai') { + if ( + !body.chatModel?.customOpenAIBaseURL || + !body.chatModel?.customOpenAIKey + ) { + return res + .status(400) + .json({ message: 'Missing custom OpenAI base URL or key' }); + } + + llm = new ChatOpenAI({ + modelName: body.chatModel.model, + openAIApiKey: body.chatModel.customOpenAIKey, + temperature: 0.7, + configuration: { + baseURL: body.chatModel.customOpenAIBaseURL, + }, + }) as unknown as BaseChatModel; + } else if ( + chatModelProviders[chatModelProvider] && + chatModelProviders[chatModelProvider][chatModel] + ) { + llm = chatModelProviders[chatModelProvider][chatModel] + .model as unknown as BaseChatModel | undefined; } if (!llm) { - res.status(500).json({ message: 'Invalid LLM model selected' }); - return; + return res.status(400).json({ message: 'Invalid model selected' }); } - const suggestions = await generateSuggestions({ chat_history }, llm); + const suggestions = await generateSuggestions( + { chat_history: chatHistory }, + llm, + ); res.status(200).json({ suggestions: suggestions }); } catch (err) { From 012dfa5a74515a309da05c5b86ecb4b28c0d48ab Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:29:21 +0530 Subject: [PATCH 075/282] feat(listLineOutputParser): handle unclosed tags --- src/lib/outputParsers/listLineOutputParser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/outputParsers/listLineOutputParser.ts b/src/lib/outputParsers/listLineOutputParser.ts index 1e2f0f5..fcd2f07 100644 --- a/src/lib/outputParsers/listLineOutputParser.ts +++ b/src/lib/outputParsers/listLineOutputParser.ts @@ -23,7 +23,7 @@ class LineListOutputParser extends BaseOutputParser<string[]> { const startKeyIndex = text.indexOf(`<${this.key}>`); const endKeyIndex = text.indexOf(`</${this.key}>`); - if (startKeyIndex === -1 || endKeyIndex === -1) { + if (startKeyIndex === -1 && endKeyIndex === -1) { return []; } From 1e99fe8d697b0f77d74f875df925873e1da07520 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 31 Oct 2024 11:08:49 +0530 Subject: [PATCH 076/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e449fca..d84e1a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.9.1", + "version": "1.9.2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index 7f1255f..c5cce51 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.9.1", + "version": "1.9.2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From afb4786ac0088844b910e7e9f0957a4c2e3c3b46 Mon Sep 17 00:00:00 2001 From: litc0de <litc0de@posteo.org> Date: Sun, 3 Nov 2024 10:33:01 +0100 Subject: [PATCH 077/282] add db setup to CONTRIBUTING.md --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c779f91..73256bd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,7 +18,8 @@ Before diving into coding, setting up your local environment is key. Here's what 1. In the root directory, locate the `sample.config.toml` file. 2. Rename it to `config.toml` and fill in the necessary configuration fields specific to the backend. 3. Run `npm install` to install dependencies. -4. Use `npm run dev` to start the backend in development mode. +4. Run `npm run db:push` to set up the local sqlite. +5. Use `npm run dev` to start the backend in development mode. ### Frontend From 7c01d2656ea834fdafe66d62d24d772810e6c8b3 Mon Sep 17 00:00:00 2001 From: Sharun <sharun@sharunkumar.com> Date: Mon, 4 Nov 2024 22:00:08 -0600 Subject: [PATCH 078/282] fix(EmptyChatMessageInput): focus on mount --- ui/components/EmptyChatMessageInput.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index 845bed9..42ad917 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -40,6 +40,8 @@ const EmptyChatMessageInput = ({ document.addEventListener('keydown', handleKeyDown); + inputRef.current?.focus(); + return () => { document.removeEventListener('keydown', handleKeyDown); }; From a1a7470ca6b43cc66677c9119505c0cf901207bf Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 14 Nov 2024 13:35:10 +0530 Subject: [PATCH 079/282] feat(package): update `markdown-to-jsx` --- ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package.json b/ui/package.json index c5cce51..098926a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -18,7 +18,7 @@ "clsx": "^2.1.0", "langchain": "^0.1.30", "lucide-react": "^0.363.0", - "markdown-to-jsx": "^7.4.5", + "markdown-to-jsx": "^7.6.2", "next": "14.1.4", "next-themes": "^0.3.0", "react": "^18", diff --git a/ui/yarn.lock b/ui/yarn.lock index fad2596..550a20c 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2210,10 +2210,10 @@ lucide-react@^0.363.0: resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== -markdown-to-jsx@^7.4.5: - version "7.4.6" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.4.6.tgz#1ea0018c549bf00c9ce35e8f4ea57e48028d9cf7" - integrity sha512-3cyNxI/PwotvYkjg6KmFaN1uyN/7NqETteD2DobBB8ro/FR9jsHIh4Fi7ywAz0s9QHRKCmGlOUggs5GxSWACKA== +markdown-to-jsx@^7.6.2: + version "7.6.2" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.6.2.tgz#254cbf7d412a37073486c0a2dd52266d2191a793" + integrity sha512-gEcyiJXzBxmId2Y/kydLbD6KRNccDiUy/Src1cFGn3s2X0LZZ/hUiEc2VisFyA5kUE3SXclTCczjQiAuqKZiFQ== md5@^2.3.0: version "2.3.0" From f3e918c3e39debf7310a052799d6f1ae41f7b5f0 Mon Sep 17 00:00:00 2001 From: Damien Laureaux <d.laureaux@timoa.com> Date: Fri, 15 Nov 2024 07:04:45 +0100 Subject: [PATCH 080/282] chore(docs): fix Markdown lint issues in the docs --- docs/API/SEARCH.md | 34 ++++++------- docs/architecture/README.md | 2 +- docs/architecture/WORKING.md | 6 +-- docs/installation/NETWORKING.md | 90 ++++++++++++++++----------------- docs/installation/UPDATING.md | 24 ++++----- 5 files changed, 78 insertions(+), 78 deletions(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index f87e788..9405bc5 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -79,24 +79,24 @@ The response from the API includes both the final message and the sources used t ```json { - "message": "Perplexica is an innovative, open-source AI-powered search engine designed to enhance the way users search for information online. Here are some key features and characteristics of Perplexica:\n\n- **AI-Powered Technology**: It utilizes advanced machine learning algorithms to not only retrieve information but also to understand the context and intent behind user queries, providing more relevant results [1][5].\n\n- **Open-Source**: Being open-source, Perplexica offers flexibility and transparency, allowing users to explore its functionalities without the constraints of proprietary software [3][10].", - "sources": [ - { - "pageContent": "Perplexica is an innovative, open-source AI-powered search engine designed to enhance the way users search for information online.", - "metadata": { - "title": "What is Perplexica, and how does it function as an AI-powered search ...", - "url": "https://askai.glarity.app/search/What-is-Perplexica--and-how-does-it-function-as-an-AI-powered-search-engine" - } - }, - { - "pageContent": "Perplexica is an open-source AI-powered search tool that dives deep into the internet to find precise answers.", - "metadata": { - "title": "Sahar Mor's Post", - "url": "https://www.linkedin.com/posts/sahar-mor_a-new-open-source-project-called-perplexica-activity-7204489745668694016-ncja" - } - } + "message": "Perplexica is an innovative, open-source AI-powered search engine designed to enhance the way users search for information online. Here are some key features and characteristics of Perplexica:\n\n- **AI-Powered Technology**: It utilizes advanced machine learning algorithms to not only retrieve information but also to understand the context and intent behind user queries, providing more relevant results [1][5].\n\n- **Open-Source**: Being open-source, Perplexica offers flexibility and transparency, allowing users to explore its functionalities without the constraints of proprietary software [3][10].", + "sources": [ + { + "pageContent": "Perplexica is an innovative, open-source AI-powered search engine designed to enhance the way users search for information online.", + "metadata": { + "title": "What is Perplexica, and how does it function as an AI-powered search ...", + "url": "https://askai.glarity.app/search/What-is-Perplexica--and-how-does-it-function-as-an-AI-powered-search-engine" + } + }, + { + "pageContent": "Perplexica is an open-source AI-powered search tool that dives deep into the internet to find precise answers.", + "metadata": { + "title": "Sahar Mor's Post", + "url": "https://www.linkedin.com/posts/sahar-mor_a-new-open-source-project-called-perplexica-activity-7204489745668694016-ncja" + } + } .... - ] + ] } ``` diff --git a/docs/architecture/README.md b/docs/architecture/README.md index b1fcfcb..5732471 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -1,4 +1,4 @@ -## Perplexica's Architecture +# Perplexica's Architecture Perplexica's architecture consists of the following key components: diff --git a/docs/architecture/WORKING.md b/docs/architecture/WORKING.md index e39de7a..75b20fd 100644 --- a/docs/architecture/WORKING.md +++ b/docs/architecture/WORKING.md @@ -1,4 +1,4 @@ -## How does Perplexica work? +# How does Perplexica work? Curious about how Perplexica works? Don't worry, we'll cover it here. Before we begin, make sure you've read about the architecture of Perplexica to ensure you understand what it's made up of. Haven't read it? You can read it [here](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/architecture/README.md). @@ -10,10 +10,10 @@ We'll understand how Perplexica works by taking an example of a scenario where a 4. After the information is retrieved, it is based on keyword-based search. We then convert the information into embeddings and the query as well, then we perform a similarity search to find the most relevant sources to answer the query. 5. After all this is done, the sources are passed to the response generator. This chain takes all the chat history, the query, and the sources. It generates a response that is streamed to the UI. -### How are the answers cited? +## How are the answers cited? The LLMs are prompted to do so. We've prompted them so well that they cite the answers themselves, and using some UI magic, we display it to the user. -### Image and Video Search +## Image and Video Search Image and video searches are conducted in a similar manner. A query is always generated first, then we search the web for images and videos that match the query. These results are then returned to the user. diff --git a/docs/installation/NETWORKING.md b/docs/installation/NETWORKING.md index baad296..6cb9bfe 100644 --- a/docs/installation/NETWORKING.md +++ b/docs/installation/NETWORKING.md @@ -10,27 +10,27 @@ This guide will show you how to make Perplexica available over a network. Follow 3. Stop and remove the existing Perplexica containers and images: -``` -docker compose down --rmi all -``` + ```bash + docker compose down --rmi all + ``` 4. Open the `docker-compose.yaml` file in a text editor like Notepad++ 5. Replace `127.0.0.1` with the IP address of the server Perplexica is running on in these two lines: -``` -args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 -``` + ```bash + args: + - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api + - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 + ``` 6. Save and close the `docker-compose.yaml` file 7. Rebuild and restart the Perplexica container: -``` -docker compose up -d --build -``` + ```bash + docker compose up -d --build + ``` ## macOS @@ -38,37 +38,37 @@ docker compose up -d --build 2. Navigate to the directory with the `docker-compose.yaml` file: -``` -cd /path/to/docker-compose.yaml -``` + ```bash + cd /path/to/docker-compose.yaml + ``` 3. Stop and remove existing containers and images: -``` -docker compose down --rmi all -``` + ```bash + docker compose down --rmi all + ``` 4. Open `docker-compose.yaml` in a text editor like Sublime Text: -``` -nano docker-compose.yaml -``` + ```bash + nano docker-compose.yaml + ``` 5. Replace `127.0.0.1` with the server IP in these lines: -``` -args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 -``` + ```bash + args: + - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api + - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 + ``` 6. Save and exit the editor 7. Rebuild and restart Perplexica: -``` -docker compose up -d --build -``` + ```bash + docker compose up -d --build + ``` ## Linux @@ -76,34 +76,34 @@ docker compose up -d --build 2. Navigate to the `docker-compose.yaml` directory: -``` -cd /path/to/docker-compose.yaml -``` + ```bash + cd /path/to/docker-compose.yaml + ``` 3. Stop and remove containers and images: -``` -docker compose down --rmi all -``` + ```bash + docker compose down --rmi all + ``` 4. Edit `docker-compose.yaml`: -``` -nano docker-compose.yaml -``` + ```bash + nano docker-compose.yaml + ``` 5. Replace `127.0.0.1` with the server IP: -``` -args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 -``` + ```bash + args: + - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api + - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 + ``` 6. Save and exit the editor 7. Rebuild and restart Perplexica: -``` -docker compose up -d --build -``` + ```bash + docker compose up -d --build + ``` diff --git a/docs/installation/UPDATING.md b/docs/installation/UPDATING.md index 031a3e8..b41b05a 100644 --- a/docs/installation/UPDATING.md +++ b/docs/installation/UPDATING.md @@ -6,23 +6,23 @@ To update Perplexica to the latest version, follow these steps: 1. Clone the latest version of Perplexica from GitHub: -```bash - git clone https://github.com/ItzCrazyKns/Perplexica.git -``` + ```bash + git clone https://github.com/ItzCrazyKns/Perplexica.git + ``` 2. Navigate to the Project Directory. 3. Pull latest images from registry. -```bash -docker compose pull -``` + ```bash + docker compose pull + ``` 4. Update and Recreate containers. -```bash -docker compose up -d -``` + ```bash + docker compose up -d + ``` 5. Once the command completes running go to http://localhost:3000 and verify the latest changes. @@ -30,9 +30,9 @@ docker compose up -d 1. Clone the latest version of Perplexica from GitHub: -```bash - git clone https://github.com/ItzCrazyKns/Perplexica.git -``` + ```bash + git clone https://github.com/ItzCrazyKns/Perplexica.git + ``` 2. Navigate to the Project Directory 3. Execute `npm i` in both the `ui` folder and the root directory. From d789c970b197c13048dfdaf70dc490a1ccc565f1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:55:57 +0530 Subject: [PATCH 081/282] feat(assets): update screenshot --- .assets/perplexica-screenshot.png | Bin 154752 -> 656226 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.assets/perplexica-screenshot.png b/.assets/perplexica-screenshot.png index c47a544f3b656f0af1e3c2036a3318683edd0bb0..fc7a697b9b0a34990903d18109eef121e360c524 100644 GIT binary patch literal 656226 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⪙fjcm_~?YyLYM8?4*#6f7kRv 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ΞdkeWUbTYl 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%0AO7xco7~5!W58jP8&2q+%<Ctt?6i9{llTq#>y> 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 W<cEf9nWzJLp2jMol^EI!j}KLJRO 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 !qrFo^^Ssz&LK~C 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"?&=<VLacoJzkHRH6LISb<KT$Rribt~C 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 K%4Kj%|Nj6Vu-J(J literal 154752 zcmeFZ^;etE);12MSn=X+MT)yi@#5|drMMLfPO;!AMOz$7ad$5g+}%C61P}hD=X1_^ zo<HFG!@J(~&RR*<oy<L%*|YcTYhSbHj#N{T!+1mT1`ZAmL;j<*1{@qBB^=zVuP8__ z->kk_Hh=kmchiuQgexB<+kd%uZ7rcJ0S8wFLVGYre7Qz-`Ka#(2Z!1H_XXeQT=)qN z?m1sxT0#q8a<qbMrggP}3_U$g+OFou{yZNa6wH_{K*S`VUKmx&sDNLj&1`@+%~XCa zXIG_VAZ=J!$XJMu%=P-mS1RVx&~I(*1IJg-kE`TF*sls*1H>;Iy-ru#ZhSj#3R9c| zr0{WZabIU7FCAmD<NT*g+-d-`A|w7&+BMNB|9e#^!{PUi=HDfkpc5MZpK1{Xue;^` z^9zj~&i@HF<#7H`n(7*If77u>X>w=FMH0I=TSm&o%^jbZ__|^at!0HGAmu*;2q>jj zNskcqy=L@QQJgB8Y2<j1N*o_=!%Bg%nOc6zNT><!>3QA#(ptk3`Ach&adEwl4J+Zy z6|EZH#-^rN2?MV)RDi}Up5_DJ>E_#f8_p?SL^`2rd=tMlftAMLyzh1PNRNZy)b=X* zIJ)v&4KU-i-om<tl`ky2yn;0^f;HqBru%Y>dNk~+A~2RA%kQoIY-#7?&DvUS?0}H0 z+*Tf`Q;>EARt3D@SGa%%C-SGX6hf1W5l%mcUR6%N#4<9<0GRpo^t9PRwbgvR<5J|s z-f|OnI684KJOYy0)59$c+KrWTH9{H`8Q6rHF}#uT1{t&UMqsBDH+n#d^J$fNTvP#B zu2Z2^$d~S1iu5r;xu+B{Qcu*ABspvj`(-p(rKcgO9$x6PpsaAOt`fXCu{iI!!>Y~c zs}%7V!8zZvyAXD2*Tq-M?^el$k6U2u_sXe!&-8n`pw2DlP~D7>voW@w^-E|pebiiB zCvC+m+V&}~Ogj;i)Ree%ah2}eYH0EA?{a2~mpM?Dj0o#w;G93Lg*ckit5uR{Tgp&f z-gv-%22o%%%!CLT@F?_0J0_iueLY_re}na9Cifh)nDFV9QnPs&4_8|FG0BBOGlab? z?k@Lj930S{uU34t$ab4Ok6j?&>0E$@!lQd@lnarOMCYr%gNM!`mSRsa{RAK`Kw=r` zGZZLp)*X(a00oSR-cX5&QQY60_9?Qrg$6zzniBClk=;d;?jN03I^7BbcH71+7sS|U zcx2{(y#{Tf?U_2swsheG{5PH}SEx+J(j!iCu-?ARZAQz8VBrUb%XYd4AqVL!C26^+ ztA=phP>ho`;=4&Qhc_KhC#@m2TchlN#7la1%m-)m-sOOEDI^f9DweUk7kZnuH0){s zX^r>Q$`;Fb!yf;0CsClGxY-t3s^7g{47o7zMLoR#X=+Sbm*L+DTfiXYLk~g5>WyY^ zk0>*2u;`5;j);ot3c(U1THS2n^c|;iAQdIKKW#+l*q_C4q@g`K!{9et8R2IJ;T$jK z$oYwU>EZKr>LAZr1z5roc0rb6d|L&4J6pzHEBP@Ou*)e`;9RK4^}MA5mA($aopz(r z2*mR|+@$@%q2sAOZ&Q!@4Jb;ks}2Aa64epAdNs@QD$??_8>778Z2f44k@bC7d#oW& zAmn(@S}&Xzxr;JI2pt@PwE}ACi|ZW^Af%G1Aru524?6czrVGGt1$tnx9ek2L?)7KX z78@s!Vi1kG5A<h{HFZO6?$xn;WV;>JJ#=nApmC2X1^2e)s4idjb2o~xV(6|cJUngh zE+S<_?3+tI`PzT;3a|F3dst|Z)|WL3N7D#u69h_^p$s6n?1o^ObyYa`@e+E;q%)K2 zuKbLQ-E16W0E$P*opz9Vt#S|%dQ|be$9kDje`D%#52A9rvTorLsb|)tGVH#%*v{EH zjJ;Jlic^1|)}eE=7>Xr?I?C3VE4i=3Lrx!b$%0ER%2GLYe2ln1Q8ml?y4a|i?{zGE zhn-&U-JgJAX%*dSX92%=Q1~cI(K;5i7?y8)PF*7pG#&8olh-WiRelDU#x}~{8hQT2 zlo7_<m{v6rI6~5kYxO$!%BGjJS_a<ChPJTr>Sh{J^p@H${#mtSJb4^pG~(ZWb7^1F zIpJt3?$jSf<P(edbq{k-<AItlIaF8CpQ4Ah+rsQ--+YafEo=Un8-W+*o>q9Vg{0EM zooBG63Gt0N@(D17%}cq0!9OByAeLU{LToKLB`~hb8E<+MAqvnkKao248QeN2-g764 zzai9+$H9R3=;VZPD$HD^tuH4nEp5H!E|fIxdVhV~2uU`Cp7l{$?oZ|ymY2)Q%TGP` z2MT}Az<mFi`#UX7B_lf)^1%UA#`gX7>@*|jv96BM!6wKcKUl`0Ma`k6u2tk=|Drn? zB#z6al&Jj0O83x>y3ao`Vcf{?47|Z>&HZXB!1sOSp(Yt>MH7waE14Eups76myw-t) zMN1F#@S8A0jI7V9B9XW!%kM`9WSPu2XEFd9if3(WJbw-h%Rc4qH#cxf>6`|BGx&0M zQ@D+S*NVewLIjr2&9AP9aT;sf0RESrtvu!|z0b$E0Cs<D_GNq_9St7_BOyi{!3%ne zqeMa2q|mD^h9SPxNFvU%{oPp!{&%E(zA_p04$4==L7uT$>-qQ6`oG&l7E32mOKbc4 zd%FY4Kos~x9FEI+O6e&fJ)}SyVNv;8qVkMz2H9S-`?X%nqtFy+q(BF<X``l~_>1Ee zYP%Y`$z#jA(Pf1=?Z?&@i?H~LW8s%oyIKQy*-n9;o1_Ci3%InyleVvAdmtN{3x-=4 zUw&bAV1YtA7#Q1lKQ9B}@7Sv}+Mfq-dScSU^*cr|+XBBMM0`||vPd+d2m(?z;bz#0 zfu9N5<DT0Z$gdmSdl;Ae(X5$OErce0je!$wWb@^%S;&{oxT+$20+&y=+GY>~VV@Y= zMKn4buhpLz_lrrJEA%~2Q{PnuqYI^fkv~(o_0cvu+q`b~JN0O7hm!jl6iQhb?Unt0 zD<>9beR2}Fh-KPW{kV~&{3-fEzGOfyVdzDLq^;Gpw0`kW*%#;LN}|5&P&_3Q3LR5a zP&@u&ez!9MxV#uUYgk^!1raaRZ*<n#R~eJF%sch1slK1OHG{#psr!5qw~0Wzl5x1- zn4RbaF}Is+rB~xd`a$iepkV;K*Y#@)bfNXc-kcYVus4!ZO=j&C?YLz6HRlnmyRkA< zdCq;N{WR#X2l5N{^PopU$6GpGj>(;OK*tx?LANmuwVEO@Z*VB|w&69o+u~_$7jJzU zI}PnkOgvm0kW$K0GeZTaRX%~o|3Ix;s%$jHSjv#22&Fiw+V*#KHo-UNDzzj6#tSOd z#~#D_CSQMjMc~NBRa=5fg}?(rAF#I9!*u6>?ZZQl<s*G(w*@C;iE+7*sUGpqw@j2J z)*T_OsR2Y8rLD>@k}9aNr;FqHl)mTVuc<@Abj>Oyv%s~T^gE}|IOi(lz5)07*cfz` zlR^zX<UHP&(Q8sEH9dcuxuEg2UesA<^&ntLt(MjIx#T8gth=_u8HtVJQ9Ik)z%d^0 z_`^hR(tIr|a@uTLNQy}+LpywW9O6nJOHbD`k9X^NBaHssV^@o!&#Coso~+gF;qeCR zLy91@_Fj0SPNsk22ApcxopV@+>nhWeqIYSq2WcYtMu3n=*;#P-<y(!TsLs>9Ol$4s zw(0oiwKMe0CORC!z_geYF>y#rgXFcd^+u<O2f%t(ah(VFGSChObjm>bQk@d6lB<3C z0o2#88qa!3C#o#_pg*w}KIz8cdOPV@P8_8`C#Mps*45Cfk>TVHS|gm?z8JRSpyCv= z3h&Fow_fzw>H$80jyAS99iLu78tyn{$uFx!zxhje!r~(qMFklpU%NL$kyXF^yh1*L z+PH5(C(y=<aK&x6O|4-@fHQY1;YhOWfL;JPW(xO;-(r`)a_G~v86TD>VYYBn^Iw$m zuBGbSjGU|b(^B8W-b(Q+?;)#7?XOn%QSr0NvTh+06=g7r>a*=rQcqv7eAzuy+-zsL zA0gbLjG>xg?cVlmV9Rx0S5k!MT)1i0?4e$5F@Y$BK?I_kwfU?mMep7axKni~ZUs%1 z_~NYHx{~X`N%LhId^2FzGd;-oh4^dB9X~_P-M=K7j?!ahMBwCRQgpD9dq<m!Na^`} zJ~TB9UzyEGt#g6j8TNypIwAjhq8#wmZl4<s%XA5K=Kx{ey?M>|#t(ao{mh~bmWh8S z!}8(?dF3kRwvu#B)T=XUe(*Vxyud7yfUBuL&@<~U$d}GfTw$geM@_q#Az%x2r1u#D zt`-1RGrqK>F<xg5r)G~22`62VA3@Wd_Q*Qr;=vInn?uKE?0Nq57A{K$e%^x(NA=`E zGibZ(Kg3mfd)^C<-;l*biGp+CHWiD|d6N2kwzvJ5+CNoD1xOiw0zDi=EOg76eK@zB z1r3Bg*^KH3qy-%8zU5qx8^+yrYp%XR>nN~EKpBg(hQ?_0$}oNjpJO)#iWp-lwKE&> z4<JC-vsEe?oul%0mL}@QA}S8b#xnY+@u_#y8Z_u>Xzpa@9|z*q<_-;gsmeALhtbAX zjm}Ql)zc>twt#+ZLstucS0ALegP<i_-?7bW^Qs0afdvT{r*a&g!$czI4bSEf6H%n) z$JZ3e8O-fr&YGDucSpo5!ixm7Chf#Oc(W{4i`s;`SdujZ;2kHndMfmWk~e<b_nHl- z+NR#D(rbNM4((&0bWX69Fi=2zx>@Ijk)>>Q+A6o7rhfyaW9g(fdcN4iw8)R$ckkX& z(eE6EwEX)0n?~@qV5aQ*#@3j$gao|1(28w~`tJ7jdJd36L$aT}<AJM{Z(94lKYoi= zAXA>4#aMPL?0L95{YMRl^%INH*Q=Zp;g@+yk0ppn<;1En`3XeCa+d>tCxqU~oAL;o z|8dUz)8*~Pp&0PQE^4;cN|LtvGpqs2tE=aBv&Q1F^%j>iH-RkDmEXkYSaZFYkmEE- zKb6-Do*q*vw2h@Tpiu8w1K@9gNzm%4krp(C;;$m^M?ld3*mjQYG)d-6>>6JE{xr;S z6~niJFwrgR>YT@YR-ntdw3nN`HTE1c?`$|2F_qtgsPgnrq{Ok;*iWD;Cmwsh&f99I z6J^O!(hC)*&JQngF(o|l5w);EV!CdnFnQk=$F4XvewsX7;ngG-opg8+l*zx*sn~I6 zwLLC}L{(<NufumA-RXc%PJAb02|iKQYf?)diJ4CvZ&{n>XCG_QzXqwQn-_H#uxCs* zpEt5ctED8zM*4SEK-krh-GwHKxm^2E(2uE7&f{xN$Xnawj=(>OC=@5-5KhHItgHl6 zxwiuQo!v+&#OroHf^m+-ve5xjFWr2tt)!&H(W+D+U`)6}StI_quUfg_0NBq@>9QX^ ziefJR<A1XPTzlBzAGF?k@HkC~jdB!ZXrE?yx<eG1@)7M-6>g9Z{JY{@HjDEhPgNg6 zM~^|4>VS;RS?fw@vd#8`H;swI+sW9}dN}?K@)*avwRQUf^G<DiqWg6+h}DuIMIY^) zr(Eq(R2fpMRa({FZA#@iPuT^1do5ffB?w&GH34|wmzofjKz`jrdhQlhayDscN_peD zspxF!5-evsGq1IBGRJwgkYvhiSp&H}W@%m7hjYSA5&cB-ne}7OLDdxW%9&)OjUo0= zEh0a>bEMndhjx{oaUexshW}fsT}1Y%8*M61PSc`_&JKTgOE!fN!DUDCC!r$~E{rjj zW3R!0P_fPV7d3n;nQAAwKQmE(`ij}gy_0zO7i<>LwHQ7hnm%`RV~LmYunCttF4gys ziQf|XJU{G;pLIMxVwLCy-tQ>i+#E$tWC(A42S<0?x1Xr`-*0yPdS~Pnhf9`)+1>Z~ zVY;jDWTl1K{~3bOVgZhVE><L1iVq%dYaK_YHFXvWX1Gk@CUEAmsu`Zb^Wa2q5|~5Q z3e0g@bZ}o5$Col8D5MDk2#JHC@hjzlvYw}_v9}ky%w@!<trsdUJq=yEjdD0+4C!Mv ztmgnc=wPmA6fjsE!CvhBS{Sxg0<t`MjRbnB__w$RJUorZ)G;L~css={@4&9tl8@kA z>uCpX{J&~8d!{qg|K$YAAX~1F_cwhN0awiL=;)~V`E`HH7^tw(_5l(@QU=H4J8A#v z8_oo%dx*Uwrn;JoOu&Vzb>}cQH<!bGPtA&JBPwbt?#R!?hk@P#ay7R_+2WZqv5Qvb zAc+L>@;r$_yuaRPI$n}u?)ZAj>z4?x2ci&7j8s>_M@OnMPX9QykU~pKo227ID;x8{ z(UEm$B&~pl{jvQ)tGjQDtsQ1z_3G!|o=v_9WSc9E&vBFJKO>YDr^yiV&<F;@U@+*< z3OAvQ`ATzy*)qcy#^bo(#nq_6i6}E3KID!kBTt*jfr%9?-v01*M)|z?;;JnSbhGS+ z^>m)n@u6fUe9mvhzM}2-@F2?o&rRFSYBwUGQBZC!O+GjiY|(k#uoedyN?~5At<Ca* zef&qh($bewcP3qO#P0?dyh%t%5`)y~>k4YTFFu#**T@o=xV$hd3Q*Wd%PCW5zC&k2 zz@yK@O~*4B0ZRn?NqWfQf3-8>&%Tj&WY^|-Y`|hri_-CU?A&dys)__sOlFbD67x?? z26?UdH*kI1`D@GtSpg*M?J$~5@0}meS=Q){|I8511piIju%~}(NnPKTdghq4XGt<E zxfPVrP>ceL0#bucVQ**0;dQbMo&C=cq%SS6+d^MZE)u9Z-|~g`tFi#UiJ=sKl7_;T z-Ntg-+f9A|WJi~k{(FOXfOr&i;uBW}o=6<IFo9SW*3DYrbL6_~c7ObQi<dJD_rFyy zEpI}AFI0)&ZiZJofymPaR^Xqk7n{QEv~+TE`rj2bp&{X*zL36v$GeRwRdG=qk->5G za1c7he`&>l=Jq)#Cy|J^#j&o5w+t$UZn;sU>EnT}0#v~N&ON`S4xPfeaU&eJb1NK! z6xxNx&iJn=;9s4&+`4HC2Qeivwc^=b3HZTW$i)1JyjDC?xNxs)#>AqLDFASoKm`63 zcU;e-`5cE5osx-sMZ!<k*31?E?ZIB(De|G`N`We+O`U<?^@8=@Vjc6--CW0JrtgV_ zr6p~7$CHo4TDxc~-M=jc2j>y*(QL!=`ROrf_iU@r^6Fsbg%w(kBmgbdJ8G`d{)Y_B z%_^s4@l%qQSI>0hBV7%A_J4S~>F5iBN2v5T)Ugu%pZ02B+S^KeujvBD*Uk37zaC_n zyVxC*3kV2+8ULp>n!BR=&MvuvsUjstT$I;c_W$88BldQ;eNic`=IrEESS)!+k{}lo z4bG;Jruupv?-#`KPsybe|Hr2+TWpukn);oEO@i;107q4Q(6PWL?uTNCK1(w6FH`kT z$*4G`^Gn>^+~jcGl>RF+^X=QhqM}Y9Wk3Wtnh-eWC%)|D1^BNVBSz<L2*jT7IRA$x zzS{|?M7923-HiPooyMs{3IDIbOHb1fiT(Gl)uYY+$B3j^ga6-6|I+sVn*?zg`^mg3 z`hxQrQbaT()*AJ19Z~6e*;WXU-l6Jq0vd}b=qSCZxOXMFpKVF?USo_QxnbPt5T*?2 zIt+XW5b{vcP&BGwK_?b{8$$H+U!Hd2Cg??1{PQ1mC4i6pZ)4t6IL)qy&AUBtw~TUz z`kDzUbY(4E^r|w{+ZVg}XaM9RR3&u)Rdgc@IOV$+-bbmpPnTokk@tlpq*)^<6(Xj@ zsdxGwjqP8c7o}w^G5)ToUoaE17wN~`Xp@HxBOon3)nz1f$b1$X33<}WFP!U3@xOV| z<Oy9&agZ`{*N{Bndi}%(<a11O#hPx8%zd=W+&c6NH$6rNoQ_oyT+_uIlcG4U+nP~W zux!<O4Yk*XVk)_TvN#HDb?+moW{13DyYOd=Bbi=kbXHc3I(JpoC)%B5{?|Wjb%^RV z_~WKX%$0|_`ulb)w+Oj8-?jeymmv3A{>t$u<DZMPi<dq$uJ_i|`ICh$`S9DqN1z+I z_bnK3sdSB(s$E9pHKn!))xtD2ISysr6|4VPD9bzpb;ITYOb4sHCoEXRQu?Y#HpU)? zWiG*?`nyZ4-Y5hr#55<DSw$OemD@?E0#9QYGv0bFd)^{E0c5=cebY^PNt&3tFh~0_ zQ~;!`YD4!Q$FYX-V(;$Xg9-UIq#x$*>vvjAK<yZW>ED+>UAC9pmd|0KgAq44ewp1H zJ@71vK8+t#J_CZ>>-(k=U;h6=A6fNJ*Tx3nF4fjT5z!?5!=^Q3o&)#nQC%b*;hSWU zP^YpQPQM5DVNnXD4j8r***K=<YQHef2l}fveB7>oJB>BO|KMtumX!^<T+{F9!wXf& zmcj#&FQp`FnEY%StFWI{rxcy(C02KOLCeMi{Ri(`DhSNZJXSbP&{;_s${0IizH<4q z{L!ddNlmCvuvCeY`K?!7mKHp1o-;bE-%SagCvBmU^@d1yhVxgMJsDI1-IBtnZ;V0l zZQN!WCUX{R=lOcA+kV%sQJo1K7rjK=j`P6aR<K?Yu1R22=?1RLBQ&62V6~>fiBiX5 zIfiv@eg4aE-?+y>_bWv{dM5j^x&1?!5*JcjPa)1+o}&9+T@3&?nJtNRN3udyadsrt zWblefPZ)D*?He;Uht0CyvX6X%edQ<kOw-Jg);rnlRL~ga8?Oy4;Yzq}Uu6;B!j%9f z9cMp0f7-4J{DP7>iBz6Lw#)BJ_!WYRslo)ByT$}0;n_bNRm(IR-&ERm(>oZ{zA>$c zb!#&rPK91-U7|g6W%J!o0`{D9bSk96u{w((BXy%0p%6N5j*mqz0gm%OPQ{=61y6JM z{W2|%3EVatBj-AS8%zO7wHOjG4>6EN)5-0aMW72~viCy694og6+SNAuz}*v$%ln&I za#hWKc8pNLX1wl}I6=C1LV`BL^`(S6;(~8}Fyt$m$0F(ppHia-<~FI(q2ca~^i3Ob znTvXq3d^5ZKDjITIh@@BzbOY-wDPm`xAWKDHBzgx_YI$gd~?-koCzHZZ=FGd9(8M0 z!dw6=`hHm(mc50<socjD=yq;*XV{LugqC-quBpDw*yq2R_rt9Zcgzk}a@kZGN)AL= z0uE$je6L7*{wR0LrJ!*PA~b%xZ&=-X*1NbTy`RMyCT4RsA$8zmF11Eq{rTDrnc&Z4 zNt3~Iv6E_pWADlZxC6&kye~{QeQ;Ouw%iJE()s(!hi#4-4OFi8wMe0m-R=XKZ;Zfo z6Bg3=Hkp4@s^c-}eGdOWi)K5oXA6C9g<wJXoL7v<1f<#Q-d^wiNMU;rRWFp=vn{}Z zvAWBAd7;^ev{||LfH3VfNG#<$dj@v=SBV6|Oz-5a>x9bfKX$`pEAIe__cnM~rm(u@ zK7_SLY0?mr(ax>`<zP8=7f7QrsH~2Ln;G}F8#+aYs+7rcMC=8_3tVKfa@KgBEzje) z*rL_rYPuEto={;DdyB<`N?~P8R)O%I4L8rkC^pP1)HG14o^_~F=b9rqVQg6tIpJrT z-)ESlNbze>u7Kf=g?3Z*d^LsM+vY3~GN|tq{QIhym!`;`o-6S}Kv#<6BAUK)YxM$y zB21V~YIo~-H14Qp8A|gn&6@D~`giGH5ghgrwN>hXN|Sr*-4hbiih+_^y50{Ge{Ku7 zjAF^RdgpSjUmoi!Z(&F{I5z_BF<&vO>ZN8IeKiymnc4yY2;u&Oz$Tz273iJm4Fwh- z4fbrxH|tV;ou9|WzV~!5VsvNe#k4}5wxvlgbd}zCq&&{jZ(#9%4j-M;j?*5)lxt{& zx+Yl~jz6#NR=GRF^Nj_fh}Yu~bJMf;J=|A!8UJwXH{?O=_BD{S5;u81>`F)^O5oTY zpi7+^7KonxrFPiWDl_G}1$XAHPne6@jFA?c5A42)=0l~W{IT|+mt$RrfNMI2ku)TP zl8_}j)$^V>^=$jwc%3I?W2E4BcTuUcJaOv9A@xTMNtd+78;0EHGha@lifS<e2bK@3 z=liK&%D=kbqv|!<Q`28MycID4WOiC!=jlCNp2>ST=-r=2uK6*(`WIx(o%)Nz3S8^; zE7FGb{LOGPv4C`Afh3rLF3tKClwdV0rH>nA)=g~Bd#>md*VqK5_HTjPEPtd@K)u0R z8#dCWM$ZlaK_!)UU+fE9po}fqo+NR=RU4t7Ch)VPB)}th&B}VA+Fl_SuFnBOvtHC0 z@nq#BOUe3;XGImD<J9|J_n4+iQY7&!Wy?&ZWdoDggBp?RR*!Z~U<`OzzOPTM*8CXv zF<vx)Z<Y_E`_m(qJ(ql>dLm?ic;s~h+jcvb($Vg1LT@CC9zUt2j|x_U4&EYGS4aVB z)0kYRr6zP|b(}nv=V4+>MJ(ZLyTer#CdQ&ChKSpdvM?)0MZ2s(1k^Pjene~MtIsP1 zMe2G;U6bz;kq?eTw|)>Uh`F=X8@r7O1BQusaY@Bfqa+mUl?cyQiGUk{nydeS?z_>K ztclzyyZS?q1mcnlKJjPm#@X6Kk2O?=hEKvEwz;U@5j~ggW$xN8gXl;_K46H7YpIj6 zR6V+g&~^zya!IBQ{Wn1oQe0Ef_N;f8q}=lQcjbCZm-i|yZv0j;9GO=*xaKI%{&5tI zS3RM0)xzgJ`qr3ox+}tnC2`@&v7*5B32qNJvF10L6k=1qxN6Rp3;ICup)rbG(QB!V z?7z$3tZ@?)o!6<kvwV(2i&cy|*9JTpg|we)XpqJ@mMg-Vh{O;|*3zORHtgv_`dkUc z-2+%DfMcECb?K=tg<q3?F(nQ;@(m2Sqxw7I+$_<*UfyTKy)D39dd=mqQN+O~$M(aO z$m$R(zm<JL7^-r!NtSAgz05{{5*B;rY&ch97-5bhNp-Bu?ld&l!MsVN)ei|#wM-Nz zb+8h;<nfp^YZmAVs2cgm@?JbR9UqPJVndxs5Zbao&uUndbUGrns!wr`l~tJI#<iEr zw{dtNd2+CCjS>Jd3~O2fIZq&E^o0_tnhUqqFJyZke{~^r+ILTQl~Dn)gg%^)Q^oaW z-mI^w259d}tpa#>B)&V$2;Scxor{q+^|hqRU4ruj>E<ua-VXl|gU<`M4x7!&i&4Lb zzvz8;DJtf<y#d~(6d4@IHKB-Bf>8d#XsYSWdG7vqgj;C!clx;nH0KWKR|>q!1ScSO zjSE9wG<f2lsqB}}7*8KsjFyV8fhnVA9^@+Gl>TpXL8_OV<-)#bibqlzqOC;au@}+7 zD%PC6N+v<ATagCRZ@G};dP4Uvs$9Sn^Nur&3oRsQS!6Rxx{w;ds3gMAwD&Ba&YLW! z<a6$!C=e=p(?&5GJD;WFnXaX?Y(W^Is=AI}^1kAMk#%F-+H!E;=ZsXp-=`~X*|pY= z;s}~Rpxttvy+lo!kYQJ1%Wuo$vq;BUollpP!BtpeJr50h;U|#@f_hKqp*yD?wM&(E zN$MNp9Ho!gB7kK1!1kR5)D3LD=`IhY8t&eI=r4camyDpj7?q`~X8D`_WsI7RRiP7S z<|^)Vd8<oIuQstYwz;*EPef_qf@@(A+<5XiO02f(H)&Xj-JZF&S=qc@i@(`r#rP<f z8b)oaoEFxi_fDHP+i9zXAI}D?H<8S{Nb@*6Rz>^2gRfo|L5APy`P$ZK*j6N~<)po$ zEkyQiZ`uP?e_2_KH~yFhe7YsJKB%uBll-m$VZ%FOMQI?avl!Q>e-xbgRk~#kX{vRh z`<LzBdHx0RKQewFUQKUpy}$cXwVyNvCa9_6y4fzD+g*X&87_dTw=mAXb4ix1{+xO$ zLA6lRj<ebTJF^qIQMTiR_|{1kr_(J?Qu4=T#Whhvaz)5Qh+E>o!?$bgc{g5G`mT<E zfv9aKYiDKtBIPfDf$-`Y9<9fA-V8r_%O2)bcXb%1(KRdm55c8J9wFk14e%86pUr|^ zb6AkmhHoxu_}UqErfKbU&+y?#lF*`O*xkdiDQfK4{Bf5(hrcmQs#obHX4w!#UZ?@) zM_CSS^_fF8H<JE=<E)`C{*rfVx_r)!qtKqQr*l;~)n6gyaO*Ssa;O@X=E9XvueVpz zljmp4kxZ9n>*MIdw3u5jA*tUOlAi%hR5x`54v5Lo+R>SPQv8>4EyBs+hsY7~PuJva z9n6Sm4e0{U!(YdEC_mR_MIF|37ddVPIAr1*Je=8Z-Nwukz3C{KvpDfq<*Gr4Xm7~a za|!Wt>krSX6GjBm?dHMRrwoHH&${D9&8{P><YLdPo2?!7?x!oEuo%QtQ3o;tGL*GL zM_G%fDEYNqX7PVP0QI52?rKD+=<sUBa^eP%a#)9zAz0{Z`Q9^psxGGF^metyNc{P3 z(WTK^dTqe^<oi!fZ^4~4qBwh_COy96miH_31=bdlo-pu!PgwUnW!lVCmBU<9sJ;}( z?y)?>N!Ymu+RrSqJ>cZ0bK(Us;GzVVQ~2Rv8Q*MVW9z=Z=ZZb6U4`q!Bti~3OVDRH zRRn=smX{ENWc!#Tmowv<sNQ4D0#>7JjcFPd*%5fr1IwNLs#xjXs9i6$ir5;`4l z`ZuOSeOX1PTf4_BN6Mk+XA2SjO?vlwfZJLEGg~Kt%1D$3q3)Xrh|p0iDW|<h0$WkE z!ncbPB@reB!rMk?rk%i6<fSYMcMH$m)`s7fgTw}3GE+L;pzDvg9Bysobi&D&8_}RB zOH6h8w*w?%Z*YIJOOLuqb+K+6&39ZsY;jPLWbBUgJ-GQOf#;zGqvdd#nKmS!NB&&5 zm2jGl4w99($e9`ir+=p-T6&+Js9gar?Q8Gw&KpbNx>c$|t7m=gsmQwfd~87Y;7E7w zmt&>RK<dTXmkvx@R%HHCc?OQ}7ua%GN#NL>kWb|a#45&e==q*fV9~V~Pc%)@PbBa* zk0LW<hPju9`QbMBcz5EJ*Ol}#Y<dy;PF42PDktSoT1F5(0(ZM!EZzAkz@GPu$<vwp zJ;Og9h~a-iypBUby~u!{TrXHv^oG}#uFjs1g-{i>Lm)&rdA(me4(QM|kx#VxveRxL zHYyS4Upk4gSnu>k1ISA_oZ+~HuH<tlWfi{ld5QSWq2J%bsFC^58}LFSWMYJ+csuKT z^LMtn>JQvrU-SCJ7dTvbKBLJ2Yo1bCbVG9Uoae09gn<Qz{uQ%@n`UT|V`W9gUeHq= z!t_$D*M*wjOjWd;9j=^?sqq(hh%IFn4_J={bfhonUisJ=`&&i8_&H1;NNvg$jC|*4 z*d5ghS20<F@^t~KSkYg^-Vb{Bx|}nYx1n+DbVb4roJ1M|aix0v8=x?M-8KSEHp+l- za~yhe?*Vl5H(3$P)_j{t>5w(9f539XpX3)Wt%F$MAnDWyNpUD^@V*rc#dm%<m7cTT zzt4g+!__$Nhj-qLf{PLO8dVa-hpnZ&M=eC$y$^1YK_hxT&U`*tX~Bqx=V}3dZ{s!R zqui=47hHGoMFJ|4#Y3ME!Yv1Lm!~pAN`$aVp7=1^S~BSY4?hg9Tmmn%SWe7c+5Kb7 z;L>)*Lpuq}rHuhI@+M?)(?blKw^nKDYUEBjK5z63?34U?Fet`WihZ3Q>|XtBlt{h1 z{_$DEG(2eu^xR!*ej)7E{qMM*HH4Kit@CA2;_TJYhcdQE^XCMX+A096=%GK^r0kO4 zC0G{ED*@h9oc94t+eBY~R5lM)Sq&^wTASU8CK&H=mpLUm>qphCQ3YZ6o3K25@L&RE z8D0B73I79YOqs$#Bmaw)yd0@o;{7M2eR=<XROY`$@&CIZ)c$wo?Z4bIP3}(7`W2XJ z?-Z?LjoAblTWbbRVqphNP4UH;ww9@5ej50J3NA?@Or>mPyl{GN`aMDwj=Df<;A_-@ z_Z<6|j3wpa24!D|R!~4=k@9(co8SfeZ@#6NBmx@}$a>gchd7D$i#-dm__7TkUupHQ z2$whg3k1#yh};d=XLRx=7!+tQoe5;32qDqhh-$>sQD4ARlQ-!C2n&*O44GCxv~&H$ zey!G`;L5I`m+6EBl~5c65e6j5+78xu*keXX6L<Joz9T`vw@8u|p)vdLF4*E(NY7RJ zkpY0vw$bgWUO%da%)6Np!V%4S$<zQ~#iX14XmBQ%e;(x_A-#`gt{v%!o-1uZn<UG8 zU5-Cf6l^?gn8Y5D=OpfDvE<xk!MBlY9^$e<_qblYF#Z(Gre@#D$W$t+@r8@Tn60O$ z_s=d)68&KOw{H=f4>Yw-OK)Ol__Tx%<G<mtuX@pTRK9*68TnCJq4#Sr?Vg(iyE+>s zCWRPW$xM`^p;wm;XOxg;p6_QbGG^AUC-$2>`v#?|H9+mjJWfdpyBt-aq>qmfSsc=y zJCe=Fgbm(Md@^Gy?FgfwS`aLhQQ(L|Z}aUp`Z#B=#f?i?yq68(ASR&&G)dQN?8Hb~ z7MyLoggH*^q4(5z9}!WVYhuLg?L>#4AHgNp<-pf{ctvx%F3|&~&sIL<dHoPDPeSUl z{m1<Ba0;1uwp<R#_nt#e#{8)9UQJu$RW#$!oyXz&mxYOou1pU5yfa97#%A0ZEt8Oj zpo+RWD%WBIu1CRJE9O7Dr1cv$b%yKL{ej5R9V{dX13auR`|i-_=PBxcX<Y6O;)4)i znFRJAkAk!m$?JLcO<c7p@dI0gPt{S_8w!XZ5$15M9sc5H>CS!koL`Nva3WnJ>U%qF zqC!`W@x>DmvuA8^h|OibC~yhY+J()nEylh3WLbE?cd34bH+0;iZp0`n$OO(J(WYL8 zp_ptfxmd6sOncj)2$*Y>#Al;Y$tDgl#g*wsQbuSq0l=Ja<h7k8R;!FpgxFZbVo2b7 zk{EBQSD&*GNa{?|BLxWSFiB$3Sr95^Wi7{^*wx)w7)RGw#M#7(2v7Ti)F0FlWr)Q> zRcA;rwIU%zXYDa`hi2Ho@hBg)$hn*`+oY{QagsA34MVgLS;R6xAurc7o?)b$TI87i zrCrZ~*2ih&4QRAwX!VfW?1V!Xi|c!~MK^R#doj7AJF>zx6T}ta5}exsKA5-xsQ&Rj zyK_rQQiH@U4zH6G`k`W?^K;49flsn|#z+IzZ|e$+ygpRSP|>qtdLy5Y7i-&-iKHVp zn1&6HuB=}G)JzQC6wH^`mTKJ^EqM}G8d#c@l*oLsqtP<S9;8pkeH$P6j*|Fzkw%OY zBhx^b2G_!TT9)bF!99Ahq(V;X)9Y88PiK)Ay3s=$g!gfvXq-7&1m8R<vIg#l%~ej@ z;rTi@WOSsAMpbPN{g{a8Sar#dZ7RUT+5NrodU7Fm8z71z`XG}64k0eEP>-1=w@koq zk4l7s-2xYP-O)YTvRPeUKN7_aui1V7{a_~bXc3u*hqhYLD@JDK;FS|;Wykj<WGYn- za<;D2&0fyHqs$+StYwmp#!@f^>_;vRKL@0LADsBBVg!H{q}SAj{rWvWrOzCI3by-< zh9bp1lqt(v`V8Ho#76_V$BQyuyG4YGA3Tg{?U)baQ@@9f@jC>qZG|iyN*MSQ&vzh4 z4n#(9rhVH###A*ooX&yIXOv=P8ZQ)j-Ed+Iz@W_KYb2g2_JakR)J_&p$RfWh(yHvI z4>!r0T-5md`8?l*Y#~phn=&Q{HAMnHkq(tfBAdnh0|dNoe`wAjEt#(l6eq=7^2Nrs zDk-bmu(3rwh~C<$PwQE|+)Sv3{92Aym_;!vzRG2Bbtxos>4w9I*(6Vc89Gsis1S<` zJ`Q$(kmCb-_8i9TKGhfKbjj&Q+qpWZV?%OuqPe0{s+cHAz@T!r{3Gj>1!@GsoBlsC zKxUlju=4P?z9cbF7{YkO#dL)Kg06GWNgf82#U!%-N{}O<60;Z7@nM=FE!*IhxY_gc z1=;c+_&L3PG)ZMe($dkP%~M7?I6RF1`8~WWjX%#fg+i}sQ?ph<`A<&Q+n7ct0f)^; zBty|j!~C4$ViF1<nwYCWHJMMex~-@l?QCC9kL6IW^4>%XR*aq5{v_6T!5X-dNZV%Z zw<sAVvO9^oQvvR+9H@)TN<#J!laWm@ybz}6+J;c++Zqua`QhedC5L|x2OkI3?bEwl zn!Ih+2$TeU)NWD|QuC@%1F4-|!l-6K-A;xBxe_TKyQs!uJEJfAR6Pv8naWrX4;(gE z9S~dcBv3<3n1?n{BYfqKhRnFk*H&p=rf2fX9Nr&XMc;!#^Px7ib_t<TlXlY_LBC9~ zZx6}-?Ju1_U{o*|$m$M$;b1i6YyO&T8aWZnbjw2OK?d4vw_B%{63Hqd_*^67r-czB zffcJ0O}^xoGet7qY;3s4Yw)^9E_dtgx`zPHC8A4VD|UXr9Nj8#g@e-baZSC{7pw18 z-}*W7H@2ur<r3N7^e8p6z#x&|^l-3GP)1C;=Qo4j_5gxCOSyhrL2n8r%P6c$WQeaN zR^Yta(C!<YB^I9iUFK%i`%`?+c1oTlJ{*nNX;H6xb{bB|W|qNziDashsb`irY`vG# zTQI4X*ry;*?97MJwy2gQp6s17=7?8|a0Mh{EqH1$NPQ>+$l<9aD+h2<9lU3h;#B9U z&`@yo?1Wpi1&e{3YdDE9Qm<0hsKt~Mb;-oAu_1WEHPLRa&5$RVnTU>HyR1?gbrZT> zyuiqd$tZ)j$f*5n>zlEg9ivi%Q*LH>q`w+efCHZ-m9$>@RS&hztIAiQ^UusbK|F1y z;d|)lsAwi*M$-6bso5}hU_{bjy~Hnlbo5Ls8F_h@Jz}})CK}<R#x2>ct?1;<9>FGL z-K>KGKEpO-%px>{WfJ;Uf~^6ROw5Yr_O;Y`+DI`wHav|+{bOT51qa$g{`ZS-3RaLo z0v!i~3J?l6-o+~aLr(|*<N8IxwKwJ`xU^=q%(n=$XxRhB<M7Et#tvoHN+~LT=4DUX zW^)rIW_t`Jli?-dNfi(t#>f%{lhiuTQ5XxmzrCr!VJkq8uj1UBu0e}ZRKT&t)746x zImW(X9o;&IZ!;f1OthE0RHS-di+jmmEh;J^;xPMA19~}R6yESRyCBz;se=DiCobzr zYY^F(x-EoJN^ap?J>12libYEP*2KoJZho{BM?5a7L2;;f{i+DtK2}mn3c;YkDVE5d zC0K<WogU4OxkL>H5yK-Biwd>j{W7!~Hg-w5H*A_qqZanDDvQE^pN+>Zp5D`0f>8jy z|737uT?PM}aiJ6|VaQjw>FWDxCGzgmk{S5?BL%p^^G+tQEXM1EO%Qe(U}F;eN5>G$ z%^m&PVf3r1mCQiAU*WWDj~<Q7iYO)oXz%S=9a4Mrot4t#;4MrG$6|rn?gLVs0o^wY za12*sBD{Wt!xe++(4J<=Rpb{N?8|639IHeK#$a;XASG2{d>K1fiVi{fwkeyjqV#mf zc#&PvcA<dxpr`JFk@em$*U8-ii|g0b?F_U?8!8Z-i{97G>FQ7>+dA8Ideymm5qZ<* za{pjK>6A}eMaDm|i}439Cv4=ioKzlpKpmz2j}>f6T&y-3th!N@2FBc><6wmfiB`e4 z^+@b?#+X`KbAN0&x;DzeUt2|v7EFWk!uq81_rCp{Bx$)hmb8`UEG{05|1p6&5l>LH zrl<aFCt&PE_W{F(=jE6he`}mip*xZ*>lI4W{h?YwP9ZHjlRXno*0(5GSCN+PI45J_ z=<3-{<~Ma-V<zrngVNrvf<9I^l4_;)bMJB6?k;<B8<J_>v!c@H=`Uw_6yjSsrexB` zQHGsI+2K)$hOgY;m_KzqvpQMxwpL?;J<#^9#`l%RiIiQM{30qzz#|)d@ge!S<;z4O zd%-S`Zyz6Cl1FkAUb6F^J3B*=tG+-6KU0?IR$vBhrVakd9&oGl^T&)!)XHmaeJ$td z&~xss$;l_&iuyPDcr3hqBzQd$6eNV_XB*7LVvl#&)tNWxu7c#sb(B!`1Dy_GGe-)D zsSdp*G3Po|Uo(@+Si#Jbi4K0S;8`^8XC9U_KjXYq`6%5A|Kk4fYe{gIDXRFh@P(>6 zPGm7Qc_jA0uG=Odn|fk(lq7Wuf~Dzyq>+NpjnxIL^m_xiViM^l?yQ)_n#3X+vk4rv z4QdI;TrGqbA`J>AspzTk2~Ea{9h*JA@~?xn8%%&pa>kK~I{VNC`y94131;I`Sg7g( z=pBMon*y>&Hp)SEy5Db=#1FEeZ0f(^rZ+|Drf~y@#?_zV^HCnlzILvMs_cfSl&N3m zsUK!z@JdLJv&U_rg{4_oZ<0ieMI7h$2xg5`GT)gW?l^vo0DV=+3sF$X-MZ<9U_|T& zy`}Maq=50j3#^F2daN#+mlgiZt-Jq$5T5!5LlHA949`%C!8Mfd>X@qIXendBhwj_l zVh;sDtGw`I!-iaCS)^I#`B#pADr#LE3+;oXj7|?GEhD&yk~j%g+No%0ald6QlBAgY zjGY{mb$y0aTC1{I<d#N&V#BC4mYs7c>YdiYEc<%Kun>V@5A+ZAJlXZ_@B?R&5z0<w zue%6J5R2Xy6_%8QOB4`VX>=dg<>mB-e_v$kVR-i*GJ7!HxWB_05gRAxX!U-v-ZnbT zsTqfSu~t@gH*;^57uVL-HlkK<!p#1IhcX>muGpoI=%s-xzqiOo`=ki_3Ubu6`HHex zq?V<~pFa(H^zv}<`cR_mf2otgH&BvueaFTzmo=zvwT=iN{>%TO%FD~Yq@R&;1U~tp zlMB@@^sRS>bZ6bshntPg9>46G>7fsfhHBr2Rlv`B>J#zYsSoR$2162(F#aY+?a8rV zb3}J2E9e?Cs{cGHKm3}0#ea$N0YCA$bJ=15ZDF3{jsLizmw4&@sa(<s(7;fXYto=| zbx+4&Rq#P2Kj|mix?GHKP#kI%5l<zSkB8FNykg8BB)pd<32z&1t)2)_sHm<<?dS?+ z)x<t!Ge*;{P7Tg+#h}|Ij;nj}Cx6YGoH1a{(zfvJ;JUAqP1LT3OLRns_ynq<S<i4z z<L@#Xd#qet6_ylBj+=$*<b`mrOH@4hbKXN}tdu?oYR8B;3x3X<F9Ia7XXf^Zt>iST zAAF=>z>6H5poVDJNcX9^yzf@e$N#Oz9LW@)CdoP~A@+%UuzdEs)v82ufl0%Ya4vec z#x`T(&A>nr$D#D&!1@TKR&%}mWv+=<wMU)`p6qOn$-*jg6!v)0#>IfyByz<NYD#0= zmsbuQrqkI=(RYhXwa#mpgzl%YLHrRE{>`1oZV_0;YU=8-Co4WQOiVbDXF5GS(%HX@ zk?b-E!nE;ShFnEgoDw4s9UJB%g=TUmb<hfQqcfK3bL(@FIKL1aU+VO;r{K;MntM&t z)EHW;3yJ5V<3z+nU~3=Zo<=gw6}oJXQ>PBcGnO!hNEywA{*tzmbzHccgj~_ku_8ib zW(0gn;na5+s~lg)CE?M~i6S(_wBu?g&DbPNP|WTL0Mgl9Rh!N23z6L=8o|4V4t&ym zeUg^rd8?}^Ndut@uBHaL7HY;z*)czg=7@6UqJ8@|)OzzT?Z8)B_7m$ao$ST)C+<{Y z1}eVNmqUMEQh8MNri&8JA9m85EgtW#7)1YOGx|jevx$m6+8bA~H?A)?W1`>np~oEC zg&smRM0oxLH~wlI|7W{8XoOUEV?=)=_8*N@s$WL~1~5GJm(OxVB?f*XbikeDBugo# zkb7RobJw~8&TUCLj?qQPD~227gEzWw75-S&@OPb_brsGs;kwsy*_bIS${2;h>m=Zu zwoboss?x=vN&GX#oE+zslUzf_Y)KmhbTHo2?GhA>vute3AHMAItgcH#hxR;o9ZGGn z47%bav5i`^y@iYFkcmtzUv~l$`sASoq#zTxy?*0$ByDR;%_BiOxp;%0{|$GbpOX?{ zoUy0?9Sv;4WAz2Yj|l|OosD+DVLDJ$@yJW0Mk#}7?IF8)539A=ZhVz3&>59yzA1=z zlm`n&DvQ8(OkU}u8b1cmMI`F~PN#x6yqp0V&rzgT(n%=H%PyqlH7bTfn$g;r{AppN zqZuk;)#u{v4Ud$FzdqR|wWkZfevHP<Tbn>A)c%3vev5q>VR`>B_?q{2XwK~P<dIP% z8FaI1_$Ic|vuaka)@emYFkiL-?I0WLy{+Q}lPG?Xqd|_ptfBkyqH&RP3GW*_5NUFR zG@wV!kggzF0cruANr`kr)X>mW*U}4`FC?<5<-)_L8%IBI=aBtjHcpcLc4**>22mc4 z_dQk=mreE@Y0uTwABK~HW+CKPCqZv(17Q0;MuIL>Ob&e8l*|&|Rv42BhIz#gL<c>O zbM<+!A0NpW=;=x5YmT^%C6$cce*Zr8Ef9uHQ_5*m_<}mUSqBxP)b&%b@=TcHEafyD zUR{1hL;p<c5Nk5MSS*8In1g1Mi0ZhN@K#;h5tyDY%*rX|t{xEp|95rNUkQAEWMpIO zE!HkkSwg&rS-u>b?jIHN&Dzh=|FP*z%J=MxzOxfL8-{0gTpCH_HzUA;QXxp~%kq2F zFfP{6?Hesc$y!DvYJuQ%Ui9{T38%F?Kt>b9swLI}t%BMY4K&B7YjOsHWw-rAkn_5n znN{45<Po^LocZEK;knn0%N%HjD!0M%MAKpqCb+~147>|$$fUX~J;MVbE<Z*8rj$N5 zMrJWu6%r(d98$wASg7Wg11To<f)8C$GqFKcA3xa7BS36E`~YZWkA>``+&zpJ(U{l1 z%d-b!e&qjwUB*kTVfkT64=vo<LwYt$A7=3=l&CY4S3ij<_Zarg@wJs7LyIf26_fxy zsyoWM1ASYP6*FmCF)x@5OFi5{Va&OzZC-&u0FNsQsDsJ|HmH*&wp8~dO*!OcVm)FE zM?4$<X{lzY2?DJ>p$ONL_xL)uqWNp^pbOF387HN3mXp9IA%7tu_BQecl$Bz+DwXxp z&F-zgAxS(RtW-zvDzwViP$6C%1SrH^F$x<2DXN7l()VSM;=ceTItu54^sar9tQQ6~ ziLE)Q`V10Tnd&wH=kL-AGzUx{`nv5nyDD@#nJcmitFe|m{utV>NE;6{W6Y%JwpNup zGMw$blKT^@+hU5IARBVj6|(1cgwjecP9}!DNWrR8zf$8YUVLz1j;$-sNry30M;D>0 z6#5d@Y`IY{mdY7@d25kpxj{JB*xvdUXBLnzV`iC0IuS1m3nqd2Q6wfNO0{C&N6N^% z;&^TcM27zqf~`0SY!A<G3Y{+1kQ!jU<WuG={n7-$7-`%;pH;!d%-Y!0A_>?_al0PI z27Ib@jFxS|>SiO2kg}4CCn0>v(<Y<<p_vfxMg3$iXY4K)6;^*?eJM*HP)wZ`;*Ly2 z)s0QUzXw}JD9B?&&LbWLunEaS=I8aac=#mKvCq#jvs-gtUtxG`t_5MP2sKE3F9Z^~ zk_ozgLnpIJaSWMd7b6AL9je|*MC@5BzdSyJ_L&l-BK7i!gFCwTGD52e#un|N*|<K) z_V%C8HRdl59vE~!Qej|bMtgaP!1A1!uaKsANpBt@v3lj6tUGB3Q|t9`xJVmG#qt`V z{H8E|4<R9849B3={I~mqPcc7Qi4f28Ijn)?mck2_*Hv2R&xQbq>vR9t$2g_!Hgk#V zHiimj@o&iX1xi)co%IBo8bHf>J&}tlV+(Q1o&ZS*<@u)Ua0fe@!Y-;VK)8up7d~0c z6Qj44glQw&n%`mqp<qFUQIAJ&x^HJ3?Qa;D1qWotU=p;f9z?L@!1?i$ngcm^U9*{e zNM5PcrJMc9DTus}V<Sl&;I&U9P1lompvOsq7QKGaoIQycpFt3^RDOb3FvQmG89CNS zUdex_uBnTW0FF9-Zo_3uf|r<TD|GYxD)dE|C4k?ZsgBDeC*7=<xldB7DA8%ATCrZX zLcQ6PnL6`Gh$ZXOAI3qpZm~SQN<?kwy@iX!x{SI;7T0g8?N4;M4?z?weWh}J6!dtM zf}wXLq|G;{VUyKduX)9YFbG7>54hY}nv79bv^bcv(E8g~I*GK1o=~z{8U!w+a*yb% zMj2OmX$@MPQG|M`$%XX!@<leOXG>&m-{zs=P`5}TZ?E<U+wrzCsS6R?-SxOp!F8b5 zN-sdR>Ce-xlAESz4RbRW?w@bP-A|T@Da#CE6B$gx=izI8)PwsO(S^PvcN9v+3dE7w zYj{RpN1wLgSG0kqO=A=Fi{G9U^O6u{cs{gPTK{VDgYNTu^mC?&8hR6tmlgFZ@zeiD z)mcVG`9}R(8l*vbXz3CJq>)xcWQd`=JEWvx=wZmAq)SFpx<PU%>F$(H={)m)&%4fA zXFl<17VBB??EBvPcU@akTYIhRQw2UocfJE%92z1zj%mV7c6^-qgJW{=;5kzdf{l|$ z{U70>oLm7eMsF_?RKU$ID7Q&kP&L>Q1FR%N3TKY00-poYm_DD1FDsW$obOZDIwiks z>tv|NVUL(gkf<EOGK|SjWHK15NfpT^4pVxWOW`rkTR=+i3Lr0U@p`|+k)4ZA?y~}w zdg5f&^Qn}@^)8e!B``)t`>Oi~bWwiZ|AS*vxQgpx{gF7sJ8QPYg*rtG3v_}LDTdfm zxeQNQHINS;A{HQ5tV;XK^Ks`5&7a1<;r8n!vjYsr544M3od+JdGazt&zWQs3@9NB4 z<cBQ6nx{+PZWqzx@W68*Gm{<2%8FI$c8e6r+x#u8nEOoM)YP<IKI(Lr_~%#DPR#fx zwQ6(GzY-GXwLIu#Ufi8rN%u?x+W(Wjdsljx?I`mcLBTv~r7*Kx`CqW-UKso_OJIGa zg>uq)kMNU-cMsYS|8opNIRDS@sx%iraViOrbKjxsvPl%_Vy{Q{skL?<fQnMopMaHP z=N(EQC3F2hGLy5YBko@pfQTK6KfMN+|B(w9q@;1UuKay@&Zl%18=T&#s#CexLM7@` z1@9#S(OZrcmV}D=`koxw{Q}sIn;r2MtUY^!>?87bewDf)<dRGU6iu`fX!SG%YpL<w z^>`%c$Oi4~)K0Ft*T*`GJ-aK<JBufNQ^aVaip(Q}3FrpY=xAzPyg3fU9Js|K&e0f9 zZ}kC3p^Y$a<9cpbjoy%>Wh=WrU342K@lU)#ce7%jvw~{Be#dJb>PSl(?E=H=k==lg z^zchX*z{~cem(K{z(=(v3HW|HNqxIMQR5pzPe&?Ly|}poLt7atHPN1I%QUK&8!+-% znfd7j<|{sCNubo3(i0ED1x8zjzyIO_g-ZS|4>T~77GO!pN~I88ePHRmryUicLtcq* z2Ng+KQu_BYmMm|4J?zi1=Dtq2w=#v5KJCowA7&aYu{VNwWKybj_)zcB*MqD36*Rdd zSj%(uk~3`9?*T7^;n;=ZZEkByX>BL~4(agFIg6>O>3sMpW&PGx^u*vNBF-d5Yx#p1 zl^#TcVuKWzC}WAh&=>F3C@oP=ViW|+AWkc%LTQKK$V7-nO<xxuB1A{EXXtu+x;WN$ zuh4k*SKMVfUjNNQv$1KvN5gtW3#-}b8jb0z``Fk>84pV;CmR2^6-|FZG4#*k2JYkA zyL09A744pQydC@6A5LJ<p^8=<3PTBlrNDW3#n0{^w7#a1Z_Jk}PkQkSPGmIQU&r|1 z-d!Ds5gZ8+)nWm?%P1G?{epw~;!3)d;k}o!5Qq%JTJP_nirzmBs=rTuJYdW&UD&Gx zo@q&3rFLwDNTsglOM%A=uD5ksT+tRhY#_BT_a1qjwX1J=(==+@`ju1o<9sN{`N7@O zqoYXQA3aEj;_n4pqCQn)B$#jr=UoC%Lw=ZPCNa46^)P-2!OgJ7?}L7c8V#M@X%`@v z4~$>WCiZtuM+W;YSLcu^2(NV!iH-;F$nU}F=9ry6Kg^96>A@|rolB&P$>!6fV1CQ9 zv+|d}u71+EuDYEqh+%t4GNDc2v2QB3IIu4U_=&HdnyJt~tFfQ{r-{15u_gPJPuB}4 zC8Xh0D;0am20{y0a8YU{XmP?FB+)nx9F>G74@oPIJhh3aY2oKgVwCHL?KXNlNV}sa zwB5fqpF(0~`Y*qLX?ar#={j&}Ks`)ey;^fm$0q38!-J>qOH&M6dEUS8^X5cPCQ`4j z!3#4~{-kuq-J(B~JHppufz{j6ekw0mz2+uP6*EvVCJ;Jx$B3|-Vs|ZY2*$1|3{!m& z1=QiAm<zB<-{R5vY+%IXoZ|tYs_q}`@v}PN7kG)JNmC%&?o<VPU|KUE>_|Izy{my} zxdT@WKT63*{H>r}he*3Ia!w=uZYT}-#1pou4y1E+(!)}I<OKY~RNK(Vd-Gtxy~25c z+1sGXqukS!>Mh8ARRTPo&K<^pWyvAhoU&RNq=ZQv)i+GB;qvoxH83s@c0@v%y{6Sf z3J)&@9yLlOoTh{OJKQ%%N%bvV&;E^|A0P`oN5ok-$BpoclV<;@?$<j(v&V2~zr!j@ zff7E#v0<g`(3n}@eQ-H)GPztf*=cj*aQk*B1@3n7XA6ez*JzgPkQ;62du`SqKa_kt zW^~qWe1%V#B&R=^DgzAo_JE&L31r=_qWt51U*3@HaV{Arf)%mUaidbe-k_Wbj!Cv0 zeGm<N=2GV5B%(4^4AqTW@^9&NeRP@YC1j^2Q?@@KN=}P0n%6yTG<*|zP<Ca%b}F_; zeEs>&nv8!IzJ5bF*$%_LOlGRmD`n=HgUfse8H$%LuL_<O{9XRUbHR>hqdrD$9OFZA z_OC^W1S5UZb}2%ZD>6ErW-mT{{oyq0*+M%i@eeOM;BF5Ih>A~IXQT$pyo>GX7Z2a4 zcFIafC(l0nlN^EJWnsQ?{!zzB01YgdappH+qC(iV*n`f^ml-AFYUT@>Gb+3Nv0Q<h zf~V9VJ`=93Y%PA}if9<>F1h}iOrFJ7WntPMsbaGHs*pfGoXXe%QJAgB62v{%LfZ80 zzUu3(I=9ieR^!M2ih&04W+SGa;CttOj9UC(SpKJXT4q^<3Ey7;!qFSw3b>qPZT`Bp zLCGgciZ_W0HFA^(I#QL`m#As$f^&s~q|&phwsM}|!(^cMl_$_Z$yt<Y%Ur-&AG)Y$ z1deAio#K!j+^H4CXXx1^<*hv=$3`xxwclwrpa@bObD=4)J86^5@VO$Mw3fZCy7v>6 z+Q1ndz8=}W|Aw{n?)cEX7ZT-@N$b`N_K2$NKDzAAeV3P)kDU~Li8#($T)*%h=cz&C zZ9OEBf6cZrv#J`_NmAs%rf)hJ<+AlbK}-^v(Af?)75E+xi;s0&Jc>NeFb$^`JNpAv z<z@zdp!yT0hk2VPti735K!PHAR;%p5C{>wk`qNw6bKokPg~}kBR6~mRrRlU84gHdj z=>1JP+2Jkv<urlAVl!2r^l->D-yqGaOY+k$KDLGgj_+`aoXkVTsa4DE?ZMaY1UmI| z5=+qI^K^SHy=fMTGuxUj(v@7#Sp0J*sK?c`Arl+w00~bOoW!qJhZNFZL`-H5T#&G@ z`P?sJ<*|2LC7+T(kf$L1^qcc=`*1mX;Vu*5$We;!%~O-f*yXuKtE`FrF^l?04^I|< zJa5T2l*5!R14Wel8+!c}=WaP%pt9c@Uq;nY`*5qpm}C!!81{QM>$n)*fwoiuj|WvB zVxSR*hoz;Bu|oJlaQ2eU?!Z^lCn|yHhRq(}PMi1c7U)v9-a_1F^wqdNp`xhcQT&lY z8OUGh?+04XLz11p7Yvf37_o{O0!DD9DO(Ge3{H`G8BlrFQOQtpkc(4|d%rh#Hop%< zn7kS`OD^<y3*Oy<@E{|#_8Xg<t^+Ko?~CmNhSQuYk*P_ExCkf8m_yZ{%GaCo`VK+- zq~<x9#4CzK&!!dleAy1t`_$c#)x^bs{lFXO8_re9QTM~mu0;h4voR0mHycxkHQ_gc z%{^8eW(BA!O^;F%9o!V#PG|zvSf*RMIB9o%ZigJBon0-W+j#$7t!sC=>3>`5fvE$9 zGNrJ}I2m-eWkNV#$SGrzv{-lQ8sXLfAx?&3j6$r`bg86Hb%dOsiS#0{vObf$pHr?4 z@X56Z8>;E;bUi=*DRdW_;pohCXk%q_O4uYG9B|x<tI8YDv3SD@mZ$2*=s5`T=CN*0 zIk1R_gY;T3V84Okc8t~cH8<bcKz5cOj;|6qIK1V!Em-ZrUz(rEO7ov_Bf9fy?=+CJ zzYFTEl-ad#U_+kQ_3_|gKMsduZ+5{tDZ)i8OF7kClrEoT0=16!MNZ}m1if0{NB5|& z6_tG9oJ9MBJZM_U4*bY=87MeW0&AXCoo&BTDTdCUTg-rxxTlC1^P*<oHNpEL3Iwqf z^3k2z%|lLWywj$4?eKEV3qQ_(`RXR@sNik@C<9t)_9(HFUiMSfO;cwHDE?^VRMsgu zi%h(c_lJ1MR5lXmRT-%r$nPm^58NeNGqgC`w{Cnjq9@p*l`&KxyE<Hi!28*2l~oiQ zDzaRUw9pc!OKI*1o6&7;2L?S7XE#@jSEIz8JLqN&eaXbUc7yEn@%Q&R<qdsIr)Y>$ zvqNOicsqwh`8MdkJ_l1+Nq~#DHh&hoASzEfr#e)6gJjUwu6)$=fF&^fq6rSmB+JZ) z7Ob=DRI82PfsWp!FH%v)t8eN4J)e0QOzp_(Y?_-0q@Rv2T#9(-66pa`tI4bsJR~Jz z6{luE%u<}xj*ATuy3U$iR-!ZJ@53wgz>R%YK-G8I0mo#mg7>Rw5B)i3{TCe@3DS~r zh-`1-j;sf3m8ZwIl!2>Bb7#FyuTo*1J7*B4XljuC`jzN9{8_ICBR_`+nT)*<dcGYE zJRMh}H$9xIS{GVP>W1)JK9s28{;uU#d0%mZ%9K*>IOhDz;9K++b3y`Zwxi`7y&hTy zS1SWrr-q7M62M4|0s~$HDSk_PAA0K9Zos`uAJJGiDXq?zL$YAtSw*)@f26)?Ql&HY zoDy;RpoHOq{2$puTa~$X{qL@Pl5i-?&Gz@xJJcvW9u?)#AK}JDibi0<UVM+6?pn6B ztJ}5fJJ*{z{<#NL!0>!jiIDzS<MXc@Ix=~r2|?=l;cFu;fxGQ0j^_b2dR?-av4GeG zr1-@aJmx9r%U(E_x!Am+cDRmR(Wi19iui+VakH;l><dX8=4vpd5svZ{9tM^=Z<d+T z5bCNCLgyI_7b}mR1z|qslQGjdI{@|_b?)@ODKs(^@CoP~({t4w=Dl(0b-F5vI6c3k zZQQ#K>@$p$!kKqdD;<|Bp6y)Gi7VL`0D|aIWkf|G61nW9tAweGSOtoQ6m(UJDZH<C z2S$hfNjzak3k*1QqqrK$B&%i?FKO>)YH@<SX9lT>Eq;{{YcW5A<hU|Cvcr`8w0Sus zLV}DTimpx-CTg%Do>(?1t`UubT02ch^F`Dhu$wuy966cxSWI@*Y*z~<(uABx&C<nb zQ<-aUsZN=^Vc!Wn@?h?1pK@t37~JA@iX&|k_X?gp=^lD(%~3QH?aRW+NS;7UygSBE zsuinPdpt!x{#R!TM%%qEr*!rteqyo}$=}~@gI!(Ct8f*joqw{;?0U9F^TxBQdw13u z{m$4E?aol_)yJp-5zY9@TK9_qfvCIY$Jo{UoiOe7<^=OMyZgYKKZYHM-=$8yzwDh5 zv>kWlH=^C)jdMEg`%{=WI5=vM12qj@@YIasSj|@@%~|cd72Aj}#R|4s<pR2~ADu&& zfu%7KO?-TOf}4$Bmb&tfA5nz-D#j%L63?owG&nVosy5(0@*P8PeJ<rSVPpZW9pco6 z@Kg;b>7(qa6I(uMVv^i?=3#})<+QeWX9&jN!O6nhZE4lRJW#|?yd#F+F&CCELh-eV z{Oh|Rb^$cGCowF!tvgbIH+$QQ@ht6!3vSxklzgsAz^0qUXxwlWv2V}aJ8Kn?uI1*@ z0kh%dvEi!K1xl%iQ_ltNrK^P)je1i36-lx<0>TcW@Fjk7-E~V2uUi9^4pXXg3mfVj z_X*$s_yK88F_t&~BI&uOl}mZ45`PNX!LYP$hRSwM#|l?BmY-X}Vb70zQu;O2wm9QA zyUDY;B_$z390W6zTy_U`CeT>fStrAUabC0|J?mVJmMf8zYR$vtf?5*1-_TqD|Cj9u zWtPQ}Z^<rr8{Q~I`gQv~lyL$}iKBWfSR@CUdE^NKn;MGl7ZG|IgNgSZVy|YzO-p|U zFWZ8p*<%^$1kho??8VJ+1oOz3@^Dabgkk|H{k5F4AOkNiH96#C`lZfa4}nvd#eqnj zHb4&csUpG9wT{}A)##m=wXS^Dzzg89VSOF0zhZq53?>4k=d4l8Y?7$U)eEo8C+`Z* z@$1*E+CH;rviKz3!8he`@1W^(mfH6snZ3qYjULEWy=@LZUQ05k804qxt?@qk*K`(e zzoL9F>LnKC*efPF5RFHd+^Weu_!`UPRqrI_CA|FSds#Ozx9dX%(~mgZAksr9e*gX? zy<RycW;ywMn{Ol`<{HuL(QYTRnQp{HqQJ%O9Ewo{y%ZSpC)Lqe-}8#1kGee&lg&N9 z#6p;pquh9TL+W2twYR)(Pk>RzJN=)}Q=ycF9(G((%xvetPBy0(4UIDaz&Jf%hjJv( z%+T>zwQqod!D~D_W@NePJx`|RLNW7`1yDOo!^^7k#*g0@j$<c{$H+Y1a~kfHy8@Ld z?%D0}7V2yXE7>BYKl=l^E84NU`C5p&!!LWw3o3eUR+pkPGoi{sw1Sjt7x%E=b>k~R z*si06tSpR-!eZ{~@*OV#|Ej0}{}KXh#k`JVjusot*So^JkLqTBSq_nJH+(}f&+|3b zn@D|+#97h4rmn88_i@wCi0Lo_d88LX18?-0nTwu#9?2gA=eK_c6_y3;E(+l&3ewiN zV*fqViLA<s3F0BNm;R$5ni%i#(b$4D%46G}f4gKo&0oif3ojd-+0e(N;S}KhR@hPE zWo;AoBky34R=`&>)pvh4KOU&s_#C1-th8b%(R7H_AN)p**%KlzRc$czNc#7a+|q$( za4vvV_^-<Ql+o~z%+GWAnGIy=U@XQ@hokjAFV!nIYv2BNGngD#W^V7rXjMKeiYbP_ z?6nE|i{988U}Lt)5b(FB|3Ha>X(W2~>4Ka0(1Y<13LSh+C!qGV$xy%_%+eKtv^p1& zWhs^-0}+dAy7qFV4>Y|`+vsl-T%xaQ!`Xlb037J;XPpou%S>6S(}7LQ5GfnYe6=Sv zFRO9~vTqv)r7xv&91_T19&U*wSV75KNEW&)6U?;+d6#91aH|x{!+J@6wx$rqjfOR{ zLngEus@jck5-s{!5X5D5(_F!8XD0(vIef1`(T*0WR!vgu-EXV7J;Of)>Wd8Z@`nfm zF@YHQYi`4eRJ%XHs%gxhOegMgNj;cbT!+-OOB0r(dR2SQwraFvr*}#3$?pF_X5F$5 z>Dsv%z<=J}yDgKPEw4m1D~byT-eFW5>vFfB_`<3OXM8Y$^v6No<!`%pTp>Qw>jL`3 zGj(=Y$%|NVbHWVzmV@L8`LQsko{hKd+Bph-`D8dB&uoYm%O5Yk#xx!I9L_ai{eWYO z^j`8xxM8ch#uBbblhL_O<oNx<CeOkYzdDquG-@N}sAw~4H8#`$Pag>9Ux&55*>QfB z9Xn8zl@-k7#iH&Fu*e#;XGcUGrp;67E{k(r5B+;<Wi}yqz1j9|HQ`8AVZP^5C<8Ww z447}|Mf<0|O5JdN)<G|CeD{~{hD%*z0_Y}4uP^M>y>$EO^!(6z?0Lfo&dt+(?B6n0 zVNQ6nEPO%l!s6gD-7gIz)CeVK3A2QIO>eG5eOZV6DFp)4A||TM$7p(+?hYg0_HL9M zC^B#ep~Zb}CDg|6Kvzt{$f-1Dt{=~T(}7x76y|+Wv%JnFck!?9w2BIkelPWdXHz>e zx&Yh8qW2^E_xF!R7vd|6zKYY_FUE&`yoI<f<gu@BPDb~GSP_4IsR+f85hd8QQaCHX z65Fa(9L*fdIvbma5v>)9`{wb9L&s0T8*d1Sx;{S*>0Ep!HMZ$?Ktl08PUKdxQjei; ziwWtACTSPL&UtW8=h_H`L_NJ*g3Veg32+yKwRGNWBCXDIx@m7t$R12@ICgkOSe!4B zR}9map#L#nBb7Q9HbP?qRrp}H;|-U4N$L3FxUf!Y=*^X*%K^{3&fLk(%D4w&FmEfm z5!JD+CcLyFcyUL;!4JSROx~|sd}$`0tcL*x#=)^kXB>1Q3R~?NHd&K7Q3!VPgj5xv zU$F&Ku1#<nlR=IGhZ<2zzjw4lKIjrrMRG2eTc#HVIf!$tVE6wbQ9ck6T_4^_z`^!G zdy`&XT~Ib>bciOlyJf*{W-L}^jLa0+0O>?on;mdC^hXDr`l{_+4Gpty<kj|~OKVkL zS;hw!IG~iETLy@(#}Esdi9>p0YSTdQc`mt+Y=Sc1By{PZB(G(WqgV?ncRknk&KDPV zrxa>H6H!-HwL^UzfPb}Re#~0#FgDLlHV|T;KnnXzGkSPBGRi=sek@u`kLA`bkFYk@ z7_0~_+wd<Ms?$j<P`9(x_Htd4(JInOO5u(E3pRFOYY`l3#`OqH4K5+9<9o)LX{4lN zW+JAih}bWoenn2vO>`Q0G}Zq>wX+?~7pSfaX0vX^D`)@r{Pd3ynT=bYEJcpXVrzvR zdxYNPR+kVc;Sxkk(j<KU9y*dG#w;yOe>M;`ms~?janXdWT8x&!N;;fyHfHA`;^M+b z&Swz1K8r6`E2KEp1`yW(*TOWtd+KoQ{=h4Fdykjz-~62=gb4Va?GH`5?pbP^t+p@U zY;D%1-H$$Vysh9Wf4yyzpWnW%6YmzjA2f-T+{k(`+sd~;gr?+3i&S#C4DGJwl}XSq z*85}XE0C1|`SVqLyz5vmMvvJBm*@y%=pkp<D<uxk`_j))88kkHr*Xf=qv^E!JG*bX zkpWkfQo`VM=129SA3ySuQaH9cKiJS@@fYoOo2-$h20sZc^6;3E&}qY1o*jYBulF*P z7KV^I(e>Fs$Pn7Pql^2kmtaz@$W?r8fll2qx34(jsQN$Zc}2ZUl11V_di3t+he>!Y z;SKDCa{Zg6b^W5gP(|}s6E(a+0Mt?cT5O{;HdW+Qxt0L?#(zV+h$6nTNU?NSj25rI zqK}iMaBANJJNmJtj?-Jh6JVGgBjQ{rq9>8bDLHk=2Ha_XDfTbo7y5F%#^^3=Oy!ka zxQ)y_kM1EKyLAu&6OpE(qGoJf3@Jyq6xFYR7wV<G6hB_=;>qmdlM9N`D14J2@9_b5 z7RJ2gNLh0cViN1h4~?t#D8^&hZW=u46VOa7C)~Eb?XHuE1+b}SN4)M<0<v2QTZ#V7 znI?(|f2;<m0tx2rG*eU+<AX*llnQ?;PJ!_{9+Yq3!@T7Q9<O89@#{t|hEn3(+9XnL zHZLRZrfjS5|9qkR#_i0^84X!K_f>1$e34HdXyms_ahXdHmU9lsosOy=)U}Y8jJ9`o z^~VtIEezcUm0gv#=6%(&U%w0s*^&%w#DZpH8U+5igu6`1@>L*yI4-*0^AuE_KNhib zaLC=OIs%Q1pjdQ))XhOJ4`$l1IvU%n>r51M$<!w_#?-XJ<P^5^vypk-UaN=49LRcj z=8=BvC{>WYCgf1{WIB4%15zFBVP{B`Q|5<!V>Y6u8uJt3oN-VJp6a=Nw!r3=GfGy! zuGVixa0R3gd$3ku3j1C0ZX~Lo-clS?*>189`yUy)(o^+-&h?^w^&D9A#|O`3B=g&| zeI6QieSv&u**X-bxl5pk7R0m6UPXt`Ey=bKyo^&(aWU4WcG|p~g67u+SgY}%LVvu; zUkM<h{vxgbMgQy7Mzg7$n!7js-=~w!u`tHFbn&xK3{3f(%F4>H83@u@e|~-r+et}4 z(zxX2XHDpF6YF2`>55Rx9xFnWJ_7E`It$!m7q@w>Pych=NjnBq9<EW_jWTsBQ56c6 z{86JBW`A-cjBaoa6XhV#E5@?5Enmm?hV{8s*Ja_+Y^O!Lb&;~P;$p7j+^xSl0N{JV z=tQGoQ|?ngoGJ7pWaav;w~KW|^YBdmVF8)RInmzNdBY%=$(&G~VnyVS-=^6K;XtM< zL(Y0W(i1WWEeu`@Kehk$$0S&JB)1&cy<S0~9~v;u>xmJ!isfx-!h!G$ozT)|>sDcT zHN}yafv0LYBu-`XGbCSyu0w}@-;IY&%2hOT@Y`U;T(yVwdkI8Q+E}v}49-=_UM|6x z<0gEbHy!C=m*xEhBWtch5vGw{0oVk3c7g^XM6imqvgZ_Sw}0Y<Wo_)0aYCYr>FEi* z3M2)O3$%~r05Vf?g|!T1JLMEg$(G58r>O}=+hopI&i#)tjm%<)We&bZJhNV`F%BX8 zS>v~WA0J4Ugz6#%()n$E7o9db*etWsqG1_D$6Ota*Xdi^pl&pmYO(Y2Y3pSS9*^@@ z;^Oe1jYW?7pAWFvtmg4l`x*z)RCK80=xoQ#1i11DZUiJPPdz%NPSojP##FWmV-b_% zR<x}902PIJo7}NO^w>KcKRZ%odv7qh@5hI1y?!g^`Jqc;9$6*(JK04**g4&?*ieF_ z-nR5<ehf(g((x+8+Bqqd?uz{g2;W|e@v_(}!q2U=S<PN#IUEW<*&7NvIj)w2q`w4W zbEWbUd92Aedf=OxZ>s5Pv6M^_Car|<H^j<2zyQnwsNE4pI0f^erMw*~4`si|S*E9z zvq&FFer=n-ojXrp-+H<~K_ESU<$h6O8OXg83~W1@lQPKnA#xn_iCFqGwS~QG9feHC z@GngflgKbe0aUSM0#AK>6+8TJXfwt(*7@4M{`a5D9}*WG1UZ)zg?wm{>CFcz`c|j7 z39)hbyDl4&6MLb#T1#9cM-kupoTAoXJDFqpH70bl8ofw0LSV7_kewSWlHSW9lk1ll zh$B#zNcyusQ$;m}Ny%TZv`+07b*!*Hc=ZI_)@}q?1;gibSRy8)-J(Kdcm`Qk)L0Xu zVg=-ir#Z~A29Ia-$`7r|3F`dt&|zN_%MW1#X6^!lnw{$|>^vJ5pFS3d7~lFg8v%w$ zh@o&hFr2xnO~iPf^9yFf-L9hi{-Ls$3v{jlbf~22Qb6v(&h`%n`gTuSPttDNVOjZ< zCUkULL$(KhFh;-{6d*`}AfS~80vR)f-!TPV3&NtTEWEzfaTwT2-AtcT=BW=jOze>E z6au^1Ml_rl#pj2vx9VQ*3&9^IEiUK;h(Hh^Rrk1qAj5)9*q=>BM@upSi2bT~3sx*G z7ve3S1Yr#a$rq_xtRBU__q4V$hFbW|m%HJ7Up+TMR_5R6;mtLj;kMS>@GD10$A3pA z+t2NE%0Rndslr-ig-{l~Z^uZ70Nj`_GrwZC>>0Jnj3#F>Z<w6Uwm!GD7BFCIdm3&3 z_tZB5K!KGr2^DL=l|$~GnE9jMQ%_yC`iop|{=3Ff|3@>LB%pzD1BGYR>P_KmJb(zL z*2co#C2NnOu6$Fh46_q?frz4myI{1v{kpA<yq@yQ^Q#jj=%4Tp5GpFiq-5R)!xs16 zyU|&u0xdR&8#DZpPoMaokAwz281I_QZ|3ljRoEDra(s_G+;>%~ehD~RX!>e>LxyZs z6F)Ao3^`R|%Ti!tI18kUTSSKU0Z=qxWKeuzcqYLvSnT3(1tZ{$IR#Vz3X!Ff-REJo zBq1)I#HqyF?`gMqvYfI_$b{t&O97~CJNL_55*qJc!ijLwio0h-(Cvoq)vy3>I1TO5 z^4_b$6zj*5crG*TfWpY8LYvQKEEZeA$Y$saS<q)c>tstFN1L7u+?CML&ERfb!pcRA zuNE*Bwd9HkA21Ge8%_YSKQJ1`4$;N=sIbo1LOb+AT|L|K+JFib8BW_1RDRE{&%Cg| z->b)7S&+{pyIu%#;JTvE6YeyedLcTPdni^;zGD*W#-MycP*(!8SCEVZb09UOo=3?w zpCRW1DKP3Bhi@EgSvbE>UR5giS7->W9{Fr4;jWcjLwv5fKtQa2&c$4eWto?HvDcLG z+esKH9@N;Jn;)ZxibB6qe*?JsOUhJEsA|mc)aq?7#j5(gKnpiSNz#LWF(ORHGk|<( z+U0b_id7Yj*a}z#a*hI>^EOI`S@_6~u!6d*gup_5Uwu|n<Lw>r=AtIKaX0_zX6=z| zceR7iZiq|4|3D37n0L{)KU+zkZ*JzY)ldAohvm1)M1f<*mCnOe1||OkHIjSCFDU_B zLN9IL^^8qg)TngyNGi|e;)9gC53|`u*(t=srv{_N>qzE4MzBa|=l;_wc*Nv=+)CS6 zkv$<myp^zh0!?I!-ANQmfb-K<=ls~sK-x{jjHF;(M+1C_%lmu$0hKZ)VXoS~p^++c z*Vok;Fd`nLntl{N!%3?eLEDRnmT%gu@<lGS>Fvu~+ckwjJSzD_bJj~D1DXX{lWg_8 z(^VOtzrZ48x18;9ad9*JVads1|4Yn-u+K~DmR}TxJ2>yo*o?!W@73y4NDnToNChz^ z-8YoD^c~ws3VY?{IrCBu&3M34kly@SB1mLymyH0kfV!s!6qHh0>ZrWyRk+4ZQhFcG zDmq>nJUU4wV@|iVG-8)bFN0LvzO;jSlOsS;sQqdcL!meyoR(39>Z$*eq!w+Hv2%+> zKRlpvKaKk44;vLJ<YjU#^0c4q3yM_{){zjESgf(q1ysJBA`zh6M^5J~ucLCvEV=r| z8slUvJsosWbF>dfPjE59%yf$<yN*1gjvkah*b3<OJfTKL{$gO2B0m<$aC5kgPqvuy zHGLJ4xM?`}c+eXFcEfc3X2e;Qj7MW>2zeYr9dH|%(_q<GuU{BSC0mU-Ygh?U1ZLMx z$<OWY=lWc~tvXRVg<nPV<=}a&UUBWPf|aOB20z+u;mzi|_1sq{mx}yg&jG;(xb~SU zwW#rsVQ>~!v-=rZWKM~ocrrGvQRGHT2JlB3HS(T;MM~Fp`Fl!Q5P@M!r<ouUCM+n+ z2V^z7gPK7@IDS4CyWtxf0$cQwLAdvZA(AcaJ;~aHa<Ue$@$v(<VisM;$LBiiDa2~+ z`34JQ<=s(Zh*_t!=6ZB(OsBrbFR@~L!@@NkOJDPBBr=Uvx6*o-QTrkC%d6{bl*O;@ z@;*MuGz=M|7_Yi8x<YB_Yn!F*ISrkH;k)G$ElfK{kKKuOut*9$NBIIf&u6YroJ5+o z<0T$6ji~rG841Bi+^Um^@mQs<vEei8jX%oaatC30mUw>i5Atn=<a`6$H&J)`E&SR| zyz<gsct{xnGB*C-XLp$H<`He~s+ZMfJwiA)T)!Cnrx462puShVZ|Cq{PX$2j2o)gJ z4B_nHe36QGSL;TSJSNZSwm}iMSb&~Tjet66S=XnT)+u)Gd8~)bq{AO3O5Ae@>_FXn z2k2Qwv7dMmEO?(8nFp#E>rl>W4BkZcOSL7ymXyo>aT%KQqEa6q133DS?ps8zkRrQG zUM5U2rE@cdhf-^7??Oas#%zoa;rr^-J_CRk+3pxONeoU`-Q!@pE&`Rp&WA<^c_+lO zWF886*hJ4{Vy)TrIR<B<Q$D!1n!Mj@<`Krvsu{(vLzKdR<=UNP6gji~QEoj_+X20K zmXvS;xa<xuTY3V|D}`^CIF@rI?pzf2sg-e=EPk1HJ&$8I?(p(T1wS*?rRQ(jfK__2 z@J6~p`L}L(Dpk_yT?40DBk$=h8uKP1|AD?M?8AuEc?X)WA`gDXM#<a-;S#f;SwKO1 zC61+4j8eSR<)o89UG<nO<71i8vg0wx9RymF-(HRSca9R449d0N;f;g}6u{xw#4{gW z_p$zF8ystJmM-Gul$Q*=S@CVW`)=wYez>t<AD=KzaN>VMbsqc5)K`@kRCYtu;`!I? zIvY)=A%K~H_79?%-aj_v0o7rl7Keol|K?y-TK4#uy3F7!rK1?WtPkSpSC6NH)!!G~ zhV3{QhzE8~r=G2WYeugxyh|f5GF2&fn`-&=kOM+qNuPY=*0MK)<iBDS8x;(D`V^Q% zrBJTIedeewe^EzZ#^EMlGAk=b!#*arKe+KlLt>*_G*o8_WMx%I2BZH~xh@85HxoTB zA=i-oKa~0HfjFGrt-%q@%E0y-Cm&b<{!|JEng9NSlx-*GljN=t#4X~2=g|v#LrWIy zrZlyG?_B>jtN+b~;J>&fA|@+B_u(zZMJ7Dz#WKzp3TN|1rm?l#4_^Wxxt@{|?N>pb z(y%DK5R@Xa@0kzsu}SdIFj<uosSRr}hCw@E9~Vr9xrgoW64{viro!iEgjLH~F3=Rc zxEG`ydqNps;|h5!0dM$=me$d`RZ}$aE>PpopI6n_6Qo39_s>@*f28iMQUJnculjt> zY&5NMLCArq)}ZJB5{n4_0?<wYUUA#Gh$N)Ju;Z3l_J;{^m&OLq=z6WUc6y#+pcFAt zv_=UImNmT4E}64zK!RcMOe9p+bc?YFV>eyW{lqy}s3c*fgp9ziiGKfD8m!A2mVfHw zdQ{6vi@L&aVTN$4cY&jg4W#7R6^LZQDXM(y;1pC0L&B-mmn9%T$NnyV&$5K30T-zQ zK?Yo(Onox(Y<zIKzrB$UIX#fM9?3#>HLE@?;Z`qOArsj7!-_>nIA|xLG>@1|T0dfc zLqKz`L@m)c(%iC$osR=7#6%(&L8zdq$*tFL5M9{g&h6_Z%K0+(w{s;$4)Jw5yexM# zZeq|4Su}{oU9(&f-GNF54@GmQw>vrwJ~&RTrbO8}XCf;P7qo>IeN0k{P%Zk_*q)mY z+;^*hsVTbOPkiq-#`5G`Zrr^eJLuQdil`u~kEl)Jp6i1{e4#5gK_jmbhzqXul0Fkz zOIr@q{0a-N$9l&FlRw{uY*_Y1q!>RMG`y(h8x9u|!%VhxOQa&pbYeT?r4e?ty!p_9 z_vcwJ^nYG-k-K;X_?MJlPbA})EBrV3ESX5=%lL?XBMxS}jr363dS7OZV~bWn0B92@ z*Rln(xvkZB;vGwzMp$cv=*dpMS=(eD;!8s29TXiLxK*r3GwJAK#F+J#)hlb6{-OKF z8wMx;VA>E##PhabXG4=KVkw$anm#sQkx1I)ZKieVA8^?!8@MN+(`Z)5vhcFIoev^( z9{xuB?7R2H`|<e+wP6UiVKFa8VGs8vZvrl7T6n|UJ*L<~igSje{DK`Jkvi&jwR0CP z#_}S${M{ecBmuOVhfIlgx-4$3O1Ig5DK#K%khYAu8Z(h~(3fp3S<QJfbtf8F4o*q3 zE8z0H|NO=+6Ok*z;<_Pl3O?MYU8sWp%XNtH24UPrn2cq_2W}B<ByIvT02rd#g{lBT zDOU;Cc0H=EcS3{w?i+J5$;6zcR9a_19jB=^VrL#!s)t7Lk%;@vkTlApZp33tZf!Nm z-w!;ohoedket4XYP`IOe<fknyR2AL%GayLB&{G7!%c99sS`w^$67eoq5jq(*a-`S2 zS3e{g5dS?pytJ}e59jXh)4^)m?QqS_QRPWr;Lb?*O@>q7-!IY%DseMo?jIB^ay-@Q zAYCm(sird_(`gqyVk#MTN-@o1_>!1PW;6NE-OxB`Y=4A%V~?a|&Ei;xFS$?cXSvR* zg2wyUj5kN4lX)bThp=gU#31C&^>jx;H7}u-C5_1xg~<>_&iXus)y6(?V5i5sN2>D4 z#jdj1yiQOAa<>38BO~3>Vy)bJgBrT@EED1V)2I8P9)FX*gUU9fZx4NLixN&Q>2q-y ztx84PtsS<z6ZgN$q5tNg^42r$j$-b5_!AoX>vQdBr|>!#J+t_kAGFGZ{WI1$r=t7G zV<RSSBCS&etg;V<%hYdsM-7}{DHKfnQbw&azmMG*C(LBtJ22}L3}S|ffsLpR)Jip& z3j!qv>vy_HZLpwE41(C~%Wjrjf^~RfuWw(YwfcxNiMxkPZie)d<i#N7bhIPPS%j1u z);gBoQa2cQ5IZ$FQLdy(k;N|9+0gR(wOi5{R0~=BW~-m<vJi}V{0Y?7=Ng2ED;KCY zhrbh?>b9%n+#!E;uuS*P9m!0Jp<Uz;SBvDO#7bFMU(0`V{R!tndr<arkiPH%$6UeI zgn!C$-ISK*YDM&UO+`Q2DzptcjR-_)+FN|v8ZEA#F7P9{WFr@}qumOXR`&V|#l&jc zXtP@Ko#mOUv8Ja6c=jOr%>TCYou%*xc@@;otw`eMSoN6b&w}PwitwfE$-qatjtLpl zC@n1w;pN7BuMkRk_iHk{-#$7U2yJm1OgIO5w*wa7A1wdc*t;=#o-9Z76ux#pSfGj; zCx89AsB=cGwANcwF<Fx)J|!i3qRa1Mc%NlolThD7Xd;PZ{Ksb{d4xQ3slK)Q-Z*XL z^FOUuC!!%2J>Et79ZD3TZ`H$UA-?Z3Y<d$CnP9WC8-LO(O$T$NyTVdGcU`9Hj8n1) zcjpIl@RBQpZQpGCtMh(1Q>rrQJg`}2AqWig!3+>O({|Br8EZ1fqO8-ij2XDh2?(Ds z?-c=g<Jq}(TsEJ|A|(;*VmgtzKxo>H#Vaxg#m~BQS6dVtmCp~@N(6vDp>AG<l}_;P zSUYqg1Qgz7<hsmvJWGM~k04*eiVdcnoYz{0r`piSw<L_*^<y?r{iRzwe0K-BZvGaD zXZ?5WCC<_vb)r>U9m6&+BMVz}OUALLMwOZ((_U*|m5$_-dcw0SKv66J?p*<bjB!R~ z4RgVRU)73azv<#|CnUVtSFx#GOy>QAlFl$l9uyoTa2tJy$&El6ZoV)B%q0-k)$6pL zXrO+WFQ<M|EB%DTt31ypqes)5y)*_n1{mHv>yX(2oNf+<m%Jab1wmS-S8u-*EbP74 zwZu2e&p#XM?&wYEGJ6FAajh56<VGl$hfl6V78at*4^UNM%!_HL3Nw!)PX2M3D-Ny! zp8&dAT0He$oG3pepoxj<cz`*IFhp#W$3|;!gr;(?T?k{>%L4BncZUcYQIM5ZlN+7b z*%&)M4Vv-`4m3nAA6#XNS(*=F9?G67uvwSMtys`46Q{yDdieLCB1nq!CC47lsrS<E z6f2sexQ9#}ZZmV67L7r`?R)o;ecsqg#2BM??kB5v7PZPs*A?l=1*>i9f7>5@7zbYk z_k`*gOf?YdHQ0qU?^7Fi1NndiJOT?pm`AAbD~G}!BM9=8M!64HQX|T;CDjad!=_;J z+tfnB3qW;uokK1X<jX@-FQMephq9MHh3}RqLrNFCM2n?nq!kjYeF<h|CHbkFl_zWy z-{M7|8SB$}8R)!z9jF(42nhuHD*o8KrMfnKXzM`0eFLBshT^#zeiAD_mpMAmodW2I z7aI#Axsx<5>uaBg$Jct16*14l>?O$W6ot3{7+h}b028fg%-vutX(-D_73xiH^c{S? zg>3UEu=M7AjPpYQh<_)HXajgb+tA{q&LqfNTL`oX_ls(Sc-Yw$vl<)n&CTO$z7kef z`{pYz8M_@$(it}Ap4#M*m~?cQmAe^61{}{F{a-bGWP3tT47Q~R`9*hLn81ClFca#G zXZhJYqFPJ)g;kc`9{J&UBk~Wfda=&0KgCZEs=B9FHg4-$xW+)ReG;*fD`Tr0HRnv! zo=fN%hg%=+BeEqDKP|kaJ(afzb>x5OM8K+;EVWIc%0Jxm&Iq@MN0Hwo!g*mgPXa7< z_ezmjuaImZc9~`zvg>PXL6~=PJ-^QwN&nTOSfF}X+Ii5qYCY0tO!pwf1SJ;O2J875 z?S1FYUUrHT=qtdZv^@CyEx;}E<2?0*gJ9>j=a5}+FSqqktY)(amY+<KATjy;xkmlf z1s5rzUpHrZe~c2MrA2ny^6;jxUcuocz^pPaSD2w&{;XX>x~|Mxv<WiIDA!a5cYvy} z<&jxV+Vl?AoMNEmt8g~%OTN)JH;oiV63(bc3q|>#4?swnOeaQGwaa6_DUxN6{!ofC z-&T_x<%v`k=oJ-59hu9Ex^FzX&;Qfk%ci5r$gSOqiG~DAvyTWdsoR#P&;M*Af%z!3 zwV&lE++1vak(Z>7&-@<CSMSifR$4(?bY4(a1`s0Cn!7+g@>?4or1vX&eRc)AR0tJV z<!W>K4W$M}-|I-x(vo;3qYk@aRe&(?ZYS0IDR1%Ygd*a%$++q5#Pw-h!)hpE^Sz-Q z?bFkU?+4{bEvvRzqS<b{Do!4D8VJ`}D&j{s8|OLLYZa`$WIw%asVvLXZ6P|Jfalx$ zr+B#Xt@Dg@&n3|;(4fV$Tx_kXBYM=Qm+aj8tXNt)YCqb%|CloP!0DE>@5__4``!Y9 z2LYjxFLH~PO;Yst1y1+<v|#%Rs@RJdLCqOalQ+9^6k)p*LH~cPF7RdRAJE8zdK!q> zydX%P=`zwMtn0<g%IuxrQTl91c35xcZJ>JN&ugioC|Xd9cVdAnJx?;mfbf~3Ox7*g z_71{1b5$M^X);PA9kiJiYiu*B>JUR;qSMr#WnK?C?r+@U%+1GxUV13+vNMa^HW+V% z>&#gn?0(ana`JF;MGxhTQ~u(5#s<hR2o(rv2Jrb&^GHdn#qtqQFjlq_K&0>R=+aMr zhK&6bbcw2N0T757^0N3{Ak)d|mbrVu8Wj|lAPk|??t;)<YAQ@S!LftOF`I1*A*rpM z)U}26RFji-zoJidext95!@hra({Wd9J>S6^|2F|~9oPmZ_>3#;3SCfNwE3_L`_+>8 zKpmFZUvfVclW*hLS^C?UYTCn01a|*Ly4h8&vY?H>ZFvm0M;_sL2U%Ne4}j{xu$gl8 zo_0JJF`Dsa4@`%8A3>2Lq(3Ws{#9^vG)e8iF8c^aP(L=;1PMueVq)wRXux}YKAqBi z`@JR%#>~h<CkB)%)}M+iAf~RNI_^^hNd2OBoYX7$)rcPGx8drr*iP$vb<~>_=tq#_ zUk}^^85`=x@p~<SS12wN_0*~B4<ArPBM5%894Ckw6Jhw`p3X-Mo%Ld6^a$<7`WClG zwXl8ef^@XtWpv!UNFL$cP4S?j^V>pEX+N;q`dfz3Abg^;txB+2tfD1AGK3}mh|`sf zPgPILaldXi>y-QF<fg6@9<faMznhf)#P=vqy^d{k1_z`|V<u!~Vp{tbkWiMQiA@P> z=9iQyW;%0CX{B(jpY>-{^dV?y@@Di+8hop~$E}gB!M@4KKrD#DVaq~zBTPOGpS3X) z|1>I#zJD3~S@gc^ziRzIEa}t0_+EdN`2XHyE)-(`s7dodxwH65;~|78JNYZi*g2~e z!xFToLm+3Tvob{s7?n@k#~;=LavD~(1eg-1-<FiQl+qV$FBOX{GY4Kp_1x&pGob^C z-PB+4)Kc>>F)=e(|E!;$l`Ea**yN{<p+0kXpAjSMa<T}{j9UeL$Nb@Sfaj?0D_{31 zVtM`jx6drX&hx>|->EGDin;_;cB<b6KLXxigF$r0^=_JSm5}!a2HXM9_YtOox<D;0 z-a+Evo}Sl0Q1XPDLU{Z%ax_$`EV>tCP^lutET;uk{g%Q*vVA)}yJ#Y;JNCnagv32T zr^a5~9kW0H2+c%U0BM82fVj0-e<ytA@Ha|jhoF?sRFHWb1nXwr*J~SV?GG>`VqnW- z$wb<vDn@7#xMD)5Mvnj1H`zYzFthSgJ7u6%oq;sxsMoG<sse^U7l%t^l6<=rF<xma zta3Pmo=&ST>p=L$lVNm{K4wTnv2jZz#fV<a(<ZJ&nT8vPS!5vTW06-_OHKInG^$)W z>ACSZH)mrIzfA0;O(ZHRE}wPNbE#p9)F^R3o{}#8I~cc_{sC<ausWoet*EFVzyzxT zMmdfN*#s7f&F<?B;k@O)i|?u5Sg(k2-|b4eJBS25obyC}84P01mo{+IqjP=I2zdLl z{Z3gzbX!W|yvI-kr1`>L9+02U%>R$?ZTx&4*VV}riHvJGc!RugyTVnc+9i+V6=9PP zrPRZzzw2j-!5+o)yXa3Z<qD}}ItYzgD3*DLyWj`TGVU={N(4I$J0@7bXMF6rWf3)l zP#sspeSpV@PqD!WBjh1P0FQbMqdNj$zC(&4|JQEX1g){Eu%@17<j=Q%!z%H{M``|N zRmXoY7jngL4UH4^%hbsz9sAd)GGz5mlF{dOG$8^@8Ypf{ilVL&fEpmq-w+gZ1F1$s ze3$#oycrAZt{o3%_zXvI=D10)=wLKuDOvp>=W8}r&UH0S%~ujmgaFl+3A?e)Gfu{Y zOfniXKFlgr`>DLIh^r4o2!mT$#*1=k1&fXV<bLQd<s$?I&AaaP^NsrPcU?PY3_|7j zC4-+#-lW6UGzxGyk;K3wgiTObc<s+~TikiIdYTIPYc{rSj#$1?rIe51PQ0nO9>N)L ztas|_>agP`x;PQU>1**sJSNLrIB5>jJ?$d81TQZS6YUBKzr!5%zp`~7+7F555slo7 zN44P@yOU58r}h3eZO78XWq8J0TTN9gqAiNsaF~LOF)N5Fh%WKk2-$I$!<c2W=V!i< zciQmhx3?2O>r^Sr6{{#DnR;)vXQw-v_H*GSs8z1x$`prbyCM#Y)fjtcuBTD<>Ba`3 zHukk7D@LBZWOKh<x&E#^V3+AJGief(+0%vr3r^n4$_l*1CFHtf=r+(bu9n)jqgi)* zm){5n(EGIlI_{6aHq)#)D3$cIEe1hh&gF_9wa|>7PfC9YMdu6%p#VhHaKWGmk5cKb z4y!+Xd6Lc>N7qun&*Ns+|4nm^-R1*DbPVvcp%fd!p&eD2mqOnt{hzaL4j+qtLGF2w zO&9`4fn0uSA~LF|8C$BxlZI;sQAPs0KsAF;qJr<?*PC5o&%nX9{mCy?e{0Hb5Ynr% z_p#}7551TM9!F$1i-!$r20&;<*4y=(SyW6u&*P=I10{o~<WH%aNu$ycAIp`pO36X4 zt+gVg)%WhQwJecRZOyqJrJ9=W=3HF9&}Dnusoo3{J+}UT%|;rJe?rPPHnlpi&U3S} z1d+o?`4Pkc5@cYou1$H=wtT@t^KS4MAuye^Dd3X{J;g#Dqxq~R6RQB1X(+4spsFmR z?#3jj$Ih6F7rs?vl>Vp-^?GgqAk#X6V)ze6^nP@FO!;OoesT}DA2v`rs~Up6p962w zF8ak!S-8(!|FaYcae~sJIwO8ZxZb9MlqRnh;S5*h?>M)UH-!h^1M6*I<`V5^eX_O6 z&d|X@<un!6qTV0eUZpeTYqc#fkdK?Elf8l9f4NV}$eAAbv?;NomU_8XXJ|dAjIFCH zznS@l0$Km@U!*X{4xXIHOiP(IPM1A}hdwQ1FeZkfeKjO2*M{%xSC67sPMr<4C%VAs z*^%|&>o%Ad{Nku72f!99fBA{?yYubMZOJSVQj%dFO2vYK$R!yC0tHkqavOi4BLk5N zKFT!i#}kT~rNsPIIQ@U-kq9nVqQ+)IMh0Yfc;v=q-U)DXpwg&bus-@h1|ih4j^Dg~ zX+I|7gkGyy!yZRKA9#*|DuaeBv!*c}2Sx^8mx&zaYBdZxY;;t}1${I(-b#r`pxE@> zI*fdyh+CGX3(UNAhG~hQWC1fXlyP{LPuJV+BTTzs95*Kq&)|kLxQPF}|5D7|cV)ka zURBphd0C!gT+st>wfbsJs$7y;arTPRW#%i2DfaTu9-OrM`}S%e_3*53-{u;Rh}`We z1*9z9Ls2}mJYQ*Pb=rH$+Ve-<D=Zc3p$%_*kA|8coi@ezvYSq!LqI;zz`eoJ;)WO# zJWQG5{TO2`8*hp-UwslOVbo9|!9s5vEmQ&bDLPKuKa|4ina$5KGGOI@Lu82qPR!?@ z^3N53+(THvuUiyrn}*OWxm#JkZ12_a+cilgY4jDZ3%MKK<Cc{34A+LdAI;QmdR9rm z%B5LIYG82l9cE!qZAhlNoV^+|mpJLqpHX86b*C81Z*1|+^vfp_fvOcuEeiIU)aZh4 zGd4(ff@E1jf^u5%3>A!Fi2gLMDv!ViirMmxK75E!hucbon&yRQRAl)}yK=ha>ibCl zIn%^)_Rnsz$&|HrIpIP%WkI9kk#k$}mNO1eMci`L(%~LMeZ!x__2t9AplXIgu2fo_ zJVw5c_!gc=7;U|%P(2K&H1hNjx3PiRct{W#IG~KH1O?U0YH}r&PR$@6|87r*w`&`! zGOjEb=*jkuk%J%9%7&<S&#f9qnK#p{oZ&F61#`NVZ}$k~OZg(N=U5fgF&OsJGHRKS z`+uXk=L7yPQCQG4SoeXD2nQ|OS1jL32T6UN@uYm6V<!@)_Rcv`?C-PN82+tIB$~7H zamji3OOkAEGVD|gi0eeg(!O;m+of#w+$|d>dAv@4mQSVA6}f77m;19Gg4%z^jRq&( znKr-RnQPiLq~tpe-rvOr@bHFY7WN&xnBJ!tye=%1byN-O-b5@2Ip>Yjh8D}fnAt~{ z83vhKzWU~-mcRBl+BR|%lT?0l=pxAef2jJ(sJ5bZ%@!!`UfkW?DehLFxVyVsaVJ12 zQi?mJxVwkq?iSohaA)$}duQF5^D8S^E5G)6Wj`iShnm0}tg*W@{4`NBEaBjYnP(S) zkFF6-$5Z+DVY}x&bnFm659hW5ZRfy5Me?h^aPQ^!1?*UTx1=U*zAy9_B4v(le<Z2| z_@iahfXCl~bOzjUqi8XwRP?Cs9Uq#=KjtYS(Nk7WjZhvV`ty`KBbpB^4!F~iyRi;F z=lZ)DT9ns^2d|XsoB`1iCBi9n48#8QypuY21T$Q;1@P3jd-c{_28lGX&P<W~Puv#M zBf0+yZ<sjh3_ooMLn<ro9>KlG&~s8Z+NQ^i)OL`Zc!Z1lR#R~Y5Fjh%h31G(px@#Y zy;r=b{@D`@-{snt172Ly*qY8)<|^Vn`uX{f)xD|UTmx#)UQgtQu<4i(;>zy=E%_Ki zP7H%L{y~c6WymdoX%=$!l)`oh;J$tgGtTV%_{O+HMB2>RqZ<ZMe_ZDpoS-M;%7~x> zeAh3Ao~SG{Gx92Rz4^SR*LR8T*mfh;bME*K0aDcS`goq^;`LSTk_0)5WJ>X*9d}S? zgd(+?Nw9!uE#Y2|8HIQc;zAQIREV!-y^!9Q_L9MBpt|bVq?k2<mBR5kap#3+=XYaF z0tfStlhz#7lH1~|fmTOe`VqaJE-~>0x*uQ3uP6uxbwL0=D#;|?HZ#01_d5r-<nJaW z^FQ@p-eaL+r-yv^gvgS_(eBB;B7T!7UOM<lJZ-SQB|k)KFvefOVF6j#+ga{#yn1we zN71!(Ca!(9sI!VlxaCp;q*?P3ogan>(mWN9tntJkh0CL37$;Q??<+$p`gpUY;egUh zR3Y&tkdI;X2(8l8<tENNz^o|~gn!6x;Mz{|(TxRT)V^{MDK=+xrEAEInTZ(^!amWz z5Bo$(+k_{Q3!nB=hpErvqPqwj<7AkK#!>l7xLn4{cCvzUP4I%S-z-!@{Denff(Qv| zjKRIVz|NbAbvU{e#3aTGPkm`Rns0+$wf2<o>VoIC?)j^XYdIemqRE67Sct9y@Aeml z33}Cj_SYHH>nz%szH<4pzgMY#X4`#dJ2!BC;hR)RBJTZP0(d1{7-!-2oz9z`S--sx zY3Rc9ba>7kR)omtq!MmcNK}Je_&p)?Y{7di(+^z_Jw5D*MudfVg8%KS-y?k$pZfwM zdt;Og>y<Z#A=h~c4KWNz3Pyx}h<2^MH&S{YASaImo@&x*rKmu(+_yy_IHhBth^b2r zI<%S7x4f?F56PA7Z}0a_ewsek&ul0iy|ZJpf5P&^V)6^kV?_&xP3AM98_F<lETcVk z5hq=<v_&i{e!?df#6o%YI8WWt`XC?gr*Y<Yj|&zU<Yo1TvFGhp?#m6IE!M*>zkA`s z&0Xx70zdnDGs}D=fTUhRi$FOtf+gs9zL_SpjDWc^N{frO6HaeWscf#6QSGjFcVtFn z;coR$a0J3-8^YAvz1<T_Xi`{3B?BXaM8fFo@?rv(6fnjDB|d%|W$*i;n~C?q7t2&3 zZ(7=MKZ|Bet|6~~&JkQcO;WJbiU)D+WJ&@Vr&zQ92<D=EwL@wC8D>{JQ^24TlUQKN z_O1Hi18;|Ya&|^^SQre{Nk&ub`_^T&<t4=Zz;t0<WF4J_>N>vVx;<q*?~F0)FL#R+ zACW-GFxVImjE`@64&52}mYIJ5G^OEO(D^KiHU?%>!4f=dPy1gw?{>te|I}mrlo?L! zY5%koc!<4sh~ImNL6NQyW4npwb&Ghgw|yST3_jYOvY5Xzs`9sJ$dQ&9hOHNARLTBs zIocoJz`vUZct`oAgj4ue&YN0lUx$a3t_d$6mS`dRq-?(&(ce?Le2ZHFrNiDJImu@G z>O{BgMYL+A_Oo+Kf{saU;^+n5a;G<`<ItzbRk_087N^RhG)WFZ>3UZ9HOHaB-Kc_Q z!Pst5p~5=e@TE<E;<ivsw(b`gEwAGQOZb=w>W3+6z-~^<76tK0FTrTEqL*obP7%67 zic!|*T&~G6IQjA;eaZ-kNDTrjh~ebqWV*u!!&c0w>eC}=_UHV87Q0N?*pK+eoUpb1 zNCn`kLcIsUN@7X>E>{J)({G_$I2J!2O7|BrICq|LgGTIcg=lJ`fy9#?H&2d00fE2) zw?Sa|b_@Vrj`+oD48!DQsSl*yi?Q&+F%g0hVc~-wjSW12dPyg32$G<S#cu?W{`T6` zlk_YMi)lh{6T!|%?Bf2nPP>NPXF%8-g1<ZHX{k6cm!K!V=Y{7-j^fe@SW?IB&uKN( zZET3p$=7916=RNzaPo4Ch!g&TginFvJk+T-)n|Swz7c8J_^A>GD!fg7K?k>WB0ju~ zuru`D>ZpAxG~@AQ;ynC$h^0h(v^wA5r>TdlAj37W#?xvWFg#*9dB$H+<=nbq?Al9$ zqz9V5^r7abM<C{RlpSuwEO>ejB&(Y$dG4KSu5gpyu=LmX5fhYr7Xx5XuK)52kDMDk z3uzx?ZN8p&9IBtGF%ev7!pzRgW+j1J(U~u)En`qSZZ`WW4Doac?hzPu@-+Q6_0Ep0 zs5rB{7{=<rPt{ZVq5Jm-Nxx6>pY0kO`3kM&xVwE80G!<x?5$$UNSAnJphfXlEdGrf zCFLx4A^-bJ6zxJG`+)Ssk>>b>4x0su2JHtPScULWd9T*v41V>sXYgD5UjZ{|{zf|U z<XN_=t!BKC*Xu1vM!*}}VDH7o806?j14pfm9E;zsvEf_DR^L_R7}!jcaYY`LYu|w} zJ+nDCc6i#bBa+EkG6PSSWPXHVZO)b?Prfg$!O21MxsCTkGl}WKjq*q7xigawJcq7p zX@=7b!V|kyN#DoN1TAd*TY8jZzCS~s>vf*S$Wr^?M2K+jPG~yr{jMmE8%=JD{MLlh zbUeSP1c^2!hFypXQ37S03{nA6zx4NfX(QGO%N?AhTkV+N9-i}dPcGk88}q^k_(|mg zMG%u7j$9l2=2U%|GQ$T7BFadtmPA&?|8v0XNwPfzNCdnOT?HO^I-Z3H`GXU{vOI#7 zZqGNi8P$DUES9DyoY69z-SCb~%mI9r^-P08bz+4nrRO)s=~##lDaxgT0h7@~Bfh_> zl^TGqi%Q8u<oFLKT#vrzkN}ELaTH2?mQvvd*OWE2AE4x_aOp$PEi}Q(<@^bw&TWBf z@8<#NA}<6X(d(4MWyOC~A#!b3CMa$Rdg-YDxm6?>RPs-f1_9m9$!?g~Wn9L&_Jebc zT$+k6&DWgSEL?x@%P8$XI`L2HQSyU3h1H>^Y$e<>$=Iq>l6a@O&Mis92i9)l+Z78H zp88ecpV6ZkT|UV~MsieKplYK;Ihl`aZ>HfdLx$H1byNEb$r()ix7gld$DLsRB!+L< z9CW*qySvBFEUw4=9Mj1+cn_9@<5SMoUoO16+U}Fflj5<~5dSztOX_+(o(=BUdXsI` za8S~%Dtdh0djHt6;g1k}g>$#w0NM8FnEv8*Z)<$yj3>(#zIM^}Dbc`TJGBd%)|cvD z24ld*tJ%!16p$pL^hY||F)c0K!gni4x7Hl?#CuWF#}8^jVY8Df{KnGB<TVt@v%sFC z`qi)EeB`VFYf7^p2e%!S+pag=m#H1DM)F+sSXpt3tN=bf_N(`XEXYVHXmD<`?bg>` zAYi9nhkA|kjOO-JK(4#Ex?e??6J;PyoXKD>(!m~edQ$R+0>g=J5-WLNG8)&9$`Wa< zsjef#8S)$<FKHPWq)n49MZ{lor3n!ktH(M$T`i(Np(l*^e@|Es_zD*KRY3%K>*LZ3 zEND4rpkTO8FnS>LKV>akt)Zg^7N6V+X@u~MF`ZPuK7(qlGix%&l;P|aSerSl1cEf> zGc|5aR{M>(<09C(wRzUk)1XwcFw}h+^s=N({iKXvK=X76If~i8g9DCKSG(X#IEjRQ zApJv;!+|*p8PIB=%9uJ2C7YgR%#1F~j|xMpq1G~t$a}p&Zx#7?1Ldohq^1<~51C`_ z?GqqFQeb}<&(UE+a5saWNz>9izh8LUEZO0Pv8#pf9sh0y`&xqH!l!9=-894}_9K;i zAj%ha4tYbO!p!)ZM$+5ZVb|O3?!P>_ei{K&PZd;39oY5`;WgF^z95G1x^$@kzjj4T z%OlK@JCmniw6MM!MTf@&?q81)v<!&<S>o2P>n3)ZvNiLcVLNEOZLd1izJ+7VGzvzo zoO*w0(t5dEpog4stC=0A-eWpDNKZ`q&(ELri@!hOB42rchr<%*7jvdp(<6%Q)eV_` z*{AQOWSGd=6C5^us8o_ToXklf7?pE&W+OETPj_YZc3fi{rTHh+Su$W|#Y33(4O`L# z*?sssZCQQ^D^2fAsi>tb66bkN_I&9smn=3BZ+h_<$LxIfeAN8+Z3dxVg_^q!l4E1I z#sAo7XN*OfauXL7WsgKG^R%pUJ5}Kk`B(D6+xx+Vo}Ec_EzE26C%2NIUE6rs!!hI$ zG8(~UKx#iH@aBuA6Zd{vK`^R%K$9t?aNkfSEzL{DO@hq*IvkvA^xNk`I)P}J7*;li z@=jPFaPI$Um8T%No?IaT5-Q)?-nm%x|7w&(|4*ZwxadZgCFLd|Ymq~YC23k|RJM&% zW=E>9geUp<>pX94v_D(&dHFhFfj1YMnUP6g8WlrvWfw44XG6>^n{J2bB7GNVImLtj zyVF>_gtN}l0lr{|3-^G43flp;<}s6xi(~Lnn+cHk)b8(j`7IVbCk|BP;mt4-+I=Kg z<*Z!5IM8PrDA{R+6+1>4E8Ck=s+~dX<mA*Jud$@fV$u#zR-;p_!RRtDiAebq7|)VW zFTc9HPJ{bp5>Vrn$NoX@>!5wY2Lwd(IxYio&V`J(t9aNGIGB%2umO;gibO8S2lL}J zQSs-yQ_5z);}@k|6XsIgfp6u%ohzyLr(oE+_#Fvy;!n<vSSEcbE?&=3lX?=++dd_) zGl@O8GRvZq#kn#?;n1rLqlv$L=DXn1=z^{UrN?ZXuOfEk0>^t;gv%}BZ0%s7<u>is z`)UKo((?syF`WZd0cSI>#2#*q&n04p1F*UjK0^(V$Y3+7wU9&eUYw`M+?Arjk~7o$ zysAGi&5PvHd6$lf7%v2nNE;W-DSTqmDzhYPw$>Dnz(PIfJD;6iU5!fk`Tb{Uvqy)S z#%I=8;~TYRo)P<Rjn<qQWq*I@sp}(NE~7Tp46dQAesS8W=%juj!;1r~ijhPzHt5i_ zltkuV$i%(rm7)SBm5^HN%=e$u%A^l(2gp6CRhkdHj&1GB`~K0R_C=Ei$L#D#?h)Xd zZ)Up`Hfkb4J=o&Q^88hmSJ?j^MP8*+xT9Rpv;-hkcfB}z9`iG<aiXJdxspI26aqU% z12gdAFVJxfkK`=)1X{>+LM=R?HLPaf!Z8EmTQElPE2(LRhwlrj;0C--F}(Ynzx=Uo zz-YLp=^ufAR~E_V5{z9o-ZLM9+tPafxZ@_?yfsYMS;!fBuUKUYxKS}NGY>VZWb>Kb zovrw8ha%Kk0MY9vK!0{!0eVTK!bEH;MJcp3H5orw4J(ymM540t)haRfA}ETjyGC&J zVB~nMIluY@B&)j9SbFOgH6Ein&6yFcc#&yl;d*As9ye&VT19H=>$Wq774OIzOVIm@ zrsb9e8Q`1865=M7aW{ngiiLAxW?_(=a>hGaY5Op<l-Ikeym+lr=H6hFt!Sn6Sr6l@ zF)Wvq)2O+Lk`lA|j6k!?R_u3ihCu;*NuPKC3qD;c63q@0#27K|ES4eI*7Q<M2%{++ zQ_pV8*+otjNapM3=O>xA(;ikWIKUy(O_CgionKpyh-W0+o8Ji~!Go7W7H5L*W_H^d zZ$fgHCn2pX#DHqO_TY_NYqum=NH+QJ#M9s)X5+vM#>Vq1i6BiB!?O~C*j{q5#liXg zcIM1(t@DQW9^6&INpPLB#ji<%#L?FGzJUBz-m@wdsZu_BXVhJgP2Pa;C5wzib!61U znki3btZI&s*%_3)*qEx@aUfNhE%Q32(bF*YsddAd=BpcJXA+qxQOnyKpP7`sG2Y8t zawbzwLgQCv{UdeByow-4`_eQg3W~WpYh>gm?bN3Usn<;N8J%Uk=enz>1ir6yIlvN> z(9};3IYqS|e@ax~x`Ib;vYu6DbrEfdy(FL+=$0sK_(}ixu8;%efnVjVS?chQ@0=2~ zRO_uGN3k)aG`ccfC4H*&n~_1yd@qlaTRXxTA>?XeLE<YZu^n&jdEiDv@FW$SWF#SH z;D^~68r5t*EFD94A>^^Bru&5duOov{M@YMwNGL}@r~lQ5`*fUqtd02zdDL&8MHtW? zXF5DM%^@_u2HdJD?67A-7johYcw8LC&EH8}9^JCCnBn4IB?df2@*B6&1XsJQ-VJ?0 zk*(*=YlAnduYF;2fZ!YI7wE9#ytM<?c5MZ+6aj?ce-(c}B=8utzXMyiDc~Dhk~9f1 ziook77i~y>-}B5;_HO44AZj-vd-{#PLtGPUOGxrv)(Sylu}BP=Z@~Bm3)TL9bgi`} zapAOvuAyQ&3w4Toe<Lc~2HT(}NyN|>RR#p%mJ8{;0x4-drZJB?$hl5R956y)|N5{u z-=dQ&58RI0!ZVP6O^bsx5*NnP<fJLZ-JenpR<=y}S@zB2^KwT@+0HPwMgp1euV%;< zGLw+kDI@Z^_n&@ho-AdG(Z{br11Ws1xC9Hlp-=6yRr-$wwghY_7TKSfq7~L0N3<TX zilW1oc#27(ie2BgN53lNuZl?z6LKSkBrLkt;!05A=DRC6Bt!X&u_`7~HNT;446RIl z#)Lt0yxoM)`YWcY&^|7UQ9HbtnwXXff`P7xtX0udb2BaG2z%664$4MZU(s`Nen%9G z!^pk9@BL2%PRnIeTs-gI(uq^)4)LdDspV!bR>io{ZAie3mVw$iEhyobpfF&{nX29Q z(zpwJ^FvMIHX>PvD`s*osy>Y3R`6bqhWPJqN1B0K9@bGEiPQ^Dw)zrVA;t@9G8w5s zdCGk7%>$2PeMS|~Z*h$eM`@Z5?Tw`7h(E_sdGTNAEIx0AEYNkWA;+(xhf6XOegCoI z5v|@L`zfPCvj0hCt>R_=$nv_K1UO>$s-e>XTj~f(jh~d5GJfT_P2*0cTnjmxd3Ig< z8zOt#Y;>fx2?ZNb!}d~L&$h`P78?~9szj1T54XV+(awL-|M!vOViEb3Biow~alWsI zxw+J*>g<#Z#%RwVD1iEEk(YrQ5yB#Y%oClk$N<#KU7p`}Uuwa=KvEwPbzjT>`W=1C z&~X5F(?_IMnNCpA_1hQAnOJcLHXZK`xyYp{O*81*Cq{$f%a)NUs)`tWHe~}P@}!)% z9{C!pu?w53SlRZZNHDM?_H4!bil74~KRU3`6mdqJI+&GWBaZM95oISgW1FALtR_wx z2^E>Gq1)bsilT~Y!QU}8`u!5v|EG~iOmu>&HjHT(Pqm02PQz@ABG>!T)K^<EE6J=z zscw<V3CltE>ehM<ac?iC32r5R<`RQqRu`bF$x7to2we0cr`lXiP!9VfP3$Le_stqZ z>2o%p<0!I)7JhCLt8t^8bQ%b^5@tX?jz{D+YpEFZ>r6OXupXi<{);`l7%f_!{j>?O zvD;qXqpK0`!K4A*AkRWcJm2I!ylbDGCdcD4$oKRoaQbf{%Iyy%O^xK@D;X*c>B7H~ zaDR^slac|VMi$^>WN*j6p-Ux&Iu&s~CIQmE3HbQ<ng(C}mHLYSA~80({zPRt-jtO- zT62%<nIg9&JUsln3p#m2D*SJ_B27U9QC^we2ge-PP7EV%eKO}iaojauoj|k|wn9y@ za=z(A^L%y#`2jys?Cx@Zmb<iejYN6Y3!^LVUOgQda@}HWAKJZVHR?8SW)kPWr46M$ z;F2<z_?-ydGrcz)calAbFjcmk4VF3y*ZG2&pzl?ZBTdpRu><67nAK7)jbKGeMvn|8 z_;Y+lcl@844!E9|$3%ux-OyNi)nR7#DOsM}{^Y*!iYeN9Anwi#E(|5PP=;4;n~kcu zlKmwfLbQum9B}th`#B&Q;MPhF6ch;D0B4kk59svuU6etW=s-LHzW?mcm1jw1`ou;6 zf_~}VzeNUiWd1t1MRI<e$YH^I`@R}mBoY<^vas$<QmP0etOgWW&+t^BibZj56uZ^{ zQ;?er{HpW#kKLG-c*+h&M#jEkg&(!<`-*Al>E^d53%+M{z`^gEhu0tokX+8gqXFz4 z02v~PWVnXvY~v}=(W7$*M6DSw=OuhM>ZmiTZI<{{N@gV=W>$7nOxY#xXe<O+QT#;C zGrOo&up$M7_kVSva97ZvVhI}H<t9~KRm7q2?YBG=qJP7&i!G=VjFWHu{Pr8Oxym?h z_2jR7o5<008?zBRwul%%ZViGx#Rr$(=+y5Bx7kY?Ni1Tk^20b<0z!g#rnhkmh>wz< zb&9r*j<`!zl^^SLQ{%oImflFRG}68yhL5K5%@XoCQoOv8q#)Exl$Y0oC7X}*J?)rQ zsjxs3nFUT~8+s->@mf@ozet<<|NM|qPr94XY!Jk_+u6Hi6)f~L(?DvXb}BlbuYYho zho@mMN}Vkm=P~z`@8>$^R%7SKs{4WPD)HU#BsZJGUtS!}5L*`gEV?hKy`a-W&er*p zkx&|_bnP;7Ef4ULnv~3_rt~ePn9r1Rg&b8~)YnL*S0xC0^qP`?J4!BNW|dIlb&{9R zdz^uXzcI#(G~_iqFTd29zTJy0V(f1rMOt*v>p7X@W<65R%aAfu#Y!>|g)t;(lb3jC zEgCJ&6TZ4iq~&>@I2*@BSP@}Moy0YHYU+N<K!zsN#JQHJ%4gAGX-^zEN-y=}h<hbg zF(|F{4RkB$r`Xjekx+ioY(|~K8PW2`lBs-68?aa$>FV(NNl;}!iRyRy^lauA{TW7f z^87tX$S1Q=B5Z~5vzUvvM?v|r9ZP1qQdKg5N;dya1-%J{0b!i*yE{Ks3P*R)F>2@4 zD04ZHdgRbpM&Vzm>#d7e&_z;U{QxHrEmCr6?9$~`uGxZwq#GpgwIlrhJ_A_FbTz`h zaFeUh<R?Vf4zGNPD&k=O{ZB!X%4grw+3(zbC44G=%mlclriJ%gL{Yh{BkrM|NQL|Q zJm<a+kR^Ar?EwYfU#?|1&~sHcW@o8N(|W-DD7vk#1(^MtzPo5x4B=frHv=w3DR%@m z0b7Q;uGW_Ld#LD`7GHcCY)DW<8JAOO7Fp8%MWJyMCq#C==xSMhj4ji@_D^oavW{9h zD7vv6Is2T&$t7Q=*Vt%kHEZ63`F`XfvYBvBtV7MdJ@D)z7HvD{9U<f+S5=4B1Wh_6 zACII5q5!7icV1w0V^Mds#9$c-)A-kz5C-bXl}TP#{&birlulC#j`HL&W2wz)f3YdM z(OU-oVB=sSSNnP3Ugr1I>O}EFl?qFR;&Z$W!iuN-;u@=}cEb?QRzeDP|5=n5ab)kv zJE5_-I%4)qE^@DAu$ux|&cE+e9T8ybxi+eKV}&v4xX~ZQ4jbl|DohB^xnC2d^~BNc zUQUG_G3jyyN%uwD3-UX|RvGfDcS&@eF_=1hu$){<7<Kfbw+OzNxusxAibDOgsEXPg zX^s~baq*4A6i$lvm8{KP9w5`SpV(CToI;+^*o5AZ#{*8$=K0HNEdo$Bw8C`T{6#l^ zJ@Y-?{=pVk=HYLm%!w-`z9mITRMtF4nBP(;7s`ph&|D{DVQcRc!hMn}r5N0WyS0m2 z%`Ey+wi1*wImTzLp`ZN(C<~)!oG8WcF*|IgJ9A7bs1OSsF2${MD3Z5+Nee;r|9&>0 zji{rFQ2$YUgV=*|Zmj5-0iBV7y>Xfo<46M}w<MBy2Ft)Y@~>HF!!_K}hF#>HOBNuA z)zfu*KQeK<o6t~dwor+uTWk6;H3b*@n6RlVHfOD6*WfVc0~Z@ZV1u`-fTHW590Ef0 zJD|LGS;6A?{lDi3lXNEKOs$2tw~<n%mTq%<h5!->&va@SCRda~_#qunqx7_5_+{`< zQV^&jE3GsJzF#KCzmdEvy04jlFP{Cclj%>%3AEV{2GK;Lp~aQv_Eq?(jb)SlAML~@ z8|~&?M;XfyXWXCyB|-sLit6?gCXv^hxrgm=3~6u-7PTw|33`!Ejj;e^5XWuRuB?gt z9IP^sPRmd!OIOlwI#u5oYsu9SOpP*i_VFJ~u?inh(@2kJ$1^KI!h7OWlF9s4E_(w> zZ?!>Lp6k2?6$BdD>}0Wj645i*3-kyS)6z<}xMBnr1z3@}U%`T(Jw0!vF<B<5h1Gg% zkNiPRh_jy^x4wm=?z;@K$kWwO+M)DKHO@&YCp0x8yD4=7hE3hU*h2HlM7ALLNl#Tu z|5-ja2&P_N8ec7<>=H!)e|tHpVI>=!=2*T*UAgVYzY`OZhCG^Sd|8q#lbhk`nf8-@ z>OYUiMZ9t%Rqis=w&!>`yOwIr3nx5>SWAnpy@19;?Q19#6I4Aqh_CIcmrZJUzB&Ko zZP!=AN`DD8Hq**r65#8+h6WDe*zLi`t1lK%iy6LCZu;-yjR%~6VhOspax{F$R~4-w zmc?KmzONDZM8+M-^RuOzk!ewfXU?s$xw){Z1dBPHP1ep$&hY&QF=YNn&GvoEE1ss> zXMpCE2*M?+egwwS-@cLzqd5LeUz|e|Uonwja-wYg@*Er}$6sBNvemMke+9XzLE&|1 z?yjNVoJz)fD946Ty@GXFw$-K0INN)%sF^LUef8V?lAL<iUo12YoL~HiN>^XE9Ae6j z$>d+xN~GABIu7$S3*zb}KXnOL9%(ri)&Gdt=@;<Fr&HIUE2`28-`b_h)&xzsHOQ() zne{?5X+?w2uyd<=5gZ6W5IJ(0)(X4|Z#QU`gx|x!<$FR>j$%cQ6`Z^0%S*e5nKaI_ zwgD`)VfHyLLUhpwxj;`>*9Xb*KzGXARy&i=;Ewx=p+7!G({GGp%Lcgv>jBo&9l~|B zew458O0Ekg;AxBdoyGW7@epL24G0rHn{MmnX^F5K{`vF8wL$Iv<E1qY8Fp|?v~dXH z*7@q2n@fAJ&e^lsGjM7`dkV^QJOr;ODOu@(X(xT)t_Q>DU3bNtUX0eCpZ>I7zuW=B z>M|d<+FI|C{h!;`oI?U9?_Or4@)|offaIxHXA_{hj!Nc>L5~`nQ@;C0VNMJ6=Oh;f zlhdw<Gn)(Xo{lYYJ*Mh{AdC<Q^RxQT+h~lCDpv2FR>$c6;YXq;?Aw>|buac@-^^~! zRdKR^^PkyR9+#$EPs+t?ogJl8Wt)RKyubJ<h{avGb9k%!45l*j@XAR467&fo*T`ji z;2hQBmn=ev&nWYtkB~)^F8h4gYxFH*G|w1`l|5oR=Hq!q!&y>97ym}PmlX7J%N06p z?fh-o#5PVo{Oyqhrg^@t31KZXY2awE{D*yWG$W-vu}O-w2FgZ|Lpk_Dnw}GSV9uFR zCi6#<!Dfczr(#%{QUl^YbDA|I1RuAy_2jfFIm&=$H`AXRn;~oypRyJd$D(AL2Z64p zq@cg$ww_h!dBFJmDcG87&@u#AkT3P|YnrjPSNX*UDhSVNs%Nl}3<K^LrksLv5n7=r z)SM6>IA<|>Ijh5%$v`oDLRytb$`yJ2&u*&CZi}RP>N~e&kL*ja@58&Cl$oo6B7ImX zkx}Iu*_O5;RBW9jtV)tjnxy(f#DkA|LtM+*Kc?ig_v@D>fB)n(A5_OBAV6W4bOye3 z2DWxFx!dODtq!RTJdmtOqLUJS=<$T3ZSVf6_NEJV<H1miY{5$6DQv6$C~V(c)Lf0l z+fj*y1k_ksk4sPYkH|J~J-_9Tw=iTwn=fhw8ys3J=l6NGO6->gNTsf(ttylud*uD} zVhXKlt#w@B8ZG+#+K#vTuZ$d+6Y|78oRk;UpKnrCB6wbf;x@Fe1G<@0le*09nwg!C zLwI}i86AkPC{u~VilsCgG+kCW;zIaT-*@WjK4`}m@9Kc+g?3wBR)4X)5(lqX^JBt` zjZHE-)e!VEbE)ow5fk!s!7@PA>LcaX`(w@T7oy0V&f})I>3jJWW#+c_-a#7SSGR`` z+l$(*<!XlQNr62PcuI$6I}j<?iG@Ro+10pWM@oKiK+@dwV&{)DO_^1mas{oMiy4C5 z;oOL&gU(Q!+$VPDw}FX=v7DCOE}2UZf{t-q13h4%aGw~`SBbXV>dd_8yv(!;1%PdP zvB*iGBNyf=W`6|EJsHJTj3&Ld*>Xh1GPQWpkX2d2r(c&Y?=Q4%hXJh*20Gh7jFyl$ z+_;XLFOm9*+JC;C`~B66e!6>&PDj2W;lW$ldizIt@ADogT8e)1$m{R;RnI?U@_M5Q zbK)|H(eB}tG6aUsuuf+p*q^ECoI_c}iG3zu-73?a1#R)t>HVeT@%OpjCXVRU!1L-x z<!!mcR*<bAs<+RChws}G4rqlBLrqi^<FD16+v%>_nb$_h^@IK;t);kjnGvAJaN+Hd zx;wt-#gwViKRC!I6>y|q2OwQ=THZi6i|~)e+}xleMo;;9&3ofDfBlQubyDUgXZ8&u zKg_}E$;8@g5z>mhC3H^MS#JrOUbB^?=kj;(w+y-YTWV9L66|V&DjDUhC&Oek<GP1f z6ph3LBxG+t)6PCLOSyle4i3U996?yI|EXXf-Y%a#ekl|Y4#qrgA1dpt^F02_>1)GT z-`xBSQK8eC3`I>wMrNmBfS&;Wvi05XuVfPXc&_h?7lI!bha95!4B6eq7)76iDej&1 z?!N{S)?epZg+ZnAz`0tzX$!ODPxY2eNJdNBi|c7V-mC*!Oi88b-)L|cK{-cm$DXPL zFYOo;6B^z%5rb5;D7jIIwgRC~QL@DoJnndS_$$;1tY#gSZONiIyrTv_0p)B=IpV^v z*_#xz%cx17<0;L@D&H(Etu#=J^ca3dasW4DSQxH&Y*m@Vfa-YI$22)|lE2>EKm4{e zKuuJ^62e$W86C+51d8b)n$D{l(nY#2uz=em(ph8e)<{gFmy{Pgq^3P2!Fzjsc%$L` z>R)Q8TEiPf2bY}Lejabn^YRwau2U^`DA#X0T(AE6LT5)g<mIfg-Msc5>a^y)oh1I2 zI;waskJRc?m;wjI6htoqP4NxSAd0W!tXOtR8Y_A+rS0-;jm<n}{SiOhj`4JMe;;r4 zJGhMZxddNxNAR-^g}i%+SGS#DkLQRJyayghm<f0Jqkr+x)ZK&hUpGwmsHu6fG2@=6 zC4Y7G6YZz2$JzMfe|wT}Au4Q+DY}b#vV=!1ch_4kVKh@0PA+qEGTQ{VzadoUW5vlN zv|nUXMumHDs@wBK8u)CW3I0QDJ?(1_Q{A<rZ0Pk*ua=wcYdR{l{pA#1mC-C$>PQb6 z*L8nR?SWzMX@hIofMnL{B{ls>YUwK~#!QTkJR(E&t(fA@<bOxoBRBwsuy@C-T|RId zzg;RVclyyUDD@FvP6AIbHi1y({@_m2X`PpWD4*kM%71s~LxtYHJ`f6I<eFJyE8u|) z@Fy=xMjHoBEC`mvtA${-bxeK14DVoT`7JBtXV*Rw%X%$J2OkUY&;9r^cmBB$Y>QYA zra|*%fBOC5P64@!?N%NC*3iWL#_!wmf}8v9M#JL6&I2)T>ftz^=hUj4Xy)p6^QqIP z4$hjOEi$_8XpE_$Ro352k|NOU%YDMvQ84}e{u{Je>kBR6R~doftX1u|+Q`F-thWog z?(^Q^sy|=IR=!fZG9NhSbpXmH{?=Ufudh8CeX?G^W=i*Xo^DI;d4qE%p-(*<h}fDM zN=K_PKTv17C*|g}2r+hfE`hPpc%Cw<liBOJyA5a{b7+|ws&4TAU{pGHw_zp7mDN;9 zrd@Owv&o+X#i&oT5x<>dbpeeHBjYd*cT4Z4cvvK+0_tBo_Ftj)<VyjLe|FYdcG~W} zTYypzAc?1M;LqpiATMY!(r(#Kxibpj4((dsoXQOWUAF|!XUH{fbUlkE2$vG5w%-6B zcJo3K=E!|9K!wPtE^7BG`(v9*(gE)tbh)-IE&J><w?6p}ONi!!KQT0%16sH1960*B z%H(<i^HlS13~H_Jlu;eF>e=xK1154-PIpTT?it6ZxqVs&gc@giygJq_51g6BmwA2I zjh%WBNE^|-J%(^}yLSXdZua^egPDzoy0)rUHO1`@yRHeGz`D<Z%~eDF^fu=GH1_wO z&X=&a?!EJ_<A~i(FJ0iC56F)RC(wKk_I>P3UA7Mi@)9b5H^7beV4MtPQT#&{!cc@< z{qO&Zo??T3AAoEQspjUVgKx;ZiI8|E{D@T=wqygxyo>FLv4UM_p$5NLdTsc!2B?t4 z1y>)Y&>9<phX9?z^np(y2~e;pwx=uLUKW@{I;0O^5t60C+S}XPj-}7-9Zn>Uq!`Er zj9*xgbo<pJP@p7tzU8EFMv@kD*@0IRS!C<K(<m{mSi@Hi52zVP_p0i3zEL5#70^p( z5Hp>d*C@o#HdN6oAg`0vj6}<fYYEYou3h;T{$4C$mX!85W~&pcpx>5qkPR~{9$Jkv zUu}-R29>W0@r=6c{=%b*iL0#jp(CYl+fL<WI6IcL+BsUnzRa-X)L!TCi(}78IF%0( z{D8jXb^q(9A;0l8J9d&fQfn^DDvH97(QM4em9!|Luu)4&sU>=phIQ-T2xVS%VEGU$ zdvT!;&MFdI*aRPKb}9rsD{Fw~CBtSj=}9FXmX7gF>R4bpJG$gJ`s7lbPFCeZF#&Hn zSWT|&tG0p)lG>>1XKB=WYfUmNL%$gXf#7u-<=?JclOpGi_919z<DX+KYrS{zmGgqJ zl4r`r{YHfXioS+?jlMZwBhOL}Tb+rJ-angZ5P!S9EQ3JzK`Jt(ofj9Q#6KaA^z(~Q zh7xS+V`<jWY6(H%KisC+FoX*W%G7}q2E>*qnKgU@yh0_tk8zK3Sc(m9=Lm=tNhnh} z-yM3cSq*Q`|FypAY(-bM)wwxP6ZP{oFVSllt<h~>Rw@<v+YnPRvLm-A4zj<!Fa&d5 zyR<%cAA;{gM8iAY-_#xgKU=PP7dBaw7EYYjdS44Kx8E66>E8(Lppo~Yx(xrKy#~Lf z^4HzH-q)HROF~ho4@w!G2zg8K6WJ~K-E~+#Z~K==D}R_beS^?{{pz=MavoF*_J-ZS zAjju}G7SM3$6~EP&)$$-RD_+_ltcjm5>_af8Xi7CusfrtyJ8p#IybiErbm-HzcMjh zJfVPZ3@FI)8j1nLe!<K1{fe#j`a-mRqb%zGn;Yl;Ev7}Sw@Ym^?)cLm@X~2bAAqb} zb^(KIc-=rOm2S;#Km|jwQ{*jS&1FzeCf*IDr03ueV7kz}_=@;3q72R^$74~h1}QI- zOh1&^?nB_~_P0*3@aSo?ANaR7vvClM0m24><WTEzxo)6vu;;4@Bv%Z7>vf{*nc#OV zS%dLMy0@pvyH^Xh!zPOqUuV9`AscHoQt#cn(;G}#m+A);XORZPc$Xq~!*^<t`gWqf z9u0Q&TH93t_&cEZjZCizh1QBI7{lNhROKz3QApoWXx*!%?(H;y;oSfX6OR$ngM$ay z40A9pz;@17S*z(|1vJx(!>s7s<i;YwI@FzHG~8i#P4)Z8X`3#r1yrH;nPuv?A-25l z5xsb2CDlQP>;S!(EKl~_=U2}(mghgVm(SkcKu;l)L*wBwlzA%`Y1?An{9fZgr!4>L zvYMSu@`Nv^@$+x<<kuq5$xTTQqn~>9B3-M<-{ZNu+6J_#B>Um|JyE>b<!She_L6pe zQ~O6L#Upw9o3&Wv(}j)Mfe8jjlkXVI_^|YN=btVha3l5)kcPuyGMDW2YtZQH-R3~+ zv?z*>awk&!8o$j7Yd+hcl+HKGmmL*>iY37Z!?#m}_Jhd~n3}g>81Se{>(Ny<hg{D0 zEWlP9RBnlcOImPMM@alDW5PunYqCA3dd{rLS2{2wg7c-a13WFbvR9Y`oV&-`It;#t zNge2przh+FQ1E!Z^wpKgdXt|!JM$X-WSdTSHf4wR;UDSyka%t|j)C|5ZgEPG>+Azl z@mgde4&W5vCKd3Xa?1byK)xrf@;nou%SMkyBK9G)G8cS*92FL8(W~K&*OSq#6MJ4A zCc^ou&(0cFW+0e8!%1!fMeKK6%*-fN1we2t2F<AV8$RTdBG<}wce`6}cl=cbE$CKO zR+8T>y~%gM6H*`sN_+&9nFw9rDMr075au_HQhz)&)eJYX?3szGvcamjp^(;z)5*Yh z8#1qr_4w;uAr<p#IiBN(wQ$B@yeP)pKN?>&tsJP7>1bhTi3*z1=EIn*-2+zD9P(2c zH2>TfxpqWDmt0rp@N7*v?eSLVc+4|<W>qoLf11PuReipVe^jEW6FuD+0lL1ncAn+@ zV_(G6i`eB630lg(y0}{(S8Zw*P~x2EEGR%vRM7)$E7Q?-BCVVPriKRG2TW@uK5w+^ zd@0KoRNI||JY#|VA}Aa*glj*H?$9EPVmUN2RoaGV7qx3z*cWbKBr(l!!k5Hr^tF;= zV>dC@NM+$#IXl?(mTVD4IpZ;Hnsj`GjmnMKO%lf#7&eUPxHO2$4t{1aY}-iTELSl! z1{M6nDu%A$=pnuIi}m9LJy62aZSr5j>ed}(I2cNiyCV~~_ntSj9`Vp@m+nvZ;=bfb zpLvOV)`Nx9t97Fe(*5n_VrQSG>pH2G$5et&J~^U&{!w=0K&ZtF=e8COGzr83yc`O? zoX#9VicH?{y?7UnHYPCgw9#Db5jwMS9$Z23x?PU=i`D+09MVMqQE1ngn=fRQODw%F zOS!|HE9|Ck*$s8z4Zj=1YfAeOzGmmmFkb<>(#eMDs&c-K0YmVUk(M*YIvG+QMGpNo zR-VrSPkwc9hptOTQRJ4_(uO%w9Qo^!T;}Vj!vpa39x+8w{77mk4%zc^HKp6fJ>~Qo zDWGXW?UEe|Js~GG2}4OJ5@ai5C{A?4H`T+H(FY)a%f+3fFv=VP!8tQb0Z~Iu4<S@4 zZMXjZ;|GUBc#^50Q}<3srg|sgJ-J8Z^8HO7`|!PSh0H=Ll*zO}r1J4mJCmav263vd zNxZEiXsR2oL%HvE$@qQdGz@3WCvXsh)60_C+9XIQIFLQ(d6Rs%7=d7J`LPPnY4%m= z0;nL~My@6fkuw}OHhz>j+UmaCjbQI0zuZ>=PPAy{@1$pQipo2=FO<C_vm!>PNFr*} zqnGiaSxkC~4{tURftUZZo+^_zu#v_(m=vI?873I}l?YS>k-Q$O3kSX9k7Mo5d}Hws z5bc-Q&#Vtb&po)~8PEcjaoV)W2U^y*90iRLYAsat!+N~OtaQj+dX!px+1%W0mQHYV z*a5hSFPsAiG~Oem7*5c}Tg_n<zpVpObY3;)p8*6x7!9W*rPWU2&f<aJI;0>mL1z~y z+~UUucLR(A(@&##0!GV=uMd#H=elKn5*vvA&p|8)A9Bu*K4QTHbP<<8yt0k1jOoXT zJ@s{^N|Q%2wl|OGZk<J`srO=r9NL8VcL-VBRQqS{j#<*Xr8%r$?{bEa&mA}0K|&wY zI$a4SzgmL|Evid8`hlP0V|V{xqV`1Vy+3>k=DfzLvfsMS5}fAsIdFy35s7?Gr?&&A z4;CU=n;AVykJ}QUV~mJBP9SWwfj6Z(dX${|I)72!h%}3`*7*pFH^o6SmPicip7s5s z?B|-^GYo!QaZvC(eSw32d%7`r*roOW?{wlZjNkU1E*|eon&o1=XZL(PgJS0CfJcEE z-M{4_*G8aQ!dFvj{Y_&S?({EoBodYjLJ=8NvVqrpG|d;%o)hqmEYBZmz6ON+Mj-S3 z62m<11|+4A$hbXSvKY_g6gV#aG3b5gdA3xO=R0NhNEq!x_iY&4oB}19O@+WXfh9Gz z0@#>HEqd*_*QonEBh8f(p^#@($+U<x9}#0a>);dBIa$Qi3`w(BiTQ%P?yLyB2yV=) zCvaf=^$mW4)eH_s(DgWYRHyJ2yQ(o#StQo;w<yQQ8u1SXrS+Dxo~ryT=+aVFKNimX zqdw;4ou!Q`l^wcU4oM*KA^a-1uJ}bKtv*)VZdo7dDPUoYf$jcH#7fx4Eagz8L9Q@U za-z?D)~>FZniu)&zcZp#L-M;uONk#wgo4Yc1Uazxwe&VrKR>EjsHv0ss>tIT`mOrW zDICTE&C0&k9@V52^5x&#`F}Qq7g{RAI^bo{wny<Fn&2^?XJ7ZJb7dwXI;k@ofS=b| zqS(6Z8~I4-c`=>vy&elPLML*!oQKIj3d!hs!*VavIGQcNXtGLJ1x5jxsYg@FDir9{ zeuZ6KCEZlrhRD;Pp%RP9vn+gBkZoj*tgkmu5Wnzs+^YMiS*F_8!k$A3GwGUN`Sj#J zIwvWSyvo&u!n_&usYc|P;y~mbGdJXbJo9!w2<pDZgYI|0*~xXPHy-k8Ri*#Nwi$TN zTV)Ip6Vq+MCa>}%uT;I;odI2UY~P)X{JSlzU4{)wLcq%r&aZ-|QOk%iDKWNtp2rvm zG0*gvu-}|7!G=fO0ej70)wLH0!r|}b@-{^|-RIR4imwvItOZmB+&X=8f`%2!i8u%= z<z#}4&~CZe@i6<sF<xQ+ELGDyFSwqKd=#*rXZX$G4+oEN6i=3e!r>_&qUC)V*V$<r zPy;Q4*KYrX@UV}|8QZo1B&M9=As+%3*ZGM5=zeLl5~spMiynCP)oLo59+S`KeO6GP zNW#A{^r6V@K5~3{h_#OxRtCCUWW^sesh#<7d^YwFmnGxADq0$9X}WwMtZ+Ja$+U%0 z5W07E$+R@TObsIP*$u#`mYi}C4W;ka4!wVKpA0TryD(!3>rlHH91?gwR4Z5&$Dea) zC-693+KJsb?fwMZsWSUpj;>?cul<Z63poxXnCg0hbM7z~qD#t-iR}u1_EmX(?<1Re zUbF}(^oPLqU#rJ#4ovos&%x*0lDin}STr{g=bSljb^n!(v(cy%CHp>Q?^B-D1=z^( z+?YETz6(1SZfmhziW@XO6u&yJMuz&lUc67LJY&^%`;o*2C@{5~h_AeQOx?S_pX9cF zUz%eH!SD$>-4=b)d*%^1U_r&up*9rzxYcDH;**-~`n60#;4svQp=X<tWxf6zT<=QH z()mY$5#H!dvXy6mZ(H448v)1VTzcHPNpRp_!~@FCdq>Y5oO4II`<UIo^YrH~?;(<k zbKBk4NWTi*UY-|Z9)MLokiqzPP*JFtgfr%QRuiI+_<i#-&`yAr{MwDE0`&Is)`7@w ztWu+GYjF1w+rWpS?XPU0vtIzC`Dsg>lL+l|4X?u>CwX+ZN39LUfP+x*q3~9p*OC!^ zC&>!&Rr8uN&dgsuM^otkL5D0FA^;LV{O)SEV&<QvWQ>!D_OI{=SMX<J{^@hj@ep!n za1Z99;~iD8CyQdcrwWv@2))u2N+mHIuEk6oTEW0_dm6(kW5s`Q#AjMr1C$-jc16C= z5_>=WNZ_GS9Oy4$gBzf^@{o#YjG)vMw8ZDK>v0^DB&?sK<2r-pWbioNWfgzq>N@1r zY-1tm(wDw2ZS2(4IQC5pKXBbRf>(PM03+7e{4-8vp{qZnUdo!2*0XIA$O=0_GceU4 zU0&0z$CWPP<iyJv(o0I4FfXNn=%+;KMyGZWzkaL%?^zNk-SsNT=_e;NS((HlHhF3J z29^Hcq?vW2ITP^tC$XYu#4I8ph?%TRf8~yA)02HtA~k2(8ZMZogPJ(=t&Xh(uciFe zz*JVOHxpE{d~<=}w(tokQ4{j<l0A=pF?O%}P%O){A8zkc*T}z#NV$76NMT7Plxxhu z3Z36E#6xvi!nWRz$+WaQB`2z#ppZS%VzohHsP^kWD%^FyL!-h3HSycxhd%SgcWbk? zJ62Z&LqvGkkqMuo;;Jvca^A;_3W&eEo;_v!WU_RbGb0E3r2Ngtm-`4s?FokyK8MBP z0L@1kaX9VzV+9}&u{Xh7!%3v^oJDdLC;xtM?C;@l+Rr1Ba9hHW3V(@-4@b~4JL=sO zNWUT!tU?Bohp<GUT>y5669!v3r8xa<#Yue5Oi4o45q}Gru~fg^`L(_tm~8X+bQ0aa z9TWIIT=opWhP=?eJ*<)M)O(bHmQ%Vo?WIi;$V5KCB7CD{r;kb95#ecRihY9e&C&j6 zeJ$HSIq&!IFZ6z-KA%%tL77Oz+9G>az&iS}&P{&0fYl1lZK&UoUAo+1r~j58JV#X* z5Tf;4FLDp(aJ$$-wr~kat*G7hLzJ4`)?=G5(H}l&g~$tuVS@O<Ty&bkt*?FCm4Q57 zYrb|cyS_IgYdN-(Z*`Of?aD=@@GwnZm#s*I4DpKh>fXIsw&zAxE>jEGT*)V#@uRD` zF!z7g&}?`%|KobE(D?dGPM!bd(07L|xBNkHDX`NV2L53QR53P%b=n}ha8q|2<qxI~ zE!bJ(b}Q5M@t6|4a}@5hl(|H4GXv<e1UDL4LVdd(ZHFHK0c&KL9b3j2_h1ya%dC#) z9rjFhW57w|&Tg=vr?*^sOC=E={o5yT$GmP~P&Eo?zfs~sjkS1)akp5<+62jXh(EgZ zd2U$Hyhr&Z?LzCm@O@ExC(P;P>!#Rdxn8$!UTOMPqMK!pj)+DymUsY+&xH@`jQx1W zss3-VLKMZR2ebp8NcH*d!?E5al2OI)OV0nQvHUKDv})RjeJ(HMDr&N*A9GuXOZ=$k zbK>*uvF(Wl$^nBj6;*^KpD5>-qKEi4p%v#m)K@BLhg^|+aDEoH_gMg~Oce9|?Y<{+ zdt}r2>{Y-QybUN#Nh+0i?G1$;5>p+pBkgYE;o*y|=slwxp`wuMKKRboxk(*BX`P__ zt#vn_wiycAGln&|!dV!M!t<G{@nZ!Jrw<0Jc+3=#tYmf}&q?}vKm?EAME>f0^F#Jj zL=5r7+;>9ZoM_e^=dL#|=$~tD(8%;7@@=g^f=DCV4dCV`Qhkpfqg_0=fUvCM|3gk@ zA*)121tHl<SuYKwQI_ruA7vtz>~dW-8q(#I3YE<2P07tkC(PD?6|>^5>bF<qop8%u zcs9^vO4?_{t2HUM3Cv3rfE^4*fQya6;JYgx)Hkchu|i~a#ewns31w=@kViZ|w1^7Q zAwK3r!i5}r_EArcO=AcpPmAh#|5xVx*kdr)f|1;4T8blgdC<lV5U$1`Qn~|AMb_CF zF}McBuY_{YprxSAnpOW4pVF`ej<rb%w8;D7e=uPiPXn3}&2;;RD!r>>>tH`Tr}j?J z^LEQF1NWj!6|0in3{3z;&Tet;AJ6K+BCERWY9S2n(eb6ZyVxKNdh!_pgJ3z`Z!i;x z1QB;tNn$yHr13aO;`n9CS>JJhq~SPpNx*3{DNeiD*h~%x+;7i*2%)Gu>Tr@+)LT-2 zW*yL6eSw06+Z|CBKp3_wn=}}^E4NdO1KeJ3P#Zcf%Sq6rO9aXsst$eH5<(;R?L`C+ z_580ZiUPIvNpS}6nJVYs;3Sbo?aHAJ9Z9@$_?oII6LMn?Jo!ig$o2)S<y{hpxIVl- zeKWPaRD_}uDB(|@QZ*O*gsWxz?K)`|H`9Gb>V{!Z>1`T5UIB|ZMsN#(OIHw$8o#@% zK;wUxlMIT}$kOLK>`=rz$s+pnDHfPIQ@<g0n^@k5^vl&qBb1ONWTIqa4@|W@#<Ew; zmabJ)^yGSnJ}uvacVdh)n+S3eZk&mUiGVJA^R3LuYuBNv%i+<uQ_hy$tI7}<%|yM{ z<Js))L7rLrbx%V^Mf%P9JQ3%9R*Y&Xz$H6@mB~XmW~C4NnAfb<3;5n+X56XPfwJ`J z5VVEywSz;J*<NqYZ(slSwLxx@AkO_}@Q}n};8`fjUBx}VNZEQ~*`k)|FwAJ)WY8r8 zhL}5{zctn(f!dIV=LKtn%V5H_&34!|d+)r*T@~}=O!J)-I<e%<V!@?hf}9vOtL}~U zRONq)OT=1rugcU%oQr>V|A)1AimtSczCEkLif!Art%^}W#j4o0ZKq<}wv!#(-bux_ zliuGsJ^J6{jK1vmDi?d~i;QQ#Yd&kO`J2PHxxWk!1Xgylf~q`Tv@Q_0m{uz<Ha5PD z=c0~uKaDr#KO6*(S}SoB<-Y&fa%Zu99WdHnF>$*vVyJ1u;o5d4v$f5o{FFbc+mz+p z33ezh=00(In*c^VSg`)48)rMpaJtTv7*78@^Kw}3_wCdC{9)VviFpoid%C-;x2kzr zI%9EJO$LYPdhz606}XZPl#sBwfK$R-?mPQwwA$($vu*Z{znw?Za?=w869=-c+<2Wb zb`iH4b|#}3k@Y?c*zNm3qY=6d7W_vzc9;=(3b$CH@41dz@#=cJ>>L)9a(_QmZES?P z(S%PN04pT#I$AZJZV8C)Ux=~Mqzp!;ZuG<RLZ!V=o4;E$4iP}LP@`R_r&qY;Y$4m8 z-VVd3(QKe7N_<}=g)>Ae`Tn=HScRINzQ9Wx*LE0^1|zJhLV6_Wy3K{;a*Pq7VkInb zo>eoM%4>=SHCwfSwe45Bnjn^`MNy);g|)btF##6N)B}RidfQL}P{g#9)$tlH_1r{8 zH2QS1An&@QXuQp(0?ubSgm~Oat)cB_xec5R@W-YaBBn*RAk({VZ<(2xSP-(PORM(3 z>bZ97oEind-S5P#P{qkW#;8t8Q^0oa`@;9A)Xh;Xm;{$;>%|+z{jsBM(YE@K@k!Nx z-HV4>{qqM&30Tf>D9TP_qYuw0lQ)INVMfm9n>g8Yv>?Z|qBBjUaB1u?NP-B<hzJJi zrObm9=0f}C!fChKLMYb8QSP^SkGP31o{gz03=Bn3k>Xm6ymD0D>_yE0JI;FI-mX4M z%>f8_%Y}AdHP{@U%#=CqV6j3#O*wowd`WnsK(vv#;TvOs;p#34x9jr{__B%tmcr2d z3P1g5Ay;Yzo)d04Y$1@m;KB!)hQOw?9Kk5FxS<wG@Z)3vL_u)95=Xh*xTT6bh{jS# zeZeeZ_VW%wEJng^@OZ1>zrbl(tc8*8FE?O<pq%?<0C9adW(wjmQWe^I--;zfoG+F9 z2?Zu*%?vc|%c}e*rgG8+|3QJ-CuNT<nuYL)psRSfi}4Jo2SV~F3D}x13T}>MDEJg& zi!Qn-Z?q22yBj`s7F-bE$3hitZtC>7@ti|{vO3vwXRLNpcYz$3hXzlofJ^)y*#GhO za-)vWd%UzCZ&ijN1Kr12y$~IV(U$?5(dbrWu&Y5c$Y;1E3pA^#<l=1F;a>M?f@ik! z;c*S8f!3yB6(xU5u%v2T2a9P&AG{JKi<DPZBR4ns|3QM6Z7qds9MX$w^^zPbsRt~# zr2ha@S!={P%|ts^`yHOjVb^CoOfu&o_j>dIDPDA*LZ@yD-m27&n|Vgu&Tl{0p4inx ziqRkMf7rt8ovat0%DOTYD)(@)R7sb@6_Gas-MT_0u3`($=tXOs*WL_cwOl1d&6Rrz zPB@2I&VFDe0&$cNg#tzn7n8EZCsN4o!^3lZ+J#AZWC#<m$cg5D8Pcw{zU64#`E3o6 zXvXN+EI^`7XzN|~XKfw>W=P3vymSjm_V^)|LJ5k6xd`4GX07Vl;=q|z$xudWXfg5T zJoR#<TuC{`zD#gA)5~TB14+)$!eS0ln<CX56xyQ5zybay_Qi#bsxVXD6cH=BCtam~ z8=d-!&b7zk10b9&78cpA)8PIRu=sKE=EMY!)7$sd>z4$xX0Wt&V|ZDP+|XRHEEdSV zZ6apzTt>L)Z$vQpo=2qAwb)|e4z4$3Y*SZ8_Ddp^yvvY5b8#8}gdaDi?`m4ist6_j zU1gQ90oF2ViEg{tvyDa;F2DeBz_8)F9pVxl?fQn|BeI<pMW@4p%P3*3zl2ReJ302E zB4u;o#8HSs%Vf*Hg08*ACqm1xN?%93?W|t$rq-arIsd&Ici*MYZJ_b_OQN$qH}5lj zZz?ahHwvPwkjwcru(I!e9KB?QlZn#gC~;H?X!il7XmqI1x?>7re|GrwY7>SzwZ}b= z>&>#nEj0NT)Fi52Mz;g$#cp{MS{UGzXLrLdo%1HQgXyj3&3aO~=h^IJDHpDvyW-LD z>Wc#8@mfWef(C-(Lug9G0HB4Q+?6BAjvCyIlu(N~4*^1ITSyxqb3wI@sM@6Dwu0Ck zI|*?Hj;eUYAH^Yb8?##3oYU&|)u8z}{}u4;TP2H3h>EZhI1v@`i;~_hD9YN4)!Efs z<!&t#i~v_^hNvj|V~4FxwVuF0{%3B*@!XUuaaO+O&7;DGbz1e>we$y9lelr$=k9QS zc@J;(iq;jw!9xP<`OZ$wC^o8eq*z2fwcqfW>$w{|TvWm~{e(sQzcxeD#)ks)t|Q?O zRC(5%=0gS&QU5_XDd}kXzrXAJ3l5~FnGBh!CP7s+IC``(hiUEekC0{$Y-!<aE1y!x zbtI+C=EtOp#f$sg>NFg>rj5p*!}9TR7L@=P-Hgwy%$0YciS`roGjfS`rIM$l!NW@o zLsHXSMW?3z`M1Dx2MY@<X-O&vg7NUg>qgd5Bzew6IyButxr+&wofpX3jG}aS=qg2> z7I%Vawz=bE;0><U+d$)5;VG%=%D2o#4ipfhYhn1%bm^=;YBF<KoBTsJXg3@+p@Ydm z%njYymw;PR{$uy6!ANhAZ4NUi-+`DSubd(p&-RmU+dfz-tPmb>2l7$o{D--S)d&Sa z()SVmUAyeBW(@-S>iNP3`x8L!c{NA^zGTu~VkFx*#7F;s59p?Uhb2aW0cVg>U6`uT z7UbhSo}q>jC&T^}5F~o43B!Dt?&un>49eRhsyZI8^)vgTtl1*;36dg)jOb&cMI3=& z-7P<gx1b7&+6s{uRy%9n>hkU1M3d7(mNCA>B<hiF+<*TF<<I7s!we9jg3c7&giuXI zwy+A}6AJIh(2eKNvzjL>foh~K?_hUexQmkLHQ|rk{_qO_#>VrB+;FCJiyN6|jLKXV zZM9M(L7sySW=%~+9gA@$rs9DbQAQmm<yL4`3%k6CJPtR&&Nh3j6Hz8%TIzV~nNSf+ z_4y_=&co+zcB3w5SjzcX;NESU<@I`l%@#?<iZt>_u+cAKuCq9;KH%S*haAJvJlp+! zaj|*6Tpn8~xGbxLcW58y`9qMTY@p!6HEWzk6{{YrGSWZuEm=VPmpSK>NKyzOk6}2( ztcYf8_QZ~VOnFSc&&GIkmnA&-OnI>xu1Gxe_NQ3jPalG?8N~~Qi;?eOx+ePY&}Vb} zzNb57$cefgOmu`{+U1+)S{CsP<?)*)QRVEY&h1q?4RZH%inWS(GG&Wt^teuIi8xWy ze~4|ys7LPxLBJ#&W0K5MQ5PllaWsbpDLq_&vc%G19@U#a<|@n6zbuh{X-KSHL`ODR z7~CCRxSuS&xIY%RB2&G&*>kVk|35sG>Aq25<p54RpZC`PveejvUN`o;(OUTbJ+aP$ z8wJS!V-EYDzjD$3*D|dA|M5Kk?}c#a|Kka(h4}yH<MED8P8W|)h(u&5Kbw0&#g}*1 zrTZfrRDBQrKdNuy2z^CGfpHpZ@;@w6s@-A+R*;7!125Hv%;pcVmj7QCi%!u_3hGFR zwdDAEIn7kaw26==Lqlm(n$TaaqK0wPtM{M0*a?5|-A33oZJ<nsL$gzf+Xa|^Th57J z?aNoMYIT2)(LOb#L{sX*Wgin~=7J`W{RzBz+hw5kFDX~j!Ho$<DAOb8s6`uyX?DNJ z54#2)PEpfMOSMKiI_G&NyOalOKPk1V6|uvpHzCA4JcM(!<hPgS2;wngfSXbbD}Cst ztK;`<>QuzVE{{O5H*pR~Q<M*&iYC{}(hAE+d@FZ`(xcU{;)rd_9(rHuygsL^9ZcI7 z(-UDl-$Z7`v4mTb9A_q>fmM@0yZEExRbCPhP8Xc<ig~WnjEy4*z!FX@yD-)2dKT!# zM-<>(6YO2>c^SR}X&g@UIKW-yfB)%0_NhlVL_{g*_r7O|(XilhrE3Q5{+IhFcF&l+ zuqiN4|MKFG2y51`!t|gm#on^58}Nop7}C}{yjxi>lH?sN?-p|dV_f}nl1*Udpav)` zP#pXq^1spB930;nt~>Zz!6aGKBRZlKn|{g`4>x`^ndzj84k*EP5Gp^9naH;`tYy@` zbIad!_Nn2!gp){u=?%ffT$iYOk(4xTuY?8tC`f&q%qw#SzI-Q65kH#$wq?w*S`OdU zfhVy=mtW31DTjYEBFU>KMVcOU+%Z+Q)`G*Zahf0_g&Y^0->J5m0k*LSiihT^cirNw zdcGE0yxN2+3Ydb!1pXD;i86n{Y!efaCPd)iJ0nr`cyIUR&5i9UV5P=EyG#@<Vnd;A zh;e2Q%^=7$96=qW857fsAff;{6Wg39cwJ7QgqHLj&PEw7e+*wq_=*rFmb0G+iyT;r z{~Yhze;SlCGg!rBZ-oY$KuxSvg~*x4yFezMqF$J-qq47+a4H$7@Kr2^Vzw5O_M2vo z!dZf<O(?_xkriB&?{ih%ZkYw{fy9whFrYSh>!MTpc#A<2)IO8v-rE-e88gBPW0+W( zdAH91F_6Q@7xO54(35gds6KxWU%ij@)uNNk{h}-kDibV(_9{!TQ?`z?rs^MO5T(Gv zJcVm2Y?G6bBy9~ToZY@vRP|NUD(Uz>ixKSJU=X8N71T%1`3?c7%f*X(AsOZ#XLj60 z%Z}CI%Xy*;B~m|V#fi0_`nQa+6}tAMs0AKiyOs{%i$Ze{3!A8l)X*LI;m7!|yBXD# zBaGTZp#EOq;rBRz?&yQSU1{t_ka{!N?fbNEcactI&{Hy5O@&Dkcsll4Pc^v#&llY= z1;J#hz7@`Sh14Kr#wr)V!>b0$09@c9X3LFf4roXSruyWX@|(I)^<+dsE6x{Oo&{hl zG^(Y<#Lxy1HbSt<Xtm=h#=&v*JiTBl&fJVN=wqHZ?S`Me9I1NV_IGw;TDL_?<OgQQ zsDve<;@<B>oN14v&3U1wu0(`YQQ$*BS4|jx50X_qEXQ}>q9lvOi`9@rU7OJ{CP~16 zQ5hl9zov*oX@~}<A8`{C`q<3WW?R+Y%OS{HqfTWmL}!@(Izx5r$eXI=&-s$s^gF-Q z8N9%vryP<Q{+?As(!o72Y|J!=wT+8g4_+ru3asiR4#@E+i(Rx_oaO}OF`~p2BS%TD zd;Qxz$0Q`^zc~xr$b!_D@^}7!zteNw44jRqk&wFHQF-NZAoN>*s%7~R?rj|R*XDmG znBfJ_Ckaw!y%CqoVZ}Jx$p~Zk>-?7B#d6NC<L2t83AY27ew5db96JI=?t2b&8sKoY z+Pz9Tm2F)4M~^g3C=ApGK^xnfaivyoZTEaMI#5IZi>xSYGNMM11iR4o|Ct*iLtt$k z_Z=pRaO5Ol>x@a9UWExtkm%^&T}|KfrJm>P7p3-?eU{sn^F0^V-baH)+kJ8Xbu_~O zuB(*b9!&mBIt;hNyJj>#FSZZwo8jWGLZDN)YuImy2FJ*F{zI@Pg)YR;#OcweGEFQE zgBQ_J=i><H+<n6d+~kq!c$K%e8)NPgT~AmjOv!q4c>;x=cc^GOEq_zIbvHhIS4qXp zfTY-bFZ`XOb$yI&(`WuxK2UYy#>c;8f!lZtPY?^i9@z%c!qLSO4+ffQDminZYlTpZ z)66}w7OQgKfAb1*K%|_vc#JM$$K2A;Qfib>c4HK4ZP1~%B_jV7V4{7zYDT;VRQJUG z7Kq_fZ#if5%ulb-LNdP$#YPw+^J3LOB&$(V<jo+Cw;oS)n@?j548h8gu(HDTFnxJG zcvvyo&RUsmGUW>;;=`p&qYsnWVat#b(GnqiZ-8s>@op2<E6X7@VTDz>VYalwoojKz zTOVLZ|9Uj4a`&PUuxlc<D4o;Mj&g}g75fvgBsZ9XCcfSjUlB)27)7F_2}Wipa@Wy! zOQ(WKDg)jeQ>|I=%CNa;S+N71aykh{?-lu{irrc!NY18!y30F=e0@EcRk|4dn4e*D zG>=(`XruKCdBGD2DoQ{0+Wpz^`}4x<ct0>Rm`srHzbenY{>%?fmSg#`U?6x4g@kIf zpX#?6rm(|{)h-5I=(;R>{IWol|C)<L(qaL3pJ?R#VlQwgIgpzbsJl!=HW6?U_LG03 z4z1bctp4ARJ8yj7ZI|@zoq>TTq<V4p|IXmQ{4%)^Ag!>30zO=-jrGpw8n+s_qpuPp zZ6)eL<<nub0%yt7=wQYOwkx^0xF~fbCB(S-2GvpvNZplf)%~-&_vXi8v&9bEgPgd2 z`F%N|6#7ZVSMRX<G0az2S%Yh}{Qd=e(d0Y<%TmS=Epo;BO-l33hcx70!&s$N|G<{^ zr4%WAelt2?Y&rQtyf3!mAFWE~j6RE9mkO0o{oWaQ7`RrCl)W0*aToOAE_^u@tJ_@m zc`XKfS@jvMAC2&ieCGCmvc=YTZ?EMFW0KT!z*&@ougC6&7y8Njny@atqA2ebIO9(y z$cvAN_>^9(-O5NkITJJxsNR`Jy`WLQB-pL?gFX~;q2!HB7g|RT^GMTcqG-YBLsCnQ zt;D39y5rRL{UX0}mgyK!GSwXKLrAV|Bw95=#}FoWG|K>K<z_Qd=dh1rVG&gEf^4%M zDn}Y?LK?E1Dw!%c*V+JI2=&-M8X({>evJ~&!Ih^SKt!eHI^@4UV!ZiRRjJpKW1Vw3 zuR))wshOidtQ7J3=68H*@cf=pnJpLjQZR;HPy**%lQA@@{FHfxU9e3%a>?6=(}d6v z8{9S^3o@$C=#7)QBv==3rI5YX|B}X`t&26W8l~-n(B0{Fx0LsfT#()(VLAGGBIUBR z4xFlbK9r+@DtIJk!HAkO7X7QOVZfYGoJtxcKcC1&rAp@wZbm2$T27*cr6Q&V5|r20 z%>?jzV5TYd2?Uh+?^Fg4en?#IUc20RKuLCu80&j-)AHW9uZ9MUKwjkyE~*ZJt4%e| z6yA331nfQLMYL@Eg-_gQCBul@2mj>ovI}-EA=YEYPNK{Wp9^}+QzeebU_cNxNw>dw zz}9|8RJR_d1PsaAf7FM#n;ra7i_MH>qf#8YF_tv4@3kG}Qa3aPjB%S;Lsn5()me=? zdmr6@A7#La9P7M$45|NPCCgd6*`MxtXpzouh%b=rDv{rgaAtK<wKZb=+C-B+s;3e3 znx~x~@e5A{oBx15i_?O11jJnWCBWOi(E_zpy;db?Bm}7VwZL4{i1fP-zfe*wpS~Ny z%9{7dqSRmy24H-CEl7QLQF8~Oa~o8Dymu07T&gf~liXvKA7XRn)*Qu{f-UqRC->K# zf2kB2R+Zg=v958?cr4(SAAK?3^TV_1N;AaRi8M^!+xf)zAEwLB(Tb<9-3jmM2CAl# z9f@fpmjve2fe60}^up@Ond`O8k%4u42nEsQz%E;F&_acyGOsf$WiB(W*qd`8Qv;MX zT#3=h%OHwQFRZp3*B;9e@Ki>3wqsI!N$R7nRX60(n93CU>*AAI&6^sV1-8)ZIrt+K zO1`hDywqr(yJ3g0SjpI`zWZ;(YVOvhi+nJY{IJ#nrSaZsLfPr>A65X*b4#Wjsg)rX zvAIHj&O?m8KR5M%;7fE>Li#%C>Udg_Mi!cRPlnJ~Y!?lFni*iNtt61INO9VZWVqNF zkHI#yKUmcV)`ZPv3xxY3CVb3B2%|<vewUVOC$x9EhRCx6MX5mt&(78E30S^gICRw3 z%hR%l(_g^2Ot4Zjbc(NcgF@X*%f`pHXC6_APW0Ff*J;w_o)+TH%K;W`J^CajcHg(S zBnzed<2K$tneivKwG*aRf$>TjQ;(9hp~#{58)%wu{Di)hA8&hXj>qTI{lG>i5a^}b z(=|-vZXnTSRlRf6oR0YyU#B36msrPUJo;<Tp-)CC1KSqYnyN~;VPd2+B?80lpbb`R z&|lS%!&mf<XuLRkc@E1{x4!UT<>hLwuF&XIb2u<1lu8>>EmN#>onDliP)~C~49DN1 z5vh_MX^s#lTFqhrM*HH;`>u?>S-mZ0@7*8wj91}0OOOnhlC=Tg$~<}am%>n{-JSgk zfAS`1bt+>0F9WAnY$Zce<ofC;&@qnsh>DJ4by2K!x(R~-4-%?B2S9ii6LOr;;=&3$ zuCAv?$Mk9j^BNE=Kkg?vnawPD%(`fh#(@P8)5mVq-okgWRkF@vMZull*MG(5-vf)w zBWAO~T~trhkZ0WeiVA!MPivY??y;5>xOGI(!|MHJp)nvf=*wu}i4<^lGunUS>&*Ro zl}*$MbWwfAhtCVE-6{+C7LyH4R^JG<gd_k)mo0fWAaQKJj-D)+6TEyt7jJ91eU$Dq zJ2BhX1~Z}O1=E<uMdEjDlI80yeXgPlD?lF6s&yQ+w}(Jw{2tCqE|eaV_Ge~<Px};k z-_-Wla84e{Y7f~rS2eb$o$m(mpxZnxG7<%ixf$*X-~Z%DQMkAZ#;)g@etYwqT8=%Y z!lfh+sNHQk_A6Z=bNo(^<CL_zFFuK-C60&>tBZWPwW0=Nj3H~L=lp7QN_M+%UYDlG zm7&;pr>|g2xXg<p@aCaFhl!zt7b!bDDa-*;&9xdN<q@hp_9?pRDI)`W0LJ4iT};6@ zX$ph!1K7(`M=cd%zHzMQvALeR{JlI7juVd_29Ix>pt(L%Y^E!(;OI$g-OE^iw~*%Y zr!5ly4@Wq@@g5}C%c$LHx3V2f!_waYKq@(j;n$b4*yOyc8*p*nJTR&!njqy)4AV^{ z50geF!6+^3MzPYpE)<i-x8|f@=|Wy;1NU}lYs0c|>fg6Y_BLUBfE&%yMcT{i(Q~Ex zfj8~W8C$NMy;cR5yo~8eFxKv9Gd<UooMS26pH)dB+Q_`0sB(C}qgP)&+)tWK%O<WO z8sY-a8g!fWv0gB!9YDsOwH4XB6=kjCjP$JT?O6QZBKys*qS$&r58zgeeBM%PF|<T1 zXVG!tU)Q;2{pU&?sADoaXLs*bRk%7{DR9eLu1cIq1v)>xqZK!2AX3s@FCp$9mM>1O zDp=BInTeQeeyDbHCB$?EznE|mZ4r5vm+3L<<6qd9<)6Jr*Hd#<)E@?wJlcRdB+z73 z=)uEh^uH-h<O6Ct45T?t2EnZHItE0{s?MLdd@%dXH0_g3QPzIDU#>Z;7JF6Vvnlrq zgmcUYf(vYcS<S(^-|^0NGY7pZeUs!5ZTc(8oF1hF0AV}P`<1NGQ&I}V97uSd1F;1> zeo%e^71Y#X{P}8;H<o?E%lKm71@Coty4ikuIfv9*VTqf-O!48(&T5909R#T@g8wy# zrB$>m@pSOf<TkyM)8;gkl^LCy^4Ab46Qhd8UWZQ8_ht=sxro7I5`y;Ycy`wD+GN(@ z^!x^u7Gi(s0NA_mfGZy-6mPW_ojnRDvacg})e8{WScs=UD_6sZv4n^KpBTki#guA3 z<X}`?dtf_x(aJ9|j#K=llD}bVV%}R~nH&~E?v;{pPa$rD_v7NThL;&6BmeE*hy1T% z%?nyNBl$UGSFHs?p78j*5wFeqUq_~hdRO@#??_wk1Wc#tMF-X!9~-J|fPST;=R*z9 ze}LIfD+W`YGkXUJ%II!5OFehO<c8_A0`BSs!d$aW&WMK>Qt;>=UtWl*%G+1`o$!3B zw$E_pZ}EcEP8UPa6K<sY%L(PWp)T?yYKVEB*p!O~JhXRP%(z&_)9;oj4s-r^!@3j5 z1yUpOwUhm%xJ8J$+!(5**H-kJ1?xNY)k|k6`)yQ`@K)RUai^GhE}yFDjU6m!DcD+J z9d(HMBz^{(MV{(SfQA*q{*FJ8wk#9w=(JG<tM|A2>5a)7r>5^w<GmX@z+DetPD+KW za6H>Kk#_;qo99N1z2VbNSH|IcHiaRiUN;m*{x5hrA)l_*RxS?`p@*rli(JHLtw#8` zu9oQ6BLe<TYbq5&p~$&No--?8&2ijZR+%L?EqJr$oh!gvsH+vR+Juj{`JurQ{J;l_ zpikkn?!;%?mUxV_ryemVOl_do3g^=AhJcr9<8WdXolf%LhjJFU9$JuBT7UN$IDO@m zu$x(((+e*<6dg+&k(N}NkvP}n!2ZR9`wL0K)5oyj+B2)3uNT@<tn`Jriz@7=0aE?h znMrFk!REFow)c8Fw)SRZ%H7Un>WkG#NkG7ysr?&OAe7rwJ-n;<Jp1U9y+kiD<N2Xv zk7VJYE5NqUD3AM+jm3nUmjCVXY3J%4>yUmYm;<N7K~u(%EK~5e0CDK4hd0vd1>)tk z$20v?Tgk;)9Zyyq@MyA+;zB5xKw*4D9^gTBs|ZhI_Dw<1j27yy0Z}L?0Omp)2?iiH z7(MZ4_6#gb?g^{JeH21YD7SU04{~9o0O?C}Z&$d^ET^cAxa8Y{Sj6=|qZvu<po+OW zWN5!6RwK;7frSVQh;cnnoTcCdAQLT3W*F^Yv9zY=4!HYuTJKPtVrJ~Rxd1AkYXQT2 z;2|e?honc_JSmv7?7r)3#`T;RfeL+eS0cYNJ`X0(L6CB<Ek$541vTTeSRFI;-wxg? zpGTG|?`uPPkAH&Jy3f2S+UjIBO(L9$(o(p{R;%A*LIE8WB1t+%d09;b@$Q~%(4I20 z@_L0f5AtO`eq<RL#?n?Iqk6nydxO^jKFl`jTIuem=<ou6z+$sKY5z>WBTSAENK2wA zb$>65jMUVo^9l3H-)OjgZaQcGoq-$TR(yU7>JR1+GMPveJ_4^W|7I*8FVy||+mm!G z5T%aV?3B?%rJ2XRQQDk&vZWXTeP|G<ao84R5c7$$KHwm}j!M*R#KqKCd&mVmgq&(S z*rIIvY=P<ZEybCW2CKGl7*(U<AprQ}!=)k61Sb3tYZ+YBxlm<$+$)%<8S124HXd8A z)_eqV(tjGjVfwbE^nh~#V>>SgGov&NPdY9%8*J%Pt9D|C&sq#mLUC_?H~3OfdLOwu z6YwJgbl;t-Hg&?BYO*7un7(>JL|`>nnqiz$f+(TSOI#h_vA^!uM6LVH8ec(PmtCMm z#&@&#=k@aEeInn$yBWe5A{`gl9G^YLuG{xs(0Dt}czx0M`cyV<?_o_b9F&^+sV^sJ zh|GJ7lpluu-=#O>e}hn%hPDL-PDUsfdmo{|wmS1SICd~prT3OL>Tj6*Bubhw4vuo^ zmVNklPgzsjX9{J~b2Aa`-702XI}y4gj`V&9Thb8;ges2QPt*dUWiT$@9`}qr{2-2) z-jrwCQBy9Mnhgn-FT#OSSb75mHk7xW2!MYl8hfu33X;QbGkfJLLc*)R0tAgq_Y#Tp zV@}>~Xg9CwLElnhG!L&c8fa?zxGCtFz7<rjUpu~q?M26YAK%WGbJu_OZViviZl2pK zg-eTI+eJuVEU5vkn3x$^Gm{e~N5xoZb<Zx`s^ea3bu-g(>@R=*<Vb6=6JUly;D4M5 zTq;vY%Lhb|L|-ZjwEJ)z!o=}&1!h04DmWD2T5)oL=gujZdq31Wg?jK*3Ap<CTLs1i zweA+)sk^GrHMtU0cuccju|4S>(Tq(X`6e130TWNqSi0Oe<G`M%x+QuMA6x1_Hne{X z&UAePXo%O}5BnKT1AjlpLqWB;?Qlp6WJG7VYDf`v$7P}>b~1?%JVFdP<iboJ3O|*9 zB#PgEJhmd{W-9gqei_f5Yq_7!_3lqG$e?TZt|J-h3-DDIUO(WZe4v;xiBchoDmKGR zT(e&GKKM>r?D$HrHo;zXJt1Z+f(7&6d+a*P;o*vIt#h#)HG8Z^3#Pk|eD?0(#|pBi zY5Xw17kd3%A|9hBrv=fV>Q3I)3N{Q!nqJhY3JfP2M4yz^Z;oYuZqgyNabRunQ;1um z{np~)j&yor#3<8hfnT~iDv<pWv41<x!8`w!)DxtwDnnhO0C+*Mfg3~{FZ7|9-J}E? zmWU_C8EUZ=sp0ak@qx}ii%&S_cwxWK79>d7rzEZIf<}K8Tsm%_SO4|Tm0s9afrXv6 zb>=Ln%2K+70UHJ!r=y=r`!@~25{YR)=ltl|GDd_wn&nE>z-gM9;YXO2h$0#F<qqCf z7-FEhPIOa3fDYzB`rR}-n}6b8Z2tR?czqRV7mobbk9!TY0N1@mby}a?zFkhW1Q`c4 z`;hS?)BqVd%U<|wuCv|r2huHq`V8Eh?aKS;A{gbTiP@w1+<idr2Tj!u<Cipc5;;z< zP!FGv{+!tuCh1Wv)REE$JZ~*R3}@@C2ZAS}YQo4xZFP`Px>PRD`U{mGWcT~&mDp0b z-o?Z}?0Eb4<AmcC7Ni4&%$t$kOUcma;RXqMJ6<8F&_iev-?DtC44EcL-9;psET0#* zx=NnFN<Vu6vj>!qV;m{U%*{4mj_J;0?@gx}0{3@)w;!2mV|s50{Frp9wL@jb3PTw# znF-+(yHj)Z77wJ}U%cZ{(@&+^Ul6)0_3r)F@4J9r;o3`r4JS9y#e&qN)*UqR3Y!_* z?ybBHGBw%aEz%yO=6jQCyS<wO-j|za^?uX7^g{L&5!{rJc*Ac*^2Dhqxes_2U~%JC zxWpB&;_1{wKspwCF&0|q>M&~kp%ekD!Eq?`$+W46gnrk8_XEStX6Fe<Qzu4p0*Q#z z@H48B`D|Fi9CpR<#%rnUyeQwZfB$&}+z&u-*V;eIAi1(BNIh0n@crbY?aS_KAfpax zn81ZaI-4RkH!LOj!Z&Uz2c_cF)=vt_&GbcDeP(cfW}zPLv@UmT;4L3lK7p8)Dn_#Y zStlZ?@=>l+&^{*xTfl-J>PST!5jQR=&JZa>VB_)6%k9D2yTCj(?e%_vU3MT{j}Iqr znp>Y!qaI-4%STI2sKRbkApsupBi-}1{`oTH$Y=njklC-_%jgZum;&=xnDXWay;_Q- za(A$o2g2!Zm*97KP4ZV?LD%_jCR5r?cD=3*8<k2S+Hx<@m^N0yztuy^eHwZT!X&ez z#|_|t1bh46YheTtzvKGY<m5JYQpo?{q8}+>Fd>Lxf#}SMo}(azR#T{1w_1N7gmPmD zUBCXG;}tp412y&`hxEz2x-lYXVMhWlbOaX7WHrF2C>Y3vWY&eT5sJR!cJqmj0A_q1 zBf2=urm2%A>9p)2MNC1u*ER#O6ZOyM&1>C5^+_kwdB+|iM+^{f<zV8ZT4Lz^#xeFZ zddp8V8TasEXgD#Uxu8bu3$Z2!IimJj@ASZT@5^42?Z^6R;+E$=s-|QAveb6@^=G#$ zA}B=nA)T8*_34#_+!?e&$n5cyh$^0TlkU5&cl+mp66i3o9&a$L`urx8GtgC>sifOY zc*U<BV@|yIsoNAbx4_spwokd+HPLX?YXF;_yFw=D2UXMaXgSI4$FxED$an_1AgNku zcEWZ7CWi+A_&~EwPkItw)#@Qi{rH30Q81ulZeG4BjfYv4{JnPtDJE?q!F`|(Ue}E* zMY_M_=_XhPMDtb*HKdcCe`*s4w7Vc+fO{1RKNzpp|5|Nv=fK4)lpY~X&Q-ABxq{$D zcM}!XFff^yZeH%6rDz);H)taNJ|XO@1#_#0l^qw`=+WXIyt$|2DM>9(oJZD5O(fyt zMXI)q<`Lo%U#&A_=^9zSS3*J}=4Uz)IEO4nnH`w3@!fR*6{Yo8W~|%BvFiYKatyYA zjWINdPB($m*E@I4%i7G%A(1WMkcTPX_6<6`){iKWGT&KRe|2i=`k2#t$$zi8{G5f_ z5fyex<PoCm6Lyb5*(9-PtC)1qrTL|l297XS>PIJzr4{gDG^YS_X`;BF)B3mq6mAfz zS$aEB_X>Oq?tAW3_1rr&MOpRJijoUcF8Ffy<@c%{=P%Bg-)8RmmP$dEy`lKS)7LW# zo5i<c)J#K{jMN!iMn&5fA89SXrh%&pQoEofkDNnWa0t%r9ZG_t{d(5Fzp~T3b1JsP z$g<-n#b{4ijEaNvgx%iG4)6}zU<eoJdZBICyAvWql^dK;Sh_nxq#MV0ur-%ofVA!N zBrxfDh_m?=_vUcgWO2Mu%EX)ECc?iRs;LdZyLR4Nj$r#X2#WL(j0q*+Q&Qf}9k(RL zx3!wt0ueK!{tHGyMAQ#o-@1c)5>>}Yug6B{2$)wb6=tFp-#W7+ZZIUXX;6L}JBp(( zr;b)gasbUJ_FpFeh1^~6OhSXCNY{t&rsk7GDO+x9=En(-b=bP&bAIRTZMT4?59k$R zYYX(V)ZV{aPk-H^nR>>~w&bS{KlWvrJ2Y@Soy&w@{BO9QZt=u>R^n*HoVOgi)~cx_ zv)y5AcbisbgcWV@)T^JLVV$A5Qy=Nq+t9}5m7UKYo~JDYt}ov*4W0jH$-CVc{4-;F zMql1tTbr2u%?*`i-(8y<3QHEL_O=avxK;}r1Pw2eOKYICgsk@KS3W=w^y&h6ik}CG zK8ZgGBkoW2!poBYh6^RtZFhEYdpD)}5>B$2bt9o8f8eW5L#=9gk+5?8aIGhXcCP$T z-9A$Yi+UlJ8r2O;sfhYZ<kOk>RVrD|9wf@(Vr;L%=vWMeHInZ}zx-Vrp!o1Uj#;u> z^xeLXFuJ4IRYB60>d?HNjkAa>GI-)BM!0;0gX^LZ@m+>SNhVD_eyg=?KU_<zr`L&Q z!Akg;b6B8-7k9%0=+SGxe#dnRGl1F{Ln<kd<J+A9)2HdQvFUx}JfV-iIxj@|$upvp zm7U=;h_C|e8mtQ~H`yTdpOl)-s||(9v(j$JX(7brx8iqPhimo>;l6CVsrN#8aQlld zkuG2@v>8FEkCY|5QQK*6&DlPfw%7O6hIkDb$>Lwb(Bo^@2Bg1FZZ$mdqQ4~Y-PY<x z`y6NS3O=p?Qa5rMCbXGBB<N!Y=5B{bW`$XZ{i^!=ps{(=s#P{k6yu~=IrREFuWH2> zuc8n8wTJF_v!@8cuDl|csiov&p%e`_3F*mq*$@FUIp0oEX!#><`s<nRM_SBqbR#r) zr5Ui+O)$`Hz!aOW{iAAddhi~_*V>lp>{O0OuG_f_8RMfJ@>qEZdTeQC@6#-mpbqph zgTnM0U4vCAPyWGLMg!ZWM>K!0m1H{F03qWp{&Qerrr^pfPGKe*2d=~v4oR?8HfV1- zUS?jPi96V!FD!}i1C!C`1;d$!LBt#I=jV~=e#bB71sHZ4Jt}@oJU8pYHygsud{Nw0 zN#)gEq4~KVYOnt)kNxBMpz~w1QSRFl$TqH@8J^)_cj>4@Wi^0s9tkp?hNY<X7PjLP z6v6e$HsKExx}HDuv_fPQwH=AEerA=Xb%ul)i6{u(c05Qb$PlT?^WvC&erj-^tkbdB zzmoqugjU*JK{-}}jbqY~6PjUS2*!~SR;9262hZsIG1h|3s`e$`rUlWSPbm!J^M^#e zo}$ef1J+AG(s(h4e@o|xiPH1X^(Kgmeh{4yG$`Rt8@JiqrqPc_#Cj(hII)KKqjz=t zw9mH}S38Z8d(xx@Y!s-LydWp#$b`ZEjV#o54|Y$(R4l&c+{Lu@DYmsOE}zpZ_Gsk5 zHeOd&-Rn1E@#AV;oNs@%z8Ep;&-5grB9jB`Yc7o>8nO_#*Sp6e60N95h&^OvFxTOB zvJ17C1c32aXB(#XbIERYRt@Br=*V|H;=Dgrj%CaqXTFm6y!5;k;x?UEqcsD&X$#Q% zfZ9EGnhwguG6#uP21XGP0Akx+OKySPPPcEJ14w~wO1HPS=XQ~C|9FO51hKsWOEJCG zr%S>@8@=v_@;a{q|H|b(rmRtC^TTxNJrlKj9l=EVeEd3hf9*AYGe7|I@icrZ{OV`B z_kaEu@Ige-(+|oZc=b51k%}Yae(S<X=kw!nUE+v1kw~I~AB+)dhq~(N{83E6OU#Ad zx9M>O^sDWPLCAD7nCNItP;g`~_)^UK{^A1ocC~rKjoEDH`23Dfo4K#7R&u5!&h*YE zK8u6<?IBNyEiCMq5PM)*8up8;6@}>zER&yt0VU{bXD6)11BT#?--y5lpSSak8zbHG zfE{9|7d(!Bch?vz&-z3EMBs`Khph(A5MztYJ54XF;i9qrypThbj>R(??`rez`>P%Y ze)ZQ2)?sjo;Yb^Gss!C^>7nnq@wXEFH6oWUcZj?7xb>;AH2tvINWSamy+;Ib^I7&R zzWFd0C&7~x`uW;|`%Z#ss+m5Q{$FkTH(PFOv}esE^qqGO5KP^;6jq-dR1B{MuS>=W z-uG8!na%`IfZXAo+*(Yp5u!RhMPQ?B$&L<aglRfXLnYE;(kJ02m$X9IL_%}ERMsaw zOblbk4~eOnt~QKr6mnIKS*ts`R|HS?H*n9Pe-yjT(?H1jWd<+(@gIR^FKb|XZx8BA zq1XO1U2VWz8$!oqfc7!B-M8&`)IR3CF&xbRZ(=ktXDNX|=WdQ#ZSbW+v62tQ*R$KU z@3n9@%j#vH_+^*)LxajgxEpmogHWSCq5iB(swBo++lnZ`k?znHip5>pA3#fJu^~8M z_cUFvCkF~1=NlF6(})`>KW`GI-*fCTj7wE<P>^bHoj)TJnk$uiQ?9UW!^*pnSd^aN zqYeOhu^9<w7<6LRW0tTrR3b^TJ9k&KxnP)-(<=H*Wthu6s$CV8CpZmp?mr5olPPIR z8tz<|rUuGGzPdsEh<GGdrbw&@fV^TiV#@9Q&XV;h$1inpzq!BVL0a^Gpfw;@?(bj? zUj}4n`mL-o>a2iK*KHq~%x*R5h>WuQ!-Uw5=a-Pxjr5w`JXT~EU=)fzUpE%}4pagY z!()i4Rh!{oTVF))mmf<;z1L|4(eAH3a)9^yW$0ZiU#ys%0Q)l;6IR>JmnbWiytkZh zL1}u<uqD}^te2mFLF~m|F4yy_!9})`z2PsxAl=Rk`-NIx*>aU<Ad+AB&L@y_^W$iz zuehE0qbo{TMLjn6<JjxkBk*}`##YoxR^ZcNM}V5)GTcw_wf7tbktFtT*S<+uqX7gv z9y~g7@%$FCv}8=+V_4h!5NDpnMRc`ePu3#zNVJ+7vLy7vbE=meq$WmY`T53QT#fc$ zs2dKa^=kMR{|mqCrRBT1ZsGfTy!$hOpf_{k7`N@)9jFPn(|8ShwQOo$BuR>lbOuQr zc)ZhTj@g|Tq<95b0T!twrGINP&MxaSC*0j+{Ji+TD_G7xB+>8F{gu*Kj!!BFElKz< z;k?e;oSv$rwAXOTHq>IUmks6+F-*lov6-8&B_HtVwXs5T@9>tPU*@KAkqMuq%!lql zXndj@3;hT7*WF(t!De%U7FO|-vptV5i;|Rd{H)M5X@d#hyo!nwfE2y`R(ChAafyFJ zQ|gJ^H+N5(>G?%l667fQL{zz{5oXeXexarV7iJD|f*vm8vJ!|)oa-Rp{DPb40{H6t zsgW}-H(1Ap)QLN7Yov)b`jmDnF=j+TIYsPZ4KKTOxkN=hWb;*RNOrV{s?AWj91I&c zoxCYCxp@sfs~C=?HiT<vsmMefMiA{DYNO2jAJIjz26)=$?_+~euj`}aduo@|OK{;- zD$K`SCoPzo9no3B{<rzJoyVR1@%gH{lO}ZD$*mL22Ez!vX*4C)+AtMf<C5bAjizM> zDwG)+XTTMc`>HB&$r;9l!nfmEdb0BL(Kd1tu-n&V7)$N3ivrK%>sNtm&#tQR{=C<< zM?E-XzwfMPSVo6CxgwJVg6p!x=wHVlwl$tsx^IGcMPe{H?{~E~mjegxM;DMv=n;{F zI|<9ay)au9!Fic04wHv=i42>Mn>yH`A+6h<1O(%E#7Oj|H3jcl--<PsJ5ygH1j$ut zH2>f;W}jZ&kWf*DS)1?RDQ?y1+P^u@bz0$g-k%1^GPUE+2)wYDWO;)8;m;RSLc{Aw z>W0U8Ib~b*IA3m42+|T8_D9)%!$f{hR>6+2!P0oLl68*5sP3j{nU$?AN0+<1*AoAC zOHdq5K!HD5p>LtSFx>TmfhnxA?puxmK?0X01bQo?hRF9#f}aTswMd@~YkSzxVNBpm z4LzoVsGfZaO?Kba{pw&gS}yvWn7RV>cO03vecd>4GY6#S@(Ozn!Efx}zA&PQ00gls z`zRsFk^LXrNwY^nwETDzV2tR`YF(Xlk;9!vKNk8DTJL-n04D_ah&*uW#-+8WRB`k{ z^&SbDX3zUo<uUVpJvBZI#-0qT!Sczerd_8`XS+37fuA1ARenL7RlkF?9dQ&c55$r* z`EGZA03GTgf6WkPxM;2{QYvrSJm)myb;d~joe!RRgK2ZE^W?$z)l4)poMdKLZGcES z45Eq$*D_9+3pJJ9C8lkW@iUb#lZlj-ny)h`_g^`~u)=S!%hsQ}(enYnb=oX5vlEZV zq4KdccSUVRaAB^3XJ;x_qkj(KaXw^U&uASmw-RGV4Z^hw<K@l&_U-FlMqETKDBGgY zTV4}3S0hN<A<Cb#tEFgIFOgPia~U~i<OGy@lE7J(5o>?P*u>FHx|CJ$v;7+dq#rdz zW@#|izqv+RNY;j^oImnq9a2?D7Nr!&_tHi*oa~CrjSJGHdF|lNglXZn3<vH&2AV*T zmm&tVpRq_S8{l*);v?az*{IS=I2|b%dxy}uL&i^EaGtTbIkmd8-p)A&-)M`WoBz@= z1shNkk?1qhSAb&qlnKgm65)}W3omaY1z!rT<JxZ@i?7F9(kYpc!3;opE+?()sw00* zx2d*5!_RuX0pz>*0dJ{K@>50s=dAdeAflHTZV61UC7JNY)lrKoytSR};IRYRb=un% zU^2`M#&DVQ_$_5!u36q3wVB`nOOZ{(6luQXd(z{Lhfs}Wu;blLnEnSWRkkD4wth3d zqR<P`d4-+0gADY26}?m%BZ0xXZPs1&g!1oogs+zw@V3Lyon14bFPuaRoWZdB{wL5T z=;mwY&h7z^T?7Zu8{a|=0e%lUDDn_=>_a?)pf-AaZaju8&k|O92qLmMq+6RvdtC4m zT^^*lI7mBe@N6@mFt;~l=^gE#S<@w9J6jk;X#eUyzkP6MI~+XuMtKps6K=RIF9dZ( zuwPVG>(S1G)>>izwRpN8exM0_KEYArZTGjwF%2%7aqf>FEgKwU9RdCBp^bz}o$Q}2 zcfV;0dsv`b>8<yks|#2m3icW3I6k;B?>AiSp27hN?0h@BT1^Exi)E25^<t_PHDg{n z)smqHHG93f*T7l7n-OSyU%Jkpp<$!8^VRiFdTYM=1hd!DaMb#WyWJCJO$uCPPiyr_ z3|gK5)(r;YDN_77V$*U6@VkqmNE}_Ik;V_ffjw_RkVx8ndft74%Cp3Ed<SJ__!jL! z#Vd&XLKi>wa1gVCdnXv5>v#pfPCm~&9E1Tph7sBphke7Tr-sgpAjPx@okNu@sfSEB zoeDo+haofVJEUGXflmSKu8xkTThL+=&<-i%VAlSkUYn&r3lE)BX+^7VfePMtXd@<} z+70B}4az9&*H|L3EW@tYfNpOCzxO8!r6FO&1hp;}LjM)xO2SjacwXHJ8z)R#mbi|F z3$xf_EeZV%rONT&$Q`Vg&BL~Ua7OrvYaUT~Jl75u@*731qPLeFT9TNkqV?NnpwaWs z;}mT$j(FLF@t||0KE}m-tdP8e15rkX;94^zX;WR`<u=_0jXpNa-?YmCMJeZzM9jw` zlUzU*QX$1y9_0|nK47-nUjV@)E?6RJC9k0XEP%K<ft+L>eWb77$6>E<<K!6>HI9Qx z?A<}TT&ng9FX$CPbOkZneooOZg75Q_S=1w&rOb}${#Y$~AvV{)=x@PYrjlut^(d-d zqnVy(5HckO%0KA<+6%9o*HF*sY;Fv<O$V&V$e;B-fIr8{E%oJ)x*ZRqW|miBpDsv* zp4TGpz?R&6)i6diG)$51ban@L%<9c>{m(s0L#FS!u}(9BM06Urj<o-^Owi4yK)JG2 zy&xrXBe7CAURryGcKqG?+Xn;63`yb-#>PZKZoSelNB{`yQmF|Y<EOPEKmy^&H*hwA zhBR6(j%_ow5ii#i30k^l(hr$pImbYS57{jUFt_m$=-d~DNUL`j&;}gFy7tg^g3J!s zVP2E07gY<v_SBbQ_gj+-eh3qxfC~)O`uqibc}O+5j1pB358rMCy6jN-D^uBk@*zV! zMw8V}`3GQ*MUry2Jwt}8ZC_|irv2p<R-Q6L7>Y$e6>j+DIt<pqMuP<vYu)Z6w34Pu zu(=hOBP%!`TF6Fq9}zveUc9#-B82S8ri~gV6aAQILp{okJAUVKHK4{Go>ia`>O-W7 z+(>%Z2K~rWX|o;G<C6cm1Kp9Fe2CLF=-*G$rDa$y-31;B(|B**$s%&!YqbyC(E#G} zB8iQRV;$bAA3hqIyahnXidL*dnTIs?VC~b{&Bbu8<<{Nc%Y*P`$vW2)$3={ex@rv! z^q<DKHfrkG>&p3Nnd~N+kRp#zMK+6}4N{@iufT#M;+j7r(fbiX?+W)50o<$IWe-@j z#(TT8(GzC<%BX~4=N4t7tVSgvnUy~cWl=2UPpw|5+>XOqi8}EbE(0Y^bvjH?BoT-t zcTyNh#K$A=BRGikwQuvUEAW>qslfCIfa;%f3YabXNU6m0zr}J-;NQ2#VJWiBmX-;U z)1Yc=c0;v^Mp|dEgL(yScwrssn<P!%53qLn{c8@gx_1|oq>MJEZJrk{{PK?mC^tWz zddX1ihLCE$C@y=>nA(o_Ca!D!1cHs@@PY_7T7iLZ(}PZmLZJ_M>iKO=LM_&s3|;)4 z>aKtmn+=B#B){O^oj0zo=W#u_T|!d)DbUR~p!UyyqX;I*s3^sOzL@)Gx4+^{MGl48 zm>c*&&@l`o`k8ct$$qXAbNXOsxDo16wo#u*$f(_bR0TTG-}yu8irXPwIQWQhx@vF` zNUP614gRzJNRip5!Ie-((6m}~Fws`vd4v>SV?Y9Fr$c@p2hr^y>1&}ZdLwxgh|b;x z+8-T?&`k#E%Durw?b1vHaqYkftROtIn>RpA?MuY2ATVe`LDHB+W23J@rk#QopYd?< zILT~^6A-0lGdPDl{hPJ9BF)EJs)@6rBfoLAloS@1!!Wudo6d}-s!JzA^R=jxp;}-* zImAq($x|q;po*v(leJt}4;*q38L8eOHeIgAR$nm;#7><V4keD#Pz!gJL*5)xV$X4o zGUBS=d1xNV0Sr9RNA-G<VKI25Gs`wZ!BW;ER~Y4%E>QQ3*$E_hRpRCqC<e$Htt@B; zJP8kUqgs~#6v;zUI`a-8$UKSMK;)bIQ);P+=}9H_c&$1#aX^uw6yABayVU3k;YO?| zoQ39gx1-o`W@v7b0yT)(_e$<&`f8zHgRiOc78;<9N(}i-roeM_re^d&@inEczm6qf zj#GYKNof{-s+g`TUSI%Q_RF8owPgT}*KKjF<h`Yw{8oG9$B9EdC5sA_dY;CyKOzTn z(oubws0zj&!5f0fSU_gSoBiB(`2KfN6hrUP_#4eGbCy^E5Uy(b8j+Uwt!yLdc&!^; z&+~Ezo6nV$odG(t#af&-X&_m3W+XnpaI7RzX_Iy@!e<5us^l;KOThk*l`D)10y;V& z5sF_=NYumBJ_WNc<tij27u?PkadZ1yavror2zVQ{v=*n_aNs}n)p7<t;uQBODc%tx zR4W2Wd7SP36ltmg`<Hjk_veMW{DGre5{%fspQ?H`)$vYzq*>+?>jwj|2${&0J21RI z>PL8kwebu|pvZ8*RYITpscpp#KssV>F|<UtdX}1KBNKdWer`E+r1CCxZ`n+L_$?-; zEULwDtHyKj*Ol<Yqow%1jkzp2vaPl72>S^)(Qj=_WIOW^<(<Ijlp<GYu?7rk9Gu7r zgukbzCHqRcYFt_(U4QU?yDf?&s2UMSEhR-6M}d#Biz_3;=X1AW*WhFE3o`L%Aj-Rn zrMR1plRL+7%yY9sair-76dwsYK^iVVEk%=w*c3Z1-Y^AJoGBT(DD?{caH4{^*?j(% zc$7-kzDJP{uA&?)J$jw|EX$N7`e7FS<oCLeTjpJYOrd39O7eX5v_&<4IVJSvTB>=K zSgPWrlGLzI&yx-h7kB<06c1>G^#HC|Xci|k%_St1dz$Gl;zK)udD(uactO)>U0oCM zf6?{TQBknpx+*=u&>%H*cSuWj3<Clp-3<;%hrkToA)NzK(lNA34+u!NAV^DtA_&4A zzw`ahJ?pM>`4eWb*6erhch~bikF)Wf!90mp)(7}O-Fpy=>W}{U+PuN#()#h&Xsz($ z9?wmV_3K^Bp)drhpOygf+QZ49?)Fwu=4MR9|LnTrEH6jotgFZ})`!-&<=-}@+?)Xu zg|)ol)SpATb85Jut>S&v>FM_OogiAIb7LJXpUK~GMY@<tfUG3fObG$LU=$(N4G7cD z%Wmc2;s*xuDRb*QBN5@{{2@H8A(XMG|7G2I0^1D2h9#avgDc5~uwODYP@tVMpo^q3 z!zMDZiXd~Uc2{;a<;!(pfe1T0@qgA*VP{bQE0gdJhii$X9Q;xsqQp&>d{WsTW73dN z6GpM5M>x2t@Jfp=ugzUS=NW-OeIUaL%I0)Q>@$Nb-AZ2Wl){A-B#SXk<-Op=SEBXb zpD84Me!55@<5p#!1{gjm4$>;VdO|{n@}61xLMO<MW7JM<#0y+`lL{7Np~QPe+g_<7 zs=T+zH%{VoQmeds#!=ki%i*;;*xu$t<=d$}Y`~z-uANb8%hQk=<`!6d72IGz9jARm zNEX}5-rmhkpcI|Ad^{5RWob?12Gv1D|3V@c-aiG~y#8A=lYBNXjIM|2HuInf1b|PH z#?dnLbX{nba5_BSvfXW_MInZ!EEW?-V%^*rwX_B@Ph)DV+#Q4$w;(SbwMeY7>0?#a zIB#aGkrc-2&X@%EQObmfaBX2Y$IfRJsZ7Q3p~St*8)=BKUQ~*Ml5b@3KIrj2rLnt^ zdLyS<?}OzMXV$b@b!8J`9d?o=)s)W<G%#WYS%!zjN|3ecgAz^Nn6XZeJf#@azI}cx zY2(Y2YeF;GTei_&%<z?FQ5Q4vj8zyd38I|)eYOcI6gW)dVq&7#<@0pf0H>@cI>DZi zrcSB546oH%ufR^d9IqKk8MlHzQ~XO^$!1C~EmeqAoeN;nM<QCk_GtAeyu%iU)QAR9 z&=u)ea1&Qm2lDp{ZfH-Htc){-lm7s0Olz{GBt%!;a$UWGrTk?tO+F<+%d$WvNcChu z6ZOkqrGp95KZv3qud-h)>>V1QbD<IrQNjRuKE_{n{eQ)=;RqB1hLae<TdN9@lw!qC zllN@&O}Pp(G;q5rNPxSl1)2VZ!o1yZ9G=oQ^+6AHFYL@Q*WXh}#ryaXZt&B6fA7bW z^woud>DUfGIrq#XcXG$O*O~NFCBD_x#waf{R#E029HeetcVS1TmA`ssfhKowp7E)8 zH>~{ZwDZYZ^f(etDrS;fyk{|KA#a#+Ft2BkoqP^v!*vF6m-d098`AOo*)X0;WmzpY z!Udhbot?V!w>#zU;a`(*9&yf_jSW0Y(V-~Mh^TWNep_k~^<c|8Zs?6CtG*s*W|Frk z0KTkj_$0zKk7U&Vjvll3Sn8|Zq~XqVd`%PuoM?}q!0ovwD}x&X5Nd%Zqa=lIDd(PT zJP@CyO#2?C_3Ih!i-uYPS>tZb6(Jn?vP-Ch7gQ9jgoA~;m_lz3S%AO#tNX>%|5v|d z<1zzM$Jr^)8#;9oNruy5dcB7RuyW=Sw7tXA`@A_4{*~(O5x<jq&$wRxGxw#y$K2j+ z3^I8VrCs}>e5Z*LSSnsDoxhHfpv>Ta(FQWo0#TiPkp>;IeFKx4dz9;~%5vYZU0RIl zj9{sd9SuzcaaEV$K*^h^&*_@VDq(aY=?YQ>#5RTH{*_|^d*n6pyB1}qE*{?Fgw|ul zYuQqPxW9q)M1u<t?+nNSe;q}w!Eu-tJ4jW9AMy#{7$_+BS+kn-JGnb6wa5ah%J8ta zi<0aaS4eY3NH{I%y}ej%h1B0A((&Omsk$p2+2>O3czk)FK?J#Jk3_va#Ws{^LgKe> zDe*cheq#{c6S0r86Xu_9(MFLKW2Q(JC;lCJlEiFY`xEC|GSMZe(oGOVE8zv%1!o3T z{nc#;{127w>eY}r0!a^1gSI>Z8Mr?$R@*V$o~I!MKq%%@*~AVTHU_MpUG=1=P&~z$ z+s5Ff_Mlu6rG58JiQT=IzWAs!lIu?piy?zjFV`lc9|L}AEm--9@2D7!iwkjl9<;+O zW`MbY0G~f`=%tu_PI;?>YD|IGFpfrQ<nv-YyejQST<}48!p;e$1(y1PJymW{bQzaA z3$W-=#qd|so_;p`(>o974UCf?udkq#akhg)MzW*fDc#$sg=FpN5mq~1vZ{IP$A^jP z*G<ORcx_BDR&9$5y=SS;?kb;zt?Y!I+&sc-D~B~$Q}QfvUl^vSmz|XqotGWaU14!Q z;llYg0*UXiLywWD=2*C%y=QZ=Y|Hw77|qrEs}fsFSVei~rxs<~udzE%8HQxue+uB< zvwvioa9_tf@$Za-_cOtcVvoLCN%-zUIsZr2YF=Dj2zPe0qVZ&`>nZI*V_@yZ@ii6@ z?cFKnqFb}Pdo8+C51#iBYMl2@|AD~y+oiA=M@esAQ-3g9-fgnh12q~GxZsHMZrRS9 zqxXXvm8#?;20UJW6!tU$Y4-hKhjrf|D|_ulE~(@RLLE=0Tuu3(TS_x~Z#z|YeH*d4 zU}NeaZjQ<$a`SwFdL@uoFt-#16~Z<P$ax}1Odn0827VE`*GtDJK;@-Ck}?cgBTdoP z4=9<mqiz}iMN3V;7AP?&oHzg3ho<lwg^&W=M&)I`po=9$Aa}6^Jo-~{nfKPdWJ6WW zF+`TxBk_{W>KW7K6eTwg()Cls@lPdvgS}RCB@{)kg{!MKn6fW07yjMOku(N58}Gx7 z*2SSqQl>jYN4Yh_l{I_%2ptJgGw}Yt@3P<b$BPQMr0?#j{r|A$#q#R&#GQvWv7%q% zaH#V>*$pvqkz~h`m$+N2Q|e}b`$V0naI!as7eN+Xf>>Fa3osjni{Asc?sEr<`ry7z zfYo;Hlay(Th=rFCO*{0)Z;IYI3m%D*8qu}ZDS3^aIs?AsQdxXrNnwcicG364NsyH` zR-ImWgnSRfz>xBQV;QP69TH<oW0&!n9?DYxmglz2eEq~AJUH-7DlKh6%XtRZ=McMS z6sP`l{f)C$RFd_CGFExs;B;7}Qr)3a%=f`Rq#mw{!ek0EGwkyv1mZ~jfT!x^RqozY z!UkeV=SN)Q3XB3_wY1_ke8^OkI#W&!+<~nL<Y};Dz#b`jq=i~xq#i$oVjha>iX_kY z7J9h%WZJoi2vCjmqHoHWfgIluVmd0P=u(Q;mD@NK?{U;ViwZ^S!jB>?gHN^=)-Eqz z{H0#F`1XI<I<k;m^=TIU*!`v0R$XS0r%kx*wvRotb42ZCqHLPOGL@y=W4S&aE>UTz zBF=150cDXe0(aY0UfZ`lB#x}_)+n`9DstI*?<YzH%WwgKzf?Dq#$&`)ojyh?vxYlq z@z9^Z-oz?+RlkWQF!$^&;~YK<O4*z%?h1h(c&Hoj$6g`_N!3lMonBL{S%qhRqtlHb zfp%GsyvZ|-*82It8N)>sFSfPnH6iuVqi&Ef7p)6$?)f=WfyPvaNO5{k`ldn+AJ9}N zRZK*1hLm?ko;?*d=CjRT8fX&tFrK@TwQ{Uu+xUJ>pIeu7V!tK%6B`fB*js$fAywva zSE<$qsiMN3@7k1arn$IjRz(anv^O%{BbU>b<!3lwQZw)e>Z03wD7rL#ar*Oc9V*JW zy|V+7{A#B5xQaaFT2kVF{2XSDhWfx`I`iGM6fe#xb#TAeRH3(jq`DO4)`l{aWEQb0 zcI_E-!|w<O%b1*z3eBP|Y-uU()UwG*cI+7A?n=*Yarw*>Y<c1*T|d2Ws$B}-p+^>f zu^tk^6>nprsa9f73oG1>F3{UM1k73iMY%9O>PD-T9~ppv!Rb>WiyxYSspVo<aN+K_ zDA+e(gFE~(2w_L?mUd<D6?Q-X8|QaDu5Oy~R?gr-rnfq@Vs@-0?gqXYcd7&4=LTAs zamT7Pjg*Z}<f*Ng8A_C{FTT?piC4*jsK|2`UWum0Xy7^l+?t8cGU@$YpW|o#wv%t$ z__jA!N330_?@?Y^ZV(}Ar6*~?!Xm?DKPMndOHIq|B<(GQgREbOzF)hhI*!07xd==H zsuBFNl0&0`aC$pP{)hb}=(10~+>${hvIy#RvxON0e2lyKnOPgzZHCk*KZv?1g>!K* z@&N24G215abKoY;ewGqw{lgM2k9KcyQZJqabvphhYT6^Ra(1PaH8>^iK2EM~Flz_m z+La`AErQm=vI%D<(oS+B`qDTbwkO<*A5hW8%xtisMSk?kaWQ;IohL2z@p*ilbs1lT z>9;qIBED{mkr7jmSlvH;icAY847oTjrh;^;V|TDIk^ee*=-1}K`RP~8-bxg@Ecz}; zh!NN)55O+jkb1jp5Mk=qvptQ_577oXq&q83=H<B)DXA#DR#R_H=v=06FZyKd^}_=g zUkZ7RrjRJ4dpqN7+=`dA6TYS2L-OICA?Vkm$A&(;M7Po>Bk>xzk1?M-bJ79KTUCZN zlIGSaH)j~PMybVf86`jx-%P8wc;tR`hYy#>xTSojdFBfr@(^tyRGpudPsDT;oo7_& zRmLJ^v}4cFIPSjR&F@IpUP~ti<$gth9e375eigntE|Bh!`&>FRJ@ToBwAqYj&II#- zLw-ZQr_8HC*Y&jG{;Kv@4*?98oJAEUnQ{i}G$#trl_yigWr`qH9A4iU`$!$A!`Tu% z<XVf9n?lSv+a2Fddm7OPWb0$sjT9bcbLcbToSnqdwGl4~Y@Y*%{n6FF`{t=M9?b|b zE#BKQk8_7q8Z_ic3+{d*Zl%ELJft)pceHNi+1PoggJXqkjrXLV3vQxKr18kWQP3n* zgu|?266CY`@eE@?l<9;OpL3>uEO}PK39m{zC~)rXh=PA?pspIK@G7LxmtB%?et3j0 zlCZWMESfiVHSi^>jYf7z8YS0@Vh9dv4FyG2^aFI9Fby<u%s@|Ca;+AP=L>3vT}Yrv z#xcRzIk<j8f29EzaS4zzeYX9oJ>7+mJt9h>BCp3qkl=n&MV^G@QKHym8u23aApj1M zrca||20qB>rHN5}4WQWI9b&3^!Gz5qkp2)T-h${J;aW*ujs2bbF@96{@ps>l07Nzh zwE*Xp1ZF2O@qcXk;m>>1b*N9%a~CHh3DnuJp-a1@8u_U#TpwrgX@QIfb{ou()aViD z3Au~(8xM|rQd5*imw&NdHU6VFCY8o68M3%8?|}euC|n_0Pzh6tjrPl-br!3WXrQsw z@?z_o!*a35n!YFH5UyfFXT;0_!mC~I?E5}c!VTK~bI(A+b8A!gbdXvEELzkb#DIRT zW?~BMTf?Io&DX5%e;Z3CWIv4=5lu}@NrJt)rS1=-fJC8LHV5OH%^m2(eZI|3B{MxK zQoPD=lk1Fa$d?_bWmBv=ZIGIjF9q1xBUvPj@pYh_rW_BuSHyV)7%=pkcs#c$W{Qu! zd)-_HnPgkvetIZgEt1!T5!gyt7Ciy1ixlRJIby*~n|stYgN0P<otEs`Yza=#LauTR zO|^9Rhe$!&cicVAu$6jIqxge#!~P1rD5lBCuzyX8EiS#!eyUNu8mvgCMpX>$vGr5h z)>9~(=__kgC^PD@Zf+0_GeW3l^#hVu2+PuSMfy)VWFYV6AO|eP5Nss|F%lD{$1*gG z5(e=vv7C$X0Fkq6v9H`~8;qAX9Dccg^9X@i`k3ElO$epjL3?l*;u{&Nea?nJlS0u- zDu@Opdy5+y+J)WvYS*gSxY(B)dO?w%>XsiaIpo})w!OJI@ln37PdRwAQ$iV>16%r< zlbCa{vl-{=z}WqsUMwB$%C!>KZHOZ`>0F}FC?0k-Md!(fVCm6NL8-A?+-Vm?9`Pg2 zRo)_ye?GsHfmG&Ket!cOZz;NVMS48P3JihJJE70m`_{<puq0snlNykjTM+1pSxu4| zkV9)X!lF7V&K-5!bUwwp0d2R=G7h=;-7JlOEFlP{5qBqZw+#ew{~iBB!E}!jKg$0T z{<uu=n->;hFDr0IxMGb0pj;bzPQ`|<8!!s~HhcgQ2$r=KH!abxd~cq<>ai!<%gcA- zcNCSzxB1JGMpxpElz1n30dwv2ao^D=v539CV*J>!C2vZO138!l6+wJ8{+>Zt@?+=p zZa#*eOo5q3(N;*>p?XXFEH#Yi_Y{OD!7;vB6bj3DkigmOnw*%{%;u}*Ej&mhwH4%h zv7v<W=|t_cqKkVZw>NVO!WzOt@UD(h;zdAlQCO=l8BG%1AR<||uj5s1%*~ov@aAu0 zvsdHZ5ogq`N<Sf8J`Kx!VFO-{ZN0Ypc13OdeJ%%f2a;wC!Wew?^!|l&$y(O%QF}7; zcNFg+?FGE{6<E29M!n`>f8+O2+PUnH4C5HzXB(hgTp~-V$tEj{@qp3r<bW!?!TZ~f zmH|X#j80?!aaBHsX!(19!hbB9_e<bwq&@|vMp;DEd%uqS$pb=&(!&u?pneuT%{XSJ z>Jk0u<R<JhJ!W3i1g$$2*|>ZeeDx?yzgKp!i}v73pUTV^N6{egOUJ3Ix3~J$tuaf@ zQE(pEIN!H@oKl_&Gkt{DME1O=B3*Z~WL~jan9;aOb@(l#1fMyii%mOMl-l~aa@>oi zl^QWjENZJGtDO13#oh4rn32iIDEZPYJ}S775Hl%vVf6k6RH7DoKme&!Tz42PHw$3< zZ~<3oxA$cBrlHqX`;M6E5aPN5VCv*QATpMm<<4Z_SiE0{diSvVl#JF!E=`Av%e@>5 zhdwbbi^=);v=FcRMDh!OO2(WN_9M&$VTU9pc(0ns-x|tRjh~^(<IvW+;%}Ay)Hs(v z*3aR&e1Gdtg`W@qMm-;cfB^X`#!W0Nv?-|`{ntH;OKo=BcTzIC6Sh2#a-Qwk{~^CW z6+2>Nh6poq4@23)XWZe6RVu`N>w3<`hE=`0(MBC_N=BPzcEY<#F+hYtz8a^T<PdJy z!!AG@$JkJgtz~iPPr7xZjr@@T+0F3TDPWcuZk;dBD4g|CP5~wDp*cED;dKf!vhrd^ zjp$A4=3-K@X6o`O5~O>+`-z_~I|pcM#Q;{5vOl95bKfPVkxE@<Jt)qjB+TUTCm?}D z&=A|)O7S|fwjZ){wty<xT}WuCvCaJj*`p4K#h5Ue6tMR=qWcHWkIx#qy)|o`=poJB zt!+)+++P|RgXde+onk-GfW)hDbcknVN?l~Ffn5rYK9zU{5saBcYmd?m*-h&d)uFg% zVDWq)PG{%xi)&*vQf{&#@OgFTy6;71DUj}3Eiu>*TlN2QjZ%GFcW5^#NEu6e96vc? zx>2<X-8Y|<gm0i3<Pkr5X3D}%s>0P!99nt`70>%<O`rAddn;_{^^K!E4E(M9mY4bo zlLw}&X4N~dO(lFPL1K~kV%3<A(RljN5yg1v58qP)<24e>_F7iLimi;LrPqC>t&uHE z34G7x3E5s+SI#18=LY5_1to<^%>g*z*4(K@U+kj7KXe@0wGzKaJVirZ6S!LjWAluv znO<<UJOQC%`x*MI(N75{UP$<Ww7Ua^75iD%&-{ylGfHG)55@ebR+34j%0OcA@C*eQ zvesOCxD;Bg{OjB|J|Z+Cx-m$Hg52%Bj<YSY+}3ByW^~at@=>56F`cip7Qcc`07Sxv z_atzy|ElKe;VY21w*nI+T00E2EuXdWNCm>lTvGn+{il%gRO-iA|GS5NA=JQwNIZqa zyl|YIto#XaF@&0CgsI}_2nHP)G;TAMl$EY-M>UV)xkDcN_p4Tn;<c?1V)<t|Uyf0p zdko)NXfu#MOdNuT=J??!ef-7$xllIpa~*i<g=rbU;l{i7NKc7^22gDX>)Q;U+aTW5 z=v)OXvQZhhu)$z(L{szFyEhHeFZiXpj9<6#eg!&lVD|Q!l5tZ^MqqCGyV8RFeEZ6M zN~`uoL<^l@TCN!0F5Z!n#N;$lBO>L@oWacGniMPLK(TlVm($~EaOO){i&E-OjC{OC zwBFon0DU(0q{d~pl1Q5ZHJpqUATrZX9?D71drw1gQeGR5>J{ep>2Y|1&}w2db`8@< zz*a*jfktHjP@}yuUtg^izCT1*ov=(3{u#_6`>u}k0O$Xg-+vupeI={Ce4|OYKB-uZ zAEme(relqfZ*DX15SjOMHcY=P>~k61bm?Ih3cGD90<{5~*$*4Vi@=WTDf5xvZ&f;h z^m8M7t0ox(zyx%plUF0wEvCFS!AkK+3>kuoS+wkIJXwipTl(t9syD$1fPR)CCg=$| z+_MUFQGBqx-;>0PyutV2Js%lanh1>zY$rqRh=ZT)JKrH@A@=0#Q96Bw3l{Jc!KZa` zg>gLP;Qlun>7H}qAF$a*D^@mkN)4NWeVT4LH(I-lJ46K=Zxv`Ut4A=iR`Cc|>Sn%$ zEzKu^qsbf(UGnX2A__t*_M>2{UV-_+My_q*f=;jGdxdxA{fiBwnwlzK6dF!avnx;q zV!;eeB#iA(tx93r@>HbU>_gTR50Z5h|Ez@WM%zQkgS)#SW8n!@<miNMj{9%+v4b}6 zPQX!{5!1DBMKa6`Fji#&)U>wYOdg>%cw8;DaftZ_jOSZfJjJ!{6{tKpzG<LTN(j^6 zj)=zDWaa6Ul?~Uu3&3>$i4r>4Y$LhvN8+9@>X}{;36<MAn$mU_M{Hg81b3=vca}VN zE}p4G%ttrSN@|SJ)y_E))6iijPGh-OQgZu-I*PBX>v56LP{N9fag|kdRG|$I^`c^9 z@@1*X`YV`}O9wI#WP;mq(BP++t})$#r0k(bE}Y0fBQVEGlApHPnz>okdM)vbfJ4%n zB(VCf@tt%&)Z16SY_4a=yJXY_)>j2ns_JEOnk<`Ev_?A(Ax1vna-aVa5=-5b!7YA6 zP%S==d5Ny1k(j0xm~GKGzVP+ahFd@1UT43iXiW9P!i+hLFEtKuimUbUKj;`=wCY8n zwacjGZa0X|u6K({OW_lJGn;EcCxf$9&(3Cw?#QR6ru<Ld|Jr)8E5OeWl>0rEjE4C6 zF*7kKw7~uxHcxCJEkpj7Jocq+=PRR)C3iCA?{&t-rKfMy?BS?~PRKw|CR}kG?&RW6 zPU<$#&nd%QS!}oer36`GGH9x^ye?J{bzz6I%uAobOG#qY_0!Tr;SgrG2o8OywLmR8 z%Mhi~RQf*M&w3|ZJTm(b%YzLq@YzB`(R1E!)bytsL3GZT&<3>Y!o|Z27t>~e<p;i} z?2Uq8Hrh+^74PyfurL#YXyUkL*sc3oIJFCXpY*YVqu67T4M#rpw2iKqpP#X<f{iG7 zWG=x*{292y=RyKU1*DzE)N?ibW?-DoG4{o!U8xP_to~SRA6#-8LNm7<RVrBVI&u44 z?_px@YN*t@_cFq8-`MArvRI6BG3a?#!BO&2JjDW2W2gO%SNq}Q!Q$>4n#C*OwYe{w zz0o+T;w#8>_g5Qzk+=XrUo^vOPJy4;Y#%QQPS(-7?|q^7ze1Cp*Uy$+>j#rVZ*583 zg8%$nKp1d)uDG`$s;lu66BE7O)r<Yp=)#hfit!)*?Q+qvL2w*({i??{j2rE-PAc+~ z_AjF~Nq`yp0_<6yXGQ@oSaeW@O)m`1g1w}%uRKz0i|%5a?xc$JAc;e<mNsO+hhNNt zFP3XHszbjm<(FR5iKSz@W)T(@J&hKrFh!hkTG<yh$1=W6cQ+DXe~X6)Bn?+B%N8;v zY*UMkC42F@g~m610WZ>o@V!y8pweS+gbZ{<DNd^L$fFY0Ukt>9nM|Pc2%<F0;QIZJ zt47S~753X+ioNH@`u@ds_R~>LOMy?!#3+&pnwlimjkq>^jjc`&BhqURS{|B%X_LIA zrYL*}Wom$5Tv|<|&EGz6h*oOqUt&`z)oZ$~DxSK)^ZH?9re2Z8w)3YsV8N40>%{8X zz_oa?;e45G>f22Jd07PZ{q4=(P;iSeZ%kYqS^`4k>~iI0ycH|Tly&*Y_x9xeP5=~q zs_>Wqn@;Yv87BAhdW*!+o3_yY1ZolJw*kD{(T}(IAO0M@+=LU!5*KZU51fSF-}vAE z`89ayFrFJ}Kbnc?=%99Jrmn56_1{bshdh5CJyW4u`r!kp?TZ)w^2&<m)v0wO;qkob zOBELvZjbIW)wdND@nM`FpIbIqJv{E%1vM5853Ao^6y1~Wqm?V_<F~t2*mSGsT+T)~ ziq@lOJ%~p?T#vtu3-)f>ES=f!ocWw5PL#&F5ijt8c%|bp=Z^dkzAQ8Lzdk`MYy<Fl z+_H>&Sra)o&%|yTZjNPIfw$92>FsNx;wqapj$L4iZ;z|X@Td)jGks;8%Drb+Ape|- zb<Jhcx__VnTKOd`Qn#H{=Hc$L?xxuR_2U+rc5`s{GH(M9xzn*r^b4<&)%nQQ&tT(; zoMQd6^#W301uZa|Oe_c||8)IJjxWiBS!@-B`XXLfnm*16tTr56r7)>X|APs8FCbn6 zhk-{QKN$rKT5ztsBAAtWD#QEI1qlMQ(VNH?zE!~3GkzfhAW85(pMOKvhk$58T;4#d z=Fqj|q8TVZ_0Z`~wMHF<ay0O#n{*aE<)nMSQ!)PK5waQsP)ifX$Ty2f4<AXL)XpWS zWg?&{AVuR)xibaqACJD|ToI^d4M_otnbOLULK+u#Hw*mMNW!H+54QY?ll|K6P;z%n zYnB1q8Ms75R0=~YFF(@XTpslcygtL9GR*ZG5zEoO8WR7&H0^nIc2?q3`ZB25aUv=z zBcQ=!PNsc$;X=M#?!&}ET^ATr{rb+|>ioFtWN7ZWWg<sWFlm?XQD45~E9I25lN%1X zYYo5Uzh`aS;zU9zV39C62_f;%m+)jp!<(YY%h^fBWc-fv)kooV-3O8rI81hKdZ(%X z8O2m$x+)gWw?E7vGby8CLK{gR2VL39ml`S@c`_SQV~42Y<^#mP=u^4*;?tq!Fp9%x zJt@;VFdXy1#kENKB9L_WW)VoqG#bkzv%KGakm$pmj{F~=Y#lLW?0x7@ij4*>($7f0 zjTZDvG<SMIzokisR~u%}IkepZqRYsR%t=j5_^!4FG#b1A)KIwZnrs|4^&LMtG&hGV z<wJCE!#~wVFq5ayk>(c^Ky$j*#k$s8xTfZu;fmE(MQ1(xr!njAluDz9=mC*RcxCZz z35Q_=m#)Yq1Yweub4JN_IkFUkawI{wg$df?+i+A!Mt0VI2$10Auk8HNuq0JH$I0lh zcWmdgsi$Z|l&prIx3%S|(h432X*!W>RvKcrzc3G?19QFsU}EW7p~5D(J<^ju?VZkt zch7y*5np9pyC_D?xv1FNm-(Oc!(;gP_)6wLM6>iy0}Z?vc2>&*7`=|abTFR|XPwQ* z$S_td9H`)HtaW-ab`P?>v>(BUpPQRIp9Xc?Zym38sf;SGr8U*o>b%_y|K#^IgvxQE zkYZEsJTnUr`ADGq6sA5pb1HMX&W3`gb<5nol1Y|X3_M&E(gRu;fnt7?u|*`%17u16 z(;QM%U^np4HTbmljyQTBw<s~t0qiI3Fe9UxvnK}V-obVDA2Hxg?|b%HH}@ZTE4e(y zKyJxX5q)ZON4Di{KzJs%eHEx`!r>?KWrItn(8~IF%1zOzz_5CB9U^ogO5`iG3d(nH z`_?@FO2S@j<FLcGC6~{sSp)j+LG>f3guxXWH(=^V>6?sA8S8iAEAJIBx$K~*7DOvG z<~TXEgqLBG49+4Hi^s%lK58~~$V<<dKtve5JjLcfYD!2i31|LlovE1ekP3g5MoXVY z=$nNZjl=+ozYM98H?4S7)YZ}up%XD`8_gVH&nZLDnWFC0_XFxo4vEwWbLg{kQe+uq zl>{_XzY{TP2Ny=HjGd2tSE-E;%RRD0oHm4b7pEVwaAxbCmPRrQ19DH*_mo)t6AQ91 zaDa@wyxQK?JGGP{<~e`P>OPT>kX+5TeP9Ej0~5nv=D{#VD*9TcGS3fSO!n(76m!pA z1ihTwJ4ic9#t{j?R|ehk^76jPy4*SQR~DQq3eB<yK@F-5n1@F!Zz{G|tFQgj=uYn3 zn*-o2GJHfS=f~?Gnoj5Qx=khjpV;Iy6BGJ?7}|%arL7-2MI(RGnYHqJOFpbX^^<ZT zpgdP!1Shc%h$-K~557>h2k?9ZcR6`Fv@M+t?o;O9{J{5aY1{m=Z`A6;CIh7Eq@y<u zM%Mx#FHNBrXA~1Yj9y+622jOnqxiZN^E7%#Dc-B@@dSrg(#s~bPO`S}x$*(3OkjRf z3*y+H_AX#cBB|(#phyh)%`AumELJE#N;NLw*jRj!PrY*~<}Vs}*}<Rhd`o^*6ax4) zLg`KC5pg}c+mQVk(LejJ%@Fo}6j(JANyc~NB>NL<v<_HQB$-Ir+C6TEiUsn3B`BPd zVxu&xB2~-CMBM%S-D<i?tBKeQ6lf~@e?q|7xPR<0ex&N*0`u52U4I7p|8UuB=|xX3 z1ho^wJif6yDfvuBHTZy~tAmW{>1*o7*%xaZP81}Gx(zpSL>y1wpM>aQeh1P^vDWYR z!e7Z`KQ}UpLMt7ejhQl>uWzU^ghcSvwJUlr?T{^;#=2ZRPU?QLT~YKp4y{i)VtV#1 z9JM`~74OM_gD;ab@K?DFR@#j(hQde?5)%5;>Gev6k6|JWM>|0Bs<gG0^2w7YUI4{m zV+5XKlsx?7zY#gS{>`KFA)pz9`#mMN3kMX!*_G-gf8?vM|KN>Dk8^WLb2XVJp2X!{ zkdthn!Pw#$N3>p5cv2F7zDNOlbTfR^A^QCccHSq#thA7|BT9u2uhPg|y+RXh?-z*{ zStDGZ?EP?B4}U}&G-2Ac<OY^7_wepGI<)xAVqzkerwv_X%a&sGZuF_8<O!+|>*rHQ zb8A?Z_PlJt`wYatsUZViQjZ+lt-R`)n!~Cv>5VHLkTjKE4(NG9p+3@;+<fHMgxa4M zfEsx<oIj+bT}e_2pBLi+=Sw6$>%`lO5%072Q>p@5`@Ds970eNiCYMwb`bJ{`D}Yj% z@j{GjJSz+<nRY_`E@Da}=bOF_Qjyr)t!s9&sB`D&<uX{4mQBDOtZNiow<{-O4k)|% zOYSSps@uXH3=S6xy$dGs-`ZsSeHzAE#2bY}8{n!YyENwa@y5I{e?gAu%h}K1TNQNb zwG}#lz|J6^=4XGm^7SriLhjydEq9^Q=U{+UtecIE=<#{<loR>N`34`^wQ*9g7flk5 zc);kVsHmvpGnVTuk?u$qhRxKrhTDbEKhIMI?#4J;1I`AigaXd(28M=waf|~j0!(DN zfL{edKYV{zt^5F4TB_vsOR@Ctii7-6>vP>FJH`(?i~m(o6D$7Kvb+#!uLb+FI~C9E zAttdDs(gB9_F;;M2p#*#Wrt|g&QQ)~(YJwJ4#b?Z^{Wn&C)<ElEF$gk3M)UJ4Lz<& z-&UP5=JD1rF#3d4v8qO~HN2Q^*6fX;6Y#6keM>kW=_=wt7umBsADdJMZdtBbPw!9% zOSfq9^?6I}v12Ng>h&xSp08scrV%n(BXFNZFmfwn*|*b}XvD^vV0d$L)O80w>QiL5 z>TBWJlL|3;lR7bZ)Z)h|%1i@B`)?j@D|NP%iD%Owfqf+n{f<~=aro!jzI}nuz1~L@ zDT*Au2;3;mgD_N;?ayyfqaKmZM&QZ7y+v6=#Pgm_z20qSDn2SCx;tvseXocgSsfp; zhL`sitJ<*rhX<#qR3$kA66Dq(=>}CtXV{K)FX>{UoCG=94vnn<K^abUeun?8S=41% z#!b|G*tJa9Za(QWSMmfgRQ})%_o8>fq_4z=m$c{31=&^0J~`~FJ=udulsDEv@$qM5 zp;C$}2F^;-+(4I=>4OYXsSKkr;5cnG5}6y$kN++?IEIYjb&T%aIY&$03Ut~{N&02) z@bRk2`0lzV4^v}^&kMFa3U2=&+?Y5Ai23gW!WHQg&{}x>wjKhawBgCZ%la50MPII_ z!aPu_u=NI-Dc<_53*RIWn8Z)3wSwh7Kw%T*!f_M4NiB=tif`SEaJwg6mUeH*8_TA9 zi%R@j2>%%Iy*L89)z^sc9e?}L;ab{}>B!xyhV!6VDW|zW&J34DI*&ac7w;Ta%;sBe zLnfO;jS)}PmbI1@ib-17lCLQ5NA60|!&h$9D~xV3fNGlnd;9I1#XnmPC*jnX|2?4d z=>k1^5{{Pc`dcWZ^oB@Z2SKo_HqK8ole)1A2>})Kphy$%=%|r|W_ky0f_cPUx~`SG zc<Hn6Fl03usEyYB$Q}A_6~g_%mBX|gle{~!WEDF)URQE6JfrOSJ|lZcV{kAz{xKN! z)q)F^!GwTRcJr|W{IbYUWRpFxS($eA<`v+7ndMfN=Dxx`?JJqT*VM7}zK{%@Oe?mA zT-uL{-M+pMaYT<kfecTcY$#V#aC}B05Zk;aQZ-IeE5Pc}#AI+`ucKqGwcpZ`?9)A~ z6(@0@9*<VWyS$k*WW5fGgTBD2;~T*LYT!wYTVTP%;3h1rn~7Qi8vz1H6?w^Md%U|^ z*+Wq`YEc&_AMQotMt5GhcX-y2Xk|tTH)gsTH<#$NkSJa6{_hJLu>N^0wdW$HB~h}6 zfc6(`f11DF4|q~*Gp^Q+3@QoX2wOl-J#oF682@8XbGiGK6kek}!@x>W8gHL`g@q;G zd}&Y83h?WP7yC1NZZFl0p@N^0xf@>XQ_e`m?`g$Gu2z1F>n)PXVUr%s3RQ-UqTR?M zLb1%K39G}Fu8p(yV%Vdfgs7CenJ$votK(N{*F3m$SS-q=VM{Z3PerZr)F2H&-z+lF z<qKI_(IRuxDg*g4gT|u=G?!!W*D{ZBv0f?+7mBWBW^!j>2i6*S?~6&BLnV$Hn%t2u z*s}Qw1Yax<?zVuiU_J^BngtD7<}n3QSkH9|20oF)e!G?{?K=cOO_k*-LCD9q`nA4s zjY8KoOHxXlib{Rf&z2F^D_)IF(q^P@X!yRk-AEPCfD&l}GgYe=l&I+d$kmbQoCgPz z?e6B#PMJyW7cLb#3Gw@OE9j?grX@0P#QNrTqz%xnyLhP%@88ZdA<lvtM!bvZPiOAr zUWv*<8$#+8wj;PGqIxF5Hy+EKo*ue<1npuoUS6?o);R4UthS4U`6c>t`6s)d*7XDP z2!As^h5cZf#KA$2=zB*v8a6hW&ox}WfNqZ+4?KOgFe5@;LA*eo&M#tSPXmN!0aoX% zm*|QF+ClPGUtvVH-q3Y%mtykW>?HRUCO^>0m?lx5Fw2fAT+_6IFcTO*oHsHZ`<b8P z(460U*~~3~;}DGF#>)`3POJ?egv%Nb#V^62Wt7byuldYKo>G%B*IBLj^dAcKA2+~{ z=soaxPCCe-G4d{gGH%iy6<8jTz~f2W2o;@ZF`GwUTsYo<WZ|t8{E7JdWweE09#*5Q zOkgXa77kCBmbT{R6z2f%BF$5V39m;l=>WCUcvvgDP#Kxun*8|Qyu<#A|IflLKHn~^ z7EKFglDh$29>C;E0!uTO)b;E->dJrLgV`Y!>Yr`=a3=F+3KZJMFQR{u#@fE>Q7Ovp zZ*X`wx)Iig5uuYG0hE1Rit2COkI=7*nCb2E!T^;$VhH`smHEd>GGQSUzy8f13OyH! zSr;|~ZldL7>Ef9KlD^iFtg~VkB4H^CpwLEwereQnSp>K$JeO}_zXiheX1y7NbKuP^ z2Mtmd_b8jjdT)fG1m#rxseo%6@LV3RmQoNil1WrMxtfKASdxj345qj!W+<`Y`Ar10 zZkMOm{0riQFg#c+Xu}2|LEi;2k{cDv=3;X?3P9Dk!Q9u{tCxRwYoiQWt|xXyKjps* zE4aTZp0R`V9ogjJ*{sYcA_&4?!@>=5PnwUyHK`(ARp@Rm;`sdCXVhz1{Mwq{+-;Ni zic5|27r*e|t<~`QER@Mblia}N39Ik@R;%>J8#kwn&%O3OeLGM@^D2y*H*xE<cy*b{ zMBGb;c&I7>U*U542pab*%^ap#9c|Yf9|lU+J`WO+Mq>lY!W3)!c3(bcl62=1Wy0=m z38Jb?%Ec`(!bfUi#MhG1B+`iStN?Gi0if2Wd~br!X~d1CGO`oc)hi;HSj`fiR-H=_ ze{%e8^q|*;un!JLIE=!6DBw<iFSc3PyiUNy8xk)!kA+;)y)|N#5hf>7R3fGpekg{d zG*pnPWTPMl5YqWlp+z=YTrfltK!0)*iOxevgUm9U2)WGF_l9Pv&0hs>H#NaDt9F%i zz)B^5@k=XC7;N1$z}VtiSqN-IYJ>t9S%RrLYmC-j8(=DzU5e4&?8<rW3~1;@!#Bd! zEZ?VV#TU)Y{!aZni$ApeHW0h_{X1zr*Oj_@a&`R&ngw&e0{<QKd}~nTpZKT#IJV=f zT}X<Rw*q*cMNjX5uYJU>o`%ogMen{NCh>)Tz~UESzSInNr`|=Z(NzSurufN&ad^_< z{gP`4Bqcj>sh1<%x@g;$>)kc)B2ao3-O$iiIkY(eoTj`x39G(#kqj;RD^KJ{-iK^_ z6tewJF&Q1DSfSq#(nT!Hgv%uLw55}{m5Peow`~vRp3dsjLWAiFTWkhMCDS5Io_f1b zDE^Sz6E%tWu0#SN`8<8P(2J{AMGPWMsCve3WiwzG5s7XpWeBXJ1hs*9O3)Nwno^${ zSzob_i<O_ITPRrFf$R%E9yp%#GU?T%zZtY8cfBP?B_v?6e_OEEUg+Y5uhqf#h%|SU z&4Ja+rx2bN8*I-=RSwu&up<Y#IjDUpu*?FhLJAWR#o0<ob!TzOy|Qr1w_o{lvkV1K zB7e!aiT5Wxx@aVw!*+8hQ35^w@h28uJCoBy(>;X!S_>jlOQP%j5OOmB|F|=H)hTq{ z&&EZxeKK2eDbFOlt@2MM+dAL%me9MOAhMQTz{4SWEal!H<<@{~>*rrWJa;C33t>^0 zBLS=lPdmVyN3j!Ot8wq%KrW1PP@4tNaxKzug~*x2NevQQe0(ypx2NlQ`lX5u`W&75 zJmenjOJ9rc?}o{s{`u`<9+by-gV^0aCrbDB8W@c!V5bdG&O^6Q4{^FW{wY{mTNJ_E zKH9c%#I+!rR`;$lvgZ*ri!20W91)DnqU6tM77vICMcr0RYGK=Ru_GkC?Sad7+Bu?F z&$W}3p-|2~MGi)<KFmEhN3Wd^Vi3bS#1s1njAJkfqX6|rSxJ=nw$rma<#YS<x<k2Y zAk{F0?F|4Z%xEB_Fy>SX07U9<N9iAgo7ns;*@N|4Q?51zR6{COuzid%t1)VwVyl|E zNMx)@Wxg|Z|H+bT{=JL%f;cOtI?)I7^SvghoMWNZB}Y#XyoW}GMMTaHEPsh&65?&# zE2<7(y-7(4yT6^dA3!cx#4lKe($~Mgq)7rj<(@yYZ(H@HrQ|bV&HQudD5vD(gESVW z*{`Ql>n-6t>-0eJvbs5u*Z-3)hqL;(MpCmy14!=|Tsda}En-FKjxUY+=N)>xRoaU8 zPlddfq?vq{uIRYdJ=G$e#&<Eb2%HRTd|li0d*?ey-p!Ymru*?=zXjuUGSbTco{Z7E zLxMz0wvF#jKqzus0t4))7QyGgobL9Nf)5T<r%G#|eG@Ur+X!1;(OGhU>mwAOJ97LW zgP{{=^C7qOD@nvDC&?#Eo~OLXXnPerjSai~jBHBEC@wOBNgV<er}l>mf%K;JO2#pi zWbE2u{X4J~TP39|vX?KuoHl%Ge^H)cZBn^vvRDS@Gz4)Tc`VX*50+2@@gO)=Ve1-` zoE-91qP_dV3Y)_6+xorR$I2CIu=pcO*M+|Q)~4Tj%`FJXqSS`(+3_;SSevptXk8~? z;to%a;NfO1Lx5G5iM)l`hjoF(pXx)j0NGE>EG%aga)0nVJw4A!0kUal@i?IS^Q@2S z7ZY-*iO{=O21Z7oTm!W<HT%%>`k*O_o13rqcYBXgM9v{0oMfIms-mhi)^4>u%lldo z*82adt1W>t#ZQ=QV7M-kk=Xq%M-eMWuw|FQf%*`#g85f&IfE<Tv}$3dO+oNPV1>B) z2uFtX!4DJqV#EHmrO1?FXiHmuWTq~5seb8<P1I;FhQ!*s&f%={;_X;ypG_l^jVA8& z$B&pZKdjq@WU+hE3w$qyw9a+?cS|4Kp&gx*gR-M=k978kztFE^J;bV=QYH8ym2u&$ zRHY198&E`$IFuAi#@-|7%uIldL9U6#jv3uYOoN&CthcEOreC4(yaMZ5AoH7L=<jFU zewo{i;{<CJU&{0q5mWMI&l|sR4%Do3n+ty7=M!b}Sd^hLvPAG&Q<0;QdcefTU#A?T z@sq(s$!lR&(HOp2gwR0cYE;szUFhZPuEZP^Q|;?L2VM8dZ_ZPxb=24bVcw%uDr~um zYd8+wwNn0lM1lx;@Edc_L5dQdD!IQW5_3PLXKKoGhkO0EF%L$!<mb8J=00<VR|l5& z+^^L)H#gO8ZF7x{lg~w2XteYp-iBOWq+z)zmedvv@FXAp;0dqNA%_6--SfoZkvqJ! z&2o7nym222|0+f*6{MGb(UtdBjX8IPt#+b>v3XR1q)O!qB;k8mqtoqI|C+t7`V6ef zv3#Qa#3B}Z+l+3A7z<9BK)K?*5x@R?MnKk}BjbHznX$j2M3Akb?Oe6L3rfs@{-W+u zQ>phuVs<io(fa_b>^9Ont;~{(vn=<Y^~yPgLa&-!2rA(1Itz93l|&Mnf2(~nNgBG| z^YC!Bi>ki+JZ=y6^zquGbF?FhczJm>*pE^MI5P_Cy%r{leMjR4R#)^;<VuoDPpB+a zQSY$k3yl5)fVk?Yjm2V%Di1NLDwF+DC*(AtPDXB@-{8c1-Y!(deA{QmOCy_%4wSQ7 zD~hiodaQTzaAgfgTIits=jq8_LB}uFbIQkI<-%{r%%*r4)~xp596xYA&vYTLi^b47 zS|$2186P56;<owGX0Z7K->AKPkV{HJ%-N-|T7Mlen%yr%=ig;}MDW~Xgh)h+#p@rX z46#C>faeElpa4wqRd2G~+}wfAza;H4zrQ(OJ6<`e^|jkmlM>2n`H*-8@bsGNZak5# z*+RB$ATpRWLT7A<S4|?_s~uuP8F4#aQ?$|xWBh*nRxXpMG{0uu1LQASx^spZp{&X* z%$-)I+w;4R`7qc^1nMTTb{odl{hF!C!C!7OBT{-(g_9(v@GA#H>~J>fa#BB%dClak z*X!kaBXTH@;X~2z3-u*~aLUZ|*)NamE|<k@1(}B?VejZ&Q@x&If&SB<1S9|MP^J@; zSBE*$H_}H>j~9q!uNb+xxd*P2L(!Cor@ublo6B4se7Hh?wQI3Q=?P!UPKAtU^?tUz zj6iYMgj8XZq6x=!!G4U5RE`)HopM-9Y+mtwwrs<9$KYAx#e<xSR3^%DYfaYB%*k7Y z0^@In(FH^`Ds_+hnn(_+uR0&I-f^c2oGyEF>_j%b33@l#cP<p9(b)}qaZS9VhQa4! z&uP;!YMF|Qp=EgHq_6whKLBJ2d$N7_o{2>6+WxD)dgW4X#2Z4DkWTx5!Opl$mQS;E zPE(U<E9P9b{UTDddZ{F~M2tiK99XJBAjB5IXDU<6sckO7Kc>_M|EV36b<k6`ZvV^i z2zuzL=VrfplEVap!EmqqQaQ5$^1<&8=V6VstZQjB+1by$dv+={a1#e|ZRHO&8)s0K zJEorcY6vOnYqj$JE3Dxc=?R5gW!Z`Kam8hxpLN#><!DlihV>;5pr_Au*R9A_6cweK z2Ba86M%-ElRq4okrw3!UuiLWyE#1gv7j7E0-QhX4g{1GZLtCQDfQHF8k23zNCr87$ zpRd@H1b6Qi2A!he3bAL~2}2K8q(~I`g=Mk7YYDuM5MT3GvY2LIIPlz`F3XniEa_&2 zsBTq!CQI+hCdAkK4d!#{VjyBtJ<>_PDz>avV#uqSFiyeX={&$Owlt2!ZU#o}U!-)) z(7!O%)N_|j`t+53v`TCfNyKWU$_z63yvDxGcpWG&^@Dq!p}OyLt}3G_u+4qTxjChf z7>iCiqJa6TDmuGGP!v1Xk9X+Xhvc_Td%SKdzj*?_f%x&<&$a&D>M(6pAE#k61ZbgZ zP21w|xDB`|KAa`KTpt(zI?xx1zfB&I62FhmTvQX?H{PzU)mPCE@5b&u*F*1iLr>8| zQ6rfv*AItXU;ps)QsT?rUD=*de{M@;svScWEHpb-V4B;BmelY6$u7A76O$nsF#<wR z+60eJYzkmkuFNFPxV<$i&l%eqfDS(7JF7QPKi8r0&^KMrE6P|rx6K|~tBx0r+nCS2 z<c93d+FH1P8qUN9&W;!BcR%$`sAkt3j=YF2!92-M!+2W$THN&Qze6Zu#i3Fy%HV{! zI8xhz)sSDSHp1~I!MoB|q4y{Ev3RU^KPu!l5YeEtXQYb!lpu+%)ryy0M`8gQ$!Ljs z-C*5o_(zLwf1&A_nZ}SC-^Rkws8F$#b=&#X*!A?M3s0pTd&1~LYwEW`>Ngt}LuH0Y z1k1}<#s#2D?H>v97={P)I2Q9Jq26tcYlcz3mg-8r38!SC<61H%t1xqc-Zc4L|6zcG z@Vk3=(2s8EOQ2=eKIvg_{Cgvm^%8!-DYEQ`P~B$*qqy6sf48c*)D`?1r=DnX)ROoo zp?4qeZ{)ssjq*tZUo|*k1)u>jamR&{l9HU<+%Ss?X@|dGYVDopREbK7mXBpOk|h)x ztUdg90T>Vvz|40~aDUj4254~Ozp==xKK&Nei<0FH>;weY3SC><1yUu-OPz~T6gOP5 zCVhOCWFrK$75em*NBO&`yi_o;zzEk;;VC&0v+5udKftLbFph6O)!Ya}gC5?VbNC8L zVSFO4p*{HNC#Mv5FL6=qbo$TAV3oBAY1G;AJnxpwGub$_VDrD%xg|Z-)2m@r^d=vO zg_$`eFE75OMRdx2W)}@TA?2%fadq`X(fbuQHF;q+?~*EhUI@KKg~m`Oe7yg2GN=rJ zk4#LUU|9Hq_Mga8Gtr0SE3r?s#y;fjR^$I@Wy>Dp-Pj;V7F5baGTNHp&AZ6mZLH5U z6qJyg6EnN*tZrHuH?S|&GMl-cYVR79Nc+OjUma5_9NXYe`9w@wo`niwkt8<hcW$r2 z5)g%PP(Q#e=>0>70+I{Lk((T9td%K%+e(A)p74Jbq)e8caWOHt$+y2@`qgub-2o!6 z&(n+650{#+&XPkDl%jznt~Z<e0Z^~;+$Vy0<0V16cYkiSkyO|(J@=FS9&*^pXsWCC zSl*peO-26RmAmh_QVR<|rA(GN9lj4=M^}lm@2ab}pJY*O!VCtCKSA_(1ll1Etjqx> zWZaiTYbELb?Jm0fnx{e%5|7adAMh8|(f#Lg#Te;A0WOl|tEZ=7cz!H*e<3$0HeYWk z&}n1INgmAl7Kcdw`~*~_zVmazl8P@g;6OD=VAEFSyly^tY2x)|^QhRV`akE!4~$fN zSOCV+NGmqrCINx?>mQ<9?G0}!Yr)3@cBOPL?Y?<+C`%O<isWdcHDVuD&^l3{*rP7` zkVs_j=GhOEovssF&eeffvcaIwS#>AEchq+;lF-LDA4-iLMcfB&1Z)R@oTvq)>oJnD z3Kqien-J4yQ8MV-o_N&1;G&bkDMz(b!Pq$4cn2ymIW<KBm68o`b8@OQc4%8sLF1z{ z&n|lXEZv)ztdJ%cU{ti#rsspCqGtsK1-nRIPEK{1_PRR$vvucSrT2s_386`$vXl1R z1l_!JXr4EG0Uo)b?wZ@Da#Xm~FVS{9L!(@JXkT_SIW&Dh<0l4GJXsyavcvt>0@M-& z{0?f{K53yqSPXdkiTAxf;w^6<{Y9yDIyPT!D5%K}v7ET*$QA#SHa2OAAZIrmAhQjH z$G>k<Qb4yK;zHH@AEc$6?UkUf;A)k%$X9Q#K9Zi+EeDsxpM;zQoliHa^{Odiqq>Z4 zhAg*N8!>X`a{oEy1fuRIv@f|(rduTFKbyWgr_3aeVci^I%Q;$(PNqO%ybfXD0O$Ao z1r<~<N0<Tq8&dshcZdKo|K+YpZF}F$eF7LGA0<Z+B>S1}nzvs2MW>v7Lni|?On|TO znqc7rs?ioTAVFYx|9fFj>OVo7#UcBFo(K&Kc+?O75$yEnYj$}=0#26b)n5FMujqJP zO-AoQ8x!s*{_~cE|7CaA6CVaPJ3If=RHA3{!~UKc@Z|qw(huENm?E>Qxhbg^<8eB} z{_^PW`|tHo+K2vFN@^*d$B4h;|M)d2B_;buX7oQm!><4DhyM>{Zynd<`~3ln2q+EG z-J+C$lysvYp;7{)K}l&wib!`3X+cUFgb9q2X2?XPBu0#m!H6;Px%qtK_x<Df<9Yt# zH5l9Od*?dWIqx`E(b#L0G4ON%3QD!4!i-<vxc`)m$#K!|lkDVL_`5Y5rv>vJM|1DA zgG4|{y)f`Wua}uwj{kpl4$qAyC=^~hXccn4%+4((WgH?E@afa16C45v6C5No1#*bJ zK!>t-p3R~665NASK`O$=%F4<Z0hNx^>u702DD(ig?Jc0UT0#w_{ezX5hh7}nw4>#( z)7N>FNwd$^#IF5y5!BZJbm<my|4E1~hq=0C=bM<c{QN{9T`U4iWXZtNQsn(RxoAI8 zULKz4!UbHmVyMDyI~Ft>uvLvoy>$DwNGJ$`F#yDJ1|<1_>U6F^rGg|AnILrC>8Jrn z!D5P~rG83Eib<QV(9-hqC!@-~hHG*<Xz{vc4orl`KVnKaIsC2H=BRr>zyUO-y=Np5 z=mGX03hMv9f#J({N4>qh2hke4DVl8EtbVhcom;hlxNLfQTG|s84dZ#}H|GO+jdyb0 z`E~-DH0yekI;Zgmy}i9w0Al3%C9b%zQ0Z_rN8B+HhWZZPt{<rL-gtg~jYSw5X28<p zC;sdtyq>EkZa(cC((WGxF8!>J<2LR~>+9|T5&ZvRrCJN4_uhSPqkv>&EE;#7(#qwB zxod+fmFJZrpsUONRy)f{iW;u2)&7bMY#)}Z$smHJT(9KG?EuxxNuNjvCsXI%0*d|W zM3aV=HpWNJUGZW=Pc-<{d#v@~>Jojmhf33n^_H_54&0Y`^k|_p$4w<9L;)1IBOz$n zVg9w*4m)Kt_^_jTuFWrQf!n?51W41SF2)rvW6uv3UL#=_Ktl;xmsv+X%UKf_5Fl~y zz?GIKUEdJ@<7vmf$5+9Ul9I7(QLvhz?twSIOBW|QFPjEML<X+kJofx_&-Fk<1$n+I zbymFwUYS{}=Et>WXETkx@TfaIf6$uTtvOE_*B{KY91)wh*O_UV6iA_XUUxnmcg67E z<UfVGrSI>o#0E2Kc3~uElapTHe(->pgiesMyPe)Li0b3Vk690`Z-Ro448a2U%LU8b z1NUE)E&w9J^~uLxK-F-9xH{LP(pv6Tev-P^g->Di>+=(?ZyzC$C_qyd8;r49&<nxb zH3$0T^73*@yv{#=UXBIl5HWxiz?27&&U4=RfGwf1zp0b(IX|ROGr*t)lOb`Ve!U|L zR~N{u1U&`ZEg*f~`$xOD0<p~WLiy}8O>zkdkpWs?kY6(T@(fMit<3fg1x8gXW6?;F z_pw2patuRT+;Vc}w;bo(ptrp-a(fqVnqC=b%r7THFHu4daRDGAgxrCS-$DkF2v`Oe zpkU5aTL82ZEV91aU1P<XqPG2{FrdOK(pgqF8Gh`2QA}DRo`6ZM_mZJ7RT?xY{vW<* zI3oY8#wYz~qu{HP0Yx=RF@3pmY!32V<CgT+=H}j*CVR{ca~GE?69j%VY-MRULtr1c za`n$EJwf~LSPC9W@bVI1=llv@x10bQH|Q%D3QwtEV!~+5CXI+4m^7h&y0l~?clc9v zN&FmVhCDU$ds|;pqW(222vA-29-nmh)9(S=Xwxd}qL4Bxxu&17w}Qt%5(O6Nw@SC} z1fO{3M-pj*^?yP2*ghZO#*#vKn)|{(%CXNhyWYi9XEWE)(V_9_!q0_~18H|H4$<Ca z_6Fm&1v3vC(E%v}w?)pV79_v4i?(|!C#`dB0Q_&hEcX0l=DvUDrN4j%+hHqaSU^2l zP+#uhU>og$+c-=>v><dL!x%&rCN&@H4k(AY_}2sN?Chd5ljNia+QbefB7mQh`@1ti zqc_>vypIwp2E$Y3^aspL$V(d=U);h3`2%e`!{Lvpg&s4D4xl#Sa);Ric9o$h{AD59 zi~TM>3eeHqJ@<-1D12WGvpWG3Xs(S<QoQ{3nryi3`2l9{0!Ji)`z$96Au*~n{E9)% zO@b>m+5Vua`8tPBP-3v0rYroXv|N)NKb=ic_-!b?T=wg9_~Ct$*cCgq%HZ2y`gOH* z88g38SW5%uID<1?(FPQ>M_Y4$(da9iutV)2FYQ9TxUiP`U(BP=LQg&zfP6*mcWTsk zcDoRDDdJqqEl>Z1_K(65n^7mDpvbk|=+4mIEsRWN|FeuDd;OKtdYo^GYpvQ&$IW9B z?~3>$Hwb+pChsYYAOvaYc__P*5wYawWDw-B#)2DOx;tvF1?%IYNZfzN!A=*KbS3@# z{2(Y^O<{zNqH3Qmoi7bI!Dkphr-P{T9%?S%=P@e)ymQ>l2pUoAa4R3u!!;!mS%dZ6 z1p)B)Jn6Or2AFK>mqMg`fe&G!0Mx|CA!n$9W!tBoa+X0ZPp-r;L=<wE%v6}Lf898H zC<4C-*b%#d1i=6604O&Hhs**nZfHxxyz#calf+93|Jm19Tj)R`XJn)4<t<JgzzUJR zPa@);s5j^jX~BLzfsEp@qiF{#O1q>52<yfBS1GDK(H3UzoT27NINz&o@XPNObc))< ztB;IKX;Y_jt-Z;zbu_n#{)?z8N1DZdUn4g7R>^X-YQ%Ci6LH5Snq%z-p02G6sf`U{ znRLb^#^`eHypS>mQv{M!NJ0uFsp_i|9KUSpvfBt=_B1^c3%ZJ|3>7Oa9kE*L734l6 zU{V#QPHB~+jS)v-ZCz8T>d)nNgWdInWkSrSkfMk9ihL*1k@VE;dYEgW^71{5TR)7% zgX4sB`WkCd+xr;>r9;hq1N%A8JEi!6SJSFb_PUtZLsOyBC_Fi~cgrV|L32$+-v_`b zq1!k|u(tMYrkNWRp2DTvbGe^`;lYZR`$_7~dTcy9&UL}_zB8_K10RTlii?ZYA)f5> zMP5J$uq087KhN~Xm<TotNWaj&mm6gTv4z~0{lE9!CSgtY5D4RpnTh*+nfsw#%VEV8 zHIrfkj#uf59wDzA7{&7S_YC^445P2$betcY)u!7k>%O3u$MP_zafmuAR*dnm`>ED^ zMg)o<_k-8)1FbkWm5dibpt`W7ssE+an`mV+UxnoNrktEvK4-+J-7n!oZ~7x{BZNlh z!@loO^vLS1nLJVJ{ssQo$b9QfzYU7?=lgr&qM6mT-4kZUR^!7wg45DdRvX^CiL-l0 zp>NC;1{yqUsR8Ue<<UCWk5LQEAe%oE7WD#!RXu$Wq_^ItD=Y#Fe25MhZWB6Km{+1u z$Z7uJaJTW{f$$V;Mxww6EDea)k$vBygQ~PFA+`#VT<o36P#aXEB>Ha?3A2>jHYgM! zkBv4;Dk&*hI>?c7r@IU6<uh-E<R+`l04fU>_y|c?;2lW>Ia$-RMbEbv@$#YbFHW~= z;o5=A7Dc#@pfi-ME{0H|!$TS;odhEdqGqyW1aGNZ`XM`fy4oBMp7@*uvU#JrH7y~o zAfgUN*w9oVfTaGzx3J-kzDWVXEm76!cI>>s{6W10&>#522Vew0_=#gQ5uNzhj2KKB zILiW(PyuyMgD|EXPodvlEt#m**CtjsF%rc!*84`)s*9q(v{TiS=`Av9KbQy>A&jJC z9(hJ&aJc?zyDB5?sK-p9lsmH1<v|a%Z_i84OnB<lDP%fe9)ImMm5STmYPKI@M!J?! zWd7UDOIB`wsY&}Za+}}P&fT&IhToohZQ~Wu3FJ|uE-G+(_ob47$-sjH9ib|L>FVrI zi_fTHIX})rO_0*@u<QC+S?!bpNbTGc4T_o#VecpSI5-T7#JwoxFn3frc<a;Cc2J$v zm*R@(g4waA+UodwIS@}A`0O+CpSV6=)nqPg%pTk8H>yIK+_b#i1wj~|b;cl(ch}?{ z?j;s(PirQd{gTzEgqGd_3#@WKeomCrM4)*r7p}>+HZ!cUKLdZ);9oVxbI&2ZrG(#J z3Iq5RIIvl;<i#`C@7B9_u+0P^!XsL$qwc$!PA)W4^JAD@-ShMLy!CP2c4H>-?D+>O z&5!ZNgOl<Q;VaTD_o;rgsZfS?!dxiBA#=_r2iwmC?d+e$$ApbpX)KR97{zkWZIH}2 za<Qswov8k-8~9X^Q6hb*BbMz~rDFS(^ZAc|0Bg^A7!rzyg|~@cG4I)E(01U|2$xin ztk#|hSgm{QdU`lxQX1_z<9~ZAAu$LowN(Ure*^f%!@k1sijp_+9S34aEIKpqU63#q z9`5pOnWyzFg~6&)2hjzo>6I9`(_T-KBhr${U%pv#@rPnf->D<n;8cFpA$V*);7xhg z1lctI{@EyL;HBm6z%RdqVZHBv=R(kJwWjl1FJ6$HjVk<H3!K|xns^U**2C|ZrO;y) z8p=xFU14(3J{>!3$2fxe=#SR#a3=WKu3aftM<B#0i2F!$s>yj}ba!QL@?^1QW+_0N z8SS1Mn_jkJADnO~P2o*y-`+v8ZN5BE@1bm6D~A<QMK+LM%C8^Dh8B^_vV$ZVoR9T8 z%`W>7bGP%{-I+L+l^#=ep>Hs<p^E|)mK8D~kT_8WqMpF={pozLRYG!HLel<V+p9RE zWZQV6u=_Wj^piN@)}y2<*RGiQuY3{|Z*zu;ae28*5KA@Wv{Bx9_KeT!uiR(%3N@iN z8Nf|Co)48{k8ob?>2iDO()_kpP)qZ&a)rU|Fe`FW;3sunJZ$GOG?ys_I4ih!>WjY5 zOAyc9xdX!WhWo88r>#5Hg6j6xbg7OvN>9UI0}JSb_vbRQSqk{KR)(WCv4?tow?r;l zLl;uE#uI$iW)R&6wJ6TuOgvz$94u7j-mlnJ#wyvu^-(DbZ73a=cv!~Zuv-uglMzvl zgd`nG<Li+5ytXNM7F0($PK0S~i;N8t4q(X0q3bDkkV-LPEggBLK9TsGhG!@y3+3o! z(89}lP>Lt?>{+skO-gG$Wk%@g+=BMhrA=~nHrg1WVJD>P;8PI)$MQ78OG9B-C&rq# zTXg_0pX7;5`MDWq16}>jqsdQ;Rpj-4E5(@C^_JOkM#7nVymY{su!%2{Oq%D0+lp3h z;g`EBGY7`z8%KZTY<)#;;amG|v~khA(R*t7C%Y^b{Y34hHi54je>eBacI5e~ERieg zY~1>2ZhX|VOe$S5z963gdvM#kKzPC8PNGv2o+qx-6xWiw_A~|RDM|WVoV?-j_zx{R zB(9y`a?(O}?I;f$+y6WhQF3lc541m0q^cYPZwAGP_T<+^x=tb3oEB~p5^$}eQRLpo zn8B%638y_7g7TG$mhFPWYKtAe@;y#&%3O(HZKt8|`YQ=%atgl29e`x=FjP1m22-&K z_Ireo<-lv51<8u)-l}qXt~MY}S|}&M1-o9h+DvB__&nmZ(;Ystv0J{D+;XFFxRQkN zn8b_zQn%T#U%N=PW7+ey<?_r<63LKURoi;+7rbnsKW9Pffg#=ypFy-Tm*??55@*+3 z=I}=%t1u@c@;rFJ;Jh%GC%J+2xNUr3DlaW&P<G+$>;r`C=YXI+4m4aNY*&?w{vaNd z`C4Ig$%;aul#_sMsKiFr^TuvsBc`oh{qAV;b)ESk8L!vsjkdt6K>05zBDFh?%Ljv| zR!YmefNWYE?>_V%XUHjw9U98%z}qIe?sFIUE)SU(Ybw>xeHpot)!0P-+>R>~*Obew z4-arznQ0RslIh54B_c@{r7xeZZ}xL8R+@9MgMKCRe-j{=8d7)jKD5_1;3W?=;X2oA z^8q(2sS=xEM_!YjU%Q9yd5^NFTmWGDuCtN#ghXTV+cRRpmJE6Kiv5WnPBKFrhxeY= z@i;wRQr{|2qq!6#>(3Mu{P-B&hGaICSA0d#i=1q8E}xJ8Lgw}Gg3wpcEjOY94*yw{ z)a~kws!vZPPU#dQY`&Pz>VdxvB&K%I?Mt0Yh_;dXh-mb535+AMpyPu3=}cjIoq50J zCR3($f#7ioo#xTf6@;|R=WvC?mgJ1Q7;r0-OFn#<Z*u6*3h(R0r|KG?{NSe3SWe;3 zRJ`z&ow|X;mg(|(GEs(Ld*SAch9L8t$nO+Y(%`Rj8MQPVj`q2^?--l6JzK3atahsR zr%c@)q^8lfWrMb8qgOp_QDJp*pMQ)O*Kgh*^J(ztsVuKo<J@;c9t!sC7*ouAa`EWs zgID(iY`h2o)$YU2&EoW5KIeTe-=bI3{l(u14gGA@N0B;p;E+j#PYrSKhmN_XBf;G{ z2oTt6psP+vfsp&LZg@KG{hv-n`D{3@Y0NBg!^^K|^vyfbRz~}dgUoSwss)+SpCG{u ze3`J^E0ATT?Z(==F3;XMW~UAr>)J#uTMAFUXVl<4wfRzQ`b+W;_~`HG<?qAufhtp7 zq#mro;CB~B@@EPo+nv~gqltu20k?J6a&Y=i4r|+IqSJ9f@zbqlgcfj$-&Md!%R~;s z^aZ4F`vaTkeG28=ifyQ`#d8|%WxrgU=x{~1KBUL3CzwKVl|x)PD*Kt>j|2?(J4WA= zi@2h)-8P>PMAzH~>NLAZn3fsB1Y5$;=({bT6C`jrN0r8q31i$H$CLP9;qoVfV;{^P zRL>YEPBSEZh<5~_<PW5U1U{kj;qvWlwC!!ZII87gQzw1T+R&(V4VSZJ<z`;)rOd%N zhK+FID(n{d_{sX&Ya7JrTl86X{f@l;hsQ^9b}nnKOsNJiKC0Fp5l-yBK?K`0-?L=@ z!Xtm7VLw_9#~)p3<R7k@smD8?X{0w1w<wyAx0#{zZ_ak;sXxKDkwgXFQ?gFVeO+g^ zw799E@&jIZ-dZH0&N36#G9GD<@$GG{N&D$C#(nJ2$qX$G_un+_Y!y(9=5~oX)o*DB zy<(9KNbo-xa&3R#MvL85W_7n7Y##px815<iIrfd`nc;^-cdcElj}GP9@Nz}z8M*dy zqjNtn_-<R;LO10j73jt4-)6EskGo~-t0zM|-SX!bF+;7{-?Y-^Tb08&N4tUM#R%vt zlobA(-qDOkN-+GDi*QvJm9w->+OL!&9SL2wK}ScryGqjoBX0++ZxrR{`IMhL%YfO5 z$9^#@)YC%W-DcOhYB&-z!LeJ!ZCm)v+XIUxdPt=MJ!Qv?Cty~Co_p*%g_c7<Kh<@` z7GvXQRawH-d|4UBJeWR@(8Dg74F*OV-L}tN7HHpYQ?l*Lx>r6;tV<`<`Phdf@Vq=T z*BB7vpxzvwJiEw$#MPGXs$T6_vId*1>zB&!lDu+u#XZ=T5$t4(p#nt(z6rRi=fe8c zA!5t|8m!@)OQF#I8_i&}upk;zw8=U8lFH6itq;FF$!mFHa!&#A^KB%KEgA`~V0`Ya ztEW(4*1tPE-Q=smBJ0F`UmJ<6#)}`5kvT-(v#T;+zvBqNfJMTSc5<H<xH;`^@Ud)2 zE$Zz44FBE6Gd5QXQFVwec-cAeK(fN}OBX9#;}}k6gZYSo93->+aQo^x@!juC(IzJ~ z`Rk|K64i@Y?XT}QG}9Erj(NU7Pg-NWM71oWlIF6Sq9<s!Bz^p1SwKoN*deuzeW!GV zW>T-^CCYnj8aRg_en~ApTnW2Hx;wM{%y&mJ>0c=0E6Eo(d>q3oo`+2D(CD1==~vrc zLE<JAtfX=d#FC@EKliJDDybn=&xzF^x9L46G7aXnx7v-TdwEgscb2I%N)YVtUEtZv z32VY5D>$6xq4=7ox_aX>t5Qg17hgNsyT@Bcg2(D2UxQ&uJo)z==FPW;q?C7w;RTGi zL9JLDzquE6dwuzZbE?~vjoe{sptT;Ra+hGTJiddB<?;|2A~<zGVuGj|Xk!i5aiGc? z?iR*YrabJ`z14{hVIEtt(W|KeDRaHdHW{7=c48tSV-eM|7U_XsjtkC4mXgj_#h$}7 zS~S&3R2ETZ49Bw!J3ejDdfCzKzlwi5dc%S!{!m5lrXjxR-(?~{=xQ-8v}fF9VfgLk zS>CC4n-fJ{blp7hpJ?5daSzPS##0rfJ7z?WeB+Cpi_IA`7ZG8=H^e#?SKTL$xi9(< z;@(euMdu!JoVx&Jdi(+F6p?<%w!pN0%eRVlF11WUoeOnp$S-THG@DB5E+uKIZ7)gf zz{ly=$!KsN9Ac|WCX&2El9S0PGaUbgrR9tvRIrlitzgwBiSKsSdiRFwdZDbH16>wG zL<Y!_L=dTi`^Jm;3=%5%ZcR?kaWpgs`=^UVo}I!~Pt)cl_m})t>rJlo@g|N3!n9zD z(Wv^B;Pf5pA^ew7bPBM<67p&M^d4D*_fiR*4%P^1unJehDydKWRDuiayupmsS7FPQ zfbZ4FEt6v<L}PvWNu^zHg_-`r+5^#Id+f4>!g0liastLdlCSoYR;US^i($o{!H(bN zY?(tAa&2v5^WSb67QcD=^^JP1?aUbq>p8<$iAjQ>-2Pwc6<6;@uWne3*vjw$YcWgu zs@|?eXO?bKwn{2<5@#TT-a2MrTl>OYRM!37@-)F`xc9=BarLOC*`UJN!Kd0y)nfDp zj>e*Fpia=%UpF?0Vh{UdNdz2cC1w;PE^t>xBeFk;XZa35XmR3ONqND4Cr@DOc|5ul zCzuO@@C>UBv_gvLBA8)s8k>!aJPlbs7uPOTbUU1|WDr+P8H53j02)^on2^IV^R`Cx ziX`r%C#rT4Jgl-P%bc?Ach_O|dBQT9hFi1BF-iTv8WncWOPm~>_K?hfhkQPvnrg<) zGNP#XF^_^#?0XvU5#`O9j_nV392h8BA>^VMtDwikmx25IZi$l1F~&^qT0WM~8ov|t z*cMAZcq*^UCSng=;oduZ;eS;A;hSLwKk~cVpXp{XPXORk6DxXEx%WNIQ#-TF@_RR( z@44}4_~mO_&y@)obv@%xq7N89Zu2$l3!$g{!<H?el~#$m_5;;r<c-aZkL67T^xkun zS)UDV>83@z$B)qJG;*=CVh&9j?#xr$0a;$u4P>*VyRF>4|EMT&pyQ@sAjcY`v0o<g z2BJSNiI+>17k>jUR}mlH+cUIXb+TYM`@7Z$^FVN@RwYh>JZ{Bpuef>R4y+g6*-AY= z(-<%uTF8cG8yt{pvHxWKmrRR3Y*zZSyGZ}i0eS1uK$5b(AKOy{MB-gVLRm0mO$jk3 z>XovoSa_hQ1R1L*jmI+aSrp8Bku4(;6rQKSwf(5amWX>BqE^Q?%@+higC>khaasij z9d1dB9`hHsn=_$GP!5Wtg7H8z6q`cKCXvm%gB%jI^3xx>$FlBfn_f-)qemf=za(i2 zPo>*3W1qP9{}Vm|2Rj#My%6{OvhOQZpusE|B#^8bYk?)-fA^ZQA?$L0c;4@Vk#AOv z@AHfWCAz8(=e6)Ve|-Pd-2IgTSab4|tI0u6lWNk|BPKnO?!%4ygRD;5eRBeJ4$idM z+;>yzBi8N{#i^1PeQqtA0mWA{mX_Pu#T;$d^Wuw^K5z;2uDj#%pze4K^79?T=f<45 zMF(-#vEu?z+_RO0tcDMBBc|1LZ2VoWnUMwwPYgY-sH?!4dbiRNSv<BeDNP(V69PfK zgMY*7F_&-2d?#)m7zGYIf+Le-?*kR_<tR<({#5MVQk!6zQ{isH4|)5_k)u(S8n@n0 z->H0DXqlj;3&#WSUOR%0$0Me1)Qo?`P2DGw24@>?OG7P|wbQ~6*B!QJfrBMCRvhc9 zVT><UPdB63a|C&!q(0g85LZ#pkk@VF<vN;=*ZLI|J&6J{!woJy6$A!ux1!HP-Ap6Z z!arm;9N`xfx8<wQ!gEA%izx)zXDRT|=)3`ec3W5s2Aa-^y|-l$?rPH3ax=l;4Zn2P zsIjvI@pGO>xygzO4on8km5lXsU@Zr*74p+r@Bqh8FK-uf*eS*KImO6|ry%}7t##72 z+xvMet348-=40529?vpg6JYPw_1zigwfhw0ejmfGjsBe)aNG9n99!G+Y_zN2GkS}W z%4`(*`Mvqx)$x|{MO8|z;`N4I1lmtwT&myR?Q#4sW!MP}d#d1T&)DOYx^{NyS}vyU zx0bV3(NgEKfPTnG8*WXSJxMJ_4whrX(Q;Y_U&|*RFB4fe9<c_;T#Kx<SyCY%ia&jg zbyK^;Y3UU6=FP*5^ukHh+xvaxp)$0}E0qr~YN$xtlm~C?WIe>Aiz9G@nt@bq-}zuv z88PPuK>|E5Fq(@~|K9@&%rC|CFHIGw#}mpcWImJ{HEYpFv>>%V7)-t^YFn!JRja1B zb0-&68wFo^-?Nwup;U=1*5@x@;bt^`36Q)1;g+UwlEnWny(I+dw?A=*tfn=94q&om zvS{yyXECNNo_@Z0RUbmd2DZ@E7$oQ#2>NW4^x>8+KoKqym)GBA)GJ?Erd+rA&pf~$ z5)zW|ai<a`9!}MTe{?Xt`UHPgvg7YPS|t6qurvAKJG0x~K08j@_e1i$zq2NrKkD)0 z$NYO*{j5$n>03^?e<?EnOl7f~_Hv<`T~$S;@b^ZqC!5QntqNx0^Q&q)I3Utchq%t$ zJTD%LwpT4#o_lHdV7w4M;?T$-DR9lJ1xTk2@nEQ5w*mqRBd3l+KqH&OP=*MdZt+^{ zJy6=<)6M0d_v-KthU_Eu5T57a=Z%-}Z{5H4VHi0txmq~{zR<Eg_Q%sv_~=$w=(PUE ziO0e~__ELFR!E`!IRnOaXy0})$-Z#Izw7a%M=u4Jm1X81yaoOgw6sP$fF1{H&nW%g zuYUs2V|`*zQh!cQgF*23@89=^1C$#zMSf)2PFwt1)Z{$`Q7E6CT+zZZ<#loKAN8xs z;JN|S`M;b$5I+R}!)XC>f&c%HJplJ<&}J}j!<=hcN&{a7{O_wnkh~-c^MK;Pe<|i( zo!6Q!YGoy6G9n`41RHwgCumZqqzmxpb}uvkOZ+62khJW;b?IV}73%vMxE)?d;!;ob zYkBh#ki`u^{yqJ@`3fq>u%fOch5=Rd?Wa{sgVQI~>7FJvPP)@`80dPmJV9C{O-uyP z)TYx1m6$JhEx;^<am-sm=BLix#%Hi=8N;CQv^vE#XWitF8M;?*(?>k^cYklO$N%7m zRDI}G2rx~C<(guyclg01cfQvHOca4As^7+8VpK7hM?3>?_n|(Cq3EfP^$&GZk^lP4 z<RZ?bHi29o%epq!3S#un!YUjn9x!EF%W@7m3rEzR_}FW3J%^NWc|@M)n`;R7HZ5S} z3z}XD0cvm{YNpWLkb|Re#?8i#fxan1Ho<`>m9$NWL3H4KB_T6EPxsRE{A>D}K9!4$ z>pOR6$AbUDK0vY3hVsKMPq+951bToFL^Xjd&;CyCxnCW-XNfzK1L}pnljWqI;Y;an zG%k`k=dqMxp63*2-d4u9m(URUl(;CQw`+C+R!UcW_&27Z-jfp=JpJk5+k(8nFGJoe zpNj{NhT+0_wI}-w#>i@s91@RRi~Ke5D_MCUIzyzS<N9v4%?WoN5Fa)w&^s}|KT+T< z0(YGrO<be{SVzE_B$)9!_Jq^p{$f0iHpiDJi09k06;BD-TJ#hzXaM@X+qt$qa((^v zY#_QF!=y6UM-8CiD@0BPq2Jh=h@PfER*`?W$q3E>h)|yOP0mw;3tf3_<G9Usg2BC} z`6-k5zkY72j{+I<Ucx~Khi~S6I)vK<ekWs}N;pwKxRGsy(Fmn(P)EG$L7r2(+tY)s z)1l}cI&Qd#h0u)AzHR$&`yGd~*}T4CgTdoIOtXM0$X4yIZJ!Mz!fU7Fd%m341!nb! zChnNDcj!qg*+*k{)_u9d)t%-^3wr!N_BbQ3q15q5=$YS<_-bZD1B9zgkK{h+cyldi z#r`E;y1fRIr>}9*v3%xgyTX7ce~)V*AeV+h8a>CCP7FeXGm5RAq1*imoHdggF?FtT zknpd{uY$oz0%mAG(n{<qcX%25?(7{7kzhoU^42H4V8e#fUE{LLn}7Y>RmbDd=f{(0 zvRiW@NblfI`gydHs3+lh$br|Nz>ayzjQ04aYWD*z+G^jGFsz@i`WR1%P$&Qt#{BZZ zyax+=og3ny^%n&FinH^m9q|ONEQ)B$9XKC{ZF>w-4rtD=34q%X%AH&9rFYjnI=lc> z-(V9Sjyw`@m7O`>oPJn$<xqQ^>0T$?Q7qdWLXGL&7yPl)snD3rdhfXXseOqyBBPUH zNp3r|`lyqS9wXLnK^k(zc+A3TWma^4IiSPW%sVP8QjBJ3kQ;A=8FqZH!3#I9)v(kH zGbcF(A?%le_7#2Q*CzLiT|&2E{3v_&%^<dIzXmk;2brJzCJ248JH9KRe)({+ps<hw zM=QmSmBYxM?@Dd&56W*_B+YNYPKD0?V(UCFYGDOeSixDZEeQ;9?ILs$dbK-H`&REg zESvE)bFsv)&d}D-M$OZ<>m4UvoL&e}T>8VV#|^}3UNYz!7*Hvku5*tRD6#`uq;^<3 zrRS#-`iWvs?Z*z9*+2K(?mkSI({Icf+kDnBHun#~dyu(S{PstXZ;ng&54yxGf{nq@ zCYBywD{2ehHS3KD6+1p1yehs&2P*<32Av}88y<vNOq)M@kJC=9IKNP!j^YIzubE&w zxshK&31f|jzweSwKD*g%96R_T2bpYbDI3?VjS?UAM&3wmNf3IbHrnAt<EG=Vk!>(( z_1?{h34>+T+z+2e91YK~gimz{i4n$BV(PJo5ME}<+WE(^8<UE9yUkMJ8D@L6a5Wu+ z87u0H#o7-ml7tl%xDct$YrLJ#C*@STGk9chAn(5Dy9yPMRTpd^@;*FXC;bW-f_K0E zr)l<2@5~h^VcE=W!b%QxUGc(2Xx;%!n}?YUGhqcI(Uw_ZPD=ElP@qA_XpZA@sT0mT z?dQt_1s%C{Ot`n;L0iS)ntaX2sd{V9qNzYM7!r2gS)U`1^FP6)jwEWXz&GY8#CldD z3fRF!C%BXcql`JU*C6vz-OF1<t-LFRsgsjj$1SUmALWj79@hlDWD{aLoMjI|wv!o) z6tT4;gt*17f>_1{FJN!vklV6UOmQVS5BB$p=GUySSexHA4C8XuiL6^M?RNOpl~Z%I z6z&C%j)fh{cbc*tV_LOs!I=jSUD*V<+o+JEom4XZml<-O5n@VC3ei}-bt|3ZTKYNV zjssZDA#V+By*!c;_c!Gl&^MLeKi~;+;1X*#D!zQni^1*h@1*6~Mw~qj?7wr^CTz#s zAf8lUyLmrrU=%xyB~BK+M}m^Rr}zS%=o$$%lc>FiJc3`zGQOK%Qz{&o&^vN|xHW}E z5y`X<?AT2v+iNcsIt%0b(iU5>wt>D(yDR^o;t)$*@gaIzu%D5&-^N$gw|*n;&biZ! zROq~CAYv@DluygEMZmNrxT17q-D||o#;h@Zo7CDUv#8-A$xzj$&JocVPyNxh`BQeD z!N;uu#Cxy0JpY~r2;W_cs|{?X0=vW4Ab)yCN$yq-Oq;+wP0;~p=Q`w2$J$ZdWU+Vp zZrWr)Fgp=ALcQ?-vul5`IbHCyB-PTxA@@A@LNeEOy48vLoJegmZ?qEIFq7OAa)0&1 zD|PqM(wd>HP8<1<kT_r|hA?9;acj6@aRxv+GeYmj46IGjhR)FQkVeh@f2~a^U~Qh{ zp@TH#4r(UCPJy9og86`e%wb>Wc1u_46gy&@ucpQOPU)!5_tcF0(FF=b(`RAd3}u2} zeST!M=2vDjk+2`#Y5jQBr8=DEW3+wF)R$)hl%dPcR-vuM6{*#ZZ&KO#sR}S-1^nHq z<r^+@#4Zj{>xfRB@cI%`?b1<|Ulc|hD;mu|G%MeooF)IRJW66~R-MigpKF^t`S_yV z&X1dv#B&c8`na7;B5BlSB^lc;8a3Cuq2Kt1ycC)Bo>o!odsT(@zc6HyK;&(<xtI^m z4qzx^xU<^GX2vp7uHKUeOqSfr$P4Edy@>R$S~!~2=5B5`Br@-$H0@9#Ya4q4Gg5)y zxg&Z<z8im8gq}<Hi*g@f=V-lZCc$7pWbpjY!DB??iqL(n774cBYYxT3bm523f;UTQ zt()`CP)t>^SU2N8SfLyPTTu>=3aI_+k~H_>>I0YTkMGhm08EWr7L@Y4-VS0S|1enm zfj<bRfCEFr$De(!KlArLXt<@W8CISH@kO4HLFhw5X6fCPmfb>j8(jzOhZXDq)k;#; zw$8}!ajOG!-`)9+o7!&nU=Zm2YWYh$8gg^9p53-2s&V*mP?dJ<dvGVx@BO5<E}6?E zBX%supeZbvXsU${0d0ek3Y{{{Hais3eaNYQ?}~0p+g=%(gw1sL2nB?ueM~@bJ9gjj z!ES5&fBIla;JM$MZJ5<JnsKXTl)Cwke=U7wd(OH?$YjQ+jWP52w1NNO8A8_n04&2c z>SIz#M`(I-jB_TMWf^RX1kW^W3__C5>IObqSRNSncddq2og6tkQ^h|0@^(Fpr&sYm zyh05+RG#5`bfPP*r==q@k1@u7&>fT7Yst$^evLuX4ikITZ?>JcqRxa&!W#JGZRqU1 zp(=+MP#SKZb?<!r#qQ^s7s(u!(Bi44s!5+fX(?u^zR?uOiSJ1hmd=-@m@B2u;}-r+ zQe!<l5XsF(29L3TtV$`L0{ZhTO%S}sfcr9U+x=u~Opc*=3c6|Ed^y2u;t_arsWw3k z^=z7(L1mE}*6e)GH{|vE7a;0ylXbX#&Apr}Y~XfKrt9*M#Yy3hcSDoImH1rfg3wD= zqN0RXL5EKj@@pZ+L>#L%Mqe>8UjyVbximl`@hEhGLg#cb&f<F9Mt@Embx`g@YZWX? z4Bw}TZ3HOW0GWF)&m+JE!y!bj5wf*q9to(GRy4`olCwD@`fV1OWLUX_^}~*uFwCX< zW7xiD=?aD5BA!1m7;(ojxa)cEj~gS^l7d_F?wp?gp&YI_o^j6yd79NSm&FER3rB~3 z@t!t`zP`rLcb;T?WFV0j(ezHVoX!lJ3#((^lg`9vzvHvAHN6AX<8Ih89r_c%(0i7G zl6d&s^^Q>n+@0{}w@)`EG64tIaNymvODnE;A;ZDo4)R~|ErXOozSJpcls$=X=Rw+v zZ;QjJF%gZ27uZl2W{`iSd;6ipZ1YD9^`l-pPNcEkw8lG%#Y${xxw9KSY0Q-WH|i3^ z3b(TiMG$Fm1-a}6=I^&+<y?}4@uZVHJwyKu)#g7B3F<Maix{p^3T?8dyF1gwBEOpz z*=|+d`Dkt_L>)hk@jbD<)3s}F4RcHW%jAFzPACVdJuIc7r8vCQedHEQhCXW|-JI~I z)RW(WG@NrJ)_I@){PgNEx$DnXGbr86aUj;v;Mcn>GTfX`=G`6FZ-1}>*P*}osHo<r zNYb{P`vS9~?`_}%y)fj}G<k|&I+99%JGj;qmT1|f?CZ(k2p<Ukwk%jvi*Me^_77Lm zo|!OwJIQr9GOzq~jLMR{jHkdiZ@Ki>AH3HMs}%d^jWQSXUqAM2hObypYPUbLVg3_n z#_79dSqdT)fTCOFQ=J`(V_0Jt1m!_-7z@B?CLTKkj;tu_sv!vbq6#-X_R*b+J`FD6 zpG}SUnyw_fe5|+@K!OVRb2}}92$@*y>n=*{DW2Tg75G&o`?q8FmoDeyXVK&m%OeK3 zi|E<Ns)G6VdoQlKW;9!&43rg3cb*j-1!tL(oiPp}7289^HF5tb=6FvA9X~H$+dA?! zivVHN*#Qu#%2D?x0e8+Q+Jm;uQg*~`@R=udKi~eSPqBSC3M#~I@v`8ezdq+Pg6Zw& zp-@Z7tOqNQIo<AFcg)4KPI;=O?+Z<i*2&{(?mr(0L6R~<R^TmxIvAnDN$W_TGkYC# z4wz9(?eX*FqMy%=Ba5D?mph5tT!wEbJttfpeXTsselas}%P2GKICOB9x07jPZ)P-T zMf!{7Xm`Vh`~b1YL4l8746kAhbB5pEs@FPKj$ChkHTNp%mvSpNNpR9uy>RB;=Ba7f zLxaAyucwT{BJZ`SEi?jU>@<+sKch7L+<UOM-CdP>?%_vS-uw$K82b}f;}`m~o9wWi zfdqft0;-eFR;#gL3x5c08;zG&c2ZpPvtZOkI%{&bnr{z{j|=ceK24J@3t(OkQoPlu z9x`;xH<ze2Bq4>0eTGZUaQybg>?0HpUcV5dR^nz$B#&EdUt1taa!YxcoM;Mu(*?<A z9aVGa_+#{plFL(-Uy)pYzDC*}7nKbDeIAebn^r!*G)WsI9rowNyUF*9hSuX0M%G?9 zDh@uXIODa#y%i@wUwXvsY4tG7qBE+4%~j*q&X$4q;D^0$c7hg=q^0&FX)s4;;J0^i z4#&^WH_N;VD?-WI$OqvXy|K3JusDtJBNJR@wSQOb*74gQA?-j#Sha2-^953o`{Mty zn0MRUl4%7CZudl5xC3!lMfl;^mk;tgrea;}n@>#IW^!D%!DfyNYK)nOGw#Tm*P>bN zC3=(&D=NKA@0wThef@)DChRsP|EwG$FRd*864Ggbu+bC3KO?Za&F6)3ZqxiO^Dpqd z4uj;r%Cp88B$NlV0@Es0Of5)?mY%0z7lIhf<~67FEi%uh!~5yFC>!e>gJip-M@*{{ zfBdk5jufXy*?ame?AF9d2`d}cmZ~Q3gM$cC{iS*bDL>3Mkoo9xrxI->$_4bS_09Z! zNJnzfTId<miK?~^f>mc(Rj4*2MbROG?CXNWpV>~Cl-pmjDwDt$zgr&1=MD5-Qyyfq zb)F++Mt=Q_o{5q|s-EeLhBBU$4woiIE37@c+CA^4KF=em6+lipk2vyHx+88RHqJWL zB9G$6Ulj1tKLb36y)79hR(zgxeR%A!*rO$;)X1pkHie2t?`0-Whwmok9pOuqv1$a1 zj{xED4~G<}y9XQ>ve@2VZnq}EzA&ygm)K-e9#>(Ia&0jl)@7iCes(wB8zb3%)y1kT zUP+#(pb~<%&y^_gv&tK{-o@~YwDM7>L{jp&*mu4d8^R}*dH5U;l;q@Rv$M0GrI3LR zr8C-j^MUhH*G>>y)4}ghtF{}A3|}mU?B$e!w%**4;Ue1WM7RyCT3!$mbv(3MeFhzZ z4-A%HT{8Ya-vrPKu}kxGz_`#pxPQk{L#24k>hIS#uiY*^=ZYvXB~1VY;Z2hTt)b4C zX-saGBYWfQseju2geBDeb5AMMzb%lLhAUW^>zDD-N8TpL5C5eMLMu1E2UuE;IJ6&_ z&=XWKFtl8<ecTBBW+;z?4+^PYOxUS48CkEn6S^awALZngJ4tXIwY;KPYhX6)NFpOB zR|t8YPs6PrhH9b;+?w`DnzN$AOlS3V5F6y=Nn1JBzLUG4CT~{b1h2@gCmC@XyQ#lC z^rmGhPEGkp6VVUNze(|gu!brp?u(T}0V1$WUs#)t_}Gx^BH#{LVE%VWnUz7XnFM3$ z+&gbkZ5NhbP<q>XOXq?^2rz1<<FOrJi)A<jj!=23D{2&ph{K*+9i6Ema4AjgOcC%4 zO@d{MIn!YEvZ7=}F04PtJ%9IP=x^A)<J(sMY-7HP@2gjYehLk$UN{EPEx!8m4|ihH zp{bxWQ|>)EHxZETJIQ*M$o6Gme{Q4e&fSsik)%XztS@_#o@RHb2%CMEE6-#`J#7;| zMNqR38vD^g_Sl|dbow161QAYx$KvP_oIwc%D51H@TAM#?<pXU*7}2D%inY7V3=ac6 z$f@ahxNTPm+zNbM<U#U0oKDK*@XBk(U>jh<slz06VjYe~oTs9D2Zrl~t!a$w$_l<$ z!e+NyEjs!FL!vzu7u(%B_dfe2CAj~IQ3}9_uME;7s|AncXQI_QEtsHn=xn5)i0fDo z0~iwIB@W-8x($S`tLmKSozoV^@?c$se6wK#FeJ3q`}oWhc@Q|vHuRh9XQTUvja!zX z3Ts|BCW{$y+ft)wDR;2gs%2kz3Ew03r)u3Z_r?OgUb$~)Wd~D)K#%EO&j+&U(ZEDw zyOx3MW<}V6mB8)LBKtGa@SFp$eB;*a|Abz}ulj`nFd<_o;IkTYXpH$-S*BNzSR4EU zJK3{GO-)^>&%d`A#XhVJAc;l<6aO$e4Q6W@n5k&9hGd5MXk))XU^2Zhz25d0+tB2) zPgd?S#FEvjs~n9CUbI+|?rg`csbG!Ap1oO5aD%TX!}{e#im>_2`bJanCNiNo=2X#= z65^R%y>3Yb-D#`;BePy2r@UG=9zG@7=W6p{h*844Y6v20-f@o%L-ddQmTP8c&8Gen zU$mHPOa%&p66oXmxVvQH-_o%c{&I3+x~akPfCU`&x4-)Sw~KwTN17!=_Cw02M;7Ja z0J6+k#go^zJu{I_IRZZio6X*K5mz=b5!|O{>LrsJxMwKJ{W`Oj9JjBf-aAH(Qh0cp zyw(*7C+R^Xok2eh)64~jpsF4fwbWIW)qKo9eX2e|=iUKst;wdZ_v)%C!`p6yq)Y$} z*qnrgw|ccxsw_!?|J@wpwW3JBHyIki-w8&sbEkqghdNr#Xz#r;uQmnUl53~S8D<u> ze}ea=8aSPvW<gRLKhot~raZ;MxIdB6u#G|m!jrTySi|bENto_p{=Ug(8>*Dp7!)jj ztJmAI^ZE2qC25PIX%bWZXAIT0ollAOpbBpOIZ82ezRVCaHIoY^N(hiY+<yG(k9_wt z?g@qAd#I05RqaPra!353R>Vw6iK{`IIE#<azt=GgG_$9&7d10&##TQj9z4?I<5CTR zde%v!IG%n9JZ7|Yj=cY%<*d#48^9Ry`Cf#2yVjyNz;^%)!2SwFmCoXTdnL?{7;hYd z!A0gs<wsTvcaZ}1)#<k%ZIAZ-Ed#$lkS&O6XX~5#>5~5*<%4l&JF6c4)=Xw-)>waR zLi3%Q?5Cz~cSesd9(y%9#)GN$&+E7LDunrhcHo61<Q#V`MOS>q?ZnugUzYWVi$x0l zAe;N~YvfB!zmib5Z0!$$xIX`PTwl-i0d(dBO;+7Et4tdS(H&>P%`VeiBCLQfu;;Fx zTv&NIzsu}5s%Ot^&qZ?a7L;G84BDeUzA`bssm{4?A|S$L2h-Nk4zKtO6m#r+B@9O* zWnAS!w57;#_e*OrYKqKdROz&T=<>_Y(eJ1@EnNx2l}Q61u|VJijV*pkkAEUg&C6Y{ zp?DO=)8LhY=NT3~aE9(olJQzy049cKLdfHZ*!<A*La!7qS42Wvc*3qtLnsU+EDB0f zbZRI6z;eI&+x=O?#M8Cs*6B=pf61>Mry8Y|0(BKWgiq<$9fO7cNM3U`p5T_(-I{J| zqj_A({%1STWh7t@^XMUy8gz!8FeJsq#1!>$v$OwN-d`9Ns7;@wR_T|2^4`vx0w=_2 zcW=UND!w6rL(*E54%y8X=fJ&g!suz-Z!6@3lMU6q<C-a{MgNBMnToJP+Z=gZAJ;1y z@(&_wTj17?$g?U$#QZ-a>4in;t7n?@w6tzt8!7<^)Di~ad7`7$(`LLkWDk4@7We%@ z{3KY3U7<zO0FzJKe_W!#HQOEjn-R36A&<fbCiI>FT!cEj|IS^$Xb)DfJ_ay<me<tu zhXR(s#jY^?C5eK<NFolLcxb378CIkQXgB}ETqSo~9A+jJ*IV~QYX7>K`s%+Ux3Bl> z0D7O1fw3h#fb)~{*-VH1&;L<+wwyix8U%X@5R}(M#J^v!7+doCzl7lRuW^`b;ne>< z0R@~G@&DoREhk%1C**yN%=2S-|F;Ti;1q%KS-W(IIjF&Rvd9+;Y4Ytn$5H4o5g(5i zc?M?xi^BolCh{L!?wxc|I#F?34{+qJa3N!imIYw9XT+S5^fEAqXHCVKws~lQ@*`3H zxSc{^!c5cm#|z6m!|aEptywt4Y#_Cfmpt(c6aoH2w=Wu%mY4ngGz^Y?9KQWDIQf5H z3TXnMvZWLQdPp4=J3F3KNy%aDo9UQ`zH(4}3JR+AQ_o?gd9R4UHoXv8(gQ$f;Di36 zkR;(>WUl+Rz9PZo++@D1dyi4ZKg5vb5M%c5+t>2)np529`^IsXAh6Ql3?LH}&Hu&7 zxHC4xZe*Ze7FpRdVL;X!<PdI4P{au-+L2<i`0^hHhPff5P*jMh4`6fx52dv&<A#kf zf#}M~<Ehg*8Lb2N;59hh>B>8Ue?Du(h$-dRMAXbOF2E@9Z*W9A^v4gt?XdgQ$mqBQ zJ9S(DSIUJwu)2@qUjxr%#DHzO7tZpqGtd8Yyok*W5xOmI;9p3$V)kMM8*;vBhBB;~ z!R+9pBz~U0nqLdX)^B(2eBE&=sC4Y<y3A?M&WLh_`WM3*+Ad*hPj@<=qiPvH6FTy6 zc?HURnO;j`uh!fN^Q0k7m2`WCH*6a0zg5d1^ClQkq~J5_Zf45Ax`LjOFiAHa?Oaz0 zWiFbAuk*OKMD9El%u^ZKO;tz|d&!zMNl{oPST%A!8&rkx`#zabz}lvAX~7^k$8k7` zj9O#gDiHH>CR~jec5fxn7g1pm>#hIdI52G18KJs55IthCeGbmCAj#w@TG&Z@E&pnG z)al<}$#wL8hOo$8J!Sjl$jBkV-g|b>`yt<F?yGT6yVLh3Y4Oo{GXGNQTN7JJeEKM2 zX$rL8IISe{u0Q%wd^*ZY;SuEu$x&+i-3tFkg<abIaRzW4XY7(ZDxoRNbaxk?8HnL) z21QM!3)1W|bBN?%>K|z!FgEz5KU6nu`=mp@QAaSRS--@WtR#Q2TFMz}DS-(pcs8uO zf+S99ir%ShAt!U3K1L5~u8b|c3+L+}?<+@Ugn?VR{Wm6O^n0FW_Z)K`!<|ZMx^K-1 zb|9DeLnzC^J*0CZcAqc4_$4qv1yx_c$b|xjQM|xcDk~uRG<~cz|2??U1cVg0LD5Kz zH)$*wpLULf4|pbax9tov@HDuhFAm-|B`5w0_PodgKx!Obysp~m9GsB!`HGxzEG(nZ zIyu{;u7jYJQE(^oTDX7jNJ877<;{H?Rh$QYW#>yfTBEZPaV{^B+U1wMky@{v#A0mo zJ4&dV5GPLI5a)L_-9<1LoDw7KMruKY`bwtvNDkrGM-s}!G3uNBDlZ#acShf@4;KI? zf_k$N?oZnc>nAcW52B|~ijyB3)-@`9L|w3Pf_B7ox{VzV<IlQILI-e)F~^aO+Wbt$ zApO9X7*+wJ&XmS_|CNTY&Vg;xku&BqkdWy2mpGaUhz6(JuN%QA8uJZV^uP1lGSjs< zE#zOIsLu~Up4op;ScI7qhdQ6lw3AGXPH53B?V?id%YNFa`2P{KlRQy02}@@#vmGrq zR5}kH+;B5kS##hn`uPr0IuQ69Nu9J|kfKFt@qYSPvV^<eC}O+Cg&kU2chvaM2YiRg z6y%w|Azm>+lp`ADdhfE|e<Zt=j#el@O`Z8)2zVEy5pns2*ddrDHFSgQ%+B7?CclO- z2Y0;EfZ37KEa57Cn^j0*Yi=An{H!7iV|r(z?i`J(M*gG0UYkQF+&9?|=gBPK<(Hv~ z_%j}%RW;I=Pr<{G#(qpfSC0{lwY4u-aw~zozERX+I)@SKM=n&GUE{j+U{>qkBOmX3 z)KjALGx-WcGfun=bb_jEW`-Cg>Lq}^a5zSuAp*Ai`}i(Dfgft%k%=5!2zAHK+@%b4 z<>7K4?pMld^(rtAH{5?Ax<%Ila+{84io=W17Dv&D0cgKW$8vwty~<8oL5t&q`Ir#E zhM7x1_-GgOzC!$NvZpMZ9qx4;!fa!-TKw>di@kr2QQb~wB;RpE#jm#7&qPmQTZGnH zgUZg@&b68s@L&u&?Pc_NhG^Xmf^N;>*Uo*dEE!sDUn#B!_lXeLQ{8pz`A#;knw|Sz z(|6=;p0j;_`@0o}J7IgoM4eI(r}uxRrtBsb|IB_+7=p6rt_KigLB;W$)+9qYxF4zs z7@JqNo)Ui!B}tK?FAq5P<&l5Yota_P*Ti`{Mn~zGQb^_BbGMd>u0yH)W%?ry2UP{) z0s$I8G9Eqg0??udh}@A7sl7=d;V+~<OPX18tr}nJb*%lDYJ3&%=A#6@=8XS?0GAa% z#rOp#xXXpPUgE`L45z%ZR(Ksa1Dg3i)rd`sEEs-}Vm3+qA>n`I(fM%dw}i9}Ua6Xh zgZuyJ#6w6RH-xI+?YEZ9BS^W<p&8|uu3|-1hJzQ257Gz0BRcUBAg4&0yx)yK)-v&` zg}UOUjlO8u(ZBrEmmF<xhH7>fV7FOuI5KSx=_<@KMxHwOG#(MK*yTu!u7X*g1RwQn z)&|LMqWoM025a1J0w^+y7vK3q%(&x-#ehK@l!2gyQOn|?TH5#j;K3r(g4G#9lh|qP z-#Pv^m7&jGS{cf~EnW-KDezC$mk{z|kH3&zOZvZdMN9jViqLHM(;lCL^=dWy%rsF= z!Jqr;XCE#7xCcFYTyrg>&uc{c6;Tlt%x^$yZW1NcdzsW~7D&ck)Z4;vK1P^6Fu#_~ zT92)a$>ZOVUsweK@<hTa0X&uM_1yo#sbQ@H%m(MmqGB~th1QdvpItU(!vCEadfETU z3}OZWFs70up`O`q(!DWJ9`88P$x@$$Y-rN2oarDO_f7E=A2ki#KmUJ6?|#jtFi1LQ zoPQa(pT?-)7(9d~f@_DmCYxilKPt$z>V+&*&i{QEsYghGfAd;9PVw4_N=RkW^(h1b zzt%%H{`h~Gd#kWGwys?}K@&8%1=rvX!GkBbH}3AP4Z+>r-O{+b1P$&Ejk^SQ@;7U( zcYSjG2Ya9GI_rz3x@y*_Dff8hGyc*;6Q9E+yYN%?zl+dJfL=3UIXV>;<xp9FKbdC7 z44ruXVFdfWkiP2SkZ$7P$dWD2MmIW7geqWw((s_g3-hde;1~2gzjpVtQHR6FS*ATb zbz!-7T#@a>7b~hOI<eYP*IWJM-Y65|;F0~!@v<_Uu=4v+Z;Y`r@KWcP=YrnheA+c8 zBoqDPMvx4;5K(JVTT{U}vU>`gl&8nR%Y}N<yHvcBNUj>FA_xc^-H})*%?jxQIm+KT zaA=?=-#CFykq}v9ct#`oRf)cj9pR1r$IRv7b?R6!P-H9_#hOoRN^5e?*z{CgHpE-B z71LI}ZkLB7<&}Nui8Pm4Z!@4V$?s{QOd(vM8(4z@*URur2tO)k5vjL#C*M`G#fd(G z<qbpR0yz^Nq3sbP;4p??$a^c<_J)c;^nZxESGUmSI2zx+(nzE#nMwXkknrh|vjJ36 z@EjHy|Ci{N3yC1}LK7h?#cYzj2<cu?=qYugskVu0j*z8HfTt&4kzAx`f&Rbf?2fAL zASu}Rs{-@cc>hdl#{<Cc2ex~C=Rs{Om^vmg3wPKe2btlzD~rm76W^fPuCPtfL<^&5 z$VQw^Y72x4fp%q=EMsY`(w1W^%HR<P4FAOr><R%o9I_<iyk>Ly=t0i1RRw6R?1<hN zo~I3+KS^CLP-V#wD?aV40QLFbTljtf<;Px;vZwr4ely?m5~o>?UdY%<P;Q@p**+=! zGwV4QffzDKMq{)EroNrDKUiCg+L~7Q4Gw>Vse`M*lWUuLGcqc=(*b3~ASbePfwbMG z7#%+VpLIRgRER$SnYNGNXC?7tj|RuOo^Wz)eQ4My<wuUGkdxS1^D_E<4FP*kvRPc* z8g=e5>)&#I#5{UojZBu(Tn&rNxg-_G*XKPRu0xh@gl%-z5IoR<ASU4~=~ada`^gH_ zxfuFGm0U3!BxY|D)Tl*(AP;<^uz03IHD9U1z+zB1b}X}D;Ba&9`CS;Qkr2GJ`gyHo zeR(C>mm6YC_`r{9uCxB|gDW>O6Q>qukHr29E2}CMG~0!G^V3i>AKqo<<`)KxG*oxN zxt`^vapn`ag7DPNt(cB>+;DgchGLVW8`V5LXmHW($06Nb=w#l$l$1!hj;=#)gkN$q zdGZAt1Lf$6piL4&AeLMxw$HM>tF)iD4V*>xFuFNwLqh&V1#WdX5yM)=*84z7-I$Oo zm7Wpi@=irY%QFcFu=-5%D<qSk>@EKxdXH^OXuOS`e-rvjF*gFK$Ip;XLFeaMZCAc{ z$es?txRxw29$zI6;IB(oPPLhaxK_I)3Ih%TG6GnLJ>FUlFNR;#11_3epC*5{dyx^Q zo&4?I^kItNwWs3G`bVc+@Mcz(t_&W*F1_$AG>7~VX!C^<aA`$o2ZX?=Chz~iD3pam z#{M}ZC1uu{hC#zOHot@-N)eWcwCSLXSC_-be@9_7Q6iQqjM6OH@hW;mzUStN)Ks#2 z+%h)s!_y^lP{p5Axg>LeTY+tWvLpt+M-KV&03m+8oCPbX;WbI0B(EdWQ`1rMojx!L zoPqfp-^r<P2v^SM8~enrkU7wpD4z(t(~jdaAzL=dXn9LXkn9F6Gy+>*IV4dPpNZ2F zK%a2NAogN-AQ@eqyT}Lo>&R=%f0uk~iBs8nw13IFyYjzll<EG~DBr=>wh+>ZC`i#y zIkqp4d`t7&eO|6Qba6lKHRN~Bpql!<g&kZWvRt(rY}u+AWAZn$*;{ltyGy?ZndZBz zsb`Z|F=j2Oz&o-J&#yUPT4@B2z_`!8L2_i<sk!mqUZtkq56mPG)bh`)_u{m$CET%< z>`TC)1o)VKJFEUYAc{4&#*TFk3bGO5wQ3)k=&?c(J|4=lmvU4jo2cS-ov2ue)Le8n z?8FO#{Y(SgRsFAr82-0hkqWqA#R(BG2Sk)_YhTl7TlJ6K!ITlxez?~AENk<R0I_7? zocupaa7N_66uUTIA5Jx9IuyVA?a@|~_r1G(!3jqB$Da$*3Ftb!?xl+f|M{+6Mfk3* z5a1zEwolb|7-fCYLds29r@ln;dFS>&=NwFa_gaYKe=&;xNe2E87ykc}g#Y{R%ZrMN zx^2(nNGmI2Ld+m`T=|b(csuSk5hdd&nDp@!X_(EYD9+a_pCOWOh%Jw_*Qr6(q7}qE z>pv_6B43r%{=J?LF{y&MPNF7$qhvZbi{x7Cs?ct=n^jTU=!Pf8>>lcdm?&>9nr0`0 zwE?fK^zS7bT`@xJZmfx6VPUzQ4>4a2^9pq!((R^=AOgFcM72$bKUDvG#|;NsffuAw z;^e}@yT)aPVi+eL!VZY5;1<NOs4s~@bGr}+`}Ga|_r!SZ;n-du>CFaPRsX!2R(W{v zK(elp*?*q)xIL~)+8PGzmYe^#99g^Wy=lUbuWR3ceOXC~5X7+#_t8G5i+tYo>0hrM z$S(};oaDh01GP&kTTgk6jEzGFmg+70Sd)h-{lYum><F2=#l-!4g8?5dcI+oL1@I%q zS;okHUUhrj-Q5PC_bgYr<?;WDtN&c|VDhjSqQJuw1k`n>aai_lL2Q*IOihd1iX=$P z|Es~@ktR2W6M1bz+<w4@%)SNxb<?B)S{;lYzt15KMja{jX@XhqyLbTs0fUwvE3Zax z<}SwzlORjZ|Mm~t!y9?<#DdRPN;7kFVFQpdg~*^;+RB4TF693ancKsAknbHG9i6`# zZo%6wa>u+HS@9y<{x5RXOkw!naTvs8?SDwV-!+r`2b#V*5w^%`(qnr;bXJfWcwT%G z0;gNA#hM;)Ag)&m3JUV2$_@xj^%@Y{wk-lTh&xmDtNZampmFUY#5wN2S~w=QWxZP> zQ#SbLPhlEN1oy8#_>pknhq*>Q&UAZ7eLVMrt~IwUWWL)K$BS0P@K*};Z~R8A!J-PF z>_LcSFT{5=7>iCdWZh6z6&n(W`i;vwn8_&rE3BjhcDG8Eiscm)NOdmPw;-NR?&>iA z`U1b6cyF&J#jXfa25caj80RnE`k&t$RO^Ab&~7sj+IBv>Jl!;QCPH>B42o6#L#djd z1l}C99!)N3L~kZu_*GX`<JLpAUP*a-c8^Gk9=;kI$%$vQ?YBi--?ZSxo@-Ga3R;RC znL@_0EGni>NpX9~h8uRwV^F)~&S`6<6DG0AwRclWdyBMI+1bDc#=%?ffWJ{7b3HRT zY9hn&-7`ZpFdPbF!UZy%o?jdDy}ROFekO=}C4a21ZRAC%jSZRB4Bn~!&cd3D-x>V4 zxl8`MvsI;GsX)?6jPZ(c@DR5s?w<pxZ0g{eezEqG1?`D=^Ug(p5EX!RSaYaD3Qt<3 zkfoYfeKXboDkfP^ax(m|{nSuY&-duHYa8idk^2pSWy1s6j-Cb_CTbpHg6x5_qyf^B zTqw^U8hSM!<J9b6OHPtI*P@q9w+r%}tH;B=|1mBq8a!hv2yd=bXdwYdb5k(MiCh3O zDse(tIN?~T4Sf=u<d@s6kllfJ{16LHh%Ho`-uyXJ;zma;8>{@?*w;>Qj6s5rp4idk zH%u*)YP~I<Guy3S?Ww?__=wG(W3Ihg2P0r;#p^gQSorE_IJnat6XKi>XKtCO7*Uo0 z@#-m5sq?}nBRAFWV|4G9EZ~bE96#ym`E>CZ{vFJ%Vk;w}Wri`-P&V+RRWYW<fuA#( z>x&N%pJ*+PwD`(`UOQ0b_6BHVSlpInTY0f4O#!i=UCZK;oSu&PlWeh_ZF<j&VVKJ` zuXj{VS7l+0o@8Z}FmJ~jdy?E}9Xw*CPCoRMWc;T)JuX5VO?4zfbbAErcvejv?jnm$ zbPag1te-J|`(nV86j?yy^3;(&+JR+6BBHA+Zfk#of@$M}8@_XEWT!s<gksL-oAzpP z4SXkDA=e$2K{liQ_OjI>Z&-9|4$~;Pv8zgt9AWPMXSBG{DTAnm6Cy2<O!uyaJIiZd z0w?y`G{)q#l!$%LP->wxgEFUJKVhe%Lof%YwWsmfsSevzOl>-Y=NWetF~pPWFPxbd z|2sk&lek3edd;g~DBR;<Ig`HYB;2b!3mN*+_QoRVG*bi9HbL#7*EGkDSktvhC!zeV zy3TtiN>k~(LsF+l)~?W}izzs3&7Vda_s62R8lV`U6kluea%kKIt#ab2=;?(U#Y(In z@lzL$>Q#-plzdI=Sw57rLAk4^!me*a^7jL}@QIvokq1K&=X-XtlWGIynv40%2Ojw- zzte{cm$zdn#&3j8$o&fsz|NH@Sl;ful;_5rDNji%zX`few-lovZY>n<wZyY4HtYu% zbfOMj5AB~yxQGLxXBu(nlqxdz@(1AgIsJLT<DSUCW9VgxO6y}f@v%4M5f3gs*X_}o zN(+uFy{3;g?c>#0=2O9E!UD(D_-`I7FptZz!HEy9KNMQbzdsn6U+A7MpPqg!I8W-> z<n{U+=qAY}flr_ATUIKiMb_xN9(M-!hT#vzc@}OSQy|>=W>InbN;5fB*oA(maY!vq zXs8zn_z~`~W;|Ld7u>w{CzD`du!5}vXyW8k?6yX`_&I)L4u9G~{@7KU?zq-=%TL<2 zdB@W1dd+W*q2!Se!}d9$_W9nn6kM-MH3kO4(kJ`t>IRMaGXwZhoL4U@j=<%a&vW<L z5NFAhs5+U#Je1+aAyCkx_uZHb_-tUgZ~s~D+cUE6+ROdMfK!*pL1O32Kw+meeMTXC zR7Y3=vRDaEKQ<vqcrmG7vW4{h;uHU#8YB4DAm>O!Xdr6uygAFURyR%muxY=7gXXh| z(57J_gg-oLseO+`bTV70hm(SOf)8y<>^OTny!T-q5z>KegTh{|J-!D7;Mw)a{P8<` zIdV830Y{hSW0jb(kbQ1^6ADqn-2qUN#_Dn{eEi!)caP>~i!F~6@LpEirxaQ$Kd6T< zwAP+&>BYl{Qj<NO8bhzmkW->2`V5O$)V)`Mpp(?LrevMfU*b*Aq+*5#9bWXiXlNkh z7W2!PmRGELJ0tF)&rjP}VCYit9{G&(?KFC<Iw0~;=7nR|bUHHyhc<V25!32&b>iN9 zMVAsD3z~i8M!o}E?!?yj<)QD6u=UGPbR%}D_(uOfytkTlMC1Y6W%?EgRVgC2;G@gO zovkUY;GkNb-nGQ&q5Qt%hGaIfvy*Szl^MwXGXehB^u&MjTAjTtxx)$r%rdDUh0(+I z-FH$1d;FYlckjIf$B|u+p%*1~Pqz#RE{o1dY9p-;No%r3yW2i|_ARsJ(mMB^>?v8P zOR>)OQ4Rj&s1#e@<4Jy+7~$s%`B4VB9_-MQJ;Q?)(iUe_&oa2Gnh)2<t#L%A-%E2* zWK#Tk;UU8TN#)+%E4wfJ1?Xxxs_Wi0T9)}Gya6792QyN)tc>?el?M(=>$x|iO^hVp zo{01Koy@oC2icggPI=Eh9<xF=Sk}1_YTQ)O$&eUtR;crg*zYe#uH9xz8SX`$H4TG5 zcUp#bqUoA$1IIL9c(<9N1BuE67HZtX9p$|etdADyDK1IEy|kqaA1l_jLBIb0QWPqk z`rJ>^zdqiy_B0rVM||1*;dT7%C}(}!adZ1&?~I;&cv25)uqWpFPUiEdP@D5~rzS5` z{2%*^S$zS7c?yHDB{&ShbEtdo5JxsV)Y?mG261?Rv{}3wGJVX&!=9-C(o@RPPqbPg zS?Xe8MIv4a^%q5hTnsQYzrms@?b)WFk$>r{B++Tq3ljxv=7w&53b&p6^j)a&JjYG@ z{wWlpkh+OcUdH@}_7m|R0MTN-`H)tUiEjC=C&mOv2^5GEJNGRM;DLCS21t+AlFvl? z_=4d6%#4kbe}{L&uQzL8!5u<AX4lIw_A^QlE9A{<dXAOob;l)ojAdmj+6D%7`2169 zC$Z)zptBsIAyq2&GUY6Y0s|Jb_cqwYfB{mvwE1r&Ehq6*E>*R81JkQZ5IUF+w;z`h z7k#+Lx=8&a#?utNW_V{u1i|Z(5|x7VW${+u<WKt_E51$Jh=DMfi*H|0FJG=x9Lrr- zUnS@+!qF)S!6Zxl6xHeEF8Om>Eig)^RQkV$Fni^){g0o8R(@o7mjj!STzZh%HwL%X zZhb?VL0IKpKM^`5>Q|tsV@|MC2=yr=gzo6weLG(T*}iWhTix-{A+#HWp#TSA-8Jbe z1?Xk%97McFqsQWxz+<Cph}s^(DoK#2q|D0Yqcg_>Uov6xvYOtn^1m_&Y59t=3WLxz z;b=IchpiqMCaZA}&Ai?{1b)ZPGvZZ&?A7%dRe@aS)3(279}yBbsts#tdOWRy>^rhi zw--=bQ5zy7`V=74yg%b$%`qa`{nzm51jyY_e}A-Oi8&bZDkaUE;%Qv5G+9SB!t~2L z5x-w>)yEk(Twf-B0bD1B{M0S#UQi68R5B$!fTxRb*m4?iuR{pwME#t{!6H@riIAm% z*68vi>@vjGl^`rkS9o@qZsBo$A$4SI_nWOwJQ2+X@o|x$f*+;AQ!R9+Pmfh6?{{+0 zh*%$dSrj_)MS3qa+UM}i@2Ipfns}0_Mm-;cy*+??ZN^x8W3@~hfpKpcf8;lfIXTX` zN9TJT&v&drJ+qS|)u*?PH>)evDj3g^Gk%srA==pt<p41srKwBCMEm?q!k3H<1vF?- z?At?98~`3&yoT9t%=CaDKKJY2aIGCMF~Ouq)n?Kantrc43+`_h9v?s4-HN=r`X~h5 zY0lTgp%}wBN5LIGohpxP8n^gn#%mt69c+Uu%8nmD;7ko(&=>1RA2`-37*2a)AcZ{l z3uyOylN-jU0#J{BZLRaeAvjFKo3R`)s8w3dor=4xIR0+C(?QZrDl>J6G271`$ZXZ^ zk~*gQU`Lo-*%t@V5fO{nhv@G;5PLUazYQYt<>!rUrS*O8ud<AMde%``diPx4NV*j# zV<irm6>Dj|u3=$%aonyB9=++=ZM4J5T;c_6Wqi%-W7_DTLrIa{4$fB;qIBn86~r?O zqoZpEE{^fO%4>?Hm3Vz6rjKEUkF*cxlKr*_c8_n(d%KHW9};U{5qr9N``WSrHAB>D zS-QRpqew1pPPU+fo&OBdCw6Sa`4H61#w64mz42^ML0WNEIJFcao_k|mgEEd+HTQL= zv1Knr%`J*Zr@eyiKIwk$auBaUfm;i_?j^EX{ySMgAKADQNvcnNxF}=0kwjlmh%~8C zRRa?&JRMuR+SqP9v0RX4$d+;W>_sx*-2@D={wpJJpJ{kZ-|C8bm~oMw%TCy<H2wg5 zRe%4UW}DIU>$4YUiCRMhYCx&1Xa)*cCq2VBls#yKHQ{}K_3v4ARtU*BqF~p&3TaPu z<-RU5_u2|wV{jUVI4l~X9l}}EFNX)DC95H$0dNm)2&y}BpcoWFC2ya5hK7P;xcyIx zt@t$w{*KQMxaYBQ&2Z~S_@*CO1J2?+T7g=fHJ*P+e~t|8`#i4&rNO!Ah~u>mh?mir z3ynZFxH?GGw&)FCZ>(MG{N;~RKVu{60>sFfGo)WyM@<e!o8O}OT2Bd>eMZ$KzxTfS zV}nXr#bbJZp96LD?2Sr54Ag}=X+PM0x*lS4{7Z%}=FL{sZ>pxJY6LZB^GR5&{ryI5 zTx>_~n_23|C_KIej&L9odix1_FyrvLyVjpBNHrjWuY|RZNxFM?!}2$t&I6L(M<DqN z8}2Db#FpD?`kDSQ3;wHQD+9LINy{e0h=r7bq{z{9TTKTDjz)G7x!;#Ed-t`srM+-a zie>Xpt*fA&LI(WHouIiiApF2U5@D9ps?fQ#prTux-dan<QvLx%!LA;d1gW+vypF!< zP83_TmL!EAay^W<X<cw$le?zx#~|+5XUCat(<a|NEZ(Nq7w+^`4*F}!vC3hb#ieJ~ zqB<bS*!8|RC%dsSF*DWFG|N59)WkFkm}RPU5wuppNK`*6sasFP!LYg8ALGk$M61x+ ziCm1T`rzz5_0!E3d(%_PZhXRU6eG8v4hi$u1Nm(9TGb<7;9WX0Gwzd4HXKhhVK7Jy zd9%1hX07I++DvNOb7ooKZXFv8k|vz~(X!Ljq>j+u5oZi%&pS(bA(M%=?`P_k+=b0G z_Nz0tt}8r-ib~&%Csa*Zj&}*1WWFi%qJ6)xVy8tBjRrca?`mj$&p&YJFJQmgG#biv zqp9FEu-<Z2ovU$!#IZK+894Sh*nn0R(H^d|D8`fVq7!SOuT|b{b$wzMFa}!B+YAcg z!WB*RDkdD@g_lzE(Otle&LPes8BoemDEHZmx67Czxh6u~zKo#@XZ<jLA{426v?qD< zDbMR2=5Y$5xziqAwzpiDDkIF3O6K_$=&ZnC#&yu9%(A-Iwli3bMm&ky5JUf?cxF^S z7d>*|U{thZhoBdk%;oy|drW%iaLv#8!INS5QfM`51$t{4W(C#@h-!6jVbh<MYl3)9 z#TuA4Zph=<=d9z(b$7U<H+lbv&UD>HqkV1sxj6Oa=$Q__F&6i%e2{{StVOu$A~uA~ zVY9pk8Y}9eG9wG~hAiRKk<>;V?&?(BYK$QFc@mNu>XW&cNW$l#=!0Kz;RY$xeOp`U zB~wk0@T#`49?BGH;c<_eC2{QlG}ICT+`uLMo8d;!7{V*pp4-{L#kEsY5uF2?r5$9> z-u}G}J7~CgEXp3DEE2_GBYbVjgM6mEX6oLDISxJTG;wo=+Ru_lHNZ^m@0{<4FK6&* zwR3gMt!HP8#&B_*`KoKnX$X^KHxu(+g80;fYciZDz!aA<D|a^5u;{FQPQ2_JxzhaX zWNnpFZC;<W>B(8w#u4=|1^ldOj@~KSKdpbGM^HUt{-z>}!&i$mi0^Q`ueW53sY&=X zz?~zYv7SZtM9d{-+^tm(#1My^_*Rf&KL=5<na{&ey%XB_59tsf4-K`vmc%f3;ql?x zg6ogujk%RZ>llpSE;{s(?>JzLZA+mV8_(W`o8DjBKxvMrZObZZsza&9?-K%x2yH-E zVlInt7zs+g?7-W{He)_oI1xBBH|81K1Oda(0%Xkk<`oSj^Gvq{vO=tRM)vzoECoom z=4%g592#<=T=;)56k{A!*BmH9NlaUM&oNze#l!N?0Flg*Y~>}o$+V0C+pkYt_eGL+ zvtjp-7^g{osU77NKF;BkR}Xv0e60g6HW^tS9XuUzC=D6V$7yR6{De^X;*flyCM%cJ z-)6y{br{sM+xi*Rz>-dj2w4#^v&x#eJ3;CD(6dWfY9(VbI^E>VhN!i=FMzSfNbjK7 zc)3i+sou?h5Jh8D@G@$3#?6OwDB&F5+6;hmTBI0a_Uyg1?f<3@P`3oNRfB}N9hrAn zx%s}$4oXtnG#ID}Nw)`L&k*xRM)CXiY@(_J=8Z<~M{)ji$U(j##KxpKr}uUCAxN|0 zTzDc{AQ2NA-tn!Z$4w;QsO}j0aP(Mx`)kP<{2t;Oz5eja(eA33bnCrtR;qlB%&}a@ z+bj&G&0obc-?zvb{**zV20+Sw&i_>0UzWw-kp-dR#-Jkb&~BbV{KAJ)iUY+H0(IOk zc|{Rhj1)Ra-<lLkwWIXQ)WpsHfm@7NGUVreE@BwOjf(XWh^TTW?&eHzcGDXq){^+5 z&cEbMaUqS&${3xHyIaENayUtzO~jae=edcza2ldUTk982Q3++;kKwuGOW9XNT$LyK zs}l-vQ@7zH!QWQ6NYGzf_2$Ok0ykEtJ~(}1ZYE%e9j|Cv(>KKg!`vj`v*2BPp+DrE z>S^X|3)!u;C$m)*ac#h3viVI&8GAgvz)b|YA#&7QmaohzPB5$}L?&zvQXQb_cgn&G zR%+iYnI`MbiMmZT2)fo4d!Rv-7`XlhV)YW~zkySxH7*rR07Wtf(XFHPlEyh%JqxMI zGycp>k6<>z?kaO4cG36IY`o|Rvi2#w^=j^hGc~6eSOr9(s^~B*waE1}lMe!NFp_pH zo;F$K1wII#Yum|xRC)pT^dzij-*AOq8bg;I-hOXv(@cb~X^Lvg3A)608Cy#8<v!<E zdQKtt1L8#(?o2*(a}!l<A)CTmT#|n^jCFO0P`it~q#5v8Swb4&%6BM!BAU;Anw{Qv zFDBh@Dq-NSSv<9(*dB5jC%a-r#1Et1Uy%|OWtVyF&x&$rjmEQsM<gUpUEU{<xf*6p zJ#;Bk4alQ&x%|>DS=_tD0}8gRoDTx_2vENTr24=`l^4<=@SLV2s-P-|q)V4KO3lVp z7yIF!Je&v$Ir}3jm{Xc9=td98?0%oa&1KKqKNVKy?HdJT^|iJ$P%`&7{obqqTBK}f zY1YQ-00R46O~_SNoK$Gf>$);H3AFzx1Ueu6n2FJ8v1;b~ea%j!IxSpbtD}Q=<1!Mo zk+pF&+zAYz)|a9N#kd#WS-G~QnQ{Uykhtd+1Ak5;tq})VT2iU<x2U=63H`zbyEt*r zKk@xA#_146UO7#byeQ1q%KA)j(mEv1UIsN2m?!aL(nA1?@^N`$em*D&eshCoL-(F2 zI0YBE&fflu2AkN$z1`0pAjNXb(cRla9(Kvm+lqXLOf<K0l+paqp%DD)mtph4%7t)M zXJA%5liqU}P6Ep&pQ(Q%2q9hV%OLT4gdKlk>@<Cai%N9LVUwQvGxxhF7+YN1o$u)4 z1!{9EjK>V)eGgQ4c}Q}{R)M_TFh?(N0J^zcw}5XwdOs@#Q$}ep209_te_WL!Q}8i= z2}FjTrC<#B1o1FtQG#>o78pm~-%O7!jIkNsD5KGeruCX?PR`5+clfK8@hwM9ki$jk zsWBon@=Rb^iux)h(E|v9@0?}y5!@*3Lr4e-1%HSenqn$)apvf|7Sar?)p}~nlK#*+ z@^ex5g#@uVM_w8^?`gk-7tL<J-VHs&<{q56?q^?f#;s(gsizT{j=Rt^zW_$%M;}yF zrQnn0UV*-%pJm>tG&}r2P9E2C37d{TT~H?rmPh#9YHBuvLSBs!4?GZ<4edCb37OZB z6>cj9s!l*DL`$=YJxT6!V|T)S(AK0@!UM3endq5lNXL;5oQiy;h(-(wq~d(5`)=xC z(b=ceLHbwCB-Q5PjUvk??=lN%u@0oOHsAcQSZnH2&{6#6`T1oF9Su#!r^Oggl6&^u zfFxExKKtZRdPUf6c957-<ihgs%xASMr1<wI&d$FpT_&t+wjv`-&3tI_&0plKsq(%m zM+8k{n`K3bJ>(yjeHw~M4NSRd@97k2;GIl{pAjw2k<8>sJP`F-P9l`p_0x)Qu2Y9x z!!RBlv54LdIT~7^spv_yNADl$mHkJ4q3y7mUWC23Z0H_KlTRLWEj#n3WkmhPaJ|=` z<vo<Bf*PtR^S;LGgg0oPmxM|YPyKY!NHs}}PEzyKb1)`%mmHRX<X$hDJ$6S@1r@<c z-w|=3h$bZ=FY<`W-MTjXjew(r)v6d1e6e?^$f+FprvnrEZ!9G0mBBA;^SO_m7QgS( zI{i4VdQ3vi$RH#&<6*qr?Z&6*9Pi-B<SFxoZ*Ad%34@bjz~~UzNmzMo9`L8<AT%Vz z?1QF2P*+kkB+dEvVK@Lk_5mW>|Ld46`0Gyp`6Pp&DgbHozmNaBKTXyZfvWP0i{Wn& zGI@eSyhd7=de0|=miV0E{yN>HSpSd&S>Br<X$<L9IOi}%*wq^Pl$yw<sUHagIyXpz zgDj-vVwnY>PL?by10lIoNKG%|3(B6ss&3I1lzT{Vb4crv<^6J*g;Xc|tNmVHysrt- zw7-_w-gHOci-Hvk#&W~U-Ts&-5JcrT$x{88aaZ%JPUfe}0GjBTvMZjdnNB89(7iPs zO)HcY+kGu^_PYmlwzRrj1VIb+^&%(xUfanjG*yp(Jph=FS0qzkMQkIo%tD<8nK`e6 z!{`QRlNR+y*>b()Ffs=4<qre};U%B#`7?r#^uH<#Y!u@*_{*|ejY6SE(yYyWFY1wX z$}sc4)PpVy>_{@9EWx@|8$+|*E5kf;`03t7Yf$oyy}M=@WiOp9$~KJqj7DgX(}J{d zCtvAy8RC6=`Q3Wo`>|L~tR0}1zJThiAmkNPm>Qz(Tl36W4Xn1Q1};;@FQqa6biz4e zPA)y?og|&=jau?`Mq<TO&C@9xcb7gktz!NJTXmXzPu1Yq^!^&FXMSTRQte9(c8E>@ zR4RP1rPvq}Bce3oYK_5J3;0+_VgiW!(j0r^{B%GWFq*9Qh}Lq9cR^o*m2FRi@kleg z2KjP_Lr1l0fNm(vIVY)hQL<L!!&l=}rf21iO|E0W<*s^91M`kH`n^{3z!~m&bTNCu zM;P_f<(u}G4N>={6jJP{O#q&0D&r#MTqj60!7?3uW1-JdnmaY5z_dG`jLg*6$BB0K zocO^sJ;!7$qqIW_cw;%J`A3BBWns(hiTK;^b}X(^L^xP)lLek9h9Qw(5Sdb|O6Cp5 zh2vil9v_hS`V{*_lFKA4WGSr(lE_h>_s=jKlT#GjyWU$C;UB{h#$gv2jH(iZO>g>k z=r|#d$oZYZ<v>hp^01A%u0--L(1=%)>X{2gb3MU20GFA3K3lZ9EXI!(N8-wPXuAxL zlU0mvDhuD85RWUD<Q;<F&CiD2pytIm$x$9tTPT#ly~p&{6bGQNcQ>#=^Hg({pR|X3 z;|zU16*}>^`0(fI6FZr=xS+>Q6g77Kmwsxt_X?)GllNcr(hlTb2zY4|Ph7)JZlS8f zt9We77k*%>x0s%k1v+PjfFpG3xQHRoo5XT!x&+Kf=ikQKz^e~de3M@$dUyn%7cYuS zkfx)kL^U4N0G-H8P`7VwD^|SFaQ>zGNv|0{SrS$X5ix633B|DnJF7y3+kqCLg}oY; zi8IG7M{)R%qf~C<;}S9SGb=|1x{1LQomYn>`SyXNDrEbF=X+LklBu%~QQ6VH`p)mO zUYfD|o0*}s(XTG<<f+NSvj0>!06^R3K9Fwl>D%$`jyZFxDz}&b4m}105DPf!d?Zh$ ztZM&JRNb=DCi=0nxVM4-@B-Q!QZ>p&jB;+DW9@>S3rjuSV$y!(lwZ|Er~sG{(#WTp zCQn44J)mCX{MBRs%nkP@Y}R{uSoqiUbyZRL8yTh^!a|9D?W9~|?rL<)TI7(!rSSH{ zG9fixVEu!vMrho%WtE#MF%Pd;T1G3Hl;ixCt*sIcD9GF7?kXqnF6)4E|K*J4hFI0~ z9`F9201Ac#5Ie`nzOeS#M+$J7ALe;lV*zHAH~$D$11Z;Snv(NiR66y~ZG&1K+wbj2 zkrHn+&q-5e)xW`l3E|ew$cK)F7Ud9Pv&kA9HK`oVzTx<A<=>ZK_jACK9h+>2S$BGA zwDCXJphqWQiIrf)Qx^6~Mq2dmQW`9S9Aewa@EjcuC$N$Op)`Nf)=ey<b85(EU<dAo z^`*Fi@J(bn4`usEkJfS@Ph_$IBdwIM%~)gt%M8pG+H33>N8?&(DJCF&$%(F2WtOVv z1X#xpyn+NAhqPGwQ^3k{r2EF<lOl3nCX7#)4%LlH(9eXhYpU)CoXWcglYcZmVUJ%{ zh}ckjS|VE<ew+xcUwB!A(Z1C&8viQ(pxr#!=1hbwxcNr$)ZaK?E3}gbGZa{A;|L9u zkT370BdH875W~x&8Iib<`6a1zNog&`##b#~)~<#um_s<*2zvAg59ygxwdIb@O3ArG z$Y$~mIvyA_Mt%IDkd#fe8OIvq-F(exwp%IsB?_PuOZT%gLiW62`ZQAQ0eXl!7*FL% zR+(I;0EC|G9<H!+CDdxgFf`jI66#gKECN0gD&-U3HnmBF%oHpvbib3c=-ne!pDecx z#7J%X8b8J~q;9&c^2uk#?P2CtYx+0Al-~l-4hqX2gHf6|;EbMtU8wL|4ATPmTptOZ z8j@>qR`K~&v4`YQ5;#IG;!}Ks;k{`-l>Y8P!kq}~9}vBd8XR7D+DHApAozmuBfC`m zTFzy2ACJK%qmq#*k)Wz(+nc_R)C&B>Dj>i2*Qly(QRYRF_o;iUOvKxthcvV7r(>ln zbSPYzf@!F{*;;0_xU&T}&YUK}B%x`5d%Ol|?Cpn$&`n3r`S3zv5yGWw%90g*f0>SN zVod@py7`Gx67mr{zwq5!_$Ly7WXD%p<+Q?2tn%UZkp8p+Eu_Fi79(cC46pOJmce>J z-SRR6XYK-|YgL_m-k42u=A8)fTWNmt6BwkhYFR#-U>!ypZs@)<f8aMDW)DdomVw(B z9eR17R$04J;Sf*^n93|SSi{Fff9onIIEQkakDQdwzt02uGNm>XwxIAX!qHHh_lkfP zem;|=fqK`{pluk)CqYoXRx10hLL!O=%Vo_DBUUGNdpJjbLws9kl>p+OtPX!;e^Tac z&u*5}`~?|3cCvTee=g{nOvOu!#u}rPL&SewB8)3ryOPiMNBkjuX)dN1f#rmUL&47d zf~)klulHv-DZhn=_K`}y+4cDoGKtkuw{wL~#T#X|sBG9x3{?<Y+s{+oCf1W__jhsv zTaE2OBHWC5xv4wIJ4*m$iAL=Hm2dUNrFf`#&cEy0LatvPamPG~kyJ4mA6U^%n$KU} zJ9}Vazg&A5jq^tKmyd6bgDzqk4-pU1|C)_Rg}-(blvkc(C1-H;P2;6!UJn}wD&Q!i z|Ddr&LdD>rJfvP{Uithw8|biGryTP}Sj%Z7X52O=?K)R=?zEHu-|;&g7XA}6pXJUa zYkAS-G!}yQ-bYG0wH}k+$9FM9ZF&b7Jfj~6JL!ni38J7q$W_6XzSgc79#ON8&Jrlu zr~THlZPnngO<uUI;^^5DDd5ATr5ZSjgm%pKPeL+^+bg~cwiV3CwPzFuN?;svmG_}{ zI>UoV5F0A}si@iuB!5cgZf#MoBA7}+m)%x=l<w?xgV_}>APd)p8PNFf49wMhg4KMn zsnq-kpBGUw9c%lD#D_D}=>79V*T`67{|u{;ECHYI;Df}$Pb7em+Hs@_?v|F>Q?b5v z4SB5@viIG5xV_Bs@PfO1CQhjs?4VR+_p)c>7S7q*_qtE49ZzDP5orFJf)x%xrip3j zbq_n<+J%&aVe!sgi)*Bbb{n7NZ-~odP(9tvGGXx$edi!ZYJSn7OeWg@v0iaRef=aZ z)xnbU<Lc1Q4{ha}b`4mC7HVUpl^J@8$QzBbOU`g9_HgCcozBQ@eol16Rj7>BS!mNE ztASe%7e<6b4pXsSO7sTxlakA{Q<S8JlCIkm2R1)NQa#LiJ+Q}#BhsfRmj-4LQLg}X zeaknNLV2>*$h*R4>gRhiI!36Af@hWmr`>2EKzIZ<*T<x8n}$!8glp$Q5|%3mSo$3i zasQ&J)zrSDMe=V)W0R>Fckb?&>bAe@p{~$&gi71^qZrXPHikz574uN5tk+ciO~Y3- z+(ee5NA83XsMtM8=?J5f;!h-bb7gO_cXE$AD!)7~<NRKT&p%;p$3%UaRa~*VM)G1j zvVU@Vl#4CT4o!WqI`2Sox1jkuTm%0a*Lsa}p6nRt1F2FRzUlFsNpuUNF5U8><)Jfj z&j;a5dT~NX5Ga>-IRc04?gtZC%$7JO(-U!IXxbK;*%s7i(V1ke=voP%Vj93O{?4!i zuSgVrD9gDkGX{29=%WnH;#@$~wCou)P0;&Jh5^G_yQ}?}`kv6G8Ytt;B4kx|=Zql7 z<(SD^sHUoB@m`6qYy{u7_l(jAt9t0Ct-$dmet6ds%X(ndP3=lI<B@4$Xf6-AQc$dL zk!QG~egFZwUJ@#ruWW%i^jzV6JsqTOGE>IyF1t!XnZpKzA&U*Zg&-~zRWg;bolyRh zt~i4QRKRQ#c2`X?axw2A%hZ;Xh9EaNx-Hu23dIFU?VDZS;CdMDS-Km^a2Wr^M~Yoc zwz5C87uxFF_<wa*Qf58FL=#iw>2Jrxg)6Lv=^XS^VUhd#zt3f^t_^jvrw`JRkKA`> zQ9&w+M~<YAX9dDm5i4IdPxvkM$e3AL2pel)Wvx&rr|W}tL;ZYrcGiZr@KZf7D2#~2 z<clP>wmp=WThXX5jOzdVMyU}y4JFEWiFDrQPV1(BAR=OFL7s2Br_ZYDU=6Cq2lvyp z{!n;k8sA*ZcGs<J8r#S?!a9G!(bus3YkZLrfGpo86V|=UQG)Z><ZHyDx=noDbKy=} zy}utnN)T<>8>K7Et^550BQ8pXCwIl0Hl?eGjv<mLjIvasx<@s}_r`*yUo5jxicXNt z7F0u>1553!M|*!r+|r_^ocB+{NoAqzrDaPvPcROkSsfW+v7XWQtev_U-S^Yevx)3| z4%o{^);4CwCB~p1YI0^B9m~Bh6}C;Iv{-i;7gbzacZ*9JStOGgmcL49K__);X_dc{ z<j@!|&NK2!UkK)8=lg&<|Nf7vK_pE}>xWr}?>eihJ3;ilu4iJ4uJifoK}~`Lf#Y>h zh@%!-bP6?AoLY}r#MSlbTN1No#}UGZ;<50pbYdE)*2A3ZrDVz>ZBgS5d8Kj%mtW{q zv#cc+`pbN&DB8&elbQXJ+8?D9P6Fbvtqq8mb!f%COg)8$2UsEG9qSZEVeN*iOQRa4 z&-{=~a4S-mX3Y!xvw-gC9s}iI+Hzp~PBQ?!t%jnA(6*H`v}3PbvRs9bs!3gTXb&}X zwLinR^Ia;#lHI$9_f592R~g(=(;YL`hOWpjU2u?`wj;7YqU!hT1<{P1qw}-UVe<30 z-kx_KP&kk~R-O%9IyKt_!(7{ZLtYQYRFKJd)^qGb7Sz@4FvyiGO{>q0TRTduyfCHK z;`pS(tS;p=zvn9Lfl-0TcrMS{6?;XFn%p`k@p`aMgQ241!NQrA6^Bvl`!YY^3r~`> zr0)^wYk$y!y8t1G5JJFy0eNk-P>(nXjy2hGj_lX(-_a5kI_?DtdeLNbjYk+0P5}fZ zUe{LaM6WX#DQSVlIe#|O#i_eZgO+HNY0JY_H}`_+5Nq>fgHe7^tWyUbq)dW1pU!SD zv3Cfh1S@U%hn`q{BfveLPriCE`;^DucLwLuisHLk0ihIsAN^4b#Q%OUQ+x%S|2e2& zAsGKZAO7F{(|(QV+H6o(7U#@vDH|2w7bA5>>$jQGuT|C9V?FgLy$o8cEuPj@#JrJN zr_*M<dVyav1r?|~pAFR@{e|p|jWRXHu>RTUmvPX}L}{($RIXkyq4ilvoqI9zjkOXr zJoKf!nm*26D$xR6ihulO4YxSt?X{DwcHl#X@q&-K=LJr6N~Lx}9u>Jh1Yv1A%yB(V zxVF6QJFM&6d@i1x-wRO5%nEaYET!V9&Rqb>FwcGk!&QnuV8#VZ{Pg?n**mT*oo-tu z^B7Zc<J(`(CrHhGiQ?6*7!e7w`?fyAjab?C3P^ByjLT+zG$NYXhpe*cholYKcz~gN z3*V=KK<@TV?!ntIELrEp1QrFb?-n51A(L#%xOYDNg4Q@}n+d{MFnb|`e9Q6dHU&8+ zCtfq}EFL=tU(?60wJT-~MdY`S&61tPn2gSo0V&7Vas}~)lF{K}$0thMQOQEpEbsAM z*%~Sa#k_TRYPe)qXY8$|Aq@g3klWyvwd510%5X`Ay<TRUDLvRy^eR>pjEjCc167uf z+J(DUcyzi)D|<pidP@cQ*GN8~o`e}@<jt^c$UTvvKITQxlgEL@T9~z1za-q}-VL}E z;-^KF0EpzF^)2I1I4y)mVOZM{S$%gdsG`mM<+lWF&`!-WK_y@cRtojQbk5bIsmt5Q z!LT0aeLz`OX#K_hkc69>Xclv{rXHcpa&YuuO;gv+xZC*YQ3Wyllies!3g;|J5MGTS zWyy1-u9{wAMVU@-Em4xFbI>=N+OGxt4rK;F7r>=74R{)+c%iZZGNvqWI&`EogkE*J zqSbAJ^UgxuLhg{PxC-CQJ$GD(09TBCfB7tTJYjBFv1a-xA)<wo3YQCNJ<w$%PjSe7 zHSDZdHk7$6dY&WQ>87h{&9YrWQW9&Y@gZXnf3R9VCz+;`8;$?SA<euo<qqiJ%u&>4 zj{vCcWPRtptE5|L2s%IY`3E1J<Ne`FjdS0ZV$w~E-fhB_Ac~?}1=_dG3uZ`;N7e|_ zu4~zMVONcN8!Nx379e1^MuJePBecC<y?ZQm0hpsHe8wnmW3j~s$v=eT$?dT{9*z87 zZpgOtj~n(i$Vua99c({|=0yVJdK7?_rF=v}+0>gYj8$!@T-zzUfanWScMN($m_o1n z%w-AgV%&?Fvk^nG)9xY2eucBEt}__C0X=g}=`Pm;NezNS`9>+Ab7%m@!{gH~M;+~@ zmpE_@#g$M5(x;79L;4vqbYLcSqu2dW(=);6A>GfwuLYWVKC?k_yuA!!YIIA2A;MGq ziB;Jp$V=9mECrxMyz5OkmHQ`n3A+-d6;TRY{TERE7h6So-d-8iH8L}PZSI-5$P!UB zm*JOK+qsKF{l-KRkrnRi20}lrcE(YpT95psYV8#xD;9ER#);L%_i|3?HJo7tr^$ZK zK8UiewhT)y*d!c>+&Xs(SZO<ai`S1)!TOZ|<W(ehCCtD(N_86d7NR+)v%PH@`|}s7 z1x^#vPfPw|V>)^^KNg7Xp$qD~OGR+528VuJg@>b1g4jeKj7g5po()m}p}cI@2Gj(; z1V*>h%4LfdBIgDQj1Lc!#Gqi7PV~n<@5paODl6=2KiepXxMx32$!*)3gf`_`300q& zDE}Hq;-mkWdZo~{sFR_96NvHkVSpO$EUmb}z6PZO#W}XH8Epq1XwKO42LBmfnF!zy z!x5mS=gNQP^h)CbrE&u$r(baQlT#J$^S~cqS=%*4-N&SbXWY?t`97Fp9@IM{EA9xa z<OCsNe&u=GvrKz8KTkI#@!_xqAt@A7X)~wdNQEOS*2)sI$cl*eU?+JumI!BSq{qIn zl_?4<5s*JmW1p}WP$pBq&uxP9n6Z(}NL4*9Lqj~s*2&tU|9R6056c{*Q#4@`S{A_8 zo?GKG_p?Q|q8R67bifzjKUi5DT-Ov%PYe}}Mov#A@a?16FDvUaG3A;FLwF0~tDp%L z_D{yf3T5124&pDBPb`~^Y;#5K$&ZMHbFC*EJ(h!4m(lTOA1%?3VjnkT<aR!`j+O+y zt&^h9jXrv_F>U7rwiL+p99rL>{ModIe*s`$UYe;xTlUFUI*v!{YoKCRxx4wqOsM?r z9{my+`_4sHT|0c~WRq9vqjdX8u-%gv5)w%2_tkhgZncbw-mQ7(S-|W?4(0(7<#4q$ zd8ZR9=5ebNS->c`T5A9T`ehtnd%BR3&U@8fEuZ`gotMOEjBj){6gxdIP&!F<xrrGN z0JSNei<h1}A~N(t%cxSaKO=+3sn0mKi}OOJKSz0g^ZU)}<|SPXL=lGk>CzDGac5oo ze#l!f<SF5^WCsIAvuj~^XZoa<>PlJpdn?Q0hcMZdfX1yr_fL|YbU3Mvg?c(#^ixJ^ zBTfXgmsk5f<(T0+7b>Zen#}Nvty&=%T;$_$b=*kejTJg8Ii{p9nLL<b*J|0yIFhe0 z2HSA$)jU_FXjsR|@(Q3{(jdNgM^8UoXLmBxp8;z=sFfI%03kvT8iH5uiB*NI^4A`8 zRd%1hd2!{D>Ga<dIb~l6WmBzzYMp&LKf=ke;d9*;E`?eYtR~PmFf=gDY5vQSUJi*q zEPL<1TiFE1ni_d2#n9OpS!0>(KN8X;-nWt|6=ZYyXjkWXg%Heq!M|!uAXB%o6+=6m zX%_f04`zM2BBruR)3nnKV;XHgm!E1Y)II(}v7`WOrSZ9NY#iy?EHD2ZQU}l^O+JwC zFh{;3la`6X7jKK(Gs-_zE~$^E%Issz`XS<y@y^wfkrQ+Y2U{i;>aV5tH_)<oTE<rn z&cpgt@(*$=Q?v4ciptfe;zbo9!of%g9@^`VJ(b|1J2+T%LBnt52$7n|YyQck?Y;k9 z(@-erPxObW2*#QFKHyrMBKN~Jv)V$!WuJ~F-i2*6*3nl97o8$Wf34$_86h8uZXrZv zu_mu~6c>fu3_}D1nzNU+aW?jYE%U7>vv8S!a%ijzujJ%Nr{=W<_d%2?ZC7@E3HI%e zM>42|Wqg-VS)e0j=&!j^M;kwjH}*T`;W8?P6$%H{)TzXO9AgY<g?<gL@MxCnI2k@e z?uxO+n`_}l7a9BX7YYnoxIc8=Ex(M>Jo7Vo`Gy%_am^b6cRD|3SPh6i!(F0_A_eY> zhzzIFZo3{d1&)Ewb^nTV!M`H?j+O`rRXlLgMxcG>l*hI{O9`)v|6inRNpCr~qsI4? z$ezvq5}!khhVd#3_UhKDtGN?<t_I5JSCR<1d5H)_qnX%YofuXHH0Ur1NXo9zamyJ< zL!riZ(a`@i;y0-lYsxA_-SFoqTN$~T)avO)pe}2k<baM`+3bgbx0S?nG~0*yJ)y<b z`x3-9^+Ub@>g;n(#~#v;I0wb4JJykT5!nz~gEQDxxu{*M<YAH2DLe&Fl&6K0J?|a@ z(1|^4zmK5e=N@4%d#bMRQ8Iq<okIA!Qc`rV@%e#uC_z3Bz8v|8W#N1zaEjBumS4nw zaCxx8_e(+IQ6jbcPNyyMD<V4%_HNd_J={3Jo#UPsEU_<icgxC;1e_^T!_1RQkbs!k zSsW}lklt?wweEbz<QO#17T@No2c7xj$?$kiwDIbe*;A00gZ{>DtToo3R&7upbx2$A z<y!fWT(zW~h@u!*+eJT~7<(V6`|CD_!`N|c^+`NW?Ub5)#Mv9W3z$7bVv4Rsxqq=2 zR1e(K!TA(#_MsZ{*x4-AILJ8tETbJe%{w|Iz$6Fu2br`0jN(P#G_0JT@$XilG6H`8 zWt$V8{HLn=^Ay5sURs5?cou{Cxyb;+Um?cE+Gsy?2v!;=2An_WPunGcExolg*<w4D z66)_w7X0|Xi+|o-vCGyyN*=>rA)EGAMNh){u|bCICTkBVjD(vqTn2rl%L~#Cm=a=B z1c7t3xUZD!bw5K2CB@ggflXi|J$60dhJ;pVQxs&il;#b%mlQ=ic<y;T<gM&FuqQBE zWxpz{^Fqi8{rbII5BDPMz+B>S*_*3^d@15e<w#+ADjZh?ZmtX@dh)`VAppRuo0T}v zLSa8?(6e4zZ*ZDC{HaGf1yM}Gjq<YqoCfd{tV+fFFWJ)??&j8_by^=>x?1-WvC`P` z+Ty<)#MU#atmL@TG0@DZq|DxXKX~?8YvJPX^|aD7HrdO*WRm`&>lv2llTomE8^KII z{2};suDztR#5Z3vxDYk$qzFgvs{z+X!Ao0sY8!0N*~YCICYyKA?aOpSz9C>e1X!s7 z$q0^T3Fb9+)O;{ThlqQENyCGU6Pe7O<ORn<%ad3`xui@nUj+R#6)Wnqj1iGY!S_AC zhdH?_)}>7%X}m2?>a_)1v2#NIJ$ay2jA~}=wnz?MZEQ}3<2nZj=VTy?E>S+}$(E$k zfGLXneSa%Lf<Aki$C5m;(L%&z0P-h*`uh*R>`$1y@S{#W8RWN~7im04%LTqu0g%lw zH*IgE4DTQ6?s(!3_zo|<h1{i*dr;WBJpK%IJ5%>dEU>QV7J%QQc_l|FQQY%(9N|K8 z#Rsox9L!h@TSB4|y9A$|tG@ZLQ`FvUh^`J<Q6V*stxd^He#`>1{9AY1=jxDIDsrD} z#H9pYf2VWWfu$?%CS5whV_{baRMb!7tryTPa3V~{zzN?EykGGAhA86lR@z$IE}S4+ zOcTn+<T8o;E25M0sgfzoyfu^9lAqHK6$@i6UtTcG-SYe*tXX^&pIm0{6xLy45`(t& z+QH~!+J-D3EVv<6Kf<y5TsbmD)4#oZHH6J5_o=&Z!kM^x?Y+;`zI|aKXl-3^x4@|1 zp<Ob^21mG99v7|XPlwV)KMMj2wBhL2zHg2FlNSv|_*uLCoyp~){UC&LYW@lO5qw-- zxmYt{2pr@=8xbw4UD~u*XmOgL9O{g<wsedF+k08^gt@qjAouVo%SgA#!IXP913-ch z=-Q_`eiH^r`z>EYlosy{y{f-Mw-Eg;zi@jvg3YY{E}0NK%q99A(K&jT4A}j#w_lw6 zfire(&w212kCk{y)ngl&UxDSD>*-rmlqh1_NM%*0(5+9O(2DeX!Is@k^7XXD9Mqzz zzlPBzQiuyVI`3+kmYIM+CUEs3gRO7ke#`b<6$4l%kS=#Vq)zS<nV3Xpe2A2dYTT_; zYQWU5!Vm%iitr$?OF{JEWxqeY^Bzm*d53YQGNa?p=vEhg<-K|pVMSo!1dLMDd&=ds z3HzmkTRp!I|LXZJ)Rko6lDsw6n6L9deFR1^jU0(Crwq(=azEI++RCv(iRq8)PMV@x zPn#w!hM$~jNJCo@8RYmwapWL6xW;__aMwpz<9a)RSl=ch_^ijTCD^DZZujXmpwcrc z7KDD8YY{s7pLWmNpSe9YA;pz38jw5cYJ0M5zwh;iyIp+ZSXW|Nmv4NRoQyE~K6cl_ zGA^z7qg|hI4mUqa#e8-^SzHD{#mzyNmk)8Y>Z}rzYm_Vsq8ub*ln~D#h)Ns%|7iQm zusE7EY8wtAfe<VN_b|A-yAufR?(Xi8KyV8|LvVKsuEE{igS)%GJ&=3v``gF&=Xs_7 zF*EdZ_f&UXwd!1}^bWfSTF;ytK~@N9&uH7V3aEEZ1fy+17<$>I(Cx#3r=e7=vbt1m za8`Fr>{O~^cu94EsH=G4Ue)}F0rEC+0jvl^<aPt5^j_pH#pnA}RAR_oGXZsZWQs8o zHt8P$`5}o1X@T|v*T30IUQPNsp-`QrdJZ9jVyVTmP^`p0t8POTB5xK!6~bclIa4)U zrwdLZG@o8W6|gm@;JMU<xH@CcBIIrpYHz~~o3(G(TxuHDHV^A+PA^Tu6B+#8kQjnz zVUq|Gq?m&0?VV&9M~p_b4YxEE>?$s+Dh>GnFM8g{@?8XFff}DLL+VC>>kGQni@e=- zFAK`!V(sXxn~a>1vaU-Pl*;#>A0ZMs8+6}RG5z+EzS7Uk5@qpC4Ew5)G0j-!+(%_X zhL=!`OgZkHhgsR>W^*H{K5Ppj?R@oI91DU=22<g1>B^mv#@^q1#Oe+D#HuIH+!^7v zUDhEws~v#PDd&Y(5?K*#rhL&iClB@yyHx<gn>HOk+Tk7XZ*CIW;e%`Pc(P~^1eTWk zv}_p<LVj9GK%6xqC~(UWSvjr^XcFWnt%w|G9bQnf8W21v;7%_6V0W;n`qu7-=gL1X zu&uku6HE$~QYf&IWH>#CizxqtcK?}+s}H&B{FC2uY8{BZkIA=7=@o<GWUEhMB|zWi zhc=hXDJCN1^hoKEjVeZd6#lC=>y_$1a%7jf=6l_n!(QQKCFnZ6uoWn^?5NiT8Hj1c zrf{eS3<HNHJ{hbKs@M&4(d(6cRnBypT^YLEqgH)g8~#dX$#INaY)$Umqt1Ouom@xV zXe|7n3^?4UCJI9_jgO1Wt<W!GH}yQngf_`fhc{QUZ@cG9CYEI?4ik<4D?6`ab`TFL zPMC0~1b@G`T)~-r#`NeRc(tyRhCHtIDF2GaF`J~<FECk+ND8(ysD@hikR8d~Q+w;f zA(q=F*HO}UDrrpO^0uFVw%y^qX38eEMn-JRrt<IBGHS$V8=>c$32#Pi6qd{h$P62y z_62tup(EG@lR28Q$s{^4(6#27r@gAq>UsGV=#gS@tmAv#(bLS0uk_mi812$!ar$#r z6Hi5>Lg>}t#Yf9)HnO97CIotVER)q0|1f0s$WG5Eu>f9^+5KWKV*C;%wYgc_6HrB& zPz`?@n2Bm8JyJIz#40cGeH7=+uP`N3+#FS4);ul6fY0eG%dJGQS9-0qfg~y2aVy=H zo+q-m?;9ac2y|1&`s?~{fK~`f&!ckuiF|SQ$^qZJGi}nU+nTy)@r}MX&dq*S{HdhU zTS><;Rz%fnu{dl(vxo`82jeoa5*cGKxb(H=Us#zB*Ce2ungp{=*u3Gk|88S{0;1B2 zhilYATqv|+dYoJBW>F^)mCwktyxCX=dF+;i1@fHZmmYWtCW$g7Y5E~9I_exUk|J%? z+JPlsaf@q=m+JrJ!oqOz*#Oz(?-u0)bh7_!OyuAy>7VWY>@8*gcDw0%_u*4Bc88t9 zke+X*KIC0r3k~D+cGnDj&OakxSduup+0m6etH4lT(T0Y7_owI9F6@b2iod;R3vnJ* zA_gYe(rUY@Gk${8oX(uCAW(drHLeQXM=*}lIUKixnIJhpt=y*-jBdj_J7?1!P%zGO z__?>Wy^CZxf|5=pb>Gl*F>9VSVP<=OJ{926L&rb`o|!}%5dx!flJHj0;u#r8MGd3h z?(Z4KabBOXM`T=dnZ+NosRp0bsI)I?y^Z5Ax9jOGR6|*c{LDzrOm^!<!=P+PxFqMh z@e8KArWq$jVmy`UH5jf<Nk?^yr?dcFD*R9yFOhg1{-6-uQ-{<$I6h>q`h(4Ul1jt# zd}1dt5_}w#AD&L$1oVvlDlr|*hNjPH32`zFXQ33F661dQX{O7&Cj<~{iO|?O)J(a3 zMA}nojGs`?O*rQL{fiz>JvFTY0-|=!XRU?#gR$EG(LaOftb>R4%6~^2quQ3XC1m)+ z=u{}Sa^agS{Rmk@6`pP|r^P8@PPdXk8b!|}JT0~;w3da;LHS+R3^S;&cdyqReNLL+ zmx<%3et8q{E5j+H5Ckh00a*pC%Cn#I-YWB+>9<C9@um=TqTT&Z|Ee>}C;ID^zrg>} zU)K047Rbko+Cfx~95pb3zW9P^sPNE+@hr@tbvi_(5|OvLkXDgPRdEJC`aYj`nWrAw zr|xkQDyvD0Yi<6JX%h7}=gUfLE>p@Br53;A!Kd;RVX)u$be=Q?pSRQs$?Jj>!F$2x zb@ivZ^ek%UCGVG%r@0UiR>;3*SuP6>15Frutfn^Dpv5;0(#4ZVw<noXx4T4YlBGmu zp;XT^1Odq{ns%&pVJ4U`39o$@ez?n((o62Z8bvpF#HJ3XlMIm#a_eBLJq=y%oBDE6 z^V1Wcr|2qRH(*x?{l>WcgRU126E}#4HP5!EqP2Dm?jEk1H8dWTSs5|uE-@QFJk0*v zbu`@8(AOITYz8j($l4F+2#!`VP3IZd`-7`nqeMC*0=N|n2$VuNQo(eHEPovQknEyt zsxy9xhWSqV9!RmSysy~e83|fEl?_ax<#BI9Rg@T&q2R@~;O&@?cXew|!)10QCo_9d z?o^fL<k%oa8(D1antCg4##fhr?GOcx7g=l-S?oK9yjv?;*k$!~-^6$NmcxLiAAkO^ zU7U#>HnnI-$nK##kDlIE#wX218Jen~BcQ%<+i%NdYg42J68`3=hv5edZA?hD2sa&- z+%Kz<Oa@lCc{{czCu;UuU)?v~B{wsp|Evax+_)DJqKq<7(Vp*J550;|O!d44Dz{=5 z@}P;l5hHldi2pQew@_Mp1b!_kX|<esL`>GalxE9?I=*hhe@JZto}|Erg<S=7=XnHf zNN*81mld>ebKHk7^a=kI3jB~eCbRHBi#1fMaWd2&^kFh678mVp=pgef!oO({pB`;& zL1C<ui9-%?t?mvMb<~pC&u#KV_--x9-%EX3>S9g_CYcm@G6b))nTPwt>u{JuU5JNz zL>9=yPPYHV3Zg^Ta3cB@hx#B@y=6SRM~J5R5fF{~qq~6`jC1{YZ(C|XE8CVAZq>Qs z+QbGXkTMjwSd^)hE*RI9j%V;W{!C(gJHCY2UyeS*m=AE35MSQ9bfQPg3vH}oSX-hQ zqr{zY{Q=Un{|jwljOxg&`s@2HUD#cut7mle3SjnrDTj*m3c_@`;<vWxxdK2X1M|r) zft=3vc7CzyG#y8r8(>HyRst|#-x}*-6EGJ)5Zb4iDdvf(Q^Uco4mZ;B3Uy>KvAY(r zD+cVbAxSB5<)5}|oK?Tt8>2z5=%aFR%D^IeFTooion$J!F5mo{Qj&Ig#(O?sNvr;y zHhvl^Fu4PMQo1}npP;1CXVuk5@|zGUt1|ARp=YCSWttW^Uupw$I0?T7a&MceQ4`}} z6?r+oT5aicD;dM!8RMQ{j|aW`7dVtEe>c(Ioi{;8Wb((#Rmv2XEf?upa)0OcSOror zeR_jZ+C{zbnrTgci5?01-VP=Am(ZsXGul)01tma_sE2T7)bbcFvD*Xm2wvEB(n2L; z7kG(?C`FfpbE^*{AM^;OpV23l!!|h!&PjnW+Mi3NbZf^{NdZS|j9zo*Y+qMFSP80& zGR0vNHV)>x{Y47(kUx*V$wEu_g{T}hN3?vB!O>v|w5&hcO@Xt7pT4^HG~q6h`uhFH z+oZ``78=+6KUWc}40R1wi%GQNs;Q9|AAN~39*1A)-W?BJ{c=KRx==k_gD*f6U`4Ju z9@9P@{P5J46ZpWTY2LB`y4U@^$67(jyrQYtk7f)-sq0}(*xm`9nm;X==lh?Ztbkrc zvp3vr0<Td&){qTYoNH!!!7H<-PS6IZCLxP^FCDSiA70eO+y}|!2$Q+EO;i&keR&?e z-&@#H=4I1a*{_7%E1@jues1~WxvlS8aj<s?Kh|0TCC#Dn8;tZwjQ@l5v|P9o{-|LS zyWdi**FkhcZ}i-mLo!Tt3Yp;?T>W;8FKS1B>Q;D*l6rvdlC`>eHH&C@wJq%(+{Ku2 z+(d<^thuTw^;9A-eF0Ys^6{{T$@|boCLgfV_jmVRR(w=R-qhU5pd1&3X04kY$3)Kl zJDl}lmQNxkPLQepR3i0CK7jNw12>RyB@MR)@6C6JsFTmpt6O%EZoVZksS%ic=Xw$K zn$tOhm?g_G`Wz^vAw|jisCgDoM32;@?y*OuM2U-Hbx?QMm(?;6K)P$W(xJDg%^SwC zY)5RZ5=i>ZR^zt(1uvxPRpy;9Wto`e2u32#;fR0XD^{Es;b{%oufbFE!`aqCZFS4F zTaNUn9Nj$Y)S}<7u6`6NIf@X4ulNmkN8CPe-~+Ku_y_Jbylx#6e24C|1%1yI3<&}- zqiqsA{70UhB>ql|cy3RnS_n4Lq5~H6b(eIgWdu1Olr*u_5(7?ui1oMqiZB=ZUJLE2 zvYM8!5<AOEF`h$1UbyItfuKmD$4y^1&ShNsjS24=I|~zTv1k_7l25rBljC^n#V77U z(|?U6g}%%m3cv!3v4))2FXzs1Wrpn6{6hpW;1QSNRb=R-LGQaK|2C>1L)EV#fY>lB zx08Tg&4wzJfK`=eEsxrjwLBD=XMj~AbsKJQZmh#M8pqph*=DsA?6Oh#q=Q3|{2P{( zi*7BXysSt_^3tv1zB^YzFG8q#FgUEQV#|t5vCB1jm3KqmItQ(D)L8e}o1!u$<i}Lo zg{e8ziW^R@S3ksR6-na30bk>i%TL1E?O&{UhgQEw-IZ5i6QW!QeRSVGqW~gL03Nf6 zyli3UDeG1F8ZkuIPU%DaPE?e%62a*p!`^;)Kwdw3=VyCrMY4u^vTh7l<kbI;a41$^ zyV-bLx@8{55(>Kgx#k;$%|_a7Zg{)vT-j<b5A}BZO3A9*=fQ(>hh-xp_v6>PXZVEt zb#C-+<39r}ihf@yk*<3+Tm)g`RD+PvfY%#-SQUpi5alsBV*kQhuy1Z=hmZKUG)Oxq zPh|65dm-XPASJ6InIRGHf&@Q>0+2{enm!u^2?GKEzuZFS?hb!oURsg7bQIys<UbWF z=&MNgib9elHIs3X4&#tF6FTt6su+5=e!4k{)al)z;<^ytSVcp$o_AY80C^1ZEI7F2 zA?KuF!JAc8YafC)!Da6kFVxhAngedfl!rcPnbLPI8CINL$H{f^PZ!kW<^K+Elxb!x zt8g71A7TVKRJ1%HiOKhKN3+uulCTpXFn{prx0%#+NqyC0N~GyZp9DBO#jL^lHw@+@ zRh+N~IZ=@t?rOC%4UbGz31&cHoIO~JBPpO|?VL`Fm>VR;AIV|P^uLJ8#aol7#~&yN z%z_ArEhr)U+=q9-vEnPTC?e51hu$aCO8;_Oxk*^)60Jtd-?1tjs|>rj?50vZqqCF% zp&0==bgRhqQiMt}P{4e3UE`Qcvax~3+3ILnAQG$3__^V{1P>p`zHUIDlr2t%YVCsz zJnWg3LgMJt&<BPJMQ2%Q^(0#9qok!S{)Bqi3=xf)wpUe1lx-wWh;c0K?IRS@obCvn zBibKVLoSq(>)|1C8Fxq|;S>RpaPN$Vk`>h${Rsi@$_eB1U}&|&YKowAj`^v31ox2B zWnhER-|hc_?dG3d{GXY1{@?g7&04#{Qv51ltRN+-r%#<2U@n_3rG-PHg2<-3WF(i9 zlluQNo-?AlW)sP_bYeqP5e|Q)FS1V`3DsrRQUB2f>2hrMeN4TCU8tln2g+V)#y+m> z#iHp?j?EwmS1F9B_v3g@=}s9O?2<8icCEF$dU)JXF3Isuh9)(`OPIj*RYm|~Z^Xu) zzYslhuw@c+2j8?d)I)lDN~uh2!`S*Fe1!d;TF;*p{*?yC?HbeZWF;_wMl~X{-NiA% zA47sCT-GDK`_Uk&JF>@sPb3@$lYA$0NO)elL_*<!rib3ic01OvCE7AE-gEwn3U7#B z$H<-Vg1v6Uy-HY<?pP$anqcged^UelLh;%$aqn#hnM;s}!MZ^U#tNr(A(*tG?UlMZ zx+RYeIZfgR2Gr-^wwDc6gtSW`VnQ3M8uGoL&Cw_OKb%XJP2R6!F6M5{52HH##V)LP zugR8l1+P7Kh%}v);&|ZasshT?lJFw*^xrcb7+GjWhTJtc7+5DZ5ZYwApx;eH%|*bD zlcNs75cYXsNFTajAsXk8q2TlZbHO8qzF-8@u-z~=)oFSl9%-^XbeZ~Vbn%b2`cw+d z#JhS6k_4R@;*G|cFX8%9Y>49-<#a-@N$tQ=P7dj&-o)kOs{C0fzn%CB4^@7?kC>Ir zCa@i+ru2989{cU|6L3kr8~#2ZV<PN3tuz;eP!>+Yv{(8YC7U?ZRGxY-U~ZVDl>_=x z`K#*~%x(BfxVbqSU5^E=w!KxEw)(~Ex<|~nmY_jB-k7rzzm7FciJgeu4!2!h%&MV| z(jW)Z>HG~oJ`dl6YO}&!xCAM^#~3b@+okLSZ?-R*cx_oNbmFrmLOw1(ztOY?55esY zx>UlfyL%kJUpG>(sbNiP0x2xI!bgk#SQ5vXcrCa!&agFyKF6melz5>ZI5#{L$TWj$ zQ+O4ls$G+6s043JuPU=kIR}j`<5~h|$k$Q@#dIBB!oA)W(PfLzxwxA7K^0brR^ZEY z9KmLR?#og2_6ZJ~2dsrUIKP-&M68?-o02hdUNJNogqD4CimvN8NG^lo^h4-cZ@EaX zvIpoC#}Tvbi8kqfEV)J^a?)i|;TMWtm#$ix)P;LU!B8ER@5Mu2NMK#pyvfWwZwyIA zeMDQJ9J4i1KI~qxI)z=;CV}$f*$m~T6-e@i_M@ogiOjUr!TjEub8gb44)5Az|K+Oq zBBl~)kXpAHF(5GqbPFyl>z=5(|D|2H)1;Wv%hUrx87M<{s6JNr_%OrXEV~qGCS{yB z4!~{s<U816ZIzp%vCgqX&l6<xu=xlk;eBX%bE;j0>oxYlFt+W%jJ^E5+p>!p_eK7% z0EyoTkTELM=7BdiNX&q#2RlXNo<+N#+Qmtly?;eyVa)N3sFW~&oRP?Sh_7a!BdTPn zHNC!UA#~D!=rE<V&>@4qWrDLS-7GQMGz*m|&dtaY>4jsEN=^-C`3;4|7&Yi&=fSBm z{oa?1Xh9z4Hb@PnfFJZWBhwNJ51}^Vi@$TDeBI;1G2I?&LE29Uq)jrUO{!=vO+<5! z;k#gLSv}5dd<4xLt3I`Ox%A;i=`}t*dMpDE#;A9WRme&BuV$=yk%}0<Gr5$a;p#mO zNVGo$-XEgpHF@~L#}cRYdFsS<*_hI~sbyM~r@52`281d<o1VN)KWy+N!&@>OKvBER zsgIDKbY7*xOG5Vr;HW<YJ3ErC(>oT2>hsb$vx_H}ePC9DPo)Fw|1ecyCtaUuDyl9) z6f;C8>5!F(BJn`0#AYb6xj9*hCWFL_)CSB`xJTIeEhYWMBj(W+{0`sAe(5dThCoL+ zGiw}=5v$N#DEfz}>Ik(=l2qXS%3zRIdK=`hAAxkOL{%lr%jUJ2iOWeilIGI<>5z&@ zIOJ5wxTHHyA-;Ngc|JMKKj>4ZQ%?8NOKVo`#|l{>rRj9zL)Kk*ZJ)^>_7={h1bG<s z<<S-gt?Xp%2^n#(>fElozr@aUBS7pBVmSS_Fqa=HYBT{zmdqc2NtV&2z!TplhnRKT z;jO7ay9SZGGyG_X-DOt)ucvtE>7mreOC`fy9VTBR>PtSw3t=pk<;TK2o;Z#r&}}BZ zIn|5a)GiV0wahfdR`Ca#c5aip^0O69sPnQ4zxDW(p01FlWsJ8v7$YCVo!xZ>e#AOt zfu%ZOgNK1?(8djR%q2MPLq$_Xd!6smhq=_^WZ@-xo0~Pouv{3(7N5l}Z@2?uzkZXz zP?*I|Ig7y1i%PE<ClglLh&aIsB}AG{#>tpN9DDql-}H}{B{$lTG=Faqxma>kSYr;; zurW_&)fIUgvfs5>6FH_S*uf=mw=fDPU5I3UsQ6N+k{>#3?n^L$sr2`W+!Xc1BXc6o za5nb&CXD#iC9;d5%|*{8{bMg<$y&+IRA}eT2Vk7Qd&O!_(i{X$TUD}BSL^Q}m{n9O ze8NoIwlZD%jRnvYVRhxRM=7{+x^LJ;VSWx1|HPdyq^7o^?FEjd&=1Xa=la(oMSb;4 z)rKJZj-z`#(050FNk~GAOCy5fr7v=rA|I`pLu-EESIU^a%LM@sX3X*$=h;Tnln1^f z=O04=BNJ4f)o#A1r@+oVOrsuRXP6dvyYw@4cQIs-z2_P38Ejh-#o_DqEPdr3FH#5p zx?pwq*+^!^XxM^daCqR;>Fv$>>|uLbMq6zJx-53c(il$)7MyGZ(Y9vaW2}%|=Cr~! z($XpgGT8iNrPWw*DYv+^F392cmiW!HXBSja_GgA*cQUnr0NWnTrENf6E^P8tZR>qq z>6Ej_0w|)x>4O#dWNr)=vi;t8nppJm4h!qB^Q#Fv_3911UpGAjEIhD%4AdI+1{xi% zdWv=5m$FLE1yht^)ZM=BzQ0!gk%OPytZptNzlou=j4>}ZHyf&P{IEU->fVlP+|`mL z5(pR#-<g9Rb3L9^I;<@dpczZ^7{l5Uj>l@YPpVEdjg}4|x~Oc=6jW~f^vl6u(=gu@ z3gd)&F*Ye3XDMz)Liz9}hK~9kv<bCMv4*G(s^YwF4O_2~@x31B{%~^qgU}|#TQvE& zm{s|}UC8#57TL?zd*d~i^5!Km<}o{|f>!AA9i<<2b%xj+A5tdxKDboOpyGuuTTwYr zim=<&9PS7F1q9R<ZJzj2N6vuhdc-ggJpYZP-H{>v=S;}Pl3HLu_Cw`xenms~wCW3e z2Tm=Q3X9NH?%H8@wBe;Oh|LEzmA<#%Dyh1QfQ-A@_9{3%b>^j>cB32)Zy_2SxBOXJ zsW3JNx%p^wCP?b9Si7@nOCPK%oTj7Wh#^*#<X;6H(^vz%MyP%5e|e3DU5gh_{6|bW zX~EI_?gHomst}31ic1wzx*EDp?vN!$nPqr^(CWfUi;(BtM~sxCTa3s-L6;NE=6SIA zV#oYzO-)0^+EU0l5y?o~&wf#mj^t_FsgmExy5<EPY?DMVrUMTbq$m006I)ay!#XKD zjKA?>63A{baUGs5#Vgv0o?jZRlG5>qTD)Lhtf_auDVwaeUNNkl@h$#^MdV4WqruZ- z@L8&GbBZ_b{Uf5;6VIbe`pVFPUmBeYCbq?4t_*GKcwM-r0$*^xb<Izt8OJvT%M`!8 zE)3GL_7%FCW!R28e{_zMs<nOjYu+PD<M6swP$t@OkKN7+KBu@_ilxZH<^2l9q}ur} z!7Vg)qjz)R-D20bVo2i7RR}+v>0QEE^ct7gC(pZ)vdS0Stu){TeV`6vH)WXCpi==Z z2j23&*a3!j&pmIUEXLEZ&C_dN2XDXh51Oi#F|n?zZjA%(T2Z@Mr~Tz^K$KxG#AEzd zUK$Wna!m=Pz=XLMJLWPwse@MN`W?1vZ5Wd!r11C2j9V+m|Ije%01cC9$UF>Zs*8OP zpZw<#4xEPY?kPT}(c4Aaa}$+~n_h#=bM18n;Ow*V=I&+eptctz58m5Zk)8YhOTDm9 zXT4R!I2;i0h=4u7bSrdC*O<ri8;e-{W=ruOE1E9^)OwaYWk3VY^%9>~hZc_L`%q`p z-{l#2lH8WL+N>v&x7;h)6nr7Ki8q51$Wf_Q)<>vgW8oLo(AGaeFvwo`gyTz;R)+%9 z*F-p^%wmmQFR$Si{;}OvHAI4D4hcXi#zdyWORQWQhZn)vgClR_pfW&Kp#Ta)Ak+cB zz^eLiB*hu-j36yhqH}#u<7VhA=FMnCsN3z<VXj0w8_^TYLEuw??>R59)&W<><H)h% ziGeogXOG^V0=s!ff&R+9<PH0{Ft<}CEFPRh3>s_nC~rQRA~Hsf?OP`<=-|<QrKK=o zfMmf-5cQXaOezn(2~U#Q-Z?ab2L*quSq16ohq|Y}8DfuI>&P8ymLpnc8LfavAt@3) zUr3;-zhZrcU5GmoO(AwsXO0<lp9Vj11Wy=*RD+{SYO5@Oc1E>oeI50rX{YY{ytoiJ z;3}vt0>`%ay1GX8w36s-lz^N^$Aj3IIanzR2-H$(H;am-oh*{9wHJ${7%IbB8$|Cj zVD0m}O!JCf&4ZW!C*NrS3dnaF&Z4=nOFJ0R$fS+;ot`!kT2k_xJmoMbgqghQlPJ(W zm`YL{O=DA?mr2@3H8&T&gw~s!QHs8)+J5YfOrj@*u`hda@$vl=EEQ;Y?{;oFa{Ffo zp={}Z#?}|}Q?8@PcPO(ERl%(3@6CFJOrOq=>l<vl@*2Al%Dvm_Y$TpIymV>^)=k9X zc2M(zq8iEoo3B#e(K&+CC43A}H2v&erm;Qb;iBzVDMpXnbqbPOK{miY0RWv>oMX(> zN)8q@4`shf<P+(^T4T<j%=X)J5cT|)nY{5=M!5%)9jH-<C300o6u)?a)o*B&ZAuy% zD_kz4kOQrSY5H$To)t(J%faIzUk8-^_lz-~sNNTbx765JopTIUE_GOsT2)*)3hNFn zjD4RA36`Ka;+-&s%@Bh3Y65?=trR1>vLAOkJ%nY>izHNi0ZHt3H>*FxE=Q(K#iJ|d zg?sOL)yA$leFFoxR-Q_k%)<z)hU=f&%M;oMau2=RJ)`l;VV&{|Hq#z4X#5tIetjAI zW@!Ls0+{;V%G54}GoMbZ%jpp(a3tnZQ@-mnjEAGTudpy52`NUiem8?zcWo^EO))X- z(m3N2W?Zko|2yh;Z5$Jnllj6vEqnV1G2r|pWyD%?`a>W91A<aK+9gQY?PUcP($7Wb ziFf?}D26AD|56O!v1%ejbMJoUB!I2@LPrv9VJ^^Rnsbx-MXXiBqZpnx{n`R2^rsM3 zl4WNIwuhyk#<T|EO2J;Wq$Fk867(Kj-~Hkx5s)49MMMj@S4#mj#WcV;4bw>*4^>UZ zTOr&#yU^gfqr0`im<1gzV{0P*T3$ZkNhhvEF!U--IDB6+OX5K;dUY%R6D<M;b=sPW zgg!?2l!GNmwu;Jwf82<N@v}OpUDMkHi1irk`(5u?Bip18<WKdyiQkSl<Z^2q6#Xfg zp%U*&)x9lchP35IP~c@*tja-l->dNYKpBa)JSZuG!3e8^aB_q&C7q1CjSFbC9-C~n z+-2U^P%cspfut#Nkp8QEOYZw7SYkib*bu9h!+c}JQ28}VDkwDd7^_%Q<+z)t5v*~P z7Da=d|N1GV`-fNqJk7kxveubRV)Wl0?8qkbP}M6sGtCHj_2t*nMSH%Mn}UypJS=m^ z!gX&T?pF_Q+}@$=V!*d#hnUcM%H+D^$rT-fsdT>#V%4c9)XF0|3p%U8NH0P+ZXc;M zsbtHc>f__r>fBmss)Rp>v_)T5pB*kUH$h##3fsTKmaPq=d+r;qtt_`A2R<4T5-3-V zK{-5;G;WI_{aFv-fn>tXlX@?MTE00XxRLQN@%D>&WPKUJ{%{+RKV_CL#BYagc5&?~ zvJ^q%%*8Ny-KmA5yYY<A+;tgZ{SlaeL|xesfnCkMc_)1ew+fi`m}=goP+JAx+zdMp z2gexC-FG5Kt!mcNGtR(;SkLE|Q}y%629!gK<Vzv5N=rJjp(K6zPJP0NW(%3ie_M?I zK^>R1uaX(L0B@my>qQ%O=RaP>%2`9I?{w%(M$tiMqb5vSR{2QszEG>?a%18Lm+VZu zifpAzEyCr4kz;&HLXSGiq)ZayT(fd7SK**{5@<xw>;8HIkqd9Jb&6C1R^CbTBNDA@ zU45ebVD+`pR4M4Y;jiV{%LZ*qe(!%tx16zR>m0U(k7~FH_s*C9wn{Qm|D|5eOXjiJ z_eJqpn};${Qso9h3TtS_Emi#biyk%uo%Sjn3CN`v0^l(N51mqX9{ST(OT$Kl@HoTq z6*I~h-{xUs50}=<6_Sc|L~6Ua582weLnWH$2`n!x;(r1Wo>l_}%9UugZ!D@H%Zv0q zU}Xg=-@SimATpUDT7U(Dr#vL=sNW-HHrXF*snG0S0((Bo#qC3}CJFbeJS?nCgi9DU za-qANOGIz1*s;=}@n&8+3hgv;K={^`^p;_-wuaP?zb6?xf1qG<Lx$=t>+hnOTO>f8 zvD4gbPRw>#wp5I2u|IiTsD13iK$E^%I2+5ovf3JP51otFC8nSTgLN^LVHbtDA+}0W zeLiSmaJ7;QFg;i38=+V73-Mvw|1?TJ$=wmp>be73#ZmRxO_pQLh3D|7uHlmr_vAW< zrw&nmNf9s{K8SfrL)_d#in;@0ayq$jJ+h}OpQOXv;Bi$Z&A+^kw_+-o*BR|EQG4-1 z!{DP3zrugn9jU74U@1WgV#l9*F8cZuvnjzMYQv-z@<j1fVAT;#3CL9fd~85!)#sRq zxUg|csp(VXVb4O$0JZv<fCrOv5e)g2VQbosMC<T*4i5q9G9dIP^lP#cQ}bf56=tLg zcW576;I4h@S$02CfM+V*^L}yuyI&o1WH-Cd2{lZGKz5M>Sc9@dnJ;?-qjs*kai3&T zTp}`3xAVDpB&rXP+^#Q`^hPAr&hvKew;XsPcAzIS++Nn5X!rcj;XbSD>1C^sf3<Kx z5&!?lP)SqtZw<JwbG^ZO*`m<z)P`DoyocQUZTnb50X#QQ;|<6gYrG_`PqaCB8}(M7 zYzV0+E*k^65IV8cnlW!IZrXu8?o$O0<zB#k=|=7tVXfR)0C3dVs6g$5B>6%x8z%dc zFNg3jF@N(1(;ekHDRD0NzkyPTP|sdRo@x^F#<;jVC9Rb-iAh3odab0U_Uyh|gY<<| z!SC~j*yG!g8hP7buxacqQ1Wh#a{L?T;h?xGgRjCz&y~;bGgvaIcq`M?=6`ZK-a}_* z_Z<oQXXt#=PH0~6y6gAQ;)bVmElF1J^sNL{X-LYG#g01xp*n3p9$E6Xi0sH3b8Yu~ ztg*m#G6`EmkPVQ7SX%U=Z5AIaz8VIcN+N9xr0r5n6Y$*TqZ%EqrJmU_1)fh>y*oq( z2TOfeSrO_AVqrsM`K`7!Ck|uQaTjCXKF3bEjB=O+U8qN!sk4CYNN1UkYU@mK%j}@3 z)l{7CFEFQ516f%b?_Xs}kD@kWBSXbILQq9{;TiBcTgXxO4M)`LN|2V+aV<-k*KKm| zmoqv`<ZYBp*p&A<U+zzyBBhE&GaKdCg!f6tjwV@wTq!@;)vj+jo%<@#970+%&aV%m zAYO}WRRlG>TNb*R5h!B(aJbLu6CJ?^8l1fMHOy}UU3n=U9IKbmCX1tY$B4bNMjjQu zGq|}q@mBd^32;03g>!3SyNK^(uVX+nqy!E>u=BX)8rEetY`>l0n552AEbq$l@UOek zl?czsu4qSyYioFz?!_Ur^k!J8mO0nfh3jtO3fFiduyrC%`xFW?`=7ku!3e70`r79^ z^5&<JK96$5I}*M>*X5=;hoY%A*YB2{!%$YZzE@W2PS+xVpbJZaZRQ~D1U|w>E}EvD z+6ER(SO$n!^C96KJ_y7G1%0IK5ZmM@|FGEGgpi2e;T#mWRLX=JiV8yXY6I{lAt8An zJuYbLJ?!4fW|GuE-q#`<@`^1{Z*RD>zW!W~GKdZ{GV8dCzot9tVba!)9o_zt_J=qq zfgtQOJ*EaT!H-7o(+8c>Pa(_vi1jpAM0yio6q@(>TfZ~YSu3;^^dlC3IVM32w}1e= zhG8oI@){EMt6ya3YSzrv{`MS8Q<+zp`L`!fC9Xzx4$%3K(hQU*IPv@&^_U$PKR-16 zM;Wcd%1(#5pf;ikM%^{#@zIKu3prrWFRICdCojQsQiow^m$b5;BXDqQuN&>BD_~7H z4r-}CBDWQv4B|fNou;vRS&j0W%sN(hmXHHR72DF}MB1H5XW)x?VJtHx=u`CcRAHEO zhS$%LdbZ&mwQ(zSTjXW;ImG3wYYYsfxIfz|>dTV2xV_%`qFLY3lR&gWHyt#sI}Md@ z>N<g#Er!FxckW~VPT7L)lTGEqo)t<QfGP?Uq~z$p!^TIsbu9I;!3O6}#rqiQHEs&m za?(!zRDC&D;I+<(@yPI#M6SF9UDM7>r@BYBkoWru_6W~M)*=|y4H23l5?O?GV<GmV zm`$XUX+X^Ev!tC}+Co_lBdcOg%WK8<>R-n)8poG8z40YvBZ77EVUv0^D`M4*VH*71 z2Eqj*tOWb^9`u;^pLOmYHJ3Vs<?cMP^=X+wPRJO6<%^j&eGs)=f?xLp%-w0zze}!o zjD4AfZZr>6DLr|=ff1DX)KY^!41l<mbK*i6@{$W;>`M5*U*VN55lVj`#AegBq7OQy z_+y)bWKY-=@TS?kHBt1UX_^1ita#x${x8K$U@eIDI^_~fyZ!`8%1Dadfn)5}q+O2+ zu?3<k%h1#8xlotPV25ALm>7f7nO*fMM}~TOqvG_ft}@ld5V$45F0_%S?Kf!~k4wh6 zn_XsilTn`)Y<V!$dQ3V6NeJH$;<Xq#A^<aplHA}29C<zv>@>uG0_dT&hInY!mVTs@ zft9E`dMU^gV)f*h<P7r-9l3UHshU-2>pLso_t7vaX~x$B9T#GQ`ccW_|08^2P@4VO zn*6|AAXoJHo4Afth#(M{X~!sk5hbve<HDQbu3UFjk2zpmNmm?6ZNWmQY;n6jwz3b% zbH^&OUpZ<M_^?y_41b^%YtF>~`T+l<U^Ip;u4xj{Gr1-YJ9iC<$%>7Is<T18{l-cX zus1etO>UKy56?9jRq~Viu*nciMFCzmOcE!&@;1kX`(OlHkfnBfoX=UkU8L(zv4|R# zOiLVL(b@kR7(3jeJ+%P;;*)B4Bq0hvUsBYya=l2`V_#l&84Y#QAMjEQChy`|rUNy+ zuU6kAs9t<Ma2G=+gI8CI<^QT|Fgy55!?(Gxq?9l$!`Ff_(P)IsVCna-5A)l$N<eW9 z70R^Ff<LzItvj;Af_o%4sp|)X5PaJg<d-e!3R{76f9;98F}KBQ(oar7edpqMFV*=Y z$RwvjuN+>w3MLb&2?9<jFBaDB0lWBf=&I1S>RyC1q>Awjto`3k_7;@0xOl;yy(sc` ze9=GOM<HmQGk9>6pE69GAObR`xL<30AG2Iq2(oe50%$<VfY4bHOKzhJbkX;q+0MLW z4MX;;USq{Wx8;{ONAz+~s|QiY>Bj^$t<fqb_aV+p3d%RlL)g@0QXvBNeqvxRp&!|$ zW6sJq#}c-s+yYD)`recG2N*EQc%W|I5uo{dv?diu9QqQdaVz)Htq>1Q4BTTe3%yD3 zV&Vn$26rP9-;2Z`rU8vVS=8yEBl3WaY5=#;h)Ol-?S7t>gSouz=5KnXQ06>ao5lws zv)1HYDDrFCa82R`gS+;!Io_qvUiy@_m!bKeLK%zh;J6Wk@5xy}QaHE1n~lrY&DX{V z4nyJ{v-@7VvnKxZ#n|B~WjkP|nnE9p0Dt_Khb|i1K{C{Nwhx?JWullPL>65YB*Vxw zOflA>l3e(uOEusQ%FutRhl1<UjrE(!Z>(`0&qkHDRyeNYZOy_tJ5o90+CMJhMWbfV zmP1a9(jMi!nxaGGQ|84Yp?o05YhcD`+_PCWiLh1%tQ`6y_**!}jz0xjDHBZFyy;rd zi~7}2GzesKzfdD&!TXirB}y!A$I$BB5v9=xnmAJ#TNY}QqNMUuU7QTb&}9gmt^-&# z1$fNclH*7q1Kr~M=VohKPX2v1w(VBtJPf>t<)**gUtMs~0j;F+*Nw0T^Dr5rrU_Wo zss2xTm;l$B=)kQNqC=KhQ%{`O>H%J47i)=Z+qF8RuNW*iDeR^-ByQaZv2M`p+Zn3r z%pUxz+d7Ow(wUd|h)i&L7_-TF3VJm3K>ew(c&I_eE~4_^W{Gane$r6<MzQ2N4lYK{ z3hd<Le1|xP0Bdy&$SRaDeXw1!#T`!WLoaXKIsVLR!<wr?lpFMo5covT93Bc5Sm+v` zDd8|rRth$!+0iAv7n%*aZaS5!@l=ZKyZ=~vwZE#C+U4AYS@ip<;mJQWyti>iTB}^j z0b|$ZTxE`Q#-dT+HU?sk82{5Vr8%5Ezg?6oQP`d&!DO<a{HE(8JRBw(JNh))3IDD@ z$N&LJ>w3n}(W#&Lu00!(lVG(;;b!TJ3^L?ZY08w}_a_f7e{K+MajsKVg&vycDI}uI zHr*Or6mT}3xiS%`Qw0r`D40lbUF`BBegOH-4t~#V?H+H&kp{>1*JMExJi&CG+Wh9Y z^NPQ5TZjoyfneuSuevBB#V`035_A0Cy~XtocaGtTIiE^k@&Rr!j%K#rVw}c>j*5la zimdEM+9%iZ%iy`ONcNNFFL%L>Y~e&0hZHh({;cN}X*?RrN5Kx6*17!l(r{=CWl+TG zW+Q*N!m_CeomQ~<dEF+?Fja|k?=sbwElfY3Kg2+8TZo0CSFiFQtS!Yv48V7FEad!a z&4K&64uq_rj~E(pH_z5ceu^#ySzEz2Y&ekQl4;lRU`yieA#4n1nvjZ-XxW3!x^l2V zN^4AQs!z=3xAb@3_Iw&V@D6yKG`k<E%6U+Xa&u*;(lH{&0n=%0aXDmTaD-qb2TU zr6*T3ZtI9J!NAf2Ole+YYE;J(Il8>`U*|Rf|KXoz?-Q{9&<=m%LnJI2t!_l5Sg+s~ z7e>;XF{)8J{0$B6bR9$1R*%57dXjn9c3tx?=CKfztPpjrS#+tW0m)WEGu{;fQQyCa z+j^B7V5G8BZ1i{pe!y?^$x?@%H=d{_4BT?T2bD9>Bblx<3%CZpUFgt?wklkjgOg4i z;jG}R1LDdIg^gymhBSft&_VXexS$Vco=`x@nHePvKG<(J5MK}56|+5%Yr5la)RUAu zpXsz*ep6>2t8eLsGhY&e;Pk7389V$9*6OR-sTpEW)YtU~eP5V5fyU93%mQFp2qg3! zyaD05JtrLOu&ufLVK=P+xGYK+lOkz!a?Rt7_70GnF3&~sXzMr4R0qFBXYoZ15rWQU zShnC8C348|$tVDHRCq(Y)9w|T^psUrrfurGa3Gh=onDcSWmAq|$i5BCZ=#jW0*f$! z7a;I=K2}iwxMD#m?zwy7z5Z%9ebbUVK;AtPca3rJpwtYO)7QIN>Eqt*8`RVc#@O=! zie_+pyNfzG6!}m(&a13w>|<l?i&B@&`GoLvP4QIvICJoN3ly(UH@eFsL+?BnCrx}8 zRD7dn8rH=|UmDj5vFHCMUac7%uV%}xxO}0i%CicmM*VQR;r@Eph?fHimoTkYP{@_; zEmEec!MM^u+u(#qG!<SNmmi%iQ1838Ye99vz{@cfmCoya&RG{O<Ru@y-WJq@hobT< zeUC|wRnc@{>58q&Bd$i21<j>HT!wM;>i6jvZ^PsvjPOesN@RWZ&6_){F6p4v?yI9= z{O@w@m)7EZid9R)FJnh1hJmcVQ<KsPKqE`fdy1mPwAZx{gFL8#i^i`?BkFo3F9lNw z$epx+p$^D9lM|c-!lKOmAvPSpXx21PXH?i*e^GVK&w29;Fd{-y_|&;~?9Xu#TDXc} zoDT4(sO|hG{GZeU+d$(J*^E&DxAuHtvI~+lPZm_@=O^o(%7o|plCxJP%%AHoH9wS~ zSuW%(&(nJp@+`!XIN$*0NSXV2T#2+O&5e0Y6C`hql0a;+t#4(G5HaHM?*U!%>&WB7 z)7k~CkZp}lOqP_glkzf3u$wI`4YsB4^UO*|%(f#Xb&UuKrg9Y;wqsR?Wh~Cjg$+gS zM_8sOEPItZxu}^|VjGp`YY^7?W`2PVk;{edpf9TpeojA*Ni_%LUd@G)UQ|Fz1nc69 z&HZPE09^Y<T`pKy9o}4j@`}_88|2x91erW8jI5_60(@P6AZ^?oNhja}tEmKF*WQVg zOY5(?6wazAS68Jq74k`H%O*eRnODfBjq6Zinxw5)Co+5L_akFl)2m@UDt(oEJF~#5 z4n<gqPaaUWDwW|78r4!o|GO4T^yrBU%l|N_i94voAHlJ3a}%5$aJ$XLc;B6Y624v| zpb*!~c18!)7Wo)&n_nV>jCMH!sRXG{@RjR3F=gE@)5rt(mQL7Epp4JJE9tGBb#4f@ zKj)7mIi2{BL09GRhGg_K@TwSTQ;O=_rWb3%Wge;}>C|cmnr(4E?dO)U&`$V8@p7?K z+2HyNoIy=Al&g#7&ni>bP7O!WEflAnHVqMJpI))X+80aXdg%Z&qZLT&gFu`VRmvUB z%AFbg*#q}Wl%}-T{a{qG?>I9aENjT)f=8z18?y;PiV+9G%84*&j#QMVt@b8f`R`^f zZ^JSTheRc#L=i*-Cm)XvTc1{^un8JcN4!WYDS?^%gg6UHQ4fTE_)hZRewqV>$D;SU zZ+#V7lKy2`bmpRxNQT%{%a?I+mJPIh0ofB^R|Dv`g$GeCF^0MqK^)QCGOzo?TK2$1 zDlU&wN>ejz;|f%>LC8%l_3PnF4w-YY$ZEs!Vht2vYLap?@Fj8RvtzNRSyGBH_<%;p zF+@c>+4)mtFT85t;bKVnVX^2hEVBv?0Dzt)xAFm!@QX?iEoo5+n|^tgGRvexSzUf2 z%9~RdrL||7b&g3R6YJR5Su}><D<PH+upb!8aQk}j2RsvUgn1ZN#0s?Z=Ty0_CIa1d ztwH5B3v&Md$@xcRT~6=cv;JJEha23+Q{*ahbq-ChcO7Pt(%G(@y!0as&at0YqKV)1 zi%L9lAqO8dD<}fK382-CLT#5jG#N<rX{XY4GWu{MLLHmRpebeP9^r7*C1jcC{53c) zX6vAOrPux8WQ~Mpnt8`K2j}I5b4_drc;<phWFKx2)XGjQIQ^OI5UPi~x?EzdaoQOe z9g+oI9%dpr{6)01TJZ>Z2x9|mT<J7g;cbV59i*=`zEO0DjZz7mxD23gCNr{Lhb!9_ zOKl09H_=y^VaxNpLf>|6uWW&^jfPkVIPzJ#HaTrFsxj_9ey@$jzK?3l6U;tPk3c}7 ziEFR2=c_9M@X$sX-QE_Tcr$nxMYTyp7=XqYVQ$W{QKUlKTLgRGn`m|CCc)FICX}Ce z3HK5EaQG#b$zZi!%H8s3uyoh(FT0gHtvB#W8~_nl@trzQjp8dBBT2fil1<GeZS_H# zrOV4?4yL~$R$JyWYd^LoA!PmZ`u#|J)=!<CBEcm2Bqf8?3l;8irm*gmxUer$t3hbf zKgCncDF6s``T$(DbLjK|(er(hH*!Q83&C-!$6|5FvAYt4tS~U7>aA58gjf+i%?oem z3UWrAQWxiL>_n-t!e_t5{NZ<Ri^`Rt3b>c#w3sW*^=^8R$2fajej?-zh^Pq&#mVgU z8(=HwpH@HE9Zo<9Uem|_GwyxR@#~Q>b}&Lne%z(^d}`o|^WL?gY+YM~z5#-K&?)U+ zxtUMjxU>rySu&JW%`3tja21_U=czRCAvQkP*BrNgWa3c`<@7pwd$e9cxNEL0+9?O= zkRYG?7+^7f2^;$n=vlUX7K#ORs?DF(T;PQ={r~;}N<aa|=Kp!?V+&ZO{=5C3y_N95 zGTG`{gGRiwRznoqwz%M%tlXC-4>p~Gw~=X$|FOf$&pMIboP18$LP5#<1xizo^&@6I zOV3(_h~tpX^RTEx^w;O@SecW6-qhBc(sHK;65fLfN}AM?kmvni(QOXq**&h719lSA zK&nGRg@iISj?W7cjI4us@U7s=x---1D(=vUor)C$^3hd2B+d>BJRs8_Rn{;Cj<BtF z=vA--H*#4xU)tnH;Hd{}akS5T@ZW4UQjR}d^I!dO(c<4v__h8%(YMsA#jX7LiJ)HS zXVr|aQyb09`q$IXs3gZjZoh+k45;5VzIh$carfnD(Gc*U8upTE;6ytfQXnl`l!lyF z;zrHo`*koeWiMYaW6bp05WzNU`gBR091%Otl1>}@52)Y2!1LZaZka-C3dq_4k?(Qb z@jQN3^K~B!=DOQQY&h)|Zwe^!oa9_09dCMGm|<ic99`k?ahoDRXGyO!T?LWjXGAKx z8dY6iXr<}mI_6wb@5y*ApR+M3*T~22Srgy;tQ926532whq5X}?qL$_(qGvh6@s5Md z@i6gjWHcKF#dkKc-KJIDX-XwQR>-Zx5P`ez&p>1y7D<0oxIw#;e@Ih6r3kLuqdV_| zMAAC)9^;o&B@*i2@c8cdNqQ;KQ-{)RMKn>Z#jE}Gy_*kAyYlh&8Sz?*K4F(sBB5RN zO-<8TSA&AyA#)9BsDuZw&rL)#7CcWFH*V&OfK?5N3OoAkM_kyMdK5h=AhkFL`~53< zT!Q~5|5GM)yzibSO?#I5(Voa5he!#6Fr}Q#!Uoh$c<Rk03Q#SE4D5^&h#*6UVTZ$q z&>y1J@|5ATyN?u&=o_Y0qZ)R5;uc943-xHzzD}stKYc(P|B-==%M9tg^8gRTbYC<% zHH9wa_krw=(0ezf9zP~6He)^>wRP#_ofTW37H8O)TeojcbUe2mhxMlzMY$qP;}=Cp z*by_b%^B~B*)i#I`*axipaE-ER6fBfEsK{ozS@xax3id+j)O#4k~kcQ%RR<-0?atA zwydc@+>bD(owleUK~psic8YrmQq1FtabbU7Td#rR2$_komTv@UVdrYZ{X6g51?%Oi z&ora@$1U!@sA;g)lE1qa4p+U$O`q@Ix)ZRsj)q+Hf%Thq8G2Xbt5wa{rF*%e^3vEl zQ`a0!ml;#VO}IxiZny0zn6isKAJKJjZrqn;mY|Tmv<ZJ5Epkyc9$1bmKfc8O00G;4 zXGoP;KodH>X;ZiVZt<#U53~?s-gLz5QBnbC&XY%jm*ba>zw)47(qfJ6ypqZh@$8={ z=6agl==ZA=wU2DlLD19BK=M>aRU6v<R+jz3WY-7VjcWG240~KP&PTP>0{avW{anwS z!NA9icNyW8TZ(X+i8oG6ofrXs1oq4`NAZ4Nj#~X@mQ4}7;C(>hT}Te2?N1D%ou^)W z6imh<dvCqE?k!)h&if1gC;no<QgSnl|0l;|HmW-(%!9`|w60`txJRZ=n&rPgnk$%@ z(3IO)ummDDg+GSFkX(yPe^!F5abJ3!?Dn2E`3Ojy5^alpY3RzYN}VWe@S(Wt%cj@L z5|Z1u-54bY!GO?x_*|;!UFt9UM<N)NW-k<Xq06z)K=ZXdZ}g2I`dcU#fn(PZIN0?) z-`e5{%eE9@K6|t1_4<*55-!CZZRp`slU7TQ{ie-{^2&Xa%svgI$B8;wjWcmmYL!C+ z0W$=vNRr^8>EW3Q_1$jQ@#kZ#iibYrX(Qu~XIscf%)!4_!np@JmjoQZ9Fg16_5-T@ zS`n@;Vj|7Lk|$p}I7kSYqFVWP0}(<3rdJ<qyIqbm*1!7A-YZ*3ibGa`oMS0>4(zhS zaXDat+Nb4F*7^aezuACa#D`VpvI*4RH<G^Wz>ZcKt2anNtRQ4t+B5^rX!g!CgceG! zY^m<TZ*l67In6i;;s6RMz};*-OKVEoyYYr5K8CEU7)pz(b>mUSIPc*ofH(KB!N1UW z1S{I3E0DH*us!7wPQ!j6<+vr%jq7-=@2G?Ut`=e960dsMp7iwC*I8U=;Qpmi{;B8U zy>!{0_BafIP14_A@>=gX93efAuV7+jr=UbB2V}q8`nqPp%CXnHV)sX&<Eyt-Qh)Ca zk21hwGlJp_^dje)Yd)Sv&mX`#+<dm&nYe-P<`I<3<pBH@U;!BMf)*PC3``|25}C~B zT~+>TSB`J?oFt!*18{9PS^VFQHuz^BQ9jZ@-mP>!NrH>ArXwminYTZlUhtYy8y{G& z-1*&-HgF#4+bgu**L}a2V9{yFN=`S2D7|@a0;|=4ofLY&eF6FfWI-i5E&BoHnu}TU z7;#ZodK%i{bqTHL+h*{+nT>qimj5X65Kp0fawDoF;01K2SEnhDg&L1Q=b{;;0;D+r z1A$Ib3JP)89#|V~i5FTf$Us*f(>m2B*t8Z=eDdIPi2;VFb%AT&K=%O)J50p)2ct29 z0!y#<J@`r%8$1XOCUQC>;6;dP3IHE<{hMKdg*(%Gyo&#L#pg$;&JOOm;fX2nJy9dQ zZ^lwwh5$4>jvG9^4GWRp-5p}Ax=mKEZ2t-D-A+GRJCDLaR(I-(jrrE#1-#IQicc*e zv<gz^G^<ow*QGDNeMg%J{`S_WsZS@fAGHK~%*kCPg@LbU*8_gmupbutWL?hD=!50Y zH&Ix4ga7v_xswEOEp^~XG_AlLQHIlmqVjUxZn1nPrJgysEJ{B<uJnnXQaZts&@u;q zj^^oeD+MmmY%~<W3nT5vn(AdQzXMUsq~NDs;57x_`m_+f*Hs!v9Qcxx1UGbkpHeIQ z3}krpfpdz<^nMu)=sg|92+^q`U#~eW_=gRD;&Itu)ZLvYp+2Q%L`iGedw$YzKPF%T zn%DwZ8fpy=4sK<h(rBZ{1D`AnD5B<~PD#VJ$DAI#k6`dVMkkcD!?w0e?yiTtl{UdO z!$`+TS`Adxl-@}~D7fMUUl2c{`kQVmULg5d=I>`fB`s@}81>r7NFxp%Kuw4hxwmp! z7U3CM^!!}}uGAzYJ=6CIKr<o)7fpd{w0ngv;7YRYY>gRHo%cQPpWyJ`x8fNiWD6eC z3&2MMw?<Dj<9f`Qz{j`tpU0L*Ijv?-do4dZ6!>}qr)Sa`iW$#tPg2}?p|(zp|H>Zx zOJqdw$QA!wy9zyV1n$~IUT>}Y@%C?X-!)5y64^5b!O?2~XasJu+v3EuX6qqcFM!jH zj4L#0IH=ndnK-|e_P#-Wxa#7ih>1k*a1QI-1&$+uW_mv%&_5Er(&8BW-D|||U)wu6 z!rc0WF}1v;yu8x8&6!+_M1Z5x1ox-@-xgfg#!yJ>em-4H2f}(4?~|yM_CnQP<Lvr` zytGq<Q><DiSdv-=J?1Rn^ZX1hzm=it-uLkLm(*?~!0h9JZ*zT8$^?U~2?Hgzo=FGb zHr9>~roN7AK#gEsbXonXfN|4(=J|Mk*>(SaRrVG@QT=bjw}`+GDFNveq@<*zL8V(l zx<g9oW&x4z?(Xh}WkH&y8>G9tbKkT6{`dcWX5N`+<~cJA%q-{Z`Sx{vuA;6uc+QgH zd3fqF$qU@4Oz>~fF`Xcx(;x+Ug07gcLrvXwuR}|{&H~}b-9W4KC68+zQURA&ZTE}E zfA3Ml)R?1ZOackwY{&>rib80kLF&Pve(4Xl(Qy%H5`B!VI7;;@si8+hXXNXx*GtL; zJ>t3&{ouPc*u5~^gf}+X4efmejE)+y>-wACw|o2h%G<J~9UY(Z?38tF0{9^tVwb7B z_Oa5VUQgRzs_BG)MD36li6>LNCZqZsif=^_bAa%MQE=1w(nV`WPVLOi46IWo!V6@` zY0OY3BO@y-HOgkp0p>9+@qgN9z5y)D$h1%v0lW4~6bjI*HrV5_qLx<4FvgG>r{V5+ z-p!2HqgpDTqjVaag1g2n_g0@Ncv9Rq2+7LIb`iAQh~=SpKS1JVimMaat-bEGNCn+g zFu2%^EoFFLhm<~m$KO$!{22)7lC3{FI<m#Er#_c>(g)?Kz5=HGh3(~F635>HbD%%0 zI_4mq7TTPHfoT$%cqYXj-e_*AsGAiZtQDsg+p`U+r(y-b(dUI;o}Pa9I(OTx+@?em ziB;pLTS&Yyjft!*x)AJkM5JJXLHI;&5-ae`T}>COud%O<;Mko988suM^Q)K5x>DFT z`U#c#r_}H46}=NRBA&YN#fdHF2>Qc?jS;DnM&}Nqo2%njI-3C%Oz<Lk{qtUb4%Q(1 zAbe_w6R+P5yOt|uCw^5vB=&jlWvQgxmjYT=Ab{TCv@f{3{S?3Lvdr4x_b;S96`N|V z+<xN@pnX%k>vZds>ws@1I<3_z`@-en@%p_Nv+gnkZ2&*KrhBEV#Ac=e5`-7B(e(}l zTRjeev65?KF}hoZPIE&}!xX*b{S)R%7?Xr!E}y}-$e^zHh&Pp+)H>!H7$NZCo5ncn z5vvEq8sU=hJISW))3ih_I?ex(R%3Uy$J@JX8u5@Py0-wYzr_gtU7dQoUapmG`%uW( zp^DF-ZaZV@J(K35mB#T#sO9By(|O2f<KoQ@?%2(2RReZ$O_S%G1yi~Qa==n_7A*t3 zsbhWd->bXRV57ozH&L;%uN~iU-U@myI?k+i1>x?cp2o}|o$(8(@Aq~M9vjJNJ{Q{Z zBv|yip}rGxqK>xK2^~onez93%&Lj_GT{=8^J@c}9bA3DNY)WAz!k}&5m}b+iORn8H z^I(`o%RO9NQ<E6-cxcVIE(*Dv*2-xPh&1T^bNS~wk`faSIBnn@4PGA*=nJ`!W2t1^ zAGuHojZ+sO%%4%A1M+mY-w82p+}JQS2`xb_`uTA1vQ)Fwd;1S>;=cLsDl11%$*3jt zFeRv3mErX9sly?wt$-|$b>lij=9K6`w+xh;%L6P;F=|F~6O#-W*G`)A5>fT00p+dW z+|p7wuoo!6TO6m|>2IRpf(1!)LTn}*Sv6&)P<$t#Kx)5s)4#lWcqO#i3+}2|@GG@0 z@0zjJ3Px()|EWyoqQ)e7JN?+F$wQKHr$o!%7Vpo>e1o11q@=opJWT#*+;2g%U9=9* zq+V%Z-ipU-+)pW~vb$Bv9fZC9c0tyA46A&;tOFBUaB<|cl6+(z-;&5FsuSt4ku}~t zG;7xO+GN!8{;mIoJesZr+}qQ$cG$42dd7yszM$TsI{=EZO$)7RhHnQr|LsH8#~3cF zQOUT7>h2t{;$1hZCqm0&czk?(Br9)v+;;>9)<(K)liujBNjH=CVP*%9Oz{g2%$SeY z$5S+)K`&K3I1mSv+k9hVkt9RYywk&-#|Uz>S>+e>7cZwq+Rs%{+$LRv=g=w-_Vs!X z*LwD47|^mJ?g^K?w91VNkr>;2N=LkKC?cL-Kq~d$C^-=GM8L?|(BciI$QVziXc#0l z-V?aMUMvajKg#YvdwFt8wZqVJoLhowgu8Z^TUo7;CxE47Ek5bh7Uu0XJ+c&@YVC=j zMuCyouvWukKj<f1T!S3w@hE@RYjbgUJw?<pRC1D50m6|GOYL6LpK9PZxh)wslGj95 z1(~2K;qPH{uX}(Wk2VCP(gJtvC>f)T_dS;*erDVbnpV1;8g4$C^&S72C{QR-2G%&W z*6ghwHPej+pB3cJ*~RmC>`g1OfN3jU1Y3g#ie<bf&QU$A%d6gLjn&?|Th00reYl>q zvn~V@oa?KwW|Ri=(`y^^=b(T+S5g)ZC|oA@9?0oUi0{r+xD`6Tx4K{8K3#+<L=d%E zdh2+8Q)M3?@4B9|*6a0Z6GpS&9%(<;d&0wf9QM10y}vpp=3UCMX6m*v?#_Am<N$km zln&`n(DNkXUUb0S8cHFsMal)IM=3za8IxGycq+Rn+z5~{p1D>D5|xpQoYrkcG81hQ zMm({)ej?|oC@GOa6;4*Aq)u*qjwUn}5>t^Ty6sh;bKQfaeyQO|guhaL;4t{Ot_a?8 z!K>hMZnxKA`c@?KNaOj~($^&B6Rw6uS;@yqBZzTc!RwbZBxhzJgrM-5@91{=B#KA@ zR*xiC&^08n%z!QL`*<7^C^huknS(&T2gVoYI((!dsdevBdY5{ag-v5P)#|E_KNErr zIrO~31kstI8rq<nR!psj=qdWVL{o}p<F>jHC@Y|L*_ZjjWR*x3iNj%J(}|(!XozoU zl^U|aKhAcn9l(85elGcb$tQJ^kP96f8!3AI`qm3;zzS^i#{H%2TcU#YDkM`Ke#Dyr z*Nfr_Z-{^wiva8#$LSFoWMs{2t6zXyP@WcoWTCU?Hz9v;b4^=yK$v`W(Ay8;d7JN+ zfD}{BgI%+Pag}713L5Y^U(1jf6uxp2)gcsry-OHey>^PGck^7=ZI=doKFkjlnEO); zf#^1gM`8UFY%I`w8ahXRPBR{?1Z?**LCdN@U90~17hdPwUOBaPsZ2owIM@>&&rytz z4>>B<hLnlldiJZa5uzM2VY!9#+pZnP@SLjR>i)5RMmLqG%O=_1OyNv(nX|j>l+~}r z%IAAdz+Y)JVrc^<p{fcOl#n;*!Qc*3z?_<Qect;7(p~6tjZG;wvbMCD&*lM*J_tDR zZ-mXW@p#ptv8KH;x1T@UD-b`4V-*ozf2&(O7eVXT!ulwK>$V0QkVCCJ5BItY@2!)F zXMb)er1kc%8>X`iS*N3<!RCtOBZlT+a}nFRS4(gC$XZSxR&@tk9g%2RC4vI;g<;U% zDpe*q2S1fc3R<mZckg|}s_(gXibQ^BR>$ssC<MkLAGs{HNA4S@?bpG})%xE8O>!Ow z)%z%fI-{6LF5LvL4(AIVT=o>4vX*L0Bcf5Nf3c@Z*2D7xF3O$E0P1MhN!|C<Nc`|m zd8-3K95#ERtoRGykFJk%Qy8GFkiD?U5}qA_5MO?7eI3P0I+x*(--n$e%V*X=BT}h^ z<~RK}uR-VY%e{#EAM`ujPMZ&DMTb)TZui!rx(%iWYj${fYUQN1Va=;!Jw`!%WU;D< z7wInx>3{r2IWjY|#tHFsd`>Z#9)M>j+;%25c*q~52Gbb~Njv7Qz-`06f7`pMw8pIG zcTHI>K`!}dlR-}Gv*aVV6E@v(4YC3fY7MuszZ<tjL=3yMr$*KM^vw&GjAFPOXF^9Z zNNu~Dq;hY5Sy6L`V&6`L-x_ax(j+Jejm=q{wR!SXI(v(yi<`j3D>y_-$4~SJ#R9BE z7J2Gy7$p(=jDsVSXs7kP)9-hhi2d>5!hjrgy5xRbWbYr1^)rf@3bx+{Fi4K-|MVnW zF+%Q3iR-^ZT5_g-U5*z0{nTZExq+Vf<=XmsT$`QdaE2tCUPi>t`F560qJOQ*W!)FF zk$_Y6ldsm7v;BI40cBeCD@}S3<Zak+`!D{Z-#XlkAupJ%Mr(~mI4ZL5drTVnITX{5 zSrL{8r6mqpSPkZ<nP-(4bi<ur&2cc8FiK*4!}zX{7xpWEnS<wp(R->QQ?u+T)QlH{ z<JvzZh}x@A$pqOFTX>Mon+ZWDR|pruu5=rT8X{Z$@hS7Ir|}g9&YcXxETTx|diHgV zhv(dgYA8ZX7d6C#H#MfSE(vfYrI+LyMozx(GxaY;q4f`)IH?-ds=8ms%zOkrS52ho z=_L8EVsI|K!)4`g{Va`@?Bl?_X71xu=WOMw!Ga)#nb)QmxcEp3MloV!_09WiUDcZn zvvv4!)?>1Tsc;5HcD4R-4OZZ}^?|ur3zWg@uS_x6@!$?jt>)wQnR+iKDx!0paF1Ir z*tHj2qI|A|Nq{@-(vz5Q%RYuT1ZXNT-dL%qz)u!q7-%Jw={n|=5e)v4fR#FCQ3w5b zciaYpuoprORGEA8qp@Ow0A<!0a!$61I%`LoH{x+*e*>s$;f;+vgBijU65*tZEVY|% z8(~v$LEiB&$E2N`qwOa|Wd5Ya%emt=e|dm|K!$+sS-|icmP=(G=RJ>$X7>{-Q(>W+ zosht%Hd;~-3Cy3uh;8#%_O&kZt7YWON>(yHPaU>kM`)YOtTrL!K?5{-`f^FB=P}~< zuSr&ePqM<=0ZYU}>1*4{CsPU!*cJRHHIdG?mjwxwCXmKA_lv0XSkKbZezlCZ{fu}# z`U<|Qci%u64!jwJ1taJ+?m4^cUoVklbZt5t^rv$0RL{38F6&(qfgBZITBSPT_jaeH zfMf@YB52T42vk&_TWRnRR2>KX=)a$zLpvGT)cd?3v1qZdy%r*~y~>dRMx|&y$M>uV z&B+M-dY${`36W0M42>`PE%q3mg40wS>oQki=}NS4dssa|J76i{%Tj2GU!Fhvqd!|$ zwXKuta{fx!>(LRsG@1J#c(H}L88qEa)VOrV${FM;Cuey3hECqWwT(LNxWbdJ{;?KQ zt}QBq-<O&U5<K0oO6ua040Fd?5?t+i(<F48ln?9BVp%p_aJiRjN~h%{;|o4TC#I?p z6F;xD%wYA{mAT1)-BL6zKIsf~#$bgI?N5}OXsp5m2>>J8Us9LL7zS>N;wFfhLMm)% zAjp6{Y{$`kf`-`No)E&I5_6wF)}PrlX+!-QOI;p@tUYs>V(`Mw`qS9M*ULbmO+S$0 zyCETn_ws@BanBY#0y&t(K9B3Y-=8RwRDiu3kI#Q|$f(y&=caWEIAGiI<DD4q3WLMK z(K5Q#lw(e+hI1@TQZ9t#^)5A-bgmqkq##5L<}#5sm#*4*yS>MqszSkq52_17G%UZX z=M&aT*fB$deIgve{u$h)YUytQY?9N9q;~Ascw6GUvac6qtI)Y!XFB?)5v}5$xYGd< zRfb>{S4Zxqo2`y4Z{fOI#^&+f^Zb`<1=_Z?_Rq<RT=$8s_>tg|s}*873QP<Yp<(Zq z&M;q-B=vOK^%GYRcw6qk>&Y?7Q&jYI=)+Uovi(^vFNMbM+=<=EqLXkk{`?1Z?kHow z1)y#gkHHLzNLyPzzD5$AS14Iom8uZbk|L?z=*@utgQ9AEHGpN3q2<Yf?jKNyi4fZQ zcBOI24iBXnwHV~_T@_ii*r8Anjo*Lu5@xc7AM+n_-J`$n+V+w;XI53&_Q_2GbR!mJ z4E%UCe*=i!S;KinCa8APc?cEO-Q}HoOjK0CffWS5ypT2;AeYQ}+#h+)P{3*Y&f!fo zI`6CTGC@@5apTSMx&@#;<qV|)s_QUokjQP7%GCiO#%+6Ym9F!xe|1o<J2#-t<aMzD z$<BU)=c3xO6=+?(J@zJxD!IiWs?UsmV0;7)OS1lB!MVFJ*uDDGEUgx&{}})&+6qfb zQbvO%h){?U7<XILbqhlC2JYZ=R8dU;dKkKmqL(CmPz2~?69@ox10Me@{Q%l4Syxxb zQ1+&C@%xy{WLQk^ADc5oM}Xc@(Na)Sxi9zOM?Nk0pY8Uap$;4#9wIU?8uRd~^glh` zpIXDNtf42gxMEgXJ)f-BrQHkrDPV;HX+OrpocY-!dX!z^0HmsN{x2F<Bj&Y=<e}4^ zJmN1=t579pq1JNjW25Yh(#fi>sfm-8a-{|UlLK$Gj)jL2^PTf=2%)i><=mR0E}C9Z zoYt9}B<3Z%#&EhI|5icLec!6x1|O|uDRAg!2X*|1%VaBn)^MR=J>7df9M($$3-%*| zdny}F$4g=1;h2uW0D3#4)~dg4)*m?jcAFfE(%DZzu_>eK0!{e7OV21+QHvkpEp*$j z@D8sXS8mA&e7)qpH#ys9%VVP3PnQi)UpdErp|S%_v`(pUNI(cLB&PJIth~IcRb@xi zX|zr?U@Zq2$V-h|ddB1pJ&j#XqK$~~>S{$*8{OTwa3S^~Yw)S~=CNqhE@Q8MtXHpy zE=NCpl^WCsF!P(a{mX@O8Kb~OO#rW>b!c~k^8}!vv;eScUE+>ES6b3~SjF-pbOv-_ zAW^HyprnwEKfoUm;lKP(>OhHodbe;Anoq5vNZ%qkz((8)FqCprDuBXrC4*Is;G9*C z08VBNHdxPNrpiKq|2Aum!gAU@I_k-Ix}bBEH#T;;Z8{aw?#Td)8(}d6D@T6zkne?O z(L|iA(550e;=|W8_+63TUFll{2W$y|UPOkXT=k(K^zYO13e|!7-+ZUd&dU*QVxB_+ zQ89ABwOEq>XtDhpKBgN;ToH)ywiSI+6@UiI37NrLf$P*lo1M8KR`%eSw)i)7F^k}` zBM~FOTg{r`#)vS<aAk)fu9-q*I6ibJ>a(mK3+Dx<87CebOp3p4(H<yZsD{&LfU`#Z z1-zZBul@(aN<DQPk;uYdJ&=XP6@#{-dlv4foL?ey)lPI9+t?jKK+VO47Zenf$YC0O z=J#iAE@=7bs=?)QN^NXvD$gInc{4y2l|Z_nE%ejh2vAD^0Im(Oe7^*c&@l(cF-8iL zyqvl3;!;wmR=_|zTG>>9&t5*QQapVs3I)HuK~mt{0f2v_-NRWU;PFP)%(H>jzCDs* zS^}{3<Y^X*&74y3-|eN=DKz$>`VmOhPjax-s+DGcS{dzUR=8i@B7b`i7-Zgg!AIH5 zuCIK09IzlrY{DzW0dLR)O69V|2lSRa#jgU=)p=hX9l0RqX~%{3fjde7YGf*J-YfPF zF#x`tD%s^sQ%2Xm|6ksIl&vBJec1(US!?lHR*Lz{F6$WDjW(ZLDWI^YW7yhckuvnY zOsionod4*{67E>u>6iosLmQ;#Z*QB~0fl5Xxe~xv@CP5UNH^@a-M6%LQb!16gT0Ph zuOnk)UsUOU?&p_##`9!s4`!>pp?!&ogaBy%{jFwI7<MjP^=*h)y-d|)4ltj@225UD zUA>!#2?Ht~{)!>!s^+SB7+Cj(H`=g|joid9=R3gkfNpEnmUY|A0Ts$xT9%x}evpE+ z0b6w3b(ExnLhp#zlfC0hX|W9~uNx6Z3%e>MKYC8y@O{8y-~*SUvFpCk0`Hr>3Rsu+ zye;1eX#>-cg*#^H@b0MPn7q&>R_L-wq3D=u-M!s!<WHSt9IGiD?sr%9t}BMyy8f1h z&%+$*imZ*gSaAMdBZf{mZR;5u2Zyr9wn>%xq;u5mwHM4848XCy*ET?sY@_~Yn!VT9 zIu_M_mGg(Hz;1+Q`osh5>Y}gH!QY~1<j;tub!Dn%@PN5h4u2FIo1(`yO@@mgaW&&M zV+A-{-j!Ls@*|K<UD;beelv6DjKG~&H40RP1E2P0Jg#9IExLc76Wloi%*)O1<BSxW zh{m7|M5CVZxD_~MT6XmSY)q=l*kdYGUR4Rbx9}s>Mv*zg31GMYwT_t){WCYS?oVRX zwTwrwnouX);~ev-#h<J%xZ>-PLX;ou#z_Xmy0g(G18K}6vytJZ2Y=vg$6yRUG|N;y zxcR)-g{s+ocGf~5@*!G~2gik{FjAoA1bNT{o}TJwC{*%x{|TV4wuf~y)m(4kD@k#q zE&`04%&QzS!pfPshT;{nT{3VgW<>5_{!Ilk`*Y1Z-0-i5#^3BpN@ioM<#~pgdinm! zBEao(+%dYhH&6G+CC6PoLRV}%mu`;l>_YIFm6lx{9UY5~19uFQyw1x4o1VlsTOSw; zI-}wu0Kpwr;6N9xU>z$=Dk>qtxK7fKX3NXW3f*k_6z&WkUCzZmOF~y>>I(CXx-f9h zm|3kfVz8K=WIK~B#zn9273C2}MvpLl0_BgdEY)gnssCHXU1#j4lghFXN`FH><z~FA zI=F6%r2MlEFl9K0{yGBv&JT*w-yTl8>EVWC$s<fnP0=$me=X<;2@C6ns}ziJctRQ) z8ays1nS5NXJUbj?lyhrrqa|$%d61A)@W*SN)Pc6Myw*3EUPt@g0bW}!@Uo+vtq+?< z95$T?3Y2#p?k+9&zt}z3Z_l?C&&H2W0$1A<`RH)JN=qWLe@LwQU|!FT^tL@QCU_}r zOtMK&o*)OXYAeliQ(s-N)A%Of4GYyYR-O3)HpgULV02F*_eUaP-76!1tu-eRu$ze4 z`X4E0La}gV#pP<w)b@OcyTl&6$h$q1Qt*)W9XM!+-?nJpYYIsNSy3pgpSINYCU4Z2 z4}6HY0wH<-ND>gtx(^1LTZkS<ql<DGQ}b3}&mM{Dk$=HWdyXxg79L=<PHHTaS1PUu zB*ug$IAZwAFaW8{k<`s4e}2$J971nDEERwHu|IaBk0`H3_=Z2yUA}2lSS_G1=d1d| zrc&dEDI!g>zUzT!BE;|`c)Eo}!IT;bNeU~Du^{xj-ZD_MWY{V_Te7;@ajMN?E)doi zez-!TsdU!T=h5_^#ak>quI!jS42ikkqFz<u=UbFsdE=JC82R*ZarA;T)5m;by;0bd z7u{BqzHQq@+YEF;(kEX`U@Q6Yx=Q}S4e@@rI}7UY8l%J%vpyo~=z7#fIz11e99M_X zb6PNb+j^*bD{w;h%b6o~_zhHirFJB;mV);P@%ap{A`$7WzapwB&sr<P*J&<n*A=eB zrIAl`9fTt-qf2BP{D+6zQPDN7q2^nQ4TX2IwxN8J&vZM(JKqG0H379xO6OTej3O&3 zG1CyZS30kmFECtyl1j15*eK4X{LOdZb3?0f>Z6O5(^n5S|0vNaha1^z^F3I@Jmw?3 ze!Mnu&aJ&5QvQQRa=0^R{Bb|0N>cc1MEIe&gJ2z@IZ5{%WA@qWwbaTfu3C_rFrh;_ z)tG;M4($cwEza*MPT9968VAm!wLu$%?nI2#8f}THLb$mH?>1?NSDnFk84W)FBpe4< zk)vVf+U9PWsW(#Y5=ptT%c~^cq%=NqTG?j{>0#Y?c!_uKW~F3p6(wQ{aEscN6Tbf} z;7`sG<9r04k$beQ^OtC>;7pa*&|vVdU(ai6YgZ(M@31jRd45`Z>}yE^l9`BGKTFa; z0&8!C*Mku!7Z*m6ORVQrO@>Y^aCi{!b!i2}y_Asp|EGefUSmsK*Ri2~nf%*S6P536 zH%h43ZmIZK@$119+z|C2>}TE0bqvng?G<kdw$(B0wnI$#=e^;nVBGzi-?sPj#ct+O z-_kaf|0e?AmqUUD5DxTHwM~1W@rEPYxJuqbIQoA>7>wbOQ<x<c?2~>=HESb43YU1D zs^_}ZYqrKLlY+@17fAN6Nd6nG5XyyQsK~mZF;&OvKFg<Ug`v93742c;h%#>t50LO| zX|d5xTd%0wM}H6Z_xGNUuh5R7`rKtMtV+F^gxTy})%aXg1-aEVpIarE<|(*pe1*V@ z)b+igTgD-t*7Xs=aDBGJtXsE?szCT$h3!M^Z1Sl=+bPsH7APW5<SMJKQYr=%*TD?= zllKKO&G-HZ;cJ)E#QI7+o(~%6J`p2;J|^eu|D<%;eoiLa5_&=*K$~67ukp^J3t}Fb z{1tUTj|h9_@M9g2nU?CE!kb}K>e(3vJE;`kP1im2xbiQoO1)v_9~^rK{a6O5dBa(p zD~$$2H{BF5TXfb2U*Gb&E;B?GtTl#9UCX=Ui4YV(;$knRjK<=#GQ_fZ^a`!1*|&@g z(6>uY19JuBRFcuz6z|Rdtx<p7w|47eTVaKE#<*mhTx(AOx9)Q9#zj~)kiZ^BV5I_= z^^J{$%a2FSaL%?0$V0z5Mg)9vbKi31CV+^q)+2<&J32ZHu;O=jcYnj~y<iGyRM{a# zK;D_Wyqp6IX4wCkbY?n7JdJyBTD4JNt*2!absia4mKUjT!MZp3cF&HX3P+Aieli{} zaFbmYUS-M2aZgMwggcN&ChLFG&K%Tv?wo%&Qzvj~G5#Af&=6O+&;G_J9iRC0c1hVH z65-!mGAxLj0hR^~v8ysbt$Lq1VNdEpAaU{xI^y8IQuk0aqQa31fj&q2>;xtgga6}C zJQ`_%m-=%P{u5-EYgaDDa33&|n^2cLx{oE;?#uV(jc?q5it*2sX68_?D@LiVt~vRx zLch7V6MUGtxth<nk~z3W;2%U2G+Vyj7@byn_umTktQ8;B#g@|i?Nbze3FZDoOzEe8 zB`>2G<iNh>P9-ZGQuDbD$we=A-O?~4ALO9<!TkPiW+aRb%Ri2T|E00pvFqpWI*S#) zOtZ)xiBGVrBb36Sa|q&1Lx|eO97$uN4`15Yflg+A4Jn9?p+y}vMWpmFw3B$wX1lOd z&X^~lQAok3QAln^w|%mprb+=dh`_Ij4kxeE+sd#j3};Ra<3NKA(#d5dC+6(5f^XsA zSJQX!W8_|f()ZaLAGz`4?W0!7<9qPPz0k<HyPgEr$T_5v^g8EQ{8_jZ8I%2Hk4!iw zI?F`P2OC7eZNz_4394>B;Z>Wuu`XO1jM)|SjVEQsK(>=sZpP|cb}|ER2s?8=?)hMK zzHP%()fVa1nT?k<9Yi2WW|6x7g^#Wi2c?NGAy@&iD<Am=B?>wbDB*_R{rVYLRxC&S z!b5`YC;_!=BJ}!2)_qJ$HaoZe{U^Z-WDZ$mTR+%|oZ=GtYqH=j@N1bh!c9Kk3P?!K zMEJLf>?<D<!n-;Yd`CHLj-E3IVw+mI)}B9y?@LS^(<;95xh3y)r!kzm+nqdGp$DHc zyG<dsBoDhn_=Ycu{f~HAA1oe|f3Un5zFO(f;6Kab6zptdSOax_ur0G@`Q@sXDr`aH z!Ti>?O?o!-3?=5dB6rH=`#6#;xs9h-hqT0%W&vLk3SNWQaane~O#wRRFGeQu^f4+e znmbr-l@0p-!qH5=t}WLzE`osU#!Q8_bW2|~e|R%h;Ykx=$4MME3-RE`B;$Ll(01h_ zVDZlH!s(#AoaJ)fxW)N6{o*+Z)g9R4W50-{{>{^ck<L%z*sm>PA>Rpq$nz)!QlvE@ znpuSWp>vmgSm_fT(`}h8&v)IS1xZ+ZA>#k4hA-Ng&Ud=b_x0huxwpu}EO~>f&lfWW zJ131PaB3y7YG%WnKa@wf(MJNEUU;o@XsWxCG=5ym080GP=;BtcS1X*>OFbQV?lE2N z;USsQF;W%0#O%zYKE<x_q2goZA#-h!dH(ok+?NLCR>l-nv%yts#U%BDO3wNy@7grH zd!A*6#2!~7-PKYq{YV#@amlr_e)MESW)Iz~5^b7U{ybClGWH<-+w1*0WWxISQNF~W zwMPrBIoVNv{?quIRo<Cq1=Wp(`-x!MKTHa>zxVOz?TdqGr6`e+iiUJ8jsm{LXu^~h zSx$c+MjW*(KrlXga`PpKrJcKl6{aNg?7L^nQB~3JStsB(G%tP5QIn6ZU5UaeovT*p zviy?vnI{knE1}a#KK9T_{b4kGU7co6;FEDY&k6-u_l^ciI`J-^`%)RQ%Cs{jz2S(h z>IVNF!Hf-ItCZsxXZ>aFmtS;eg01Raty)?eEyp*Ev3igz_P!g!Z$TSWTk<W(#^Br$ z@5Q2BWcU_TFn5GXb?o(BRKn}!S&85Y*oc75C|O09W-Cv9e091BSp}qgODzx5=#y3O zqZLHcOUdHkarm~So<4lz!8U^4qB*@5iqLp%?YA0eCrArYuwoJMljM#p573Zn_@QC? zuz#6)V=7*zcmHH)j9K4tRpt>1W1YUoAr?z5c&)x-ZXG32tw7#Nx6obp{`&rF_IDnK zYLYA_Te3R$mBRUu;$Nai3jNbk$m8Rjl0$tT^HWER&y|NM-(hiP-#ZC09SW{3jUtYu z%f6`SX%%5kh0kZFzw?<E?P;+0pIzQCz^&)3)*__)7eH1DCLnd1$#%?PpwQ{jQA&jw zNW#q^puuJny(Tswb?PMh(l!vh(!B7?P!0t;6RV#efWY)kOq|+n@knaIqYkCD@k?67 zlF`7IFJ<MqzGiwDnWpD>gwt_ycRs;X-lq3s+wm9Lq9yrkTS$zYF-aA4z@xjj(?dbA z7nhfx+~U{a>TnbF>DlJM4FHpULPK`~cIa~(mc>DLy9GQpEA4{EaQC(Bq@*_Y7sFUq zncEH_?8JM%Xz4QYuTA~N_IdA;4qduvQ7rVF*FNh#OOH`%>av4kRb0^fzM)t$>|IYy zs;+r;U|}qQ+C92HR{Gk(xpLi>1-{0|OotF<5?ESITix0Ke-XID(8C%*+eas-531$b zK{*l;Ytv;~7B9PT6$HF70K3f)_i|Uwh)@WSB>u~yo%Ldqy~HD2AFE<Xy=Q%R$}o$% zw-NeKK7bFahY>+Q+r)g~s;m78OKQp<$T~1?2Y*O#YHEd%NIGWI8cd@awt>ZVlOgBg z+FN5IdHgnum+0wO7wlDx_-MOth4^$e@5a>fL{56F{bgqC*q?PJCc?wa<MEGxfZM8b z@8AsF=X1?|Bwxo1-xlyh`p>0!b~IP}->4F*yTy)SU_AeGX}&u6Kf+3oe*ZswlszK2 zZp-?-fb4zovT44EVi9)FxZ%!BaY=OUqBheRwkwgtUUHK8KA4c0_*a8`Nx6nL{{5|o zXA*qd%^F}iH8)UCM*N3UYts6>a1!Czm6bGa@7i4)?HrZW&69cWa7OTiT;X7^jjmYd zpHyc9Aq#h_>-rW0-*pH5^u4j?Gq=yQr}os~4Y^w|+NQ?#I5H_8`s7rOpR{+~h+b!Q zyMrt)@o2`o>U$2K9XXAsif9%XKi6{<tA6-zQU@eQ;rH-ixgkr8O&sCe27;GPjW`_; zy>Y+2oyL%Iur{}^j!LU}mIh_4>(fX;Je0n?Z&i9k)@7M8Ft<ke1M(px=Pj^Oe^I;U z`F1Mk?$YY5gLMi)(&*MVYSTjysZ=m(l-hH=6M(~G7ZnxVj3+=i*QxTN#^FA+V{2XT zp7ufXj`>Qj>4B>wPXcu&(s#)x{a{L9RnF3J{(=7i1*-T&=Eytl7dgv3i&J;>F-JW| zY)S!a1Ig?S)@#W2^x~DSC;n33MqZZC(f6({=TZ28J{pVfYi08*K;)w@#VoeOPw4ja z%+Qmg*GdS#a5P!NrOB4gK$I&)lc<jk+HZPA6FN6STEt;{d$#Ga;*B!NH4!r|X+DPl z545S}sXC7eJmOzuVbm@_{73spWLW~iC8g}WxPoiA?Barn=pjR!<cv@Hxu;8bFOgKD zseg`ObPw9h@40-`z132VHzciQf8s(q1TSqGZdT4472674HEE&K&oyBQ<18-@?Xka# zzXqb4HMe);CA2iqI9~B7`}~rC>brM`g>wkiLJURbj4Z!6RTD7m%T>yA|KN2B-qVJb zv1h#66|#{{OV?6Ii<q6MqZqX+SK8a5R$NX%JZa$9A6A}_$|s#cbicUUVW_nXtNh?D zrn|NvIxp8RlWs^{6G5p!5SH%7mmXm!?>)g>sW$jtUPaog0}<wGyWnDycnIz(h)OmP z5{imwn4@yWv<!<%Jct@u=H1n%x=+>@*uimRAL0#EWuMDEM7YpCj5&{5vsK!c$X^L= zbQC9J{h$LjA8USzB48@EG%jSS^~ExkRBe5J(<r2o7u#N^JFCRz-8N%`H`;WfKpv)3 z-e45xa3Z_Hy0?a*OBwlBJN_4=&R^d}poAx0DU=FG&nMa|dz+Bx<KK$)&gJr@D2+fN z$^{vW6TWo$q!M*rIs+GM^hvJ+IJ8^XPWQsNrQL?FKXeb8qz9Hs&fhB}Pchd>y~U?3 z2-1?6P;Yi9x??b;A@^{@f?WF~oSp$OOo9r+@1|uxI8wmZk|z2r;M{vX^MOFSLi0;3 z68g2%8uXBJr(WX(8bO9j{bI8y<#yJ#E2ucEsC|d9XS^nhwISz`?yCjWDiXn+{Jg=R z*rMD|$mGk%zK$`orhIv<&=DteH%N$dL^F$KJIXTG<vEi@$axmg?&tMs<Sr7^sj7Q= zkPopUBq2*}Mh=HxjBCtJ!u-L6P$R{u{q?y3*901WrXE>Occ&`YwirKuLB$t^&-T>q zWi1lz?DAzMP;?pBW8rxbO90z@h|u1{wCeA3Z(Mv4OeJx^{)8IYB(>ql_blL(9Bz^! z@q`R8`eYey7M};qqef!Z=IIE=<|vS>FWw8b*elWXH}=_P%>7gugBs;1_A-b55t?u< znvgt~(erQRL?LFNsABO-!7B#@0SJqsQZbg|HUrjHr^_rF%%#BASdTyTo`OIT-yU<1 zEm)y>WmfCOVYI=8lMceTBYn9i5_5%km`B`x!9Os{HK&wDWUAhn39^j9=vnhI+5(>5 zPTKF11g?5JDCCnl&|QM<!h@W$^OE__o#W;}14U($^bZE6-e6wH6#q)uJngXBp1K0| zCWHTG9Dbg>iJQ8@{c0(`3E<GZ$R8T3okMR=q0L$-wI(h0^gGFD)-4;Uu0_<{A7ylo zBQO?7w2#%$S);~aue2GYcwzBzm>Tv;zp{;D)r2=YJ?$j;{7ZOt?f&HMw$g%x0&lnl zELb9rkW@zG>f0rslCl)p(^HKF=@P!Vm1QLL)u|9QmqYAlMz9iC`c!x{Y)L^W@;p@1 zd5SAajs5zA!4-Q+)#Zk8po91Z6JkeJ%3gfZTO2gE$@IAK*8{iGGl8`30g^R{Y+SF@ z4gz~CJS-`mtOnkp>wzeKq;a2Ye&&E&uNm#Bic#gfg_{(1mf-vSqTY|N$~Xeb$1H)@ zLORHu)RteSaeTM33iQK0q`IfXUzZMxEm6DnY1Lq3c)wTTJ{BzlD`IWiclQyVXMLL> zrWvAcQvbTw(~iUY3FMW9C%i7QBfPDw_I3b0?Z!KTL``2=wQI~5%U$H7=AT+>g7xI8 z1-8B94b0&O!+V$QUz~OWDv{owym0rr=g5lbCCd9M^eu^`>jPorN1u6gBGN{R`oAXc zTg4hnI%?2fr9jV$@$M!m7xGFX?-LRHnO)UuijW~y-xC4vPk!}vXut==9S;doOBqyX zJwD}emP4*r4y_g4QSLhQu#~i+>Q)ZCDBOGAycl*T2`<(0gI*(Nxqb<m{3!ULT=8sJ zhvo{yJd?3nbgHP*SRcwON|Ez5xdSH3H!YwY7_Eam2GmzMoT0pz;-HPtn4om{M)4uo z@*}S<s%AxqgFk`Mc+tzWO2RrqGlt*Aj!|Il>@D<6#s+B4L;Y^;s4u8cOYK=_InHb8 zna_8`v8gK6fik$itYPA|ka1VZ8F@xzt~r<D&w?QqjKwdNM!(XH3mAT!oA5hpYOXNN zylK+-;~q~~|5*8a(^cBN|5ivfqC84v$C*Co1cx<(Brdy^#J$V$gBy03-F)B;p5wRW zxUeb?F1r?dE3V9swa!xZuZa9q!BLX~3T|UJzJH#uDt`A+FG3wv3clA(3Scc(7Xczq zz9LQ`6W7;1g<Yk!FRiqj_p0J-gYreHG2n)wyuoBP2eMbL<+!_7jZ<+Pl5g=vlef>6 zu)oKzsW7yW7Hs#3c8x4@li$7kOfhHs(0iP7uDASi>f9b=`>1CS(EQgVhtKK+I5>K2 z`P_ddmi-WLW`|#Ope^KIdE;7~#Hq;=YBeI{P_q1!(!%Y|n}(R)$jj*?U6?)y_KG-L z;+-3G%t_-B{7>m<Zea!vmsXPzmw{f0WGmz!))MNI+JFXXFV|NPBPcE+|3Yiuk~Kwz zwI%+Bsk+7Z#!&J5<|PJ+fV&^X?*!6IKJl!GyIus2Sz@@HoBFhCE|T&g{URhssLt3G z$y`JV7z$k*s>&Im$`?L@2x6S*q|CeevEJ*41Silg<0%rnaj5%~%_l@MIz@uaUOSs# z9yREOUO}=QpQ0~VK3Q|#C2!UvDnyJy+g48<IBXQA*t`F6n`?|pdAul;&n&M7+-eWT zNTVxt;Su<Gaz-kki{OB@@Ind5VSgYtfXdI5CsyO^a_zjfv#+?=nl7&$C2!PZhks`O zI?u>hBPYBCmoT}k6*tfzf~0j0f0p`oI`E1DZ=Xv#I2Vd5S6)LY^su_2*iW`>F4DkB zb;^p9W+CtfRD^i{e2?Ib%L<if(d52aJP&C>J_)*r7H*MpRqQh#k+naM%_=2QOY>Vw zTTfWFJCY8?Ni;ZUcF9pJjcvFd1gP1o8T{Bfh(W{{Ff66EvjlZ!FRh@0C+(2DwrdmP zA5m(5BSols0LiSm?Iqbispsug_Y6A@d?p$xM5e}rgdLrGy+om5@?^hnPAeztK7?f; zbz`lnY`m6tm0ly|%HG!`RIfp}>buxvU>dE!r6EDjmeb*A>4K6mH^Our!psyebj;CH zQLk{wIuicqpG#|%jE-+h4E#=;eO+Xo_Ca3a+pkNqbUv|j?Vb2L2E|MIg=Q?dZU3lz z#*Xk-r^Y|-HtPo$tlL4(3uZy-GqDcNhEFBUMC8iCa*2n8ck2k+X3m*={gQ(Fk!j@C zgENHwoApT{uZ=xDsPtTK-;H|RzWkNF2-@@tI|Jg6K4D%cq->fGJ!O&C7EUCt6O;6m zu6revepJ0+%QLxs@0Pb-ER~-u7+)-Z`5P9F$B#yPHpQaM{ZcB<G}z_xfz3ZpewfDo zG3VpMRYaT_sl|9T?M#vSxWC)j{Xmdr+Ig#7ynYg{`Mr8jS4Z0W{K@vFS6glYk>JHE zA<tV0FVuPAR(~L1oM@gC#ta*Kp%=*wC@|P#{|-P!D4xO_EnMFgO7^rbOxD^eo+`sZ zd~Wgtf{W@(egzJvz5hUyBi5EHo)e|$`PxGVxL)|!PA52s&T2Nl(#-B0UXSO=sje-w zSPpsEG;na992r&Qpx7JRpz!@R;WUetoH;`1JCY@DP(B}&9r_A19aNO*%I^W?AluHx z`2C5J>;5z`VLs4qE7%PkV<q_F68h6@AU07kPIJS!r&cNxJ5KAo^4nLwab<hOC45nf zrK=+4<FT;c3TqT<j19`awz;tK1$+7`3oWU2IgLf^hXjSvG&MJN+npJC(0Ah`e%D6_ zS$+dCh?>--{&RGkkY%&@F1LWSv$~gf)I%$T%8}TfePb*@#wvTB*j?5<NSI5Qt!}mm zQfLlxJEEpJks~H|PT1UyT6<4Ig4wIR-a;-B{!h2J=k5r?54-PgXnvf%J|n0-mB<`6 zYv!5itY*6-jddX06(5S_!;>lcyH0T4+1ud+A(_-#V3IHA9pGlc+|5P5;jlo$?jA>S z9_B~ZZ?`ifHWl*74-G(P>D5WV$s72e4bag_@(!WtxrT|`ElQD74PN@YM^5EnQ>6%z z0yk`3>tENki1A9)p?Ipb+R^E-0@|Q~04QSE4*7upsiW}of?S3)!(}Co(jm`_G>48` zBb2kLNe({MAifbwB~c=9LaWW6K`M%<8BY{}gonb#)ZkGf5@<0&{l4P3!(hM)4w<a` zc~;X_=U89OX*m}4TMKR(Qzbshb6J}QGcBAngin*)x38e|pATING)?h&<lPN4Da5Vk z6*(pQ!yTvzrzzX0o^5;P=^h^H9=J#ji&jlzdg(nYm-L9kUmdF`e?{WYW+N}f{u^bU z1ZsPjps8P$$aCcPkwSYDHGKvY8L^to6Hud@m}ivA_cr^K6gk(kCr;yizj9yQD8+@o z_3s60_uys`m-}~-Z8K=cwjoNUcBRW7ml-zkX!4!iMsb@kbMxM#6%kW%K2(7Pi69i5 z9o)HMr$L4FI8}$oE#4m|2W+?GiGmXDRyyDJTYtv4bzkuNp_umMtdnjeae6fM-eFVM z1(R{xs=nzJkBV<7KsFw-9ORJ4mN@<~#``^I6`;YAf$N=Yd?bNu%f~C8`d+Np^R135 zTk865XeBAZbvnr&T5NP{1C7eo1|W(_Cj)#oS&}+#KqHyiT5V_bCW3^p`OmMLiqYVD z;u4t3<4tcw#{;)sC&h(MVkf;FTvce+`>QH^wQ<HEM*Qemha#AhvvVtj$A0e~LwHNy zD%bpimFrrhrvF9B1$uQS{!YTp%GF48iYdj*r*9MsaHTai-$8nWwWibXm2fm`OV#mw z+>TPrFjJtv>2&77ec6s)Ij(Te)b_hSvZDnUnd|DjFY{e-ufXT=IsFvz<RpPd*WYoK z-)&-!Q?kpDo`l?y3+}foQ@2V9`Y^k6{VdBaMI;ih8!mlc*5+4kghxL|<~po}0WDtK z5&IDOAy0ScFM}=iJ77ciWml}_J|mTm+R92fAuIZ1lFA(>5k8-x`eMM~ve7j=wL&d( zFloniv2~Q_FRAQw!*EN{Q;NV=;j6RW?i^q885<*axiY45aU>TP%0`S^E{&`pS!B6P za#t!XKsvRmnZ%=RO{MY8Yua<9WUe<XZQS$!F{0zps%!bvparAMCy72h_{Wb%T<cc0 zZK)PT;x8J@-kD~sy&BjtIi5V|1{b<&+#@osw0lf2-pz%>`;aJC9qr|LjP(&EhXmEk z)xl><+$nL}3gip^u`Jxp(PkeQFb5)TZ0sFRMMI4-GTHd9{DNG<a_u{sWkR%ctg{r; z*wYqTnXB08Xrk03#}BN2TJu;6gsGGxm|9K>zDG3QEgH==U1O{Xd+%jOSKPMUWmy41 zHZ3D+hPD0#%uq<<?TUYO#sx^FVRtZ0Sy(x=s;X$@hAMj*!BvbNM|gohTbDM9l=;G+ z>B1d!o!=RC6!p%<YSK`|8AJ6)T7zw@=xZ9loe4|e<mVkT8xZIHiJp^!>;VqZI5T(v ze<^xZeIY(_nol>gfZH0UX@k|!V;yJz!QXoIXc1}fpj&&Y)>huo6lzj3h1xGdj~B|J zp`m>_M5fdLZIQnJd#bN>n$K{o{4WN}-mu;HH!dGe$(a8Eq&oN?@N4XsKA>Fu&-H)% d=-CPkL2@S2G>E?f;TdpAiOGwWf7bu?{{jAe<>>$b From 5e1331144a9187c5ab5b061d7cfd6e1f69b6d53a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:59:29 +0530 Subject: [PATCH 082/282] feat(readme): update readme cache --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4aa17cb..721d41c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> -![preview](.assets/perplexica-screenshot.png) +![preview](.assets/perplexica-screenshot.png?) ## Table of Contents <!-- omit in toc --> From 9e746aea5e51f786985e94766295e83706499deb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 17 Nov 2024 23:01:02 +0530 Subject: [PATCH 083/282] feat(readme): remove `?` from image URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 721d41c..4aa17cb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> -![preview](.assets/perplexica-screenshot.png?) +![preview](.assets/perplexica-screenshot.png) ## Table of Contents <!-- omit in toc --> From a58adbfecc951e15bc109202164609096420e38e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 17 Nov 2024 23:01:24 +0530 Subject: [PATCH 084/282] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4aa17cb..721d41c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> -![preview](.assets/perplexica-screenshot.png) +![preview](.assets/perplexica-screenshot.png?) ## Table of Contents <!-- omit in toc --> From c7bab9180346798dc8a98a8af9ac79ac08f920c8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 19 Nov 2024 10:43:50 +0530 Subject: [PATCH 085/282] feat(webSearchAgent): prevent excess results --- src/agents/webSearchAgent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 1ff3354..e2c5adc 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -337,7 +337,7 @@ const createBasicWebSearchAnsweringChain = ( } if (query.toLocaleLowerCase() === 'summarize') { - return docs; + return docs.slice(0, 15) } const docsWithContent = docs.filter( From b4a80d8ca095749912825b1fb7bb7b41b379864d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:40:24 +0530 Subject: [PATCH 086/282] feat(dockerfile): downgrade node version, closes #473 --- app.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.dockerfile b/app.dockerfile index ff1824d..488e64b 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,4 +1,4 @@ -FROM node:alpine +FROM node:20.18.0-alpine ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api From 874505cd0e7193901e74a53ba65e14e76fc82738 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 19 Nov 2024 16:32:30 +0530 Subject: [PATCH 087/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d84e1a6..db70194 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.9.2", + "version": "1.9.3", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index 098926a..4d63027 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.9.2", + "version": "1.9.3", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From c650d1c3d9cd4d9516b52c33a2e4e444aa5d4ae8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 20 Nov 2024 19:11:47 +0530 Subject: [PATCH 088/282] feat(ollama): add keep_alive param --- sample.config.toml | 1 + src/config.ts | 3 +++ src/lib/providers/ollama.ts | 6 ++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sample.config.toml b/sample.config.toml index f6c6943..dddcc03 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -1,6 +1,7 @@ [GENERAL] PORT = 3001 # Port to run the server on SIMILARITY_MEASURE = "cosine" # "cosine" or "dot" +KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead of using -1 use "-1m") [API_KEYS] OPENAI = "" # OpenAI API key - sk-1234567890abcdef1234567890abcdef diff --git a/src/config.ts b/src/config.ts index bb69335..8624e7f 100644 --- a/src/config.ts +++ b/src/config.ts @@ -8,6 +8,7 @@ interface Config { GENERAL: { PORT: number; SIMILARITY_MEASURE: string; + KEEP_ALIVE: string; }; API_KEYS: { OPENAI: string; @@ -34,6 +35,8 @@ export const getPort = () => loadConfig().GENERAL.PORT; export const getSimilarityMeasure = () => loadConfig().GENERAL.SIMILARITY_MEASURE; +export const getKeepAlive = () => loadConfig().GENERAL.KEEP_ALIVE; + export const getOpenaiApiKey = () => loadConfig().API_KEYS.OPENAI; export const getGroqApiKey = () => loadConfig().API_KEYS.GROQ; diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index ed68bfa..8c36c98 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -1,11 +1,12 @@ import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; -import { getOllamaApiEndpoint } from '../../config'; +import { getKeepAlive, getOllamaApiEndpoint } from '../../config'; import logger from '../../utils/logger'; import { ChatOllama } from '@langchain/community/chat_models/ollama'; export const loadOllamaChatModels = async () => { const ollamaEndpoint = getOllamaApiEndpoint(); - + const keepAlive = getKeepAlive(); + if (!ollamaEndpoint) return {}; try { @@ -24,6 +25,7 @@ export const loadOllamaChatModels = async () => { baseUrl: ollamaEndpoint, model: model.model, temperature: 0.7, + keepAlive: keepAlive }), }; From 4b89008f3a314e1364bfefe42ea5e85eca4eb096 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 23 Nov 2024 15:04:19 +0530 Subject: [PATCH 089/282] feat(app): add file uploads --- .prettierignore | 5 +- backend.dockerfile | 1 + docker-compose.yaml | 2 + package.json | 5 +- src/agents/webSearchAgent.ts | 87 ++++++- src/db/schema.ts | 9 + src/lib/providers/ollama.ts | 4 +- src/routes/index.ts | 2 + src/routes/uploads.ts | 151 +++++++++++ .../linkDocument.ts => utils/documents.ts} | 2 +- src/utils/files.ts | 16 ++ src/websocket/messageHandler.ts | 4 + ui/components/Chat.tsx | 19 +- ui/components/ChatWindow.tsx | 33 +++ ui/components/EmptyChat.tsx | 13 + ui/components/EmptyChatMessageInput.tsx | 19 +- ui/components/MessageInput.tsx | 26 +- ui/components/MessageInputActions/Attach.tsx | 181 ++++++++++++- .../MessageInputActions/AttachSmall.tsx | 153 +++++++++++ ui/components/MessageInputActions/Focus.tsx | 9 +- ui/components/MessageSources.tsx | 66 +++-- ui/package.json | 2 +- ui/yarn.lock | 68 ++--- uploads/.gitignore | 2 + yarn.lock | 242 +++++++++++++++++- 25 files changed, 1035 insertions(+), 86 deletions(-) create mode 100644 src/routes/uploads.ts rename src/{lib/linkDocument.ts => utils/documents.ts} (98%) create mode 100644 src/utils/files.ts create mode 100644 ui/components/MessageInputActions/AttachSmall.tsx create mode 100644 uploads/.gitignore diff --git a/.prettierignore b/.prettierignore index c184fdb..55d3c7c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -35,4 +35,7 @@ coverage *.swp # Ignore all files with the .DS_Store extension (macOS specific) -.DS_Store \ No newline at end of file +.DS_Store + +# Ignore all files in uploads directory +uploads \ No newline at end of file diff --git a/backend.dockerfile b/backend.dockerfile index 87cd21c..b6ab95a 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -9,6 +9,7 @@ COPY package.json /home/perplexica/ COPY yarn.lock /home/perplexica/ RUN mkdir /home/perplexica/data +RUN mkdir /home/perplexica/uploads RUN yarn install --frozen-lockfile --network-timeout 600000 RUN yarn build diff --git a/docker-compose.yaml b/docker-compose.yaml index 46d82c6..a0e1d73 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -22,6 +22,7 @@ services: - 3001:3001 volumes: - backend-dbstore:/home/perplexica/data + - uploads:/home/perplexica/uploads - ./config.toml:/home/perplexica/config.toml extra_hosts: - 'host.docker.internal:host-gateway' @@ -50,3 +51,4 @@ networks: volumes: backend-dbstore: + uploads: diff --git a/package.json b/package.json index db70194..3a3a1cc 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "start": "npm run db:push && node dist/app.js", "build": "tsc", - "dev": "nodemon src/app.ts", + "dev": "nodemon --ignore uploads/ src/app.ts ", "db:push": "drizzle-kit push sqlite", "format": "prettier . --check", "format:write": "prettier . --write" @@ -16,6 +16,7 @@ "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/html-to-text": "^9.0.4", + "@types/multer": "^1.4.12", "@types/pdf-parse": "^1.1.4", "@types/readable-stream": "^4.0.11", "@types/ws": "^8.5.12", @@ -41,6 +42,8 @@ "express": "^4.19.2", "html-to-text": "^9.0.5", "langchain": "^0.1.30", + "mammoth": "^1.8.0", + "multer": "^1.4.5-lts.1", "pdf-parse": "^1.1.1", "winston": "^3.13.0", "ws": "^8.17.1", diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index e2c5adc..4303762 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -20,10 +20,12 @@ import eventEmitter from 'events'; import computeSimilarity from '../utils/computeSimilarity'; import logger from '../utils/logger'; import LineListOutputParser from '../lib/outputParsers/listLineOutputParser'; -import { getDocumentsFromLinks } from '../lib/linkDocument'; import LineOutputParser from '../lib/outputParsers/lineOutputParser'; import { IterableReadableStream } from '@langchain/core/utils/stream'; import { ChatOpenAI } from '@langchain/openai'; +import path from 'path'; +import fs from 'fs'; +import { getDocumentsFromLinks } from '../utils/documents'; const basicSearchRetrieverPrompt = ` You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. @@ -316,6 +318,7 @@ const createBasicWebSearchAnsweringChain = ( llm: BaseChatModel, embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], ) => { const basicWebSearchRetrieverChain = createBasicWebSearchRetrieverChain(llm); @@ -336,8 +339,32 @@ const createBasicWebSearchAnsweringChain = ( return docs; } + const filesData = fileIds + .map((file) => { + const filePath = path.join(process.cwd(), 'uploads', file); + + const contentPath = filePath + '-extracted.json'; + const embeddingsPath = filePath + '-embeddings.json'; + + const content = JSON.parse(fs.readFileSync(contentPath, 'utf8')); + const embeddings = JSON.parse(fs.readFileSync(embeddingsPath, 'utf8')); + + const fileSimilaritySearchObject = content.contents.map( + (c: string, i) => { + return { + fileName: content.title, + content: c, + embeddings: embeddings.embeddings[i], + }; + }, + ); + + return fileSimilaritySearchObject; + }) + .flat(); + if (query.toLocaleLowerCase() === 'summarize') { - return docs.slice(0, 15) + return docs.slice(0, 15); } const docsWithContent = docs.filter( @@ -345,7 +372,43 @@ const createBasicWebSearchAnsweringChain = ( ); if (optimizationMode === 'speed') { - return docsWithContent.slice(0, 15); + if (filesData.length > 0) { + const [queryEmbedding] = await Promise.all([ + embeddings.embedQuery(query), + ]); + + const fileDocs = filesData.map((fileData) => { + return new Document({ + pageContent: fileData.content, + metadata: { + title: fileData.fileName, + url: `File`, + }, + }); + }); + + const similarity = filesData.map((fileData, i) => { + const sim = computeSimilarity(queryEmbedding, fileData.embeddings); + + return { + index: i, + similarity: sim, + }; + }); + + const sortedDocs = similarity + .filter((sim) => sim.similarity > 0.3) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 8) + .map((sim) => fileDocs[sim.index]); + + return [ + ...sortedDocs, + ...docsWithContent.slice(0, 15 - sortedDocs.length), + ]; + } else { + return docsWithContent.slice(0, 15); + } } else if (optimizationMode === 'balanced') { const [docEmbeddings, queryEmbedding] = await Promise.all([ embeddings.embedDocuments( @@ -354,6 +417,20 @@ const createBasicWebSearchAnsweringChain = ( embeddings.embedQuery(query), ]); + docsWithContent.push( + ...filesData.map((fileData) => { + return new Document({ + pageContent: fileData.content, + metadata: { + title: fileData.fileName, + url: `File`, + }, + }); + }), + ); + + docEmbeddings.push(...filesData.map((fileData) => fileData.embeddings)); + const similarity = docEmbeddings.map((docEmbedding, i) => { const sim = computeSimilarity(queryEmbedding, docEmbedding); @@ -408,6 +485,7 @@ const basicWebSearch = ( llm: BaseChatModel, embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], ) => { const emitter = new eventEmitter(); @@ -416,6 +494,7 @@ const basicWebSearch = ( llm, embeddings, optimizationMode, + fileIds, ); const stream = basicWebSearchAnsweringChain.streamEvents( @@ -446,6 +525,7 @@ const handleWebSearch = ( llm: BaseChatModel, embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], ) => { const emitter = basicWebSearch( message, @@ -453,6 +533,7 @@ const handleWebSearch = ( llm, embeddings, optimizationMode, + fileIds, ); return emitter; }; diff --git a/src/db/schema.ts b/src/db/schema.ts index 9eefa55..cee9660 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -1,3 +1,4 @@ +import { sql } from 'drizzle-orm'; import { text, integer, sqliteTable } from 'drizzle-orm/sqlite-core'; export const messages = sqliteTable('messages', { @@ -11,9 +12,17 @@ export const messages = sqliteTable('messages', { }), }); +interface File { + name: string; + fileId: string; +} + export const chats = sqliteTable('chats', { id: text('id').primaryKey(), title: text('title').notNull(), createdAt: text('createdAt').notNull(), focusMode: text('focusMode').notNull(), + files: text('files', { mode: 'json' }) + .$type<File[]>() + .default(sql`'[]'`), }); diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index 8c36c98..e23fb76 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -6,7 +6,7 @@ import { ChatOllama } from '@langchain/community/chat_models/ollama'; export const loadOllamaChatModels = async () => { const ollamaEndpoint = getOllamaApiEndpoint(); const keepAlive = getKeepAlive(); - + if (!ollamaEndpoint) return {}; try { @@ -25,7 +25,7 @@ export const loadOllamaChatModels = async () => { baseUrl: ollamaEndpoint, model: model.model, temperature: 0.7, - keepAlive: keepAlive + keepAlive: keepAlive, }), }; diff --git a/src/routes/index.ts b/src/routes/index.ts index 28c297f..cb2c915 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -7,6 +7,7 @@ import suggestionsRouter from './suggestions'; import chatsRouter from './chats'; import searchRouter from './search'; import discoverRouter from './discover'; +import uploadsRouter from './uploads'; const router = express.Router(); @@ -18,5 +19,6 @@ router.use('/suggestions', suggestionsRouter); router.use('/chats', chatsRouter); router.use('/search', searchRouter); router.use('/discover', discoverRouter); +router.use('/uploads', uploadsRouter); export default router; diff --git a/src/routes/uploads.ts b/src/routes/uploads.ts new file mode 100644 index 0000000..7b063fc --- /dev/null +++ b/src/routes/uploads.ts @@ -0,0 +1,151 @@ +import express from 'express'; +import logger from '../utils/logger'; +import multer from 'multer'; +import path from 'path'; +import crypto from 'crypto'; +import fs from 'fs'; +import { Embeddings } from '@langchain/core/embeddings'; +import { getAvailableEmbeddingModelProviders } from '../lib/providers'; +import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf'; +import { DocxLoader } from '@langchain/community/document_loaders/fs/docx'; +import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'; +import { Document } from 'langchain/document'; + +const router = express.Router(); + +const splitter = new RecursiveCharacterTextSplitter({ + chunkSize: 500, + chunkOverlap: 100, +}); + +const storage = multer.diskStorage({ + destination: (req, file, cb) => { + cb(null, path.join(process.cwd(), './uploads')); + }, + filename: (req, file, cb) => { + const splitedFileName = file.originalname.split('.'); + const fileExtension = splitedFileName[splitedFileName.length - 1]; + if (!['pdf', 'docx', 'txt'].includes(fileExtension)) { + return cb(new Error('File type is not supported'), ''); + } + cb(null, `${crypto.randomBytes(16).toString('hex')}.${fileExtension}`); + }, +}); + +const upload = multer({ storage }); + +router.post( + '/', + upload.fields([ + { name: 'files' }, + { name: 'embedding_model', maxCount: 1 }, + { name: 'embedding_model_provider', maxCount: 1 }, + ]), + async (req, res) => { + try { + const { embedding_model, embedding_model_provider } = req.body; + + if (!embedding_model || !embedding_model_provider) { + res + .status(400) + .json({ message: 'Missing embedding model or provider' }); + return; + } + + const embeddingModels = await getAvailableEmbeddingModelProviders(); + const provider = + embedding_model_provider ?? Object.keys(embeddingModels)[0]; + const embeddingModel: Embeddings = + embedding_model ?? Object.keys(embeddingModels[provider])[0]; + + let embeddingsModel: Embeddings | undefined; + + if ( + embeddingModels[provider] && + embeddingModels[provider][embeddingModel] + ) { + embeddingsModel = embeddingModels[provider][embeddingModel].model as + | Embeddings + | undefined; + } + + if (!embeddingsModel) { + res.status(400).json({ message: 'Invalid LLM model selected' }); + return; + } + + const files = req.files['files'] as Express.Multer.File[]; + if (!files || files.length === 0) { + res.status(400).json({ message: 'No files uploaded' }); + return; + } + + await Promise.all( + files.map(async (file) => { + let docs: Document[] = []; + + if (file.mimetype === 'application/pdf') { + const loader = new PDFLoader(file.path); + docs = await loader.load(); + } else if ( + file.mimetype === + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' + ) { + const loader = new DocxLoader(file.path); + docs = await loader.load(); + } else if (file.mimetype === 'text/plain') { + const text = fs.readFileSync(file.path, 'utf-8'); + docs = [ + new Document({ + pageContent: text, + metadata: { + title: file.originalname, + }, + }), + ]; + } + + const splitted = await splitter.splitDocuments(docs); + + const json = JSON.stringify({ + title: file.originalname, + contents: splitted.map((doc) => doc.pageContent), + }); + + const pathToSave = file.path.replace(/\.\w+$/, '-extracted.json'); + fs.writeFileSync(pathToSave, json); + + const embeddings = await embeddingsModel.embedDocuments( + splitted.map((doc) => doc.pageContent), + ); + + const embeddingsJSON = JSON.stringify({ + title: file.originalname, + embeddings: embeddings, + }); + + const pathToSaveEmbeddings = file.path.replace( + /\.\w+$/, + '-embeddings.json', + ); + fs.writeFileSync(pathToSaveEmbeddings, embeddingsJSON); + }), + ); + + res.status(200).json({ + files: files.map((file) => { + return { + fileName: file.originalname, + fileExtension: file.filename.split('.').pop(), + fileId: file.filename.replace(/\.\w+$/, ''), + }; + }), + }); + } catch (err: any) { + logger.error(`Error in uploading file results: ${err.message}`); + res.status(500).json({ message: 'An error has occurred.' }); + } + }, +); + +export default router; diff --git a/src/lib/linkDocument.ts b/src/utils/documents.ts similarity index 98% rename from src/lib/linkDocument.ts rename to src/utils/documents.ts index 5e90571..5cd0366 100644 --- a/src/lib/linkDocument.ts +++ b/src/utils/documents.ts @@ -3,7 +3,7 @@ import { htmlToText } from 'html-to-text'; import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; import { Document } from '@langchain/core/documents'; import pdfParse from 'pdf-parse'; -import logger from '../utils/logger'; +import logger from './logger'; export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { const splitter = new RecursiveCharacterTextSplitter(); diff --git a/src/utils/files.ts b/src/utils/files.ts new file mode 100644 index 0000000..3e7a134 --- /dev/null +++ b/src/utils/files.ts @@ -0,0 +1,16 @@ +import path from 'path'; +import fs from 'fs'; +export const getFileDetails = (fileId: string) => { + const fileLoc = path.join( + process.cwd(), + './uploads', + fileId + '-extracted.json', + ); + + const parsedFile = JSON.parse(fs.readFileSync(fileLoc, 'utf8')); + + return { + name: parsedFile.title, + fileId: fileId, + }; +}; diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index e915b22..d2a2518 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -13,6 +13,7 @@ import db from '../db'; import { chats, messages as messagesSchema } from '../db/schema'; import { eq, asc, gt } from 'drizzle-orm'; import crypto from 'crypto'; +import { getFileDetails } from '../utils/files'; type Message = { messageId: string; @@ -26,6 +27,7 @@ type WSMessage = { type: string; focusMode: string; history: Array<[string, string]>; + files: Array<string>; }; export const searchHandlers = { @@ -141,6 +143,7 @@ export const handleMessage = async ( llm, embeddings, parsedWSMessage.optimizationMode, + parsedWSMessage.files, ); handleEmitterEvents(emitter, ws, aiMessageId, parsedMessage.chatId); @@ -157,6 +160,7 @@ export const handleMessage = async ( title: parsedMessage.content, createdAt: new Date().toString(), focusMode: parsedWSMessage.focusMode, + files: parsedWSMessage.files.map(getFileDetails), }) .execute(); } diff --git a/ui/components/Chat.tsx b/ui/components/Chat.tsx index 8c0fb80..81aa32f 100644 --- a/ui/components/Chat.tsx +++ b/ui/components/Chat.tsx @@ -2,7 +2,7 @@ import { Fragment, useEffect, useRef, useState } from 'react'; import MessageInput from './MessageInput'; -import { Message } from './ChatWindow'; +import { File, Message } from './ChatWindow'; import MessageBox from './MessageBox'; import MessageBoxLoading from './MessageBoxLoading'; @@ -12,12 +12,20 @@ const Chat = ({ sendMessage, messageAppeared, rewrite, + fileIds, + setFileIds, + files, + setFiles, }: { messages: Message[]; sendMessage: (message: string) => void; loading: boolean; messageAppeared: boolean; rewrite: (messageId: string) => void; + fileIds: string[]; + setFileIds: (fileIds: string[]) => void; + files: File[]; + setFiles: (files: File[]) => void; }) => { const [dividerWidth, setDividerWidth] = useState(0); const dividerRef = useRef<HTMLDivElement | null>(null); @@ -78,7 +86,14 @@ const Chat = ({ className="bottom-24 lg:bottom-10 fixed z-40" style={{ width: dividerWidth }} > - <MessageInput loading={loading} sendMessage={sendMessage} /> + <MessageInput + loading={loading} + sendMessage={sendMessage} + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} + /> </div> )} </div> diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index f9bd583..fd3d0a6 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -21,6 +21,12 @@ export type Message = { sources?: Document[]; }; +export interface File { + fileName: string; + fileExtension: string; + fileId: string; +} + const useSocket = ( url: string, setIsWSReady: (ready: boolean) => void, @@ -217,6 +223,8 @@ const loadMessages = async ( setChatHistory: (history: [string, string][]) => void, setFocusMode: (mode: string) => void, setNotFound: (notFound: boolean) => void, + setFiles: (files: File[]) => void, + setFileIds: (fileIds: string[]) => void, ) => { const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/chats/${chatId}`, @@ -253,6 +261,17 @@ const loadMessages = async ( document.title = messages[0].content; + const files = data.chat.files.map((file: any) => { + return { + fileName: file.name, + fileExtension: file.name.split('.').pop(), + fileId: file.fileId, + }; + }); + + setFiles(files); + setFileIds(files.map((file: File) => file.fileId)); + setChatHistory(history); setFocusMode(data.chat.focusMode); setIsMessagesLoaded(true); @@ -281,6 +300,9 @@ const ChatWindow = ({ id }: { id?: string }) => { const [chatHistory, setChatHistory] = useState<[string, string][]>([]); const [messages, setMessages] = useState<Message[]>([]); + const [files, setFiles] = useState<File[]>([]); + const [fileIds, setFileIds] = useState<string[]>([]); + const [focusMode, setFocusMode] = useState('webSearch'); const [optimizationMode, setOptimizationMode] = useState('speed'); @@ -302,6 +324,8 @@ const ChatWindow = ({ id }: { id?: string }) => { setChatHistory, setFocusMode, setNotFound, + setFiles, + setFileIds, ); } else if (!chatId) { setNewChatCreated(true); @@ -354,6 +378,7 @@ const ChatWindow = ({ id }: { id?: string }) => { chatId: chatId!, content: message, }, + files: fileIds, focusMode: focusMode, optimizationMode: optimizationMode, history: [...chatHistory, ['human', message]], @@ -511,6 +536,10 @@ const ChatWindow = ({ id }: { id?: string }) => { sendMessage={sendMessage} messageAppeared={messageAppeared} rewrite={rewrite} + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} /> </> ) : ( @@ -520,6 +549,10 @@ const ChatWindow = ({ id }: { id?: string }) => { setFocusMode={setFocusMode} optimizationMode={optimizationMode} setOptimizationMode={setOptimizationMode} + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} /> )} </div> diff --git a/ui/components/EmptyChat.tsx b/ui/components/EmptyChat.tsx index 6b2412b..c47c301 100644 --- a/ui/components/EmptyChat.tsx +++ b/ui/components/EmptyChat.tsx @@ -2,6 +2,7 @@ import { Settings } from 'lucide-react'; import EmptyChatMessageInput from './EmptyChatMessageInput'; import SettingsDialog from './SettingsDialog'; import { useState } from 'react'; +import { File } from './ChatWindow'; const EmptyChat = ({ sendMessage, @@ -9,12 +10,20 @@ const EmptyChat = ({ setFocusMode, optimizationMode, setOptimizationMode, + fileIds, + setFileIds, + files, + setFiles, }: { sendMessage: (message: string) => void; focusMode: string; setFocusMode: (mode: string) => void; optimizationMode: string; setOptimizationMode: (mode: string) => void; + fileIds: string[]; + setFileIds: (fileIds: string[]) => void; + files: File[]; + setFiles: (files: File[]) => void; }) => { const [isSettingsOpen, setIsSettingsOpen] = useState(false); @@ -37,6 +46,10 @@ const EmptyChat = ({ setFocusMode={setFocusMode} optimizationMode={optimizationMode} setOptimizationMode={setOptimizationMode} + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} /> </div> </div> diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index 42ad917..43d1e28 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -4,6 +4,8 @@ import TextareaAutosize from 'react-textarea-autosize'; import CopilotToggle from './MessageInputActions/Copilot'; import Focus from './MessageInputActions/Focus'; import Optimization from './MessageInputActions/Optimization'; +import Attach from './MessageInputActions/Attach'; +import { File } from './ChatWindow'; const EmptyChatMessageInput = ({ sendMessage, @@ -11,12 +13,20 @@ const EmptyChatMessageInput = ({ setFocusMode, optimizationMode, setOptimizationMode, + fileIds, + setFileIds, + files, + setFiles, }: { sendMessage: (message: string) => void; focusMode: string; setFocusMode: (mode: string) => void; optimizationMode: string; setOptimizationMode: (mode: string) => void; + fileIds: string[]; + setFileIds: (fileIds: string[]) => void; + files: File[]; + setFiles: (files: File[]) => void; }) => { const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); @@ -73,8 +83,15 @@ const EmptyChatMessageInput = ({ placeholder="Ask anything..." /> <div className="flex flex-row items-center justify-between mt-4"> - <div className="flex flex-row items-center space-x-4"> + <div className="flex flex-row items-center space-x-2 lg:space-x-4"> <Focus focusMode={focusMode} setFocusMode={setFocusMode} /> + <Attach + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} + showText + /> </div> <div className="flex flex-row items-center space-x-1 sm:space-x-4"> <Optimization diff --git a/ui/components/MessageInput.tsx b/ui/components/MessageInput.tsx index 05d44a6..b6b1d96 100644 --- a/ui/components/MessageInput.tsx +++ b/ui/components/MessageInput.tsx @@ -4,13 +4,23 @@ import { useEffect, useRef, useState } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; import Attach from './MessageInputActions/Attach'; import CopilotToggle from './MessageInputActions/Copilot'; +import { File } from './ChatWindow'; +import AttachSmall from './MessageInputActions/AttachSmall'; const MessageInput = ({ sendMessage, loading, + fileIds, + setFileIds, + files, + setFiles, }: { sendMessage: (message: string) => void; loading: boolean; + fileIds: string[]; + setFileIds: (fileIds: string[]) => void; + files: File[]; + setFiles: (files: File[]) => void; }) => { const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); @@ -69,7 +79,14 @@ const MessageInput = ({ mode === 'multi' ? 'flex-col rounded-lg' : 'flex-row rounded-full', )} > - {mode === 'single' && <Attach />} + {mode === 'single' && ( + <AttachSmall + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} + /> + )} <TextareaAutosize ref={inputRef} value={message} @@ -96,7 +113,12 @@ const MessageInput = ({ )} {mode === 'multi' && ( <div className="flex flex-row items-center justify-between w-full pt-2"> - <Attach /> + <AttachSmall + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} + /> <div className="flex flex-row items-center space-x-4"> <CopilotToggle copilotEnabled={copilotEnabled} diff --git a/ui/components/MessageInputActions/Attach.tsx b/ui/components/MessageInputActions/Attach.tsx index 6d8ffcf..61cc86a 100644 --- a/ui/components/MessageInputActions/Attach.tsx +++ b/ui/components/MessageInputActions/Attach.tsx @@ -1,12 +1,183 @@ -import { CopyPlus } from 'lucide-react'; +import { cn } from '@/lib/utils'; +import { + Popover, + PopoverButton, + PopoverPanel, + Transition, +} from '@headlessui/react'; +import { CopyPlus, File, LoaderCircle, Plus, Trash } from 'lucide-react'; +import { Fragment, useRef, useState } from 'react'; +import { File as FileType } from '../ChatWindow'; -const Attach = () => { - return ( +const Attach = ({ + fileIds, + setFileIds, + showText, + files, + setFiles, +}: { + fileIds: string[]; + setFileIds: (fileIds: string[]) => void; + showText?: boolean; + files: FileType[]; + setFiles: (files: FileType[]) => void; +}) => { + const [loading, setLoading] = useState(false); + const fileInputRef = useRef<any>(); + + const handleChange = async (e: React.ChangeEvent<HTMLInputElement>) => { + setLoading(true); + const data = new FormData(); + + for (let i = 0; i < e.target.files!.length; i++) { + data.append('files', e.target.files![i]); + } + + const embeddingModelProvider = localStorage.getItem( + 'embeddingModelProvider', + ); + const embeddingModel = localStorage.getItem('embeddingModel'); + + data.append('embedding_model_provider', embeddingModelProvider!); + data.append('embedding_model', embeddingModel!); + + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/uploads`, { + method: 'POST', + body: data, + }); + + const resData = await res.json(); + + setFiles([...files, ...resData.files]); + setFileIds([...fileIds, ...resData.files.map((file: any) => file.fileId)]); + setLoading(false); + }; + + return loading ? ( + <div className="flex flex-row items-center justify-between space-x-1"> + <LoaderCircle size={18} className="text-sky-400 animate-spin" /> + <p className="text-sky-400 inline whitespace-nowrap text-xs font-medium"> + Uploading.. + </p> + </div> + ) : files.length > 0 ? ( + <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg"> + <PopoverButton + type="button" + className={cn( + 'flex flex-row items-center justify-between space-x-1 p-2 text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary active:scale-95 transition duration-200 hover:text-black dark:hover:text-white', + files.length > 0 ? '-ml-2 lg:-ml-3' : '', + )} + > + {files.length > 1 && ( + <> + <File size={19} className="text-sky-400" /> + <p className="text-sky-400 inline whitespace-nowrap text-xs font-medium"> + {files.length} files + </p> + </> + )} + + {files.length === 1 && ( + <> + <File size={18} className="text-sky-400" /> + <p className="text-sky-400 text-xs font-medium"> + {files[0].fileName.length > 10 + ? files[0].fileName.replace(/\.\w+$/, '').substring(0, 3) + + '...' + + files[0].fileExtension + : files[0].fileName} + </p> + </> + )} + </PopoverButton> + <Transition + as={Fragment} + enter="transition ease-out duration-150" + enterFrom="opacity-0 translate-y-1" + enterTo="opacity-100 translate-y-0" + leave="transition ease-in duration-150" + leaveFrom="opacity-100 translate-y-0" + leaveTo="opacity-0 translate-y-1" + > + <PopoverPanel className="absolute z-10 w-64 md:w-[350px] right-0"> + <div className="bg-light-primary dark:bg-dark-primary border rounded-md border-light-200 dark:border-dark-200 w-full max-h-[200px] md:max-h-none overflow-y-auto flex flex-col"> + <div className="flex flex-row items-center justify-between px-3 py-2"> + <h4 className="text-black dark:text-white font-medium text-sm"> + Attached files + </h4> + <div className="flex flex-row items-center space-x-4"> + <button + type="button" + onClick={() => fileInputRef.current.click()} + className="flex flex-row items-center space-x-1 text-white/70 hover:text-white transition duration-200" + > + <input + type="file" + onChange={handleChange} + ref={fileInputRef} + accept=".pdf,.docx,.txt" + multiple + hidden + /> + <Plus size={18} /> + <p className="text-xs">Add</p> + </button> + <button + onClick={() => { + setFiles([]); + setFileIds([]); + }} + className="flex flex-row items-center space-x-1 text-white/70 hover:text-white transition duration-200" + > + <Trash size={14} /> + <p className="text-xs">Clear</p> + </button> + </div> + </div> + <div className="h-[0.5px] mx-2 bg-white/10" /> + <div className="flex flex-col items-center"> + {files.map((file, i) => ( + <div + key={i} + className="flex flex-row items-center justify-start w-full space-x-3 p-3" + > + <div className="bg-dark-100 flex items-center justify-center w-10 h-10 rounded-md"> + <File size={16} className="text-white/70" /> + </div> + <p className="text-white/70 text-sm"> + {file.fileName.length > 25 + ? file.fileName.replace(/\.\w+$/, '').substring(0, 25) + + '...' + + file.fileExtension + : file.fileName} + </p> + </div> + ))} + </div> + </div> + </PopoverPanel> + </Transition> + </Popover> + ) : ( <button type="button" - className="p-2 text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary transition duration-200 hover:text-black dark:hover:text-white" + onClick={() => fileInputRef.current.click()} + className={cn( + 'flex flex-row items-center space-x-1 text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary transition duration-200 hover:text-black dark:hover:text-white', + showText ? '' : 'p-2', + )} > - <CopyPlus /> + <input + type="file" + onChange={handleChange} + ref={fileInputRef} + accept=".pdf,.docx,.txt" + multiple + hidden + /> + <CopyPlus size={showText ? 18 : undefined} /> + {showText && <p className="text-xs font-medium pl-[1px]">Attach</p>} </button> ); }; diff --git a/ui/components/MessageInputActions/AttachSmall.tsx b/ui/components/MessageInputActions/AttachSmall.tsx new file mode 100644 index 0000000..3514a58 --- /dev/null +++ b/ui/components/MessageInputActions/AttachSmall.tsx @@ -0,0 +1,153 @@ +import { cn } from '@/lib/utils'; +import { + Popover, + PopoverButton, + PopoverPanel, + Transition, +} from '@headlessui/react'; +import { CopyPlus, File, LoaderCircle, Plus, Trash } from 'lucide-react'; +import { Fragment, useRef, useState } from 'react'; +import { File as FileType } from '../ChatWindow'; + +const AttachSmall = ({ + fileIds, + setFileIds, + files, + setFiles, +}: { + fileIds: string[]; + setFileIds: (fileIds: string[]) => void; + files: FileType[]; + setFiles: (files: FileType[]) => void; +}) => { + const [loading, setLoading] = useState(false); + const fileInputRef = useRef<any>(); + + const handleChange = async (e: React.ChangeEvent<HTMLInputElement>) => { + setLoading(true); + const data = new FormData(); + + for (let i = 0; i < e.target.files!.length; i++) { + data.append('files', e.target.files![i]); + } + + const embeddingModelProvider = localStorage.getItem( + 'embeddingModelProvider', + ); + const embeddingModel = localStorage.getItem('embeddingModel'); + + data.append('embedding_model_provider', embeddingModelProvider!); + data.append('embedding_model', embeddingModel!); + + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/uploads`, { + method: 'POST', + body: data, + }); + + const resData = await res.json(); + + setFiles([...files, ...resData.files]); + setFileIds([...fileIds, ...resData.files.map((file: any) => file.fileId)]); + setLoading(false); + }; + + return loading ? ( + <div className="flex flex-row items-center justify-between space-x-1 p-1"> + <LoaderCircle size={20} className="text-sky-400 animate-spin" /> + </div> + ) : files.length > 0 ? ( + <Popover className="max-w-[15rem] md:max-w-md lg:max-w-lg"> + <PopoverButton + type="button" + className="flex flex-row items-center justify-between space-x-1 p-1 text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary active:scale-95 transition duration-200 hover:text-black dark:hover:text-white" + > + <File size={20} className="text-sky-400" /> + </PopoverButton> + <Transition + as={Fragment} + enter="transition ease-out duration-150" + enterFrom="opacity-0 translate-y-1" + enterTo="opacity-100 translate-y-0" + leave="transition ease-in duration-150" + leaveFrom="opacity-100 translate-y-0" + leaveTo="opacity-0 translate-y-1" + > + <PopoverPanel className="absolute z-10 w-64 md:w-[350px] bottom-14 -ml-3"> + <div className="bg-light-primary dark:bg-dark-primary border rounded-md border-light-200 dark:border-dark-200 w-full max-h-[200px] md:max-h-none overflow-y-auto flex flex-col"> + <div className="flex flex-row items-center justify-between px-3 py-2"> + <h4 className="text-black dark:text-white font-medium text-sm"> + Attached files + </h4> + <div className="flex flex-row items-center space-x-4"> + <button + type="button" + onClick={() => fileInputRef.current.click()} + className="flex flex-row items-center space-x-1 text-white/70 hover:text-white transition duration-200" + > + <input + type="file" + onChange={handleChange} + ref={fileInputRef} + accept=".pdf,.docx,.txt" + multiple + hidden + /> + <Plus size={18} /> + <p className="text-xs">Add</p> + </button> + <button + onClick={() => { + setFiles([]); + setFileIds([]); + }} + className="flex flex-row items-center space-x-1 text-white/70 hover:text-white transition duration-200" + > + <Trash size={14} /> + <p className="text-xs">Clear</p> + </button> + </div> + </div> + <div className="h-[0.5px] mx-2 bg-white/10" /> + <div className="flex flex-col items-center"> + {files.map((file, i) => ( + <div + key={i} + className="flex flex-row items-center justify-start w-full space-x-3 p-3" + > + <div className="bg-dark-100 flex items-center justify-center w-10 h-10 rounded-md"> + <File size={16} className="text-white/70" /> + </div> + <p className="text-white/70 text-sm"> + {file.fileName.length > 25 + ? file.fileName.replace(/\.\w+$/, '').substring(0, 25) + + '...' + + file.fileExtension + : file.fileName} + </p> + </div> + ))} + </div> + </div> + </PopoverPanel> + </Transition> + </Popover> + ) : ( + <button + type="button" + onClick={() => fileInputRef.current.click()} + className="flex flex-row items-center space-x-1 text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary transition duration-200 hover:text-black dark:hover:text-white p-1" + > + <input + type="file" + onChange={handleChange} + ref={fileInputRef} + accept=".pdf,.docx,.txt" + multiple + hidden + /> + <CopyPlus size={20} /> + </button> + ); +}; + +export default AttachSmall; diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index e471630..c95be5a 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -75,7 +75,7 @@ const Focus = ({ setFocusMode: (mode: string) => void; }) => { return ( - <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg"> + <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg mt-[6.5px]"> <PopoverButton type="button" className=" text-black/50 dark:text-white/50 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary active:scale-95 transition duration-200 hover:text-black dark:hover:text-white" @@ -86,10 +86,13 @@ const Focus = ({ <p className="text-xs font-medium"> {focusModes.find((mode) => mode.key === focusMode)?.title} </p> - <ChevronDown size={20} /> + <ChevronDown size={20} className="-translate-x-1" /> </div> ) : ( - <ScanEye /> + <div className="flex flex-row items-center space-x-1"> + <ScanEye size={20} /> + <p className="text-xs font-medium">Focus</p> + </div> )} </PopoverButton> <Transition diff --git a/ui/components/MessageSources.tsx b/ui/components/MessageSources.tsx index e9cc1ba..c7ee945 100644 --- a/ui/components/MessageSources.tsx +++ b/ui/components/MessageSources.tsx @@ -7,6 +7,7 @@ import { TransitionChild, } from '@headlessui/react'; import { Document } from '@langchain/core/documents'; +import { File } from 'lucide-react'; import { Fragment, useState } from 'react'; const MessageSources = ({ sources }: { sources: Document[] }) => { @@ -36,13 +37,19 @@ const MessageSources = ({ sources }: { sources: Document[] }) => { </p> <div className="flex flex-row items-center justify-between"> <div className="flex flex-row items-center space-x-1"> - <img - src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`} - width={16} - height={16} - alt="favicon" - className="rounded-lg h-4 w-4" - /> + {source.metadata.url === 'File' ? ( + <div className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full"> + <File size={12} className="text-white/70" /> + </div> + ) : ( + <img + src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`} + width={16} + height={16} + alt="favicon" + className="rounded-lg h-4 w-4" + /> + )} <p className="text-xs text-black/50 dark:text-white/50 overflow-hidden whitespace-nowrap text-ellipsis"> {source.metadata.url.replace(/.+\/\/|www.|\..+/g, '')} </p> @@ -60,16 +67,21 @@ const MessageSources = ({ sources }: { sources: Document[] }) => { className="bg-light-100 hover:bg-light-200 dark:bg-dark-100 dark:hover:bg-dark-200 transition duration-200 rounded-lg p-3 flex flex-col space-y-2 font-medium" > <div className="flex flex-row items-center space-x-1"> - {sources.slice(3, 6).map((source, i) => ( - <img - src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`} - width={16} - height={16} - alt="favicon" - className="rounded-lg h-4 w-4" - key={i} - /> - ))} + {sources.slice(3, 6).map((source, i) => { + return source.metadata.url === 'File' ? ( + <div className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full"> + <File size={12} className="text-white/70" /> + </div> + ) : ( + <img + src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`} + width={16} + height={16} + alt="favicon" + className="rounded-lg h-4 w-4" + /> + ); + })} </div> <p className="text-xs text-black/50 dark:text-white/50"> View {sources.length - 3} more @@ -106,13 +118,19 @@ const MessageSources = ({ sources }: { sources: Document[] }) => { </p> <div className="flex flex-row items-center justify-between"> <div className="flex flex-row items-center space-x-1"> - <img - src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`} - width={16} - height={16} - alt="favicon" - className="rounded-lg h-4 w-4" - /> + {source.metadata.url === 'File' ? ( + <div className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full"> + <File size={12} className="text-white/70" /> + </div> + ) : ( + <img + src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`} + width={16} + height={16} + alt="favicon" + className="rounded-lg h-4 w-4" + /> + )} <p className="text-xs text-black/50 dark:text-white/50 overflow-hidden whitespace-nowrap text-ellipsis"> {source.metadata.url.replace( /.+\/\/|www.|\..+/g, diff --git a/ui/package.json b/ui/package.json index 4d63027..445b9a3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -11,7 +11,7 @@ "format:write": "prettier . --write" }, "dependencies": { - "@headlessui/react": "^2.1.9", + "@headlessui/react": "^2.2.0", "@icons-pack/react-simple-icons": "^9.4.0", "@langchain/openai": "^0.0.25", "@tailwindcss/typography": "^0.5.12", diff --git a/ui/yarn.lock b/ui/yarn.lock index 550a20c..0798ca9 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -74,9 +74,9 @@ "@floating-ui/utils" "^0.2.8" "@floating-ui/dom@^1.0.0": - version "1.6.11" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.11.tgz#8631857838d34ee5712339eb7cbdfb8ad34da723" - integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ== + version "1.6.12" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" + integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== dependencies: "@floating-ui/core" "^1.6.0" "@floating-ui/utils" "^0.2.8" @@ -89,9 +89,9 @@ "@floating-ui/dom" "^1.0.0" "@floating-ui/react@^0.26.16": - version "0.26.24" - resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.24.tgz#072b9dfeca4e79ef4e3000ef1c28e0ffc86f4ed4" - integrity sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw== + version "0.26.28" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" + integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== dependencies: "@floating-ui/react-dom" "^2.1.2" "@floating-ui/utils" "^0.2.8" @@ -102,10 +102,10 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== -"@headlessui/react@^2.1.9": - version "2.1.9" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.1.9.tgz#d8d3ff64255177a87706cc4f24f42aeac65b1695" - integrity sha512-ckWw7vlKtnoa1fL2X0fx1a3t/Li9MIKDVXn3SgG65YlxvDAsNrY39PPCxVM7sQRA7go2fJsuHSSauKFNaJHH7A== +"@headlessui/react@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.2.0.tgz#a8e32f0899862849a1ce1615fa280e7891431ab7" + integrity sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ== dependencies: "@floating-ui/react" "^0.26.16" "@react-aria/focus" "^3.17.1" @@ -317,20 +317,20 @@ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@react-aria/focus@^3.17.1": - version "3.18.3" - resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.3.tgz#4fe32de1e7530beab8da2e7b89f0f17d22a47e5e" - integrity sha512-WKUElg+5zS0D3xlVn8MntNnkzJql2J6MuzAMP8Sv5WTgFDse/XGR842dsxPTIyKKdrWVCRegCuwa4m3n/GzgJw== + version "3.18.4" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" + integrity sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA== dependencies: - "@react-aria/interactions" "^3.22.3" + "@react-aria/interactions" "^3.22.4" "@react-aria/utils" "^3.25.3" "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.3": - version "3.22.3" - resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.3.tgz#3ba50db12f6ed443ae061eed79e41509eaa3d8e6" - integrity sha512-RRUb/aG+P0IKTIWikY/SylB6bIbLZeztnZY2vbe7RAG5MgVaCgn5HQ45SI15GlTmhsFG8CnF6slJsUFJiNHpbQ== +"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.4": + version "3.22.4" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.4.tgz#88ed61ab6a485f869bc1f65ae6688d48ca96064b" + integrity sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww== dependencies: "@react-aria/ssr" "^3.9.6" "@react-aria/utils" "^3.25.3" @@ -380,11 +380,11 @@ tslib "^2.4.0" "@swc/helpers@^0.5.0": - version "0.5.13" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" - integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== dependencies: - tslib "^2.4.0" + tslib "^2.8.0" "@tailwindcss/typography@^0.5.12": version "0.5.12" @@ -397,16 +397,16 @@ postcss-selector-parser "6.0.10" "@tanstack/react-virtual@^3.8.1": - version "3.10.8" - resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.8.tgz#bf4b06f157ed298644a96ab7efc1a2b01ab36e3c" - integrity sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA== + version "3.10.9" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz#40606b6dd8aba8e977f576d8f7df07f69ca63eea" + integrity sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g== dependencies: - "@tanstack/virtual-core" "3.10.8" + "@tanstack/virtual-core" "3.10.9" -"@tanstack/virtual-core@3.10.8": - version "3.10.8" - resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.8.tgz#975446a667755222f62884c19e5c3c66d959b8b4" - integrity sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA== +"@tanstack/virtual-core@3.10.9": + version "3.10.9" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" + integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== "@types/json5@^0.0.29": version "0.0.29" @@ -3192,10 +3192,10 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.4.0, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" diff --git a/uploads/.gitignore b/uploads/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/uploads/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/yarn.lock b/yarn.lock index deb35ea..0ea5916 100644 --- a/yarn.lock +++ b/yarn.lock @@ -576,6 +576,26 @@ "@types/range-parser" "*" "@types/send" "*" +"@types/express-serve-static-core@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db" + integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/express@^4.17.21": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" @@ -606,6 +626,13 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== +"@types/multer@^1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" + integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== + dependencies: + "@types/express" "*" + "@types/node-fetch@^2.6.4": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" @@ -708,6 +735,11 @@ optionalDependencies: onnxruntime-node "1.14.0" +"@xmldom/xmldom@^0.8.6": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -758,6 +790,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -768,6 +805,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +argparse@~1.0.3: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -879,6 +923,11 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" +bluebird@~3.4.0: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== + body-parser@1.20.2: version "1.20.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" @@ -925,6 +974,13 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +busboy@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -1070,6 +1126,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -1092,6 +1158,11 @@ cookie@0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cors@^2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -1202,6 +1273,11 @@ digest-fetch@^1.3.0: base-64 "^0.1.0" md5 "^2.3.0" +dingbat-to-unicode@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83" + integrity sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w== + dom-serializer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" @@ -1251,6 +1327,13 @@ drizzle-orm@^0.31.2: resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.31.2.tgz#221a257dd487bab49ddb88a17bd82388600cf655" integrity sha512-QnenevbnnAzmbNzQwbhklvIYrDE8YER8K7kSrAWQSV1YvFCdSQPzj+jzqRdTSsV2cDqSpQ0NXGyL1G9I43LDLg== +duck@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/duck/-/duck-0.1.12.tgz#de7adf758421230b6d7aee799ce42670586b9efa" + integrity sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg== + dependencies: + underscore "^1.13.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -1657,7 +1740,12 @@ ignore-by-default@^1.0.1: resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== -inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + +inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1716,6 +1804,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + js-tiktoken@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211" @@ -1742,6 +1835,16 @@ jsonpointer@^5.0.1: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== +jszip@^3.7.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + kuler@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" @@ -1825,6 +1928,13 @@ leac@^0.6.0: resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -1847,6 +1957,15 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +lop@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/lop/-/lop-0.4.2.tgz#c9c2f958a39b9da1c2f36ca9ad66891a9fe84640" + integrity sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw== + dependencies: + duck "^0.1.12" + option "~0.2.1" + underscore "^1.13.1" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -1859,6 +1978,22 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +mammoth@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.8.0.tgz#d8f1b0d3a0355fda129270346e9dc853f223028f" + integrity sha512-pJNfxSk9IEGVpau+tsZFz22ofjUsl2mnA5eT8PjPs2n0BP+rhVte4Nez6FdgEuxv3IGI3afiV46ImKqTGDVlbA== + dependencies: + "@xmldom/xmldom" "^0.8.6" + argparse "~1.0.3" + base64-js "^1.5.1" + bluebird "~3.4.0" + dingbat-to-unicode "^1.0.1" + jszip "^3.7.1" + lop "^0.4.1" + path-is-absolute "^1.0.0" + underscore "^1.13.1" + xmlbuilder "^10.0.0" + md5@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -1912,7 +2047,7 @@ minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.3: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -1922,6 +2057,13 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + ml-array-mean@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" @@ -1973,6 +2115,19 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multer@^1.4.5-lts.1: + version "1.4.5-lts.1" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" + integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== + dependencies: + append-field "^1.0.0" + busboy "^1.0.0" + concat-stream "^1.5.2" + mkdirp "^0.5.4" + object-assign "^4.1.1" + type-is "^1.6.4" + xtend "^4.0.0" + mustache@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" @@ -2050,7 +2205,7 @@ num-sort@^2.0.0: resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== -object-assign@^4: +object-assign@^4, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -2146,6 +2301,11 @@ openapi-types@^12.1.3: resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== +option@~0.2.1: + version "0.2.4" + resolved "https://registry.yarnpkg.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4" + integrity sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -2174,6 +2334,11 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parseley@^0.12.0: version "0.12.1" resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" @@ -2187,6 +2352,11 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -2238,6 +2408,11 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + protobufjs@^6.8.8: version "6.11.4" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" @@ -2320,6 +2495,19 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -2351,7 +2539,7 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -2421,6 +2609,11 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -2491,6 +2684,11 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -2501,6 +2699,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + streamx@^2.15.0, streamx@^2.16.1: version "2.16.1" resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" @@ -2518,6 +2721,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -2636,7 +2846,7 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -type-is@~1.6.18: +type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -2644,6 +2854,11 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + typescript@^5.4.3: version "5.4.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" @@ -2654,6 +2869,11 @@ undefsafe@^2.0.5: resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +underscore@^1.13.1: + version "1.13.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" + integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -2664,7 +2884,7 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -2763,6 +2983,16 @@ ws@^8.17.1: resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +xmlbuilder@^10.0.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" + integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" From be745501aacbd56449e2fc0d872ce8a0bf3d8870 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:23:23 +0530 Subject: [PATCH 090/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3a3a1cc..6a67746 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.9.3", + "version": "1.10.0-rc1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index 445b9a3..6e4fc42 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.9.3", + "version": "1.10.0-rc1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From 64ee19c70a451e78a90d230fe645a158c1e5060b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:34:37 +0530 Subject: [PATCH 091/282] feat(messageHandler): switch to webSearch mode if files --- src/websocket/messageHandler.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index d2a2518..06ea3da 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -108,6 +108,11 @@ export const handleMessage = async ( const parsedWSMessage = JSON.parse(message) as WSMessage; const parsedMessage = parsedWSMessage.message; + if (parsedWSMessage.files.length > 0) { + /* TODO: Implement uploads in other classes/single meta class system*/ + parsedWSMessage.focusMode = 'webSearch'; + } + const humanMessageId = parsedMessage.messageId ?? crypto.randomBytes(7).toString('hex'); const aiMessageId = crypto.randomBytes(7).toString('hex'); From ecad0655779e75699223d0a7ff7e0775491e6345 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 27 Nov 2024 15:13:46 +0530 Subject: [PATCH 092/282] feat(searchAgent): handle empty fileIds --- src/agents/webSearchAgent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts index 4303762..709d6aa 100644 --- a/src/agents/webSearchAgent.ts +++ b/src/agents/webSearchAgent.ts @@ -485,7 +485,7 @@ const basicWebSearch = ( llm: BaseChatModel, embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', - fileIds: string[], + fileIds: string[] = [], ) => { const emitter = new eventEmitter(); From 177746235a347e1468ade07a7ef425d4011a0bc2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 28 Nov 2024 20:47:18 +0530 Subject: [PATCH 093/282] feat(providers): add gemini --- package.json | 1 + sample.config.toml | 1 + src/config.ts | 3 ++ src/lib/providers/gemini.ts | 69 ++++++++++++++++++++++++++++++++ src/lib/providers/index.ts | 3 ++ src/routes/config.ts | 5 ++- ui/components/SettingsDialog.tsx | 17 ++++++++ yarn.lock | 53 ++++++++++++++++++++++++ 8 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 src/lib/providers/gemini.ts diff --git a/package.json b/package.json index 6a67746..0368b21 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@langchain/anthropic": "^0.2.3", "@langchain/community": "^0.2.16", "@langchain/openai": "^0.0.25", + "@langchain/google-genai": "^0.0.23", "@xenova/transformers": "^2.17.1", "axios": "^1.6.8", "better-sqlite3": "^11.0.0", diff --git a/sample.config.toml b/sample.config.toml index dddcc03..50ba95d 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -7,6 +7,7 @@ KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead OPENAI = "" # OpenAI API key - sk-1234567890abcdef1234567890abcdef GROQ = "" # Groq API key - gsk_1234567890abcdef1234567890abcdef ANTHROPIC = "" # Anthropic API key - sk-ant-1234567890abcdef1234567890abcdef +GEMINI = "" # Gemini API key - sk-1234567890abcdef1234567890abcdef [API_ENDPOINTS] SEARXNG = "http://localhost:32768" # SearxNG API URL diff --git a/src/config.ts b/src/config.ts index 8624e7f..001c259 100644 --- a/src/config.ts +++ b/src/config.ts @@ -14,6 +14,7 @@ interface Config { OPENAI: string; GROQ: string; ANTHROPIC: string; + GEMINI: string; }; API_ENDPOINTS: { SEARXNG: string; @@ -43,6 +44,8 @@ export const getGroqApiKey = () => loadConfig().API_KEYS.GROQ; export const getAnthropicApiKey = () => loadConfig().API_KEYS.ANTHROPIC; +export const getGeminiApiKey = () => loadConfig().API_KEYS.GEMINI; + export const getSearxngApiEndpoint = () => process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts new file mode 100644 index 0000000..95764cf --- /dev/null +++ b/src/lib/providers/gemini.ts @@ -0,0 +1,69 @@ +import { + ChatGoogleGenerativeAI, + GoogleGenerativeAIEmbeddings, +} from '@langchain/google-genai'; +import { getGeminiApiKey } from '../../config'; +import logger from '../../utils/logger'; + +export const loadGeminiChatModels = async () => { + const geminiApiKey = getGeminiApiKey(); + + if (!geminiApiKey) return {}; + + try { + const chatModels = { + 'gemini-1.5-flash': { + displayName: 'Gemini 1.5 Flash', + model: new ChatGoogleGenerativeAI({ + modelName: 'gemini-1.5-flash', + temperature: 0.7, + apiKey: geminiApiKey, + }), + }, + 'gemini-1.5-flash-8b': { + displayName: 'Gemini 1.5 Flash 8B', + model: new ChatGoogleGenerativeAI({ + modelName: 'gemini-1.5-flash-8b', + temperature: 0.7, + apiKey: geminiApiKey, + }), + }, + 'gemini-1.5-pro': { + displayName: 'Gemini 1.5 Pro', + model: new ChatGoogleGenerativeAI({ + modelName: 'gemini-1.5-pro', + temperature: 0.7, + apiKey: geminiApiKey, + }), + }, + }; + + return chatModels; + } catch (err) { + logger.error(`Error loading Gemini models: ${err}`); + return {}; + } +}; + +export const loadGeminiEmbeddingsModels = async () => { + const geminiApiKey = getGeminiApiKey(); + + if (!geminiApiKey) return {}; + + try { + const embeddingModels = { + 'text-embedding-004': { + displayName: 'Text Embedding', + model: new GoogleGenerativeAIEmbeddings({ + apiKey: geminiApiKey, + modelName: 'text-embedding-004', + }), + }, + }; + + return embeddingModels; + } catch (err) { + logger.error(`Error loading Gemini embeddings model: ${err}`); + return {}; + } +}; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index d919fd4..98846e7 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -3,18 +3,21 @@ import { loadOllamaChatModels, loadOllamaEmbeddingsModels } from './ollama'; import { loadOpenAIChatModels, loadOpenAIEmbeddingsModels } from './openai'; import { loadAnthropicChatModels } from './anthropic'; import { loadTransformersEmbeddingsModels } from './transformers'; +import { loadGeminiChatModels, loadGeminiEmbeddingsModels } from './gemini'; const chatModelProviders = { openai: loadOpenAIChatModels, groq: loadGroqChatModels, ollama: loadOllamaChatModels, anthropic: loadAnthropicChatModels, + gemini: loadGeminiChatModels, }; const embeddingModelProviders = { openai: loadOpenAIEmbeddingsModels, local: loadTransformersEmbeddingsModels, ollama: loadOllamaEmbeddingsModels, + gemini: loadGeminiEmbeddingsModels, }; export const getAvailableChatModelProviders = async () => { diff --git a/src/routes/config.ts b/src/routes/config.ts index f635e4b..38192b7 100644 --- a/src/routes/config.ts +++ b/src/routes/config.ts @@ -7,6 +7,7 @@ import { getGroqApiKey, getOllamaApiEndpoint, getAnthropicApiKey, + getGeminiApiKey, getOpenaiApiKey, updateConfig, } from '../config'; @@ -52,7 +53,8 @@ router.get('/', async (_, res) => { config['ollamaApiUrl'] = getOllamaApiEndpoint(); config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); - + config['geminiApiKey'] = getGeminiApiKey(); + res.status(200).json(config); } catch (err: any) { res.status(500).json({ message: 'An error has occurred.' }); @@ -68,6 +70,7 @@ router.post('/', async (req, res) => { OPENAI: config.openaiApiKey, GROQ: config.groqApiKey, ANTHROPIC: config.anthropicApiKey, + GEMINI: config.geminiApiKey, }, API_ENDPOINTS: { OLLAMA: config.ollamaApiUrl, diff --git a/ui/components/SettingsDialog.tsx b/ui/components/SettingsDialog.tsx index 716dd7d..163857b 100644 --- a/ui/components/SettingsDialog.tsx +++ b/ui/components/SettingsDialog.tsx @@ -63,6 +63,7 @@ interface SettingsType { openaiApiKey: string; groqApiKey: string; anthropicApiKey: string; + geminiApiKey: string; ollamaApiUrl: string; } @@ -476,6 +477,22 @@ const SettingsDialog = ({ } /> </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Gemini API Key + </p> + <Input + type="text" + placeholder="Gemini API key" + defaultValue={config.geminiApiKey} + onChange={(e) => + setConfig({ + ...config, + geminiApiKey: e.target.value, + }) + } + /> + </div> </div> )} {isLoading && ( diff --git a/yarn.lock b/yarn.lock index 0ea5916..5764b3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -293,6 +293,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== +"@google/generative-ai@^0.7.0": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.7.1.tgz#eb187c75080c0706245699dbc06816c830d8c6a7" + integrity sha512-WTjMLLYL/xfA5BW6xAycRPiAX7FNHKAxrid/ayqC1QMam0KAK0NbMeS9Lubw80gVg5xFMLE+H7pw4wdNzTOlxw== + "@huggingface/jinja@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" @@ -380,6 +385,23 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/core@>=0.2.16 <0.3.0": + version "0.2.36" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.36.tgz#75754c33aa5b9310dcf117047374a1ae011005a4" + integrity sha512-qHLvScqERDeH7y2cLuJaSAlMwg3f/3Oc9nayRSXRU2UuaK/SOhI42cxiPLj1FnuHJSmN0rBQFkrLx02gI4mcVg== + dependencies: + ansi-styles "^5.0.0" + camelcase "6" + decamelize "1.2.0" + js-tiktoken "^1.0.12" + langsmith "^0.1.56-rc.1" + mustache "^4.2.0" + p-queue "^6.6.2" + p-retry "4" + uuid "^10.0.0" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" + "@langchain/core@>=0.2.9 <0.3.0": version "0.2.15" resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.15.tgz#1bb99ac4fffe935c7ba37edcaa91abfba3c82219" @@ -415,6 +437,15 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/google-genai@^0.0.23": + version "0.0.23" + resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.0.23.tgz#e73af501bc1df4c7642b531759b82dc3eb7ae459" + integrity sha512-MTSCJEoKsfU1inz0PWvAjITdNFM4s41uvBCwLpcgx3jWJIEisczFD82x86ahYqJlb2fD6tohYSaCH/4tKAdkXA== + dependencies: + "@google/generative-ai" "^0.7.0" + "@langchain/core" ">=0.2.16 <0.3.0" + zod-to-json-schema "^3.22.4" + "@langchain/openai@^0.0.25", "@langchain/openai@~0.0.19": version "0.0.25" resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" @@ -712,6 +743,11 @@ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/uuid@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" + integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== + "@types/uuid@^9.0.1": version "9.0.8" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" @@ -1900,6 +1936,18 @@ langchainhub@~0.0.8: resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== +langsmith@^0.1.56-rc.1: + version "0.1.68" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.68.tgz#848332e822fe5e6734a07f1c36b6530cc1798afb" + integrity sha512-otmiysWtVAqzMx3CJ4PrtUBhWRG5Co8Z4o7hSZENPjlit9/j3/vm3TSvbaxpDYakZxtMjhkcJTqrdYFipISEiQ== + dependencies: + "@types/uuid" "^10.0.0" + commander "^10.0.1" + p-queue "^6.6.2" + p-retry "4" + semver "^7.6.3" + uuid "^10.0.0" + langsmith@~0.1.1, langsmith@~0.1.7: version "0.1.14" resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" @@ -2568,6 +2616,11 @@ semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: dependencies: lru-cache "^6.0.0" +semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" From 92f66266b0a0fafd153ad653708105511c10e88d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:05:28 +0530 Subject: [PATCH 094/282] feat(agents): add a unified agent --- src/search/metaSearchAgent.ts | 486 ++++++++++++++++++++++++++++++++++ 1 file changed, 486 insertions(+) create mode 100644 src/search/metaSearchAgent.ts diff --git a/src/search/metaSearchAgent.ts b/src/search/metaSearchAgent.ts new file mode 100644 index 0000000..0dde085 --- /dev/null +++ b/src/search/metaSearchAgent.ts @@ -0,0 +1,486 @@ +import { ChatOpenAI } from '@langchain/openai'; +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import type { Embeddings } from '@langchain/core/embeddings'; +import { + ChatPromptTemplate, + MessagesPlaceholder, + PromptTemplate, +} from '@langchain/core/prompts'; +import { + RunnableLambda, + RunnableMap, + RunnableSequence, +} from '@langchain/core/runnables'; +import { BaseMessage } from '@langchain/core/messages'; +import { StringOutputParser } from '@langchain/core/output_parsers'; +import LineListOutputParser from '../lib/outputParsers/listLineOutputParser'; +import LineOutputParser from '../lib/outputParsers/lineOutputParser'; +import { getDocumentsFromLinks } from '../utils/documents'; +import { Document } from 'langchain/document'; +import { searchSearxng } from '../lib/searxng'; +import path from 'path'; +import fs from 'fs'; +import computeSimilarity from '../utils/computeSimilarity'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import eventEmitter from 'events'; +import { StreamEvent } from '@langchain/core/tracers/log_stream'; +import { IterableReadableStream } from '@langchain/core/utils/stream'; + +export interface MetaSearchAgentType { + searchAndAnswer: ( + message: string, + history: BaseMessage[], + llm: BaseChatModel, + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], + ) => Promise<eventEmitter>; +} + +interface Config { + searchWeb: boolean; + rerank: boolean; + summarizer: boolean; + rerankThreshold: number; + queryGeneratorPrompt: string; + responsePrompt: string; + activeEngines: string[]; +} + +type BasicChainInput = { + chat_history: BaseMessage[]; + query: string; +}; + +class MetaSearchAgent implements MetaSearchAgentType { + private config: Config; + private strParser = new StringOutputParser(); + + constructor(config: Config) { + this.config = config; + } + + private async createSearchRetrieverChain(llm: BaseChatModel) { + (llm as unknown as ChatOpenAI).temperature = 0; + + return RunnableSequence.from([ + PromptTemplate.fromTemplate(this.config.queryGeneratorPrompt), + llm, + this.strParser, + RunnableLambda.from(async (input: string) => { + const linksOutputParser = new LineListOutputParser({ + key: 'links', + }); + + const questionOutputParser = new LineOutputParser({ + key: 'question', + }); + + const links = await linksOutputParser.parse(input); + let question = this.config.summarizer + ? await questionOutputParser.parse(input) + : input; + + if (question === 'not_needed') { + return { query: '', docs: [] }; + } + + if (links.length > 0) { + if (question.length === 0) { + question = 'summarize'; + } + + let docs = []; + + const linkDocs = await getDocumentsFromLinks({ links }); + + const docGroups: Document[] = []; + + linkDocs.map((doc) => { + const URLDocExists = docGroups.find( + (d) => + d.metadata.url === doc.metadata.url && + d.metadata.totalDocs < 10, + ); + + if (!URLDocExists) { + docGroups.push({ + ...doc, + metadata: { + ...doc.metadata, + totalDocs: 1, + }, + }); + } + + const docIndex = docGroups.findIndex( + (d) => + d.metadata.url === doc.metadata.url && + d.metadata.totalDocs < 10, + ); + + if (docIndex !== -1) { + docGroups[docIndex].pageContent = + docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; + docGroups[docIndex].metadata.totalDocs += 1; + } + }); + + await Promise.all( + docGroups.map(async (doc) => { + const res = await llm.invoke(` + You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the + text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query. + If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary. + + - **Journalistic tone**: The summary should sound professional and journalistic, not too casual or vague. + - **Thorough and detailed**: Ensure that every key point from the text is captured and that the summary directly answers the query. + - **Not too lengthy, but detailed**: The summary should be informative but not excessively long. Focus on providing detailed information in a concise format. + + The text will be shared inside the \`text\` XML tag, and the query inside the \`query\` XML tag. + + <example> + 1. \`<text> + Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers. + It was first released in 2013 and is developed by Docker, Inc. Docker is designed to make it easier to create, deploy, and run applications + by using containers. + </text> + + <query> + What is Docker and how does it work? + </query> + + Response: + Docker is a revolutionary platform-as-a-service product developed by Docker, Inc., that uses container technology to make application + deployment more efficient. It allows developers to package their software with all necessary dependencies, making it easier to run in + any environment. Released in 2013, Docker has transformed the way applications are built, deployed, and managed. + \` + 2. \`<text> + The theory of relativity, or simply relativity, encompasses two interrelated theories of Albert Einstein: special relativity and general + relativity. However, the word "relativity" is sometimes used in reference to Galilean invariance. The term "theory of relativity" was based + on the expression "relative theory" used by Max Planck in 1906. The theory of relativity usually encompasses two interrelated theories by + Albert Einstein: special relativity and general relativity. Special relativity applies to all physical phenomena in the absence of gravity. + General relativity explains the law of gravitation and its relation to other forces of nature. It applies to the cosmological and astrophysical + realm, including astronomy. + </text> + + <query> + summarize + </query> + + Response: + The theory of relativity, developed by Albert Einstein, encompasses two main theories: special relativity and general relativity. Special + relativity applies to all physical phenomena in the absence of gravity, while general relativity explains the law of gravitation and its + relation to other forces of nature. The theory of relativity is based on the concept of "relative theory," as introduced by Max Planck in + 1906. It is a fundamental theory in physics that has revolutionized our understanding of the universe. + \` + </example> + + Everything below is the actual data you will be working with. Good luck! + + <query> + ${question} + </query> + + <text> + ${doc.pageContent} + </text> + + Make sure to answer the query in the summary. + `); + + const document = new Document({ + pageContent: res.content as string, + metadata: { + title: doc.metadata.title, + url: doc.metadata.url, + }, + }); + + docs.push(document); + }), + ); + + return { query: question, docs: docs }; + } else { + const res = await searchSearxng(question, { + language: 'en', + engines: this.config.activeEngines, + }); + + const documents = res.results.map( + (result) => + new Document({ + pageContent: result.content, + metadata: { + title: result.title, + url: result.url, + ...(result.img_src && { img_src: result.img_src }), + }, + }), + ); + + return { query: question, docs: documents }; + } + }), + ]); + } + + private async createAnsweringChain( + llm: BaseChatModel, + fileIds: string[], + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + ) { + return RunnableSequence.from([ + RunnableMap.from({ + query: (input: BasicChainInput) => input.query, + chat_history: (input: BasicChainInput) => input.chat_history, + context: RunnableLambda.from(async (input: BasicChainInput) => { + const processedHistory = formatChatHistoryAsString( + input.chat_history, + ); + + let docs: Document[] | null = null; + let query = input.query; + + if (this.config.searchWeb) { + const searchRetrieverChain = + await this.createSearchRetrieverChain(llm); + + const searchRetrieverResult = await searchRetrieverChain.invoke({ + chat_history: processedHistory, + query, + }); + + query = searchRetrieverResult.query; + docs = searchRetrieverResult.docs; + } + + const sortedDocs = await this.rerankDocs( + query, + docs ?? [], + fileIds, + embeddings, + optimizationMode, + ); + + return sortedDocs; + }) + .withConfig({ + runName: 'FinalSourceRetriever', + }) + .pipe(this.processDocs), + }), + ChatPromptTemplate.fromMessages([ + ['system', this.config.responsePrompt], + new MessagesPlaceholder('chat_history'), + ['user', '{query}'], + ]), + llm, + this.strParser, + ]).withConfig({ + runName: 'FinalResponseGenerator', + }); + } + + private async rerankDocs( + query: string, + docs: Document[], + fileIds: string[], + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + ) { + if (docs.length === 0 && fileIds.length === 0) { + return docs; + } + + const filesData = fileIds + .map((file) => { + const filePath = path.join(process.cwd(), 'uploads', file); + + const contentPath = filePath + '-extracted.json'; + const embeddingsPath = filePath + '-embeddings.json'; + + const content = JSON.parse(fs.readFileSync(contentPath, 'utf8')); + const embeddings = JSON.parse(fs.readFileSync(embeddingsPath, 'utf8')); + + const fileSimilaritySearchObject = content.contents.map( + (c: string, i) => { + return { + fileName: content.title, + content: c, + embeddings: embeddings.embeddings[i], + }; + }, + ); + + return fileSimilaritySearchObject; + }) + .flat(); + + if (query.toLocaleLowerCase() === 'summarize') { + return docs.slice(0, 15); + } + + const docsWithContent = docs.filter( + (doc) => doc.pageContent && doc.pageContent.length > 0, + ); + + if (optimizationMode === 'speed' || this.config.rerank === false) { + if (filesData.length > 0) { + const [queryEmbedding] = await Promise.all([ + embeddings.embedQuery(query), + ]); + + const fileDocs = filesData.map((fileData) => { + return new Document({ + pageContent: fileData.content, + metadata: { + title: fileData.fileName, + url: `File`, + }, + }); + }); + + const similarity = filesData.map((fileData, i) => { + const sim = computeSimilarity(queryEmbedding, fileData.embeddings); + + return { + index: i, + similarity: sim, + }; + }); + + let sortedDocs = similarity + .filter( + (sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3), + ) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => fileDocs[sim.index]); + + sortedDocs = + docsWithContent.length > 0 ? sortedDocs.slice(0, 8) : sortedDocs; + + return [ + ...sortedDocs, + ...docsWithContent.slice(0, 15 - sortedDocs.length), + ]; + } else { + return docsWithContent.slice(0, 15); + } + } else if (optimizationMode === 'balanced') { + const [docEmbeddings, queryEmbedding] = await Promise.all([ + embeddings.embedDocuments( + docsWithContent.map((doc) => doc.pageContent), + ), + embeddings.embedQuery(query), + ]); + + docsWithContent.push( + ...filesData.map((fileData) => { + return new Document({ + pageContent: fileData.content, + metadata: { + title: fileData.fileName, + url: `File`, + }, + }); + }), + ); + + docEmbeddings.push(...filesData.map((fileData) => fileData.embeddings)); + + const similarity = docEmbeddings.map((docEmbedding, i) => { + const sim = computeSimilarity(queryEmbedding, docEmbedding); + + return { + index: i, + similarity: sim, + }; + }); + + const sortedDocs = similarity + .filter((sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3)) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => docsWithContent[sim.index]); + + return sortedDocs; + } + } + + private processDocs(docs: Document[]) { + return docs + .map((_, index) => `${index + 1}. ${docs[index].pageContent}`) + .join('\n'); + } + + private async handleStream( + stream: IterableReadableStream<StreamEvent>, + emitter: eventEmitter, + ) { + for await (const event of stream) { + if ( + event.event === 'on_chain_end' && + event.name === 'FinalSourceRetriever' + ) { + ``; + emitter.emit( + 'data', + JSON.stringify({ type: 'sources', data: event.data.output }), + ); + } + if ( + event.event === 'on_chain_stream' && + event.name === 'FinalResponseGenerator' + ) { + emitter.emit( + 'data', + JSON.stringify({ type: 'response', data: event.data.chunk }), + ); + } + if ( + event.event === 'on_chain_end' && + event.name === 'FinalResponseGenerator' + ) { + emitter.emit('end'); + } + } + } + + async searchAndAnswer( + message: string, + history: BaseMessage[], + llm: BaseChatModel, + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], + ) { + const emitter = new eventEmitter(); + + const answeringChain = await this.createAnsweringChain( + llm, + fileIds, + embeddings, + optimizationMode, + ); + + const stream = answeringChain.streamEvents( + { + chat_history: history, + query: message, + }, + { + version: 'v1', + }, + ); + + this.handleStream(stream, emitter); + + return emitter; + } +} + +export default MetaSearchAgent; From dc4a843d8a3aaa76d5675ac34be9df2ab3247b44 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:06:00 +0530 Subject: [PATCH 095/282] feat(agents): switch to `MetaSearchAgent` --- src/agents/academicSearchAgent.ts | 280 --------- src/agents/redditSearchAgent.ts | 276 --------- src/agents/webSearchAgent.ts | 541 ------------------ src/agents/wolframAlphaSearchAgent.ts | 220 ------- src/agents/writingAssistant.ts | 91 --- src/agents/youtubeSearchAgent.ts | 277 --------- src/{agents => chains}/imageSearchAgent.ts | 0 .../suggestionGeneratorAgent.ts | 0 src/{agents => chains}/videoSearchAgent.ts | 0 src/prompts/academicSearch.ts | 42 ++ src/prompts/index.ts | 32 ++ src/prompts/redditSearch.ts | 42 ++ src/prompts/webSearch.ts | 86 +++ src/prompts/wolframAlpha.ts | 42 ++ src/prompts/writingAssistant.ts | 13 + src/prompts/youtubeSearch.ts | 42 ++ src/routes/images.ts | 2 +- src/routes/search.ts | 10 +- src/routes/suggestions.ts | 2 +- src/routes/videos.ts | 2 +- src/websocket/messageHandler.ts | 169 ++++-- 21 files changed, 418 insertions(+), 1751 deletions(-) delete mode 100644 src/agents/academicSearchAgent.ts delete mode 100644 src/agents/redditSearchAgent.ts delete mode 100644 src/agents/webSearchAgent.ts delete mode 100644 src/agents/wolframAlphaSearchAgent.ts delete mode 100644 src/agents/writingAssistant.ts delete mode 100644 src/agents/youtubeSearchAgent.ts rename src/{agents => chains}/imageSearchAgent.ts (100%) rename src/{agents => chains}/suggestionGeneratorAgent.ts (100%) rename src/{agents => chains}/videoSearchAgent.ts (100%) create mode 100644 src/prompts/academicSearch.ts create mode 100644 src/prompts/index.ts create mode 100644 src/prompts/redditSearch.ts create mode 100644 src/prompts/webSearch.ts create mode 100644 src/prompts/wolframAlpha.ts create mode 100644 src/prompts/writingAssistant.ts create mode 100644 src/prompts/youtubeSearch.ts diff --git a/src/agents/academicSearchAgent.ts b/src/agents/academicSearchAgent.ts deleted file mode 100644 index bad4065..0000000 --- a/src/agents/academicSearchAgent.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { BaseMessage } from '@langchain/core/messages'; -import { - PromptTemplate, - ChatPromptTemplate, - MessagesPlaceholder, -} from '@langchain/core/prompts'; -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { Document } from '@langchain/core/documents'; -import { searchSearxng } from '../lib/searxng'; -import type { StreamEvent } from '@langchain/core/tracers/log_stream'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import eventEmitter from 'events'; -import computeSimilarity from '../utils/computeSimilarity'; -import logger from '../utils/logger'; -import { IterableReadableStream } from '@langchain/core/utils/stream'; - -const basicAcademicSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: How does stable diffusion work? -Rephrased: Stable diffusion working - -2. Follow up question: What is linear algebra? -Rephrased: Linear algebra - -3. Follow up question: What is the third law of thermodynamics? -Rephrased: Third law of thermodynamics - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -const basicAcademicSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. - - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. - - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by the search engine and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. - - <context> - {context} - </context> - - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. - Anything between the \`context\` is retrieved from a search engine and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} -`; - -const strParser = new StringOutputParser(); - -const handleStream = async ( - stream: IterableReadableStream<StreamEvent>, - emitter: eventEmitter, -) => { - for await (const event of stream) { - if ( - event.event === 'on_chain_end' && - event.name === 'FinalSourceRetriever' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'sources', data: event.data.output }), - ); - } - if ( - event.event === 'on_chain_stream' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'response', data: event.data.chunk }), - ); - } - if ( - event.event === 'on_chain_end' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit('end'); - } - } -}; - -type BasicChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const createBasicAcademicSearchRetrieverChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - PromptTemplate.fromTemplate(basicAcademicSearchRetrieverPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - if (input === 'not_needed') { - return { query: '', docs: [] }; - } - - const res = await searchSearxng(input, { - language: 'en', - engines: ['arxiv', 'google scholar', 'pubmed'], - }); - - const documents = res.results.map( - (result) => - new Document({ - pageContent: result.content, - metadata: { - title: result.title, - url: result.url, - ...(result.img_src && { img_src: result.img_src }), - }, - }), - ); - - return { query: input, docs: documents }; - }), - ]); -}; - -const createBasicAcademicSearchAnsweringChain = ( - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const basicAcademicSearchRetrieverChain = - createBasicAcademicSearchRetrieverChain(llm); - - const processDocs = async (docs: Document[]) => { - return docs - .map((_, index) => `${index + 1}. ${docs[index].pageContent}`) - .join('\n'); - }; - - const rerankDocs = async ({ - query, - docs, - }: { - query: string; - docs: Document[]; - }) => { - if (docs.length === 0) { - return docs; - } - - const docsWithContent = docs.filter( - (doc) => doc.pageContent && doc.pageContent.length > 0, - ); - - if (optimizationMode === 'speed') { - return docsWithContent.slice(0, 15); - } else if (optimizationMode === 'balanced') { - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments( - docsWithContent.map((doc) => doc.pageContent), - ), - embeddings.embedQuery(query), - ]); - - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); - - return { - index: i, - similarity: sim, - }; - }); - - const sortedDocs = similarity - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); - - return sortedDocs; - } - }; - - return RunnableSequence.from([ - RunnableMap.from({ - query: (input: BasicChainInput) => input.query, - chat_history: (input: BasicChainInput) => input.chat_history, - context: RunnableSequence.from([ - (input) => ({ - query: input.query, - chat_history: formatChatHistoryAsString(input.chat_history), - }), - basicAcademicSearchRetrieverChain - .pipe(rerankDocs) - .withConfig({ - runName: 'FinalSourceRetriever', - }) - .pipe(processDocs), - ]), - }), - ChatPromptTemplate.fromMessages([ - ['system', basicAcademicSearchResponsePrompt], - new MessagesPlaceholder('chat_history'), - ['user', '{query}'], - ]), - llm, - strParser, - ]).withConfig({ - runName: 'FinalResponseGenerator', - }); -}; - -const basicAcademicSearch = ( - query: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const emitter = new eventEmitter(); - - try { - const basicAcademicSearchAnsweringChain = - createBasicAcademicSearchAnsweringChain( - llm, - embeddings, - optimizationMode, - ); - - const stream = basicAcademicSearchAnsweringChain.streamEvents( - { - chat_history: history, - query: query, - }, - { - version: 'v1', - }, - ); - - handleStream(stream, emitter); - } catch (err) { - emitter.emit( - 'error', - JSON.stringify({ data: 'An error has occurred please try again later' }), - ); - logger.error(`Error in academic search: ${err}`); - } - - return emitter; -}; - -const handleAcademicSearch = ( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const emitter = basicAcademicSearch( - message, - history, - llm, - embeddings, - optimizationMode, - ); - return emitter; -}; - -export default handleAcademicSearch; diff --git a/src/agents/redditSearchAgent.ts b/src/agents/redditSearchAgent.ts deleted file mode 100644 index 2c44c13..0000000 --- a/src/agents/redditSearchAgent.ts +++ /dev/null @@ -1,276 +0,0 @@ -import { BaseMessage } from '@langchain/core/messages'; -import { - PromptTemplate, - ChatPromptTemplate, - MessagesPlaceholder, -} from '@langchain/core/prompts'; -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { Document } from '@langchain/core/documents'; -import { searchSearxng } from '../lib/searxng'; -import type { StreamEvent } from '@langchain/core/tracers/log_stream'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import eventEmitter from 'events'; -import computeSimilarity from '../utils/computeSimilarity'; -import logger from '../utils/logger'; -import { IterableReadableStream } from '@langchain/core/utils/stream'; - -const basicRedditSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: Which company is most likely to create an AGI -Rephrased: Which company is most likely to create an AGI - -2. Follow up question: Is Earth flat? -Rephrased: Is Earth flat? - -3. Follow up question: Is there life on Mars? -Rephrased: Is there life on Mars? - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -const basicRedditSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. - - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. - - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Reddit and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. - - <context> - {context} - </context> - - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. - Anything between the \`context\` is retrieved from Reddit and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} -`; - -const strParser = new StringOutputParser(); - -const handleStream = async ( - stream: IterableReadableStream<StreamEvent>, - emitter: eventEmitter, -) => { - for await (const event of stream) { - if ( - event.event === 'on_chain_end' && - event.name === 'FinalSourceRetriever' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'sources', data: event.data.output }), - ); - } - if ( - event.event === 'on_chain_stream' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'response', data: event.data.chunk }), - ); - } - if ( - event.event === 'on_chain_end' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit('end'); - } - } -}; - -type BasicChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const createBasicRedditSearchRetrieverChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - PromptTemplate.fromTemplate(basicRedditSearchRetrieverPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - if (input === 'not_needed') { - return { query: '', docs: [] }; - } - - const res = await searchSearxng(input, { - language: 'en', - engines: ['reddit'], - }); - - const documents = res.results.map( - (result) => - new Document({ - pageContent: result.content ? result.content : result.title, - metadata: { - title: result.title, - url: result.url, - ...(result.img_src && { img_src: result.img_src }), - }, - }), - ); - - return { query: input, docs: documents }; - }), - ]); -}; - -const createBasicRedditSearchAnsweringChain = ( - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const basicRedditSearchRetrieverChain = - createBasicRedditSearchRetrieverChain(llm); - - const processDocs = async (docs: Document[]) => { - return docs - .map((_, index) => `${index + 1}. ${docs[index].pageContent}`) - .join('\n'); - }; - - const rerankDocs = async ({ - query, - docs, - }: { - query: string; - docs: Document[]; - }) => { - if (docs.length === 0) { - return docs; - } - - const docsWithContent = docs.filter( - (doc) => doc.pageContent && doc.pageContent.length > 0, - ); - - if (optimizationMode === 'speed') { - return docsWithContent.slice(0, 15); - } else if (optimizationMode === 'balanced') { - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments( - docsWithContent.map((doc) => doc.pageContent), - ), - embeddings.embedQuery(query), - ]); - - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); - - return { - index: i, - similarity: sim, - }; - }); - - const sortedDocs = similarity - .filter((sim) => sim.similarity > 0.3) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); - - return sortedDocs; - } - }; - - return RunnableSequence.from([ - RunnableMap.from({ - query: (input: BasicChainInput) => input.query, - chat_history: (input: BasicChainInput) => input.chat_history, - context: RunnableSequence.from([ - (input) => ({ - query: input.query, - chat_history: formatChatHistoryAsString(input.chat_history), - }), - basicRedditSearchRetrieverChain - .pipe(rerankDocs) - .withConfig({ - runName: 'FinalSourceRetriever', - }) - .pipe(processDocs), - ]), - }), - ChatPromptTemplate.fromMessages([ - ['system', basicRedditSearchResponsePrompt], - new MessagesPlaceholder('chat_history'), - ['user', '{query}'], - ]), - llm, - strParser, - ]).withConfig({ - runName: 'FinalResponseGenerator', - }); -}; - -const basicRedditSearch = ( - query: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const emitter = new eventEmitter(); - - try { - const basicRedditSearchAnsweringChain = - createBasicRedditSearchAnsweringChain(llm, embeddings, optimizationMode); - const stream = basicRedditSearchAnsweringChain.streamEvents( - { - chat_history: history, - query: query, - }, - { - version: 'v1', - }, - ); - - handleStream(stream, emitter); - } catch (err) { - emitter.emit( - 'error', - JSON.stringify({ data: 'An error has occurred please try again later' }), - ); - logger.error(`Error in RedditSearch: ${err}`); - } - - return emitter; -}; - -const handleRedditSearch = ( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const emitter = basicRedditSearch( - message, - history, - llm, - embeddings, - optimizationMode, - ); - return emitter; -}; - -export default handleRedditSearch; diff --git a/src/agents/webSearchAgent.ts b/src/agents/webSearchAgent.ts deleted file mode 100644 index 4303762..0000000 --- a/src/agents/webSearchAgent.ts +++ /dev/null @@ -1,541 +0,0 @@ -import { BaseMessage } from '@langchain/core/messages'; -import { - PromptTemplate, - ChatPromptTemplate, - MessagesPlaceholder, -} from '@langchain/core/prompts'; -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { Document } from '@langchain/core/documents'; -import { searchSearxng } from '../lib/searxng'; -import type { StreamEvent } from '@langchain/core/tracers/log_stream'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import eventEmitter from 'events'; -import computeSimilarity from '../utils/computeSimilarity'; -import logger from '../utils/logger'; -import LineListOutputParser from '../lib/outputParsers/listLineOutputParser'; -import LineOutputParser from '../lib/outputParsers/lineOutputParser'; -import { IterableReadableStream } from '@langchain/core/utils/stream'; -import { ChatOpenAI } from '@langchain/openai'; -import path from 'path'; -import fs from 'fs'; -import { getDocumentsFromLinks } from '../utils/documents'; - -const basicSearchRetrieverPrompt = ` -You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. -If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). -If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. -You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. - -There are several examples attached for your reference inside the below \`examples\` XML block - -<examples> -1. Follow up question: What is the capital of France -Rephrased question:\` -<question> -Capital of france -</question> -\` - -2. Hi, how are you? -Rephrased question\` -<question> -not_needed -</question> -\` - -3. Follow up question: What is Docker? -Rephrased question: \` -<question> -What is Docker -</question> -\` - -4. Follow up question: Can you tell me what is X from https://example.com -Rephrased question: \` -<question> -Can you tell me what is X? -</question> - -<links> -https://example.com -</links> -\` - -5. Follow up question: Summarize the content from https://example.com -Rephrased question: \` -<question> -summarize -</question> - -<links> -https://example.com -</links> -\` -</examples> - -Anything below is the part of the actual conversation and you need to use conversation and the follow-up question to rephrase the follow-up question as a standalone question based on the guidelines shared above. - -<conversation> -{chat_history} -</conversation> - -Follow up question: {query} -Rephrased question: -`; - -const basicWebSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are also an expert at summarizing web pages or documents and searching for content in them. - - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - If the query contains some links and the user asks to answer from those links you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to answer the user's query. - If the user asks to summarize content from some links, you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to summarize the text. The content provided inside the \`context\` block will be already summarized by another model so you just need to use that content to answer the user's query. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. - - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by the search engine and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. - - <context> - {context} - </context> - - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. You do not need to do this for summarization tasks. - Anything between the \`context\` is retrieved from a search engine and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} -`; - -const strParser = new StringOutputParser(); - -const handleStream = async ( - stream: IterableReadableStream<StreamEvent>, - emitter: eventEmitter, -) => { - for await (const event of stream) { - if ( - event.event === 'on_chain_end' && - event.name === 'FinalSourceRetriever' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'sources', data: event.data.output }), - ); - } - if ( - event.event === 'on_chain_stream' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'response', data: event.data.chunk }), - ); - } - if ( - event.event === 'on_chain_end' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit('end'); - } - } -}; - -type BasicChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const createBasicWebSearchRetrieverChain = (llm: BaseChatModel) => { - (llm as unknown as ChatOpenAI).temperature = 0; - - return RunnableSequence.from([ - PromptTemplate.fromTemplate(basicSearchRetrieverPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - const linksOutputParser = new LineListOutputParser({ - key: 'links', - }); - - const questionOutputParser = new LineOutputParser({ - key: 'question', - }); - - const links = await linksOutputParser.parse(input); - let question = await questionOutputParser.parse(input); - - if (question === 'not_needed') { - return { query: '', docs: [] }; - } - - if (links.length > 0) { - if (question.length === 0) { - question = 'summarize'; - } - - let docs = []; - - const linkDocs = await getDocumentsFromLinks({ links }); - - const docGroups: Document[] = []; - - linkDocs.map((doc) => { - const URLDocExists = docGroups.find( - (d) => - d.metadata.url === doc.metadata.url && d.metadata.totalDocs < 10, - ); - - if (!URLDocExists) { - docGroups.push({ - ...doc, - metadata: { - ...doc.metadata, - totalDocs: 1, - }, - }); - } - - const docIndex = docGroups.findIndex( - (d) => - d.metadata.url === doc.metadata.url && d.metadata.totalDocs < 10, - ); - - if (docIndex !== -1) { - docGroups[docIndex].pageContent = - docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; - docGroups[docIndex].metadata.totalDocs += 1; - } - }); - - await Promise.all( - docGroups.map(async (doc) => { - const res = await llm.invoke(` - You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the - text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query. - If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary. - - - **Journalistic tone**: The summary should sound professional and journalistic, not too casual or vague. - - **Thorough and detailed**: Ensure that every key point from the text is captured and that the summary directly answers the query. - - **Not too lengthy, but detailed**: The summary should be informative but not excessively long. Focus on providing detailed information in a concise format. - - The text will be shared inside the \`text\` XML tag, and the query inside the \`query\` XML tag. - - <example> - 1. \`<text> - Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers. - It was first released in 2013 and is developed by Docker, Inc. Docker is designed to make it easier to create, deploy, and run applications - by using containers. - </text> - - <query> - What is Docker and how does it work? - </query> - - Response: - Docker is a revolutionary platform-as-a-service product developed by Docker, Inc., that uses container technology to make application - deployment more efficient. It allows developers to package their software with all necessary dependencies, making it easier to run in - any environment. Released in 2013, Docker has transformed the way applications are built, deployed, and managed. - \` - 2. \`<text> - The theory of relativity, or simply relativity, encompasses two interrelated theories of Albert Einstein: special relativity and general - relativity. However, the word "relativity" is sometimes used in reference to Galilean invariance. The term "theory of relativity" was based - on the expression "relative theory" used by Max Planck in 1906. The theory of relativity usually encompasses two interrelated theories by - Albert Einstein: special relativity and general relativity. Special relativity applies to all physical phenomena in the absence of gravity. - General relativity explains the law of gravitation and its relation to other forces of nature. It applies to the cosmological and astrophysical - realm, including astronomy. - </text> - - <query> - summarize - </query> - - Response: - The theory of relativity, developed by Albert Einstein, encompasses two main theories: special relativity and general relativity. Special - relativity applies to all physical phenomena in the absence of gravity, while general relativity explains the law of gravitation and its - relation to other forces of nature. The theory of relativity is based on the concept of "relative theory," as introduced by Max Planck in - 1906. It is a fundamental theory in physics that has revolutionized our understanding of the universe. - \` - </example> - - Everything below is the actual data you will be working with. Good luck! - - <query> - ${question} - </query> - - <text> - ${doc.pageContent} - </text> - - Make sure to answer the query in the summary. - `); - - const document = new Document({ - pageContent: res.content as string, - metadata: { - title: doc.metadata.title, - url: doc.metadata.url, - }, - }); - - docs.push(document); - }), - ); - - return { query: question, docs: docs }; - } else { - const res = await searchSearxng(question, { - language: 'en', - }); - - const documents = res.results.map( - (result) => - new Document({ - pageContent: result.content, - metadata: { - title: result.title, - url: result.url, - ...(result.img_src && { img_src: result.img_src }), - }, - }), - ); - - return { query: question, docs: documents }; - } - }), - ]); -}; - -const createBasicWebSearchAnsweringChain = ( - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - fileIds: string[], -) => { - const basicWebSearchRetrieverChain = createBasicWebSearchRetrieverChain(llm); - - const processDocs = async (docs: Document[]) => { - return docs - .map((_, index) => `${index + 1}. ${docs[index].pageContent}`) - .join('\n'); - }; - - const rerankDocs = async ({ - query, - docs, - }: { - query: string; - docs: Document[]; - }) => { - if (docs.length === 0) { - return docs; - } - - const filesData = fileIds - .map((file) => { - const filePath = path.join(process.cwd(), 'uploads', file); - - const contentPath = filePath + '-extracted.json'; - const embeddingsPath = filePath + '-embeddings.json'; - - const content = JSON.parse(fs.readFileSync(contentPath, 'utf8')); - const embeddings = JSON.parse(fs.readFileSync(embeddingsPath, 'utf8')); - - const fileSimilaritySearchObject = content.contents.map( - (c: string, i) => { - return { - fileName: content.title, - content: c, - embeddings: embeddings.embeddings[i], - }; - }, - ); - - return fileSimilaritySearchObject; - }) - .flat(); - - if (query.toLocaleLowerCase() === 'summarize') { - return docs.slice(0, 15); - } - - const docsWithContent = docs.filter( - (doc) => doc.pageContent && doc.pageContent.length > 0, - ); - - if (optimizationMode === 'speed') { - if (filesData.length > 0) { - const [queryEmbedding] = await Promise.all([ - embeddings.embedQuery(query), - ]); - - const fileDocs = filesData.map((fileData) => { - return new Document({ - pageContent: fileData.content, - metadata: { - title: fileData.fileName, - url: `File`, - }, - }); - }); - - const similarity = filesData.map((fileData, i) => { - const sim = computeSimilarity(queryEmbedding, fileData.embeddings); - - return { - index: i, - similarity: sim, - }; - }); - - const sortedDocs = similarity - .filter((sim) => sim.similarity > 0.3) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 8) - .map((sim) => fileDocs[sim.index]); - - return [ - ...sortedDocs, - ...docsWithContent.slice(0, 15 - sortedDocs.length), - ]; - } else { - return docsWithContent.slice(0, 15); - } - } else if (optimizationMode === 'balanced') { - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments( - docsWithContent.map((doc) => doc.pageContent), - ), - embeddings.embedQuery(query), - ]); - - docsWithContent.push( - ...filesData.map((fileData) => { - return new Document({ - pageContent: fileData.content, - metadata: { - title: fileData.fileName, - url: `File`, - }, - }); - }), - ); - - docEmbeddings.push(...filesData.map((fileData) => fileData.embeddings)); - - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); - - return { - index: i, - similarity: sim, - }; - }); - - const sortedDocs = similarity - .filter((sim) => sim.similarity > 0.3) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); - - return sortedDocs; - } - }; - - return RunnableSequence.from([ - RunnableMap.from({ - query: (input: BasicChainInput) => input.query, - chat_history: (input: BasicChainInput) => input.chat_history, - context: RunnableSequence.from([ - (input) => ({ - query: input.query, - chat_history: formatChatHistoryAsString(input.chat_history), - }), - basicWebSearchRetrieverChain - .pipe(rerankDocs) - .withConfig({ - runName: 'FinalSourceRetriever', - }) - .pipe(processDocs), - ]), - }), - ChatPromptTemplate.fromMessages([ - ['system', basicWebSearchResponsePrompt], - new MessagesPlaceholder('chat_history'), - ['user', '{query}'], - ]), - llm, - strParser, - ]).withConfig({ - runName: 'FinalResponseGenerator', - }); -}; - -const basicWebSearch = ( - query: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - fileIds: string[], -) => { - const emitter = new eventEmitter(); - - try { - const basicWebSearchAnsweringChain = createBasicWebSearchAnsweringChain( - llm, - embeddings, - optimizationMode, - fileIds, - ); - - const stream = basicWebSearchAnsweringChain.streamEvents( - { - chat_history: history, - query: query, - }, - { - version: 'v1', - }, - ); - - handleStream(stream, emitter); - } catch (err) { - emitter.emit( - 'error', - JSON.stringify({ data: 'An error has occurred please try again later' }), - ); - logger.error(`Error in websearch: ${err}`); - } - - return emitter; -}; - -const handleWebSearch = ( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - fileIds: string[], -) => { - const emitter = basicWebSearch( - message, - history, - llm, - embeddings, - optimizationMode, - fileIds, - ); - return emitter; -}; - -export default handleWebSearch; diff --git a/src/agents/wolframAlphaSearchAgent.ts b/src/agents/wolframAlphaSearchAgent.ts deleted file mode 100644 index 1de8d0f..0000000 --- a/src/agents/wolframAlphaSearchAgent.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { BaseMessage } from '@langchain/core/messages'; -import { - PromptTemplate, - ChatPromptTemplate, - MessagesPlaceholder, -} from '@langchain/core/prompts'; -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { Document } from '@langchain/core/documents'; -import { searchSearxng } from '../lib/searxng'; -import type { StreamEvent } from '@langchain/core/tracers/log_stream'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import eventEmitter from 'events'; -import logger from '../utils/logger'; -import { IterableReadableStream } from '@langchain/core/utils/stream'; - -const basicWolframAlphaSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: What is the atomic radius of S? -Rephrased: Atomic radius of S - -2. Follow up question: What is linear algebra? -Rephrased: Linear algebra - -3. Follow up question: What is the third law of thermodynamics? -Rephrased: Third law of thermodynamics - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -const basicWolframAlphaSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. - - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. - - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Wolfram Alpha and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. - - <context> - {context} - </context> - - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. - Anything between the \`context\` is retrieved from Wolfram Alpha and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} -`; - -const strParser = new StringOutputParser(); - -const handleStream = async ( - stream: IterableReadableStream<StreamEvent>, - emitter: eventEmitter, -) => { - for await (const event of stream) { - if ( - event.event === 'on_chain_end' && - event.name === 'FinalSourceRetriever' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'sources', data: event.data.output }), - ); - } - if ( - event.event === 'on_chain_stream' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'response', data: event.data.chunk }), - ); - } - if ( - event.event === 'on_chain_end' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit('end'); - } - } -}; - -type BasicChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const createBasicWolframAlphaSearchRetrieverChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - PromptTemplate.fromTemplate(basicWolframAlphaSearchRetrieverPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - if (input === 'not_needed') { - return { query: '', docs: [] }; - } - - const res = await searchSearxng(input, { - language: 'en', - engines: ['wolframalpha'], - }); - - const documents = res.results.map( - (result) => - new Document({ - pageContent: result.content, - metadata: { - title: result.title, - url: result.url, - ...(result.img_src && { img_src: result.img_src }), - }, - }), - ); - - return { query: input, docs: documents }; - }), - ]); -}; - -const createBasicWolframAlphaSearchAnsweringChain = (llm: BaseChatModel) => { - const basicWolframAlphaSearchRetrieverChain = - createBasicWolframAlphaSearchRetrieverChain(llm); - - const processDocs = (docs: Document[]) => { - return docs - .map((_, index) => `${index + 1}. ${docs[index].pageContent}`) - .join('\n'); - }; - - return RunnableSequence.from([ - RunnableMap.from({ - query: (input: BasicChainInput) => input.query, - chat_history: (input: BasicChainInput) => input.chat_history, - context: RunnableSequence.from([ - (input) => ({ - query: input.query, - chat_history: formatChatHistoryAsString(input.chat_history), - }), - basicWolframAlphaSearchRetrieverChain - .pipe(({ query, docs }) => { - return docs; - }) - .withConfig({ - runName: 'FinalSourceRetriever', - }) - .pipe(processDocs), - ]), - }), - ChatPromptTemplate.fromMessages([ - ['system', basicWolframAlphaSearchResponsePrompt], - new MessagesPlaceholder('chat_history'), - ['user', '{query}'], - ]), - llm, - strParser, - ]).withConfig({ - runName: 'FinalResponseGenerator', - }); -}; - -const basicWolframAlphaSearch = ( - query: string, - history: BaseMessage[], - llm: BaseChatModel, -) => { - const emitter = new eventEmitter(); - - try { - const basicWolframAlphaSearchAnsweringChain = - createBasicWolframAlphaSearchAnsweringChain(llm); - const stream = basicWolframAlphaSearchAnsweringChain.streamEvents( - { - chat_history: history, - query: query, - }, - { - version: 'v1', - }, - ); - - handleStream(stream, emitter); - } catch (err) { - emitter.emit( - 'error', - JSON.stringify({ data: 'An error has occurred please try again later' }), - ); - logger.error(`Error in WolframAlphaSearch: ${err}`); - } - - return emitter; -}; - -const handleWolframAlphaSearch = ( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, -) => { - const emitter = basicWolframAlphaSearch(message, history, llm); - return emitter; -}; - -export default handleWolframAlphaSearch; diff --git a/src/agents/writingAssistant.ts b/src/agents/writingAssistant.ts deleted file mode 100644 index 7e275df..0000000 --- a/src/agents/writingAssistant.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { BaseMessage } from '@langchain/core/messages'; -import { - ChatPromptTemplate, - MessagesPlaceholder, -} from '@langchain/core/prompts'; -import { RunnableSequence } from '@langchain/core/runnables'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import type { StreamEvent } from '@langchain/core/tracers/log_stream'; -import eventEmitter from 'events'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import logger from '../utils/logger'; -import { IterableReadableStream } from '@langchain/core/utils/stream'; - -const writingAssistantPrompt = ` -You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are currently set on focus mode 'Writing Assistant', this means you will be helping the user write a response to a given query. -Since you are a writing assistant, you would not perform web searches. If you think you lack information to answer the query, you can ask the user for more information or suggest them to switch to a different focus mode. -`; - -const strParser = new StringOutputParser(); - -const handleStream = async ( - stream: IterableReadableStream<StreamEvent>, - emitter: eventEmitter, -) => { - for await (const event of stream) { - if ( - event.event === 'on_chain_stream' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'response', data: event.data.chunk }), - ); - } - if ( - event.event === 'on_chain_end' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit('end'); - } - } -}; - -const createWritingAssistantChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - ChatPromptTemplate.fromMessages([ - ['system', writingAssistantPrompt], - new MessagesPlaceholder('chat_history'), - ['user', '{query}'], - ]), - llm, - strParser, - ]).withConfig({ - runName: 'FinalResponseGenerator', - }); -}; - -const handleWritingAssistant = ( - query: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, -) => { - const emitter = new eventEmitter(); - - try { - const writingAssistantChain = createWritingAssistantChain(llm); - const stream = writingAssistantChain.streamEvents( - { - chat_history: history, - query: query, - }, - { - version: 'v1', - }, - ); - - handleStream(stream, emitter); - } catch (err) { - emitter.emit( - 'error', - JSON.stringify({ data: 'An error has occurred please try again later' }), - ); - logger.error(`Error in writing assistant: ${err}`); - } - - return emitter; -}; - -export default handleWritingAssistant; diff --git a/src/agents/youtubeSearchAgent.ts b/src/agents/youtubeSearchAgent.ts deleted file mode 100644 index 2f53bc9..0000000 --- a/src/agents/youtubeSearchAgent.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { BaseMessage } from '@langchain/core/messages'; -import { - PromptTemplate, - ChatPromptTemplate, - MessagesPlaceholder, -} from '@langchain/core/prompts'; -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { Document } from '@langchain/core/documents'; -import { searchSearxng } from '../lib/searxng'; -import type { StreamEvent } from '@langchain/core/tracers/log_stream'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import eventEmitter from 'events'; -import computeSimilarity from '../utils/computeSimilarity'; -import logger from '../utils/logger'; -import { IterableReadableStream } from '@langchain/core/utils/stream'; - -const basicYoutubeSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: How does an A.C work? -Rephrased: A.C working - -2. Follow up question: Linear algebra explanation video -Rephrased: What is linear algebra? - -3. Follow up question: What is theory of relativity? -Rephrased: What is theory of relativity? - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -const basicYoutubeSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcript. - - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. - - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Youtube and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. - - <context> - {context} - </context> - - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. - Anything between the \`context\` is retrieved from Youtube and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} -`; - -const strParser = new StringOutputParser(); - -const handleStream = async ( - stream: IterableReadableStream<StreamEvent>, - emitter: eventEmitter, -) => { - for await (const event of stream) { - if ( - event.event === 'on_chain_end' && - event.name === 'FinalSourceRetriever' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'sources', data: event.data.output }), - ); - } - if ( - event.event === 'on_chain_stream' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'response', data: event.data.chunk }), - ); - } - if ( - event.event === 'on_chain_end' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit('end'); - } - } -}; - -type BasicChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const createBasicYoutubeSearchRetrieverChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - PromptTemplate.fromTemplate(basicYoutubeSearchRetrieverPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - if (input === 'not_needed') { - return { query: '', docs: [] }; - } - - const res = await searchSearxng(input, { - language: 'en', - engines: ['youtube'], - }); - - const documents = res.results.map( - (result) => - new Document({ - pageContent: result.content ? result.content : result.title, - metadata: { - title: result.title, - url: result.url, - ...(result.img_src && { img_src: result.img_src }), - }, - }), - ); - - return { query: input, docs: documents }; - }), - ]); -}; - -const createBasicYoutubeSearchAnsweringChain = ( - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const basicYoutubeSearchRetrieverChain = - createBasicYoutubeSearchRetrieverChain(llm); - - const processDocs = async (docs: Document[]) => { - return docs - .map((_, index) => `${index + 1}. ${docs[index].pageContent}`) - .join('\n'); - }; - - const rerankDocs = async ({ - query, - docs, - }: { - query: string; - docs: Document[]; - }) => { - if (docs.length === 0) { - return docs; - } - - const docsWithContent = docs.filter( - (doc) => doc.pageContent && doc.pageContent.length > 0, - ); - - if (optimizationMode === 'speed') { - return docsWithContent.slice(0, 15); - } else { - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments( - docsWithContent.map((doc) => doc.pageContent), - ), - embeddings.embedQuery(query), - ]); - - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); - - return { - index: i, - similarity: sim, - }; - }); - - const sortedDocs = similarity - .filter((sim) => sim.similarity > 0.3) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); - - return sortedDocs; - } - }; - - return RunnableSequence.from([ - RunnableMap.from({ - query: (input: BasicChainInput) => input.query, - chat_history: (input: BasicChainInput) => input.chat_history, - context: RunnableSequence.from([ - (input) => ({ - query: input.query, - chat_history: formatChatHistoryAsString(input.chat_history), - }), - basicYoutubeSearchRetrieverChain - .pipe(rerankDocs) - .withConfig({ - runName: 'FinalSourceRetriever', - }) - .pipe(processDocs), - ]), - }), - ChatPromptTemplate.fromMessages([ - ['system', basicYoutubeSearchResponsePrompt], - new MessagesPlaceholder('chat_history'), - ['user', '{query}'], - ]), - llm, - strParser, - ]).withConfig({ - runName: 'FinalResponseGenerator', - }); -}; - -const basicYoutubeSearch = ( - query: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const emitter = new eventEmitter(); - - try { - const basicYoutubeSearchAnsweringChain = - createBasicYoutubeSearchAnsweringChain(llm, embeddings, optimizationMode); - - const stream = basicYoutubeSearchAnsweringChain.streamEvents( - { - chat_history: history, - query: query, - }, - { - version: 'v1', - }, - ); - - handleStream(stream, emitter); - } catch (err) { - emitter.emit( - 'error', - JSON.stringify({ data: 'An error has occurred please try again later' }), - ); - logger.error(`Error in youtube search: ${err}`); - } - - return emitter; -}; - -const handleYoutubeSearch = ( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', -) => { - const emitter = basicYoutubeSearch( - message, - history, - llm, - embeddings, - optimizationMode, - ); - return emitter; -}; - -export default handleYoutubeSearch; diff --git a/src/agents/imageSearchAgent.ts b/src/chains/imageSearchAgent.ts similarity index 100% rename from src/agents/imageSearchAgent.ts rename to src/chains/imageSearchAgent.ts diff --git a/src/agents/suggestionGeneratorAgent.ts b/src/chains/suggestionGeneratorAgent.ts similarity index 100% rename from src/agents/suggestionGeneratorAgent.ts rename to src/chains/suggestionGeneratorAgent.ts diff --git a/src/agents/videoSearchAgent.ts b/src/chains/videoSearchAgent.ts similarity index 100% rename from src/agents/videoSearchAgent.ts rename to src/chains/videoSearchAgent.ts diff --git a/src/prompts/academicSearch.ts b/src/prompts/academicSearch.ts new file mode 100644 index 0000000..30495ee --- /dev/null +++ b/src/prompts/academicSearch.ts @@ -0,0 +1,42 @@ +export const academicSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: How does stable diffusion work? +Rephrased: Stable diffusion working + +2. Follow up question: What is linear algebra? +Rephrased: Linear algebra + +3. Follow up question: What is the third law of thermodynamics? +Rephrased: Third law of thermodynamics + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const academicSearchResponsePrompt = ` + You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. + + Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). + You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. + You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. + Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. + You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. + Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. + However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + + Anything inside the following \`context\` HTML block provided below is for your knowledge returned by the search engine and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to + talk about the context in your response. + + <context> + {context} + </context> + + If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. + Anything between the \`context\` is retrieved from a search engine and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} +`; diff --git a/src/prompts/index.ts b/src/prompts/index.ts new file mode 100644 index 0000000..f479185 --- /dev/null +++ b/src/prompts/index.ts @@ -0,0 +1,32 @@ +import { + academicSearchResponsePrompt, + academicSearchRetrieverPrompt, +} from './academicSearch'; +import { + redditSearchResponsePrompt, + redditSearchRetrieverPrompt, +} from './redditSearch'; +import { webSearchResponsePrompt, webSearchRetrieverPrompt } from './webSearch'; +import { + wolframAlphaSearchResponsePrompt, + wolframAlphaSearchRetrieverPrompt, +} from './wolframAlpha'; +import { writingAssistantPrompt } from './writingAssistant'; +import { + youtubeSearchResponsePrompt, + youtubeSearchRetrieverPrompt, +} from './youtubeSearch'; + +export default { + webSearchResponsePrompt, + webSearchRetrieverPrompt, + academicSearchResponsePrompt, + academicSearchRetrieverPrompt, + redditSearchResponsePrompt, + redditSearchRetrieverPrompt, + wolframAlphaSearchResponsePrompt, + wolframAlphaSearchRetrieverPrompt, + writingAssistantPrompt, + youtubeSearchResponsePrompt, + youtubeSearchRetrieverPrompt, +}; diff --git a/src/prompts/redditSearch.ts b/src/prompts/redditSearch.ts new file mode 100644 index 0000000..1418eac --- /dev/null +++ b/src/prompts/redditSearch.ts @@ -0,0 +1,42 @@ +export const redditSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: Which company is most likely to create an AGI +Rephrased: Which company is most likely to create an AGI + +2. Follow up question: Is Earth flat? +Rephrased: Is Earth flat? + +3. Follow up question: Is there life on Mars? +Rephrased: Is there life on Mars? + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const redditSearchResponsePrompt = ` + You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. + + Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). + You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. + You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. + Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. + You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. + Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. + However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + + Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Reddit and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to + talk about the context in your response. + + <context> + {context} + </context> + + If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. + Anything between the \`context\` is retrieved from Reddit and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} +`; diff --git a/src/prompts/webSearch.ts b/src/prompts/webSearch.ts new file mode 100644 index 0000000..834bbfe --- /dev/null +++ b/src/prompts/webSearch.ts @@ -0,0 +1,86 @@ +export const webSearchRetrieverPrompt = ` +You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. +If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). +If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. +You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. + +There are several examples attached for your reference inside the below \`examples\` XML block + +<examples> +1. Follow up question: What is the capital of France +Rephrased question:\` +<question> +Capital of france +</question> +\` + +2. Hi, how are you? +Rephrased question\` +<question> +not_needed +</question> +\` + +3. Follow up question: What is Docker? +Rephrased question: \` +<question> +What is Docker +</question> +\` + +4. Follow up question: Can you tell me what is X from https://example.com +Rephrased question: \` +<question> +Can you tell me what is X? +</question> + +<links> +https://example.com +</links> +\` + +5. Follow up question: Summarize the content from https://example.com +Rephrased question: \` +<question> +summarize +</question> + +<links> +https://example.com +</links> +\` +</examples> + +Anything below is the part of the actual conversation and you need to use conversation and the follow-up question to rephrase the follow-up question as a standalone question based on the guidelines shared above. + +<conversation> +{chat_history} +</conversation> + +Follow up question: {query} +Rephrased question: +`; + +export const webSearchResponsePrompt = ` + You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are also an expert at summarizing web pages or documents and searching for content in them. + + Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). + You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. + You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. + If the query contains some links and the user asks to answer from those links you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to answer the user's query. + If the user asks to summarize content from some links, you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to summarize the text. The content provided inside the \`context\` block will be already summarized by another model so you just need to use that content to answer the user's query. + Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. + You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. + Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. + However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + + Anything inside the following \`context\` HTML block provided below is for your knowledge returned by the search engine and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to + talk about the context in your response. + + <context> + {context} + </context> + + If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. You do not need to do this for summarization tasks. + Anything between the \`context\` is retrieved from a search engine and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} +`; diff --git a/src/prompts/wolframAlpha.ts b/src/prompts/wolframAlpha.ts new file mode 100644 index 0000000..2e9c022 --- /dev/null +++ b/src/prompts/wolframAlpha.ts @@ -0,0 +1,42 @@ +export const wolframAlphaSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: What is the atomic radius of S? +Rephrased: Atomic radius of S + +2. Follow up question: What is linear algebra? +Rephrased: Linear algebra + +3. Follow up question: What is the third law of thermodynamics? +Rephrased: Third law of thermodynamics + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const wolframAlphaSearchResponsePrompt = ` + You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. + + Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). + You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. + You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. + Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. + You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. + Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. + However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + + Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Wolfram Alpha and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to + talk about the context in your response. + + <context> + {context} + </context> + + If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. + Anything between the \`context\` is retrieved from Wolfram Alpha and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} +`; diff --git a/src/prompts/writingAssistant.ts b/src/prompts/writingAssistant.ts new file mode 100644 index 0000000..f56bf47 --- /dev/null +++ b/src/prompts/writingAssistant.ts @@ -0,0 +1,13 @@ +export const writingAssistantPrompt = ` +You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are currently set on focus mode 'Writing Assistant', this means you will be helping the user write a response to a given query. +Since you are a writing assistant, you would not perform web searches. If you think you lack information to answer the query, you can ask the user for more information or suggest them to switch to a different focus mode. +You will be shared a context that can contain information from files user has uploaded to get answers from. You will have to generate answers upon that. + +You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. +Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. +However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + +<context> +{context} +</context> +`; diff --git a/src/prompts/youtubeSearch.ts b/src/prompts/youtubeSearch.ts new file mode 100644 index 0000000..5c729cb --- /dev/null +++ b/src/prompts/youtubeSearch.ts @@ -0,0 +1,42 @@ +export const youtubeSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: How does an A.C work? +Rephrased: A.C working + +2. Follow up question: Linear algebra explanation video +Rephrased: What is linear algebra? + +3. Follow up question: What is theory of relativity? +Rephrased: What is theory of relativity? + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const youtubeSearchResponsePrompt = ` + You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcript. + + Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). + You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. + You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. + Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. + You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. + Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. + However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + + Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Youtube and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to + talk about the context in your response. + + <context> + {context} + </context> + + If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. + Anything between the \`context\` is retrieved from Youtube and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} +`; diff --git a/src/routes/images.ts b/src/routes/images.ts index c54dc40..efa095a 100644 --- a/src/routes/images.ts +++ b/src/routes/images.ts @@ -1,5 +1,5 @@ import express from 'express'; -import handleImageSearch from '../agents/imageSearchAgent'; +import handleImageSearch from '../chains/imageSearchAgent'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { getAvailableChatModelProviders } from '../lib/providers'; import { HumanMessage, AIMessage } from '@langchain/core/messages'; diff --git a/src/routes/search.ts b/src/routes/search.ts index 70fe228..e24b3f9 100644 --- a/src/routes/search.ts +++ b/src/routes/search.ts @@ -1,7 +1,7 @@ import express from 'express'; import logger from '../utils/logger'; -import { BaseChatModel } from 'langchain/chat_models/base'; -import { Embeddings } from 'langchain/embeddings/base'; +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import type { Embeddings } from '@langchain/core/embeddings'; import { ChatOpenAI } from '@langchain/openai'; import { getAvailableChatModelProviders, @@ -9,6 +9,7 @@ import { } from '../lib/providers'; import { searchHandlers } from '../websocket/messageHandler'; import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; +import { MetaSearchAgentType } from '../search/metaSearchAgent'; const router = express.Router(); @@ -115,18 +116,19 @@ router.post('/', async (req, res) => { return res.status(400).json({ message: 'Invalid model selected' }); } - const searchHandler = searchHandlers[body.focusMode]; + const searchHandler: MetaSearchAgentType = searchHandlers[body.focusMode]; if (!searchHandler) { return res.status(400).json({ message: 'Invalid focus mode' }); } - const emitter = searchHandler( + const emitter = await searchHandler.searchAndAnswer( body.query, history, llm, embeddings, body.optimizationMode, + [], ); let message = ''; diff --git a/src/routes/suggestions.ts b/src/routes/suggestions.ts index e997b1e..1d46e5b 100644 --- a/src/routes/suggestions.ts +++ b/src/routes/suggestions.ts @@ -1,5 +1,5 @@ import express from 'express'; -import generateSuggestions from '../agents/suggestionGeneratorAgent'; +import generateSuggestions from '../chains/suggestionGeneratorAgent'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { getAvailableChatModelProviders } from '../lib/providers'; import { HumanMessage, AIMessage } from '@langchain/core/messages'; diff --git a/src/routes/videos.ts b/src/routes/videos.ts index a2555f5..ad87460 100644 --- a/src/routes/videos.ts +++ b/src/routes/videos.ts @@ -3,7 +3,7 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { getAvailableChatModelProviders } from '../lib/providers'; import { HumanMessage, AIMessage } from '@langchain/core/messages'; import logger from '../utils/logger'; -import handleVideoSearch from '../agents/videoSearchAgent'; +import handleVideoSearch from '../chains/videoSearchAgent'; import { ChatOpenAI } from '@langchain/openai'; const router = express.Router(); diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index d2a2518..598d98a 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -1,11 +1,5 @@ import { EventEmitter, WebSocket } from 'ws'; import { BaseMessage, AIMessage, HumanMessage } from '@langchain/core/messages'; -import handleWebSearch from '../agents/webSearchAgent'; -import handleAcademicSearch from '../agents/academicSearchAgent'; -import handleWritingAssistant from '../agents/writingAssistant'; -import handleWolframAlphaSearch from '../agents/wolframAlphaSearchAgent'; -import handleYoutubeSearch from '../agents/youtubeSearchAgent'; -import handleRedditSearch from '../agents/redditSearchAgent'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; import type { Embeddings } from '@langchain/core/embeddings'; import logger from '../utils/logger'; @@ -14,6 +8,10 @@ import { chats, messages as messagesSchema } from '../db/schema'; import { eq, asc, gt } from 'drizzle-orm'; import crypto from 'crypto'; import { getFileDetails } from '../utils/files'; +import MetaSearchAgent, { + MetaSearchAgentType, +} from '../search/metaSearchAgent'; +import prompts from '../prompts'; type Message = { messageId: string; @@ -23,7 +21,7 @@ type Message = { type WSMessage = { message: Message; - optimizationMode: string; + optimizationMode: 'speed' | 'balanced' | 'quality'; type: string; focusMode: string; history: Array<[string, string]>; @@ -31,12 +29,60 @@ type WSMessage = { }; export const searchHandlers = { - webSearch: handleWebSearch, - academicSearch: handleAcademicSearch, - writingAssistant: handleWritingAssistant, - wolframAlphaSearch: handleWolframAlphaSearch, - youtubeSearch: handleYoutubeSearch, - redditSearch: handleRedditSearch, + webSearch: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, + responsePrompt: prompts.webSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: true, + }), + academicSearch: new MetaSearchAgent({ + activeEngines: ['arxiv', 'google scholar', 'pubmed'], + queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, + responsePrompt: prompts.academicSearchResponsePrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + writingAssistant: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: '', + responsePrompt: prompts.writingAssistantPrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: false, + summarizer: false, + }), + wolframAlphaSearch: new MetaSearchAgent({ + activeEngines: ['wolframalpha'], + queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, + responsePrompt: prompts.wolframAlphaSearchResponsePrompt, + rerank: false, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + youtubeSearch: new MetaSearchAgent({ + activeEngines: ['youtube'], + queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, + responsePrompt: prompts.youtubeSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), + redditSearch: new MetaSearchAgent({ + activeEngines: ['reddit'], + queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, + responsePrompt: prompts.redditSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), }; const handleEmitterEvents = ( @@ -134,59 +180,64 @@ export const handleMessage = async ( }); if (parsedWSMessage.type === 'message') { - const handler = searchHandlers[parsedWSMessage.focusMode]; + const handler: MetaSearchAgentType = + searchHandlers[parsedWSMessage.focusMode]; if (handler) { - const emitter = handler( - parsedMessage.content, - history, - llm, - embeddings, - parsedWSMessage.optimizationMode, - parsedWSMessage.files, - ); + try { + const emitter = await handler.searchAndAnswer( + parsedMessage.content, + history, + llm, + embeddings, + parsedWSMessage.optimizationMode, + parsedWSMessage.files, + ); - handleEmitterEvents(emitter, ws, aiMessageId, parsedMessage.chatId); + handleEmitterEvents(emitter, ws, aiMessageId, parsedMessage.chatId); - const chat = await db.query.chats.findFirst({ - where: eq(chats.id, parsedMessage.chatId), - }); + const chat = await db.query.chats.findFirst({ + where: eq(chats.id, parsedMessage.chatId), + }); - if (!chat) { - await db - .insert(chats) - .values({ - id: parsedMessage.chatId, - title: parsedMessage.content, - createdAt: new Date().toString(), - focusMode: parsedWSMessage.focusMode, - files: parsedWSMessage.files.map(getFileDetails), - }) - .execute(); - } + if (!chat) { + await db + .insert(chats) + .values({ + id: parsedMessage.chatId, + title: parsedMessage.content, + createdAt: new Date().toString(), + focusMode: parsedWSMessage.focusMode, + files: parsedWSMessage.files.map(getFileDetails), + }) + .execute(); + } - const messageExists = await db.query.messages.findFirst({ - where: eq(messagesSchema.messageId, humanMessageId), - }); + const messageExists = await db.query.messages.findFirst({ + where: eq(messagesSchema.messageId, humanMessageId), + }); - if (!messageExists) { - await db - .insert(messagesSchema) - .values({ - content: parsedMessage.content, - chatId: parsedMessage.chatId, - messageId: humanMessageId, - role: 'user', - metadata: JSON.stringify({ - createdAt: new Date(), - }), - }) - .execute(); - } else { - await db - .delete(messagesSchema) - .where(gt(messagesSchema.id, messageExists.id)) - .execute(); + if (!messageExists) { + await db + .insert(messagesSchema) + .values({ + content: parsedMessage.content, + chatId: parsedMessage.chatId, + messageId: humanMessageId, + role: 'user', + metadata: JSON.stringify({ + createdAt: new Date(), + }), + }) + .execute(); + } else { + await db + .delete(messagesSchema) + .where(gt(messagesSchema.id, messageExists.id)) + .execute(); + } + } catch (err) { + console.log(err); } } else { ws.send( From e4a07995034b226946ff94df87b4069c7e35cd0a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:37:02 +0530 Subject: [PATCH 096/282] feat(package): bump version --- package.json | 2 +- src/utils/files.ts | 1 + ui/package.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0368b21..3fce442 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.10.0-rc1", + "version": "1.10.0-rc2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/src/utils/files.ts b/src/utils/files.ts index 3e7a134..e6e91df 100644 --- a/src/utils/files.ts +++ b/src/utils/files.ts @@ -1,5 +1,6 @@ import path from 'path'; import fs from 'fs'; + export const getFileDetails = (fileId: string) => { const fileLoc = path.join( process.cwd(), diff --git a/ui/package.json b/ui/package.json index 6e4fc42..bdda684 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.0-rc1", + "version": "1.10.0-rc2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From e08d86444565a1976c4888037a615070360487eb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 30 Nov 2024 20:58:11 +0530 Subject: [PATCH 097/282] feat(focus): only icon on small devices --- ui/components/MessageInputActions/Focus.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index c95be5a..613078b 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -83,7 +83,7 @@ const Focus = ({ {focusMode !== 'webSearch' ? ( <div className="flex flex-row items-center space-x-1"> {focusModes.find((mode) => mode.key === focusMode)?.icon} - <p className="text-xs font-medium"> + <p className="text-xs font-medium hidden lg:block"> {focusModes.find((mode) => mode.key === focusMode)?.title} </p> <ChevronDown size={20} className="-translate-x-1" /> @@ -91,7 +91,7 @@ const Focus = ({ ) : ( <div className="flex flex-row items-center space-x-1"> <ScanEye size={20} /> - <p className="text-xs font-medium">Focus</p> + <p className="text-xs font-medium hidden lg:block">Focus</p> </div> )} </PopoverButton> From 8cb74f1964f3867e46fb431b1585f408b1f44dec Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 2 Dec 2024 21:07:59 +0530 Subject: [PATCH 098/282] feat(contribution): update guidelines --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 73256bd..b16eccf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,6 +8,7 @@ Perplexica's design consists of two main domains: - **Frontend (`ui` directory)**: This is a Next.js application holding all user interface components. It's a self-contained environment that manages everything the user interacts with. - **Backend (root and `src` directory)**: The backend logic is situated in the `src` folder, but the root directory holds the main `package.json` for backend dependency management. + - All of the focus modes are created using the Meta Search Agent class present in `src/search/metaSearchAgent.ts`. The main logic behind Perplexica lies there. ## Setting Up Your Environment From 5b3e8a321472fb712d66ea38caa839a650ed8a2e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:19:22 +0530 Subject: [PATCH 099/282] feat(prompts): implement new prompt --- src/prompts/academicSearch.ts | 47 +++++++++++++++++++++++++--------- src/prompts/redditSearch.ts | 47 +++++++++++++++++++++++++--------- src/prompts/webSearch.ts | 48 +++++++++++++++++++++++++---------- src/prompts/wolframAlpha.ts | 47 +++++++++++++++++++++++++--------- src/prompts/youtubeSearch.ts | 47 +++++++++++++++++++++++++--------- src/search/metaSearchAgent.ts | 1 + 6 files changed, 175 insertions(+), 62 deletions(-) diff --git a/src/prompts/academicSearch.ts b/src/prompts/academicSearch.ts index 30495ee..c2946ff 100644 --- a/src/prompts/academicSearch.ts +++ b/src/prompts/academicSearch.ts @@ -20,23 +20,46 @@ Rephrased question: `; export const academicSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by the search engine and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. <context> {context} </context> - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. - Anything between the \`context\` is retrieved from a search engine and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} + Current date & time in ISO format (UTC timezone) is: {date}. `; diff --git a/src/prompts/redditSearch.ts b/src/prompts/redditSearch.ts index 1418eac..fc71957 100644 --- a/src/prompts/redditSearch.ts +++ b/src/prompts/redditSearch.ts @@ -20,23 +20,46 @@ Rephrased question: `; export const redditSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Reddit and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. <context> {context} </context> - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. - Anything between the \`context\` is retrieved from Reddit and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} + Current date & time in ISO format (UTC timezone) is: {date}. `; diff --git a/src/prompts/webSearch.ts b/src/prompts/webSearch.ts index 834bbfe..d8269c8 100644 --- a/src/prompts/webSearch.ts +++ b/src/prompts/webSearch.ts @@ -62,25 +62,45 @@ Rephrased question: `; export const webSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are also an expert at summarizing web pages or documents and searching for content in them. + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - If the query contains some links and the user asks to answer from those links you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to answer the user's query. - If the user asks to summarize content from some links, you will be provided the entire content of the page inside the \`context\` XML block. You can then use this content to summarize the text. The content provided inside the \`context\` block will be already summarized by another model so you just need to use that content to answer the user's query. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by the search engine and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. <context> {context} </context> - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. You do not need to do this for summarization tasks. - Anything between the \`context\` is retrieved from a search engine and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} + Current date & time in ISO format (UTC timezone) is: {date}. `; diff --git a/src/prompts/wolframAlpha.ts b/src/prompts/wolframAlpha.ts index 2e9c022..40410c1 100644 --- a/src/prompts/wolframAlpha.ts +++ b/src/prompts/wolframAlpha.ts @@ -20,23 +20,46 @@ Rephrased question: `; export const wolframAlphaSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Wolfram Alpha and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. <context> {context} </context> - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. - Anything between the \`context\` is retrieved from Wolfram Alpha and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} + Current date & time in ISO format (UTC timezone) is: {date}. `; diff --git a/src/prompts/youtubeSearch.ts b/src/prompts/youtubeSearch.ts index 5c729cb..5805b54 100644 --- a/src/prompts/youtubeSearch.ts +++ b/src/prompts/youtubeSearch.ts @@ -20,23 +20,46 @@ Rephrased question: `; export const youtubeSearchResponsePrompt = ` - You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcript. + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - Generate a response that is informative and relevant to the user's query based on provided context (the context consits of search results containing a brief description of the content of that page). - You must use this context to answer the user's query in the best way possible. Use an unbaised and journalistic tone in your response. Do not repeat the text. - You must not tell the user to open any link or visit any website to get the answer. You must provide the answer in the response itself. If the user asks for links you can provide them. - Your responses should be medium to long in length be informative and relevant to the user's query. You can use markdowns to format your response. You should use bullet points to list the information. Make sure the answer is not short and is informative. - You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. - Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. - However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - Anything inside the following \`context\` HTML block provided below is for your knowledge returned by Youtube and is not shared by the user. You have to answer question on the basis of it and cite the relevant information from it but you do not have to - talk about the context in your response. + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcrip + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. <context> {context} </context> - If you think there's nothing relevant in the search results, you can say that 'Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?'. - Anything between the \`context\` is retrieved from Youtube and is not a part of the conversation with the user. Today's date is ${new Date().toISOString()} + Current date & time in ISO format (UTC timezone) is: {date}. `; diff --git a/src/search/metaSearchAgent.ts b/src/search/metaSearchAgent.ts index 0dde085..b1d8114 100644 --- a/src/search/metaSearchAgent.ts +++ b/src/search/metaSearchAgent.ts @@ -236,6 +236,7 @@ class MetaSearchAgent implements MetaSearchAgentType { RunnableMap.from({ query: (input: BasicChainInput) => input.query, chat_history: (input: BasicChainInput) => input.chat_history, + date: () => new Date().toISOString(), context: RunnableLambda.from(async (input: BasicChainInput) => { const processedHistory = formatChatHistoryAsString( input.chat_history, From db7407bfac20825333da330aaf9869be06722910 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:19:41 +0530 Subject: [PATCH 100/282] feat(messageBox): style markdown --- ui/components/MessageBox.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index 5222c7c..f23127c 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -107,8 +107,8 @@ const MessageBox = ({ </div> <Markdown className={cn( - 'prose dark:prose-invert prose-p:leading-relaxed prose-pre:p-0', - 'max-w-none break-words text-black dark:text-white text-sm md:text-base font-medium', + 'prose prose-h1:mb-3 prose-h2:mb-2 prose-h2:mt-6 prose-h2:font-[800] prose-h3:mt-4 prose-h3:mb-1.5 prose-h3:font-[600] dark:prose-invert prose-p:leading-relaxed prose-pre:p-0 font-[400]', + 'max-w-none break-words text-black dark:text-white', )} > {parsedMessage} From 2c5ca94b3c7c5f1c7425fb0d7f7603d857690c30 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:19:52 +0530 Subject: [PATCH 101/282] feat(app): lint and beautify --- docs/installation/NETWORKING.md | 90 ++++++++++++++++----------------- src/routes/config.ts | 2 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/installation/NETWORKING.md b/docs/installation/NETWORKING.md index 6cb9bfe..ae39e3f 100644 --- a/docs/installation/NETWORKING.md +++ b/docs/installation/NETWORKING.md @@ -10,27 +10,27 @@ This guide will show you how to make Perplexica available over a network. Follow 3. Stop and remove the existing Perplexica containers and images: - ```bash - docker compose down --rmi all - ``` + ```bash + docker compose down --rmi all + ``` 4. Open the `docker-compose.yaml` file in a text editor like Notepad++ 5. Replace `127.0.0.1` with the IP address of the server Perplexica is running on in these two lines: - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` + ```bash + args: + - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api + - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 + ``` 6. Save and close the `docker-compose.yaml` file 7. Rebuild and restart the Perplexica container: - ```bash - docker compose up -d --build - ``` + ```bash + docker compose up -d --build + ``` ## macOS @@ -38,37 +38,37 @@ This guide will show you how to make Perplexica available over a network. Follow 2. Navigate to the directory with the `docker-compose.yaml` file: - ```bash - cd /path/to/docker-compose.yaml - ``` + ```bash + cd /path/to/docker-compose.yaml + ``` 3. Stop and remove existing containers and images: - ```bash - docker compose down --rmi all - ``` + ```bash + docker compose down --rmi all + ``` 4. Open `docker-compose.yaml` in a text editor like Sublime Text: - ```bash - nano docker-compose.yaml - ``` + ```bash + nano docker-compose.yaml + ``` 5. Replace `127.0.0.1` with the server IP in these lines: - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` + ```bash + args: + - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api + - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 + ``` 6. Save and exit the editor 7. Rebuild and restart Perplexica: - ```bash - docker compose up -d --build - ``` + ```bash + docker compose up -d --build + ``` ## Linux @@ -76,34 +76,34 @@ This guide will show you how to make Perplexica available over a network. Follow 2. Navigate to the `docker-compose.yaml` directory: - ```bash - cd /path/to/docker-compose.yaml - ``` + ```bash + cd /path/to/docker-compose.yaml + ``` 3. Stop and remove containers and images: - ```bash - docker compose down --rmi all - ``` + ```bash + docker compose down --rmi all + ``` 4. Edit `docker-compose.yaml`: - ```bash - nano docker-compose.yaml - ``` + ```bash + nano docker-compose.yaml + ``` 5. Replace `127.0.0.1` with the server IP: - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` + ```bash + args: + - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api + - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 + ``` 6. Save and exit the editor 7. Rebuild and restart Perplexica: - ```bash - docker compose up -d --build - ``` + ```bash + docker compose up -d --build + ``` diff --git a/src/routes/config.ts b/src/routes/config.ts index 38192b7..6ff80c6 100644 --- a/src/routes/config.ts +++ b/src/routes/config.ts @@ -54,7 +54,7 @@ router.get('/', async (_, res) => { config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); config['geminiApiKey'] = getGeminiApiKey(); - + res.status(200).json(config); } catch (err: any) { res.status(500).json({ message: 'An error has occurred.' }); From 1c3c6890398efa6eabfab7e0fb1744494cb26fec Mon Sep 17 00:00:00 2001 From: Ying-Shan Lin <yslinear@gmail.com> Date: Fri, 13 Dec 2024 17:24:15 +0800 Subject: [PATCH 102/282] feat(anthropic): update chat models to include Claude 3.5 Haiku and new version for Sonnet --- src/lib/providers/anthropic.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index 90460c6..642a6cb 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -9,12 +9,20 @@ export const loadAnthropicChatModels = async () => { try { const chatModels = { - 'claude-3-5-sonnet-20240620': { + 'claude-3-5-sonnet-20241022': { displayName: 'Claude 3.5 Sonnet', model: new ChatAnthropic({ temperature: 0.7, anthropicApiKey: anthropicApiKey, - model: 'claude-3-5-sonnet-20240620', + model: 'claude-3-5-sonnet-20241022', + }), + }, + 'claude-3-5-haiku-20241022': { + displayName: 'Claude 3.5 Haiku', + model: new ChatAnthropic({ + temperature: 0.7, + anthropicApiKey: anthropicApiKey, + model: 'claude-3-5-haiku-20241022', }), }, 'claude-3-opus-20240229': { From f30a61c4aa9c0c1289b39aca6d9ac158fdee7efa Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 16 Dec 2024 18:24:01 +0530 Subject: [PATCH 103/282] feat(metaSearchAgent): handle `undefined` content for YT. search --- src/search/metaSearchAgent.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/search/metaSearchAgent.ts b/src/search/metaSearchAgent.ts index b1d8114..1e85cf6 100644 --- a/src/search/metaSearchAgent.ts +++ b/src/search/metaSearchAgent.ts @@ -211,7 +211,11 @@ class MetaSearchAgent implements MetaSearchAgentType { const documents = res.results.map( (result) => new Document({ - pageContent: result.content, + pageContent: + result.content || + this.config.activeEngines.includes('youtube') + ? result.title + : '' /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */, metadata: { title: result.title, url: result.url, @@ -414,7 +418,10 @@ class MetaSearchAgent implements MetaSearchAgentType { private processDocs(docs: Document[]) { return docs - .map((_, index) => `${index + 1}. ${docs[index].pageContent}`) + .map( + (_, index) => + `${index + 1}. ${docs[index].metadata.title} ${docs[index].pageContent}`, + ) .join('\n'); } From c3a231a528d969e72cd5d83a83ca4e3ddb9ee849 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 16 Dec 2024 20:59:21 +0530 Subject: [PATCH 104/282] feat(readme): add discord server --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 721d41c..cf9e459 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> +[![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) + + ![preview](.assets/perplexica-screenshot.png?) ## Table of Contents <!-- omit in toc --> From 4cb38148b31eb53db37a9447450847f6d0c8ac96 Mon Sep 17 00:00:00 2001 From: Bart Jaskulski <bjaskulski@protonmail.com> Date: Thu, 19 Dec 2024 08:07:14 +0100 Subject: [PATCH 105/282] Remove deprecated Groq models Signed-off-by: Bart Jaskulski <bjaskulski@protonmail.com> --- src/lib/providers/groq.ts | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 62ca2d7..16f251b 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -48,19 +48,6 @@ export const loadGroqChatModels = async () => { }, ), }, - 'llama-3.1-70b-versatile': { - displayName: 'Llama 3.1 70B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.1-70b-versatile', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, 'llama-3.1-8b-instant': { displayName: 'Llama 3.1 8B', model: new ChatOpenAI( @@ -113,19 +100,6 @@ export const loadGroqChatModels = async () => { }, ), }, - 'gemma-7b-it': { - displayName: 'Gemma 7B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'gemma-7b-it', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, 'gemma2-9b-it': { displayName: 'Gemma2 9B', model: new ChatOpenAI( From 960e34aa3df48ea85777796f2aa5aa08812f79fb Mon Sep 17 00:00:00 2001 From: Bart Jaskulski <bjaskulski@protonmail.com> Date: Thu, 19 Dec 2024 08:07:36 +0100 Subject: [PATCH 106/282] Add Llama 3.3 model from Groq Signed-off-by: Bart Jaskulski <bjaskulski@protonmail.com> --- src/lib/providers/groq.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 16f251b..41004ec 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -9,6 +9,19 @@ export const loadGroqChatModels = async () => { try { const chatModels = { + 'llama-3.3-70b-versatile': { + displayName: 'Llama 3.3 70B', + model: new ChatOpenAI( + { + openAIApiKey: groqApiKey, + modelName: 'llama-3.3-70b-versatile', + temperature: 0.7, + }, + { + baseURL: 'https://api.groq.com/openai/v1', + }, + ), + }, 'llama-3.2-3b-preview': { displayName: 'Llama 3.2 3B', model: new ChatOpenAI( From d30f714930e39ddd6192317902b1134899de5dc3 Mon Sep 17 00:00:00 2001 From: hacking-racoon <ckgudwlscjsw@naver.com> Date: Wed, 25 Dec 2024 15:19:23 +0900 Subject: [PATCH 107/282] feat(SearchVideos): Modify Lightbox to pause the prev video when moving to next one, preventing interference with new video. --- ui/components/SearchVideos.tsx | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/ui/components/SearchVideos.tsx b/ui/components/SearchVideos.tsx index 2d820ef..170df61 100644 --- a/ui/components/SearchVideos.tsx +++ b/ui/components/SearchVideos.tsx @@ -1,6 +1,6 @@ /* eslint-disable @next/next/no-img-element */ import { PlayCircle, PlayIcon, PlusIcon, VideoIcon } from 'lucide-react'; -import { useState } from 'react'; +import { useRef, useState } from 'react'; import Lightbox, { GenericSlide, VideoSlide } from 'yet-another-react-lightbox'; import 'yet-another-react-lightbox/styles.css'; import { Message } from './ChatWindow'; @@ -35,6 +35,8 @@ const Searchvideos = ({ const [loading, setLoading] = useState(false); const [open, setOpen] = useState(false); const [slides, setSlides] = useState<VideoSlide[]>([]); + const [currentIndex, setCurrentIndex] = useState(0); + const videoRefs = useRef<(HTMLIFrameElement | null)[]>([]); return ( <> @@ -182,18 +184,39 @@ const Searchvideos = ({ open={open} close={() => setOpen(false)} slides={slides} + index={currentIndex} + on={{ + view: ({ index }) => { + const previousIframe = videoRefs.current[currentIndex]; + if (previousIframe?.contentWindow) { + previousIframe.contentWindow.postMessage( + '{"event":"command","func":"pauseVideo","args":""}', + '*', + ); + } + + setCurrentIndex(index); + }, + }} render={{ - slide: ({ slide }) => - slide.type === 'video-slide' ? ( + slide: ({ slide }) => { + const index = slides.findIndex((s) => s === slide); + return slide.type === 'video-slide' ? ( <div className="h-full w-full flex flex-row items-center justify-center"> <iframe - src={slide.iframe_src} + src={`${slide.iframe_src}${slide.iframe_src.includes('?') ? '&' : '?'}enablejsapi=1`} + ref={(el) => { + if (el) { + videoRefs.current[index] = el; + } + }} className="aspect-video max-h-[95vh] w-[95vw] rounded-2xl md:w-[80vw]" allowFullScreen allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" /> </div> - ) : null, + ) : null; + }, }} /> </> From b5acf34ef8c7cddebd0b6978a5ab8135e5cfb9dc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 26 Dec 2024 18:59:57 +0530 Subject: [PATCH 108/282] feat(chat-window): fix bugs handling custom openai, closes #529 --- ui/components/ChatWindow.tsx | 46 +++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index fd3d0a6..62fa9dc 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -43,6 +43,14 @@ const useSocket = ( let embeddingModelProvider = localStorage.getItem( 'embeddingModelProvider', ); + let openAIBaseURL = + chatModelProvider === 'custom_openai' + ? localStorage.getItem('openAIBaseURL') + : null; + let openAIPIKey = + chatModelProvider === 'custom_openai' + ? localStorage.getItem('openAIApiKey') + : null; const providers = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/models`, @@ -62,16 +70,18 @@ const useSocket = ( if (!chatModel || !chatModelProvider) { const chatModelProviders = providers.chatModelProviders; - chatModelProvider = Object.keys(chatModelProviders)[0]; + chatModelProvider = + chatModelProvider || Object.keys(chatModelProviders)[0]; if (chatModelProvider === 'custom_openai') { toast.error( - 'Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL', + 'Seems like you are using the custom OpenAI provider, please open the settings and enter a model name to use.', ); setError(true); return; } else { chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + if ( !chatModelProviders || Object.keys(chatModelProviders).length === 0 @@ -108,18 +118,42 @@ const useSocket = ( if ( Object.keys(chatModelProviders).length > 0 && - !chatModelProviders[chatModelProvider] + (((!openAIBaseURL || !openAIPIKey) && + chatModelProvider === 'custom_openai') || + !chatModelProviders[chatModelProvider]) ) { - chatModelProvider = Object.keys(chatModelProviders)[0]; + const chatModelProvidersKeys = Object.keys(chatModelProviders); + chatModelProvider = + chatModelProvidersKeys.find( + (key) => Object.keys(chatModelProviders[key]).length > 0, + ) || chatModelProvidersKeys[0]; + + if ( + chatModelProvider === 'custom_openai' && + (!openAIBaseURL || !openAIPIKey) + ) { + toast.error( + 'Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL', + ); + setError(true); + return; + } + localStorage.setItem('chatModelProvider', chatModelProvider); } if ( chatModelProvider && - chatModelProvider != 'custom_openai' && + (!openAIBaseURL || !openAIPIKey) && !chatModelProviders[chatModelProvider][chatModel] ) { - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + chatModel = Object.keys( + chatModelProviders[ + Object.keys(chatModelProviders[chatModelProvider]).length > 0 + ? chatModelProvider + : Object.keys(chatModelProviders)[0] + ], + )[0]; localStorage.setItem('chatModel', chatModel); } From 409c811a4286b2ca17be38acda326faef7e04004 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:02:20 +0530 Subject: [PATCH 109/282] feat(ollama): use axios instead of fetch --- src/lib/providers/ollama.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index e23fb76..7277b27 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -2,6 +2,7 @@ import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; import { getKeepAlive, getOllamaApiEndpoint } from '../../config'; import logger from '../../utils/logger'; import { ChatOllama } from '@langchain/community/chat_models/ollama'; +import axios from 'axios'; export const loadOllamaChatModels = async () => { const ollamaEndpoint = getOllamaApiEndpoint(); @@ -10,13 +11,13 @@ export const loadOllamaChatModels = async () => { if (!ollamaEndpoint) return {}; try { - const response = await fetch(`${ollamaEndpoint}/api/tags`, { + const response = await axios.get(`${ollamaEndpoint}/api/tags`, { headers: { 'Content-Type': 'application/json', }, }); - const { models: ollamaModels } = (await response.json()) as any; + const { models: ollamaModels } = response.data; const chatModels = ollamaModels.reduce((acc, model) => { acc[model.model] = { @@ -45,13 +46,13 @@ export const loadOllamaEmbeddingsModels = async () => { if (!ollamaEndpoint) return {}; try { - const response = await fetch(`${ollamaEndpoint}/api/tags`, { + const response = await axios.get(`${ollamaEndpoint}/api/tags`, { headers: { 'Content-Type': 'application/json', }, }); - const { models: ollamaModels } = (await response.json()) as any; + const { models: ollamaModels } = response.data; const embeddingsModels = ollamaModels.reduce((acc, model) => { acc[model.model] = { From d18e88acc97cc26b533778fc74743c93529f130c Mon Sep 17 00:00:00 2001 From: Sainadh Devireddy <saidev@amazon.com> Date: Fri, 27 Dec 2024 20:55:55 -0800 Subject: [PATCH 110/282] Delete msgs only belonging to the chat --- src/websocket/messageHandler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index 6cb3ddf..8817aae 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -5,7 +5,7 @@ import type { Embeddings } from '@langchain/core/embeddings'; import logger from '../utils/logger'; import db from '../db'; import { chats, messages as messagesSchema } from '../db/schema'; -import { eq, asc, gt } from 'drizzle-orm'; +import { eq, asc, gt, and } from 'drizzle-orm'; import crypto from 'crypto'; import { getFileDetails } from '../utils/files'; import MetaSearchAgent, { @@ -238,7 +238,7 @@ export const handleMessage = async ( } else { await db .delete(messagesSchema) - .where(gt(messagesSchema.id, messageExists.id)) + .where(and(gt(messagesSchema.id, messageExists.id), eq(messagesSchema.chatId, parsedMessage.chatId))) .execute(); } } catch (err) { From 5a648f34b8c7f31b051dc9b7b94855a9f57a884f Mon Sep 17 00:00:00 2001 From: Sainadh Devireddy <saidev@amazon.com> Date: Sat, 4 Jan 2025 10:36:33 -0800 Subject: [PATCH 111/282] Set pageContent correctly --- src/search/metaSearchAgent.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/search/metaSearchAgent.ts b/src/search/metaSearchAgent.ts index 1e85cf6..ee82c10 100644 --- a/src/search/metaSearchAgent.ts +++ b/src/search/metaSearchAgent.ts @@ -213,9 +213,9 @@ class MetaSearchAgent implements MetaSearchAgentType { new Document({ pageContent: result.content || - this.config.activeEngines.includes('youtube') + (this.config.activeEngines.includes('youtube') ? result.title - : '' /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */, + : '') /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */, metadata: { title: result.title, url: result.url, From 5526d5f60f31ec76e01e8f8482cf873ff6522202 Mon Sep 17 00:00:00 2001 From: realies <5107843+realies@users.noreply.github.com> Date: Sun, 5 Jan 2025 17:29:53 +0000 Subject: [PATCH 112/282] fix(ws-error): add exponential reconnect mechanism --- ui/components/ChatWindow.tsx | 102 ++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 20 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 62fa9dc..3968d92 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -9,7 +9,7 @@ import crypto from 'crypto'; import { toast } from 'sonner'; import { useSearchParams } from 'next/navigation'; import { getSuggestions } from '@/lib/actions'; -import Error from 'next/error'; +import NextError from 'next/error'; export type Message = { messageId: string; @@ -32,11 +32,24 @@ const useSocket = ( setIsWSReady: (ready: boolean) => void, setError: (error: boolean) => void, ) => { - const [ws, setWs] = useState<WebSocket | null>(null); + const wsRef = useRef<WebSocket | null>(null); + const reconnectTimeoutRef = useRef<NodeJS.Timeout>(); + const retryCountRef = useRef(0); + const isCleaningUpRef = useRef(false); + const MAX_RETRIES = 3; + const INITIAL_BACKOFF = 1000; // 1 second + + const getBackoffDelay = (retryCount: number) => { + return Math.min(INITIAL_BACKOFF * Math.pow(2, retryCount), 10000); // Cap at 10 seconds + }; useEffect(() => { - if (!ws) { - const connectWs = async () => { + const connectWs = async () => { + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.close(); + } + + try { let chatModel = localStorage.getItem('chatModel'); let chatModelProvider = localStorage.getItem('chatModelProvider'); let embeddingModel = localStorage.getItem('embeddingModel'); @@ -59,7 +72,10 @@ const useSocket = ( 'Content-Type': 'application/json', }, }, - ).then(async (res) => await res.json()); + ).then(async (res) => { + if (!res.ok) throw new Error(`Failed to fetch models: ${res.status} ${res.statusText}`); + return res.json(); + }); if ( !chatModel || @@ -202,6 +218,7 @@ const useSocket = ( wsURL.search = searchParams.toString(); const ws = new WebSocket(wsURL.toString()); + wsRef.current = ws; const timeoutId = setTimeout(() => { if (ws.readyState !== 1) { @@ -217,11 +234,14 @@ const useSocket = ( const interval = setInterval(() => { if (ws.readyState === 1) { setIsWSReady(true); + retryCountRef.current = 0; + setError(false); + toast.success('Connection restored'); clearInterval(interval); } }, 5); clearTimeout(timeoutId); - console.log('[DEBUG] opened'); + console.debug(new Date(), 'ws:connected'); } if (data.type === 'error') { toast.error(data.data); @@ -230,24 +250,62 @@ const useSocket = ( ws.onerror = () => { clearTimeout(timeoutId); - setError(true); + setIsWSReady(false); toast.error('WebSocket connection error.'); }; ws.onclose = () => { clearTimeout(timeoutId); - setError(true); - console.log('[DEBUG] closed'); + setIsWSReady(false); + console.debug(new Date(), 'ws:disconnected'); + if (!isCleaningUpRef.current) { + toast.error('Connection lost. Attempting to reconnect...'); + attemptReconnect(); + } }; - setWs(ws); - }; + } catch (error) { + console.debug(new Date(), 'ws:error', error); + attemptReconnect(); + } + }; - connectWs(); - } - }, [ws, url, setIsWSReady, setError]); + const attemptReconnect = () => { + retryCountRef.current += 1; + if (retryCountRef.current > MAX_RETRIES) { + console.debug(new Date(), 'ws:max_retries'); + setError(true); + toast.error('Unable to connect to server after multiple attempts. Please refresh the page to try again.'); + return; + } - return ws; + const backoffDelay = getBackoffDelay(retryCountRef.current); + console.debug(new Date(), `ws:retry attempt=${retryCountRef.current}/${MAX_RETRIES} delay=${backoffDelay}ms`); + + if (reconnectTimeoutRef.current) { + clearTimeout(reconnectTimeoutRef.current); + } + + reconnectTimeoutRef.current = setTimeout(() => { + connectWs(); + }, backoffDelay); + }; + + connectWs(); + + return () => { + isCleaningUpRef.current = true; + if (reconnectTimeoutRef.current) { + clearTimeout(reconnectTimeoutRef.current); + } + if (wsRef.current?.readyState === WebSocket.OPEN) { + wsRef.current.close(); + } + console.debug(new Date(), 'ws:cleanup'); + }; + }, [url, setIsWSReady, setError]); + + return wsRef.current; }; const loadMessages = async ( @@ -291,7 +349,7 @@ const loadMessages = async ( return [msg.role, msg.content]; }) as [string, string][]; - console.log('[DEBUG] messages loaded'); + console.debug(new Date(), 'app:messages_loaded'); document.title = messages[0].content; @@ -373,7 +431,7 @@ const ChatWindow = ({ id }: { id?: string }) => { return () => { if (ws?.readyState === 1) { ws.close(); - console.log('[DEBUG] closed'); + console.debug(new Date(), 'ws:cleanup'); } }; // eslint-disable-next-line react-hooks/exhaustive-deps @@ -388,12 +446,16 @@ const ChatWindow = ({ id }: { id?: string }) => { useEffect(() => { if (isMessagesLoaded && isWSReady) { setIsReady(true); - console.log('[DEBUG] ready'); + console.debug(new Date(), 'app:ready'); } }, [isMessagesLoaded, isWSReady]); const sendMessage = async (message: string, messageId?: string) => { if (loading) return; + if (!ws || ws.readyState !== WebSocket.OPEN) { + toast.error('Cannot send message while disconnected'); + return; + } setLoading(true); setMessageAppeared(false); @@ -404,7 +466,7 @@ const ChatWindow = ({ id }: { id?: string }) => { messageId = messageId ?? crypto.randomBytes(7).toString('hex'); - ws?.send( + ws.send( JSON.stringify({ type: 'message', message: { @@ -558,7 +620,7 @@ const ChatWindow = ({ id }: { id?: string }) => { return isReady ? ( notFound ? ( - <Error statusCode={404} /> + <NextError statusCode={404} /> ) : ( <div> {messages.length > 0 ? ( From 0ec54fe6c05270dcf03bfc3cc01b07c19b4bd41a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:43:54 +0530 Subject: [PATCH 113/282] feat(chat-window): remove toast --- ui/components/ChatWindow.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 3968d92..b6f1b30 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -236,7 +236,6 @@ const useSocket = ( setIsWSReady(true); retryCountRef.current = 0; setError(false); - toast.success('Connection restored'); clearInterval(interval); } }, 5); From b7f7d25f549fc213b6dc63f17ea9204e41ba9806 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:44:19 +0530 Subject: [PATCH 114/282] feat(chat-window): lint & beautify --- ui/components/ChatWindow.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index b6f1b30..ed3594c 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -73,7 +73,10 @@ const useSocket = ( }, }, ).then(async (res) => { - if (!res.ok) throw new Error(`Failed to fetch models: ${res.status} ${res.statusText}`); + if (!res.ok) + throw new Error( + `Failed to fetch models: ${res.status} ${res.statusText}`, + ); return res.json(); }); @@ -262,7 +265,6 @@ const useSocket = ( attemptReconnect(); } }; - } catch (error) { console.debug(new Date(), 'ws:error', error); attemptReconnect(); @@ -274,12 +276,17 @@ const useSocket = ( if (retryCountRef.current > MAX_RETRIES) { console.debug(new Date(), 'ws:max_retries'); setError(true); - toast.error('Unable to connect to server after multiple attempts. Please refresh the page to try again.'); + toast.error( + 'Unable to connect to server after multiple attempts. Please refresh the page to try again.', + ); return; } const backoffDelay = getBackoffDelay(retryCountRef.current); - console.debug(new Date(), `ws:retry attempt=${retryCountRef.current}/${MAX_RETRIES} delay=${backoffDelay}ms`); + console.debug( + new Date(), + `ws:retry attempt=${retryCountRef.current}/${MAX_RETRIES} delay=${backoffDelay}ms`, + ); if (reconnectTimeoutRef.current) { clearTimeout(reconnectTimeoutRef.current); From 99cae076a79f993ba8da5f91d0166f06d67b1ad1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:49:40 +0530 Subject: [PATCH 115/282] feat(chat-window): display toast when retried --- ui/components/ChatWindow.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index ed3594c..a44c550 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -237,8 +237,11 @@ const useSocket = ( const interval = setInterval(() => { if (ws.readyState === 1) { setIsWSReady(true); - retryCountRef.current = 0; setError(false); + if (retryCountRef.current > 0) { + toast.success('Connection restored.'); + } + retryCountRef.current = 0; clearInterval(interval); } }, 5); From 6d9d71279072112243ca45a887830ba2666000e8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 7 Jan 2025 12:26:38 +0530 Subject: [PATCH 116/282] feat(chat-window): correctly handle server side WS closure --- ui/components/ChatWindow.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index a44c550..ac15b37 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -270,12 +270,14 @@ const useSocket = ( }; } catch (error) { console.debug(new Date(), 'ws:error', error); + setIsWSReady(false); attemptReconnect(); } }; const attemptReconnect = () => { retryCountRef.current += 1; + if (retryCountRef.current > MAX_RETRIES) { console.debug(new Date(), 'ws:max_retries'); setError(true); @@ -303,14 +305,14 @@ const useSocket = ( connectWs(); return () => { - isCleaningUpRef.current = true; if (reconnectTimeoutRef.current) { clearTimeout(reconnectTimeoutRef.current); } if (wsRef.current?.readyState === WebSocket.OPEN) { wsRef.current.close(); + isCleaningUpRef.current = true; + console.debug(new Date(), 'ws:cleanup'); } - console.debug(new Date(), 'ws:cleanup'); }; }, [url, setIsWSReady, setError]); @@ -456,6 +458,8 @@ const ChatWindow = ({ id }: { id?: string }) => { if (isMessagesLoaded && isWSReady) { setIsReady(true); console.debug(new Date(), 'app:ready'); + } else { + setIsReady(false); } }, [isMessagesLoaded, isWSReady]); From 2dc60d06e3ac1311480f48aef21691d380f84e19 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 11 Jan 2025 13:10:10 +0530 Subject: [PATCH 117/282] feat(chat-window): show settings during error on mobile --- ui/components/ChatWindow.tsx | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 62fa9dc..41a8f90 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -10,6 +10,8 @@ import { toast } from 'sonner'; import { useSearchParams } from 'next/navigation'; import { getSuggestions } from '@/lib/actions'; import Error from 'next/error'; +import { Settings } from 'lucide-react'; +import SettingsDialog from './SettingsDialog'; export type Message = { messageId: string; @@ -344,6 +346,8 @@ const ChatWindow = ({ id }: { id?: string }) => { const [notFound, setNotFound] = useState(false); + const [isSettingsOpen, setIsSettingsOpen] = useState(false); + useEffect(() => { if ( chatId && @@ -548,10 +552,19 @@ const ChatWindow = ({ id }: { id?: string }) => { if (hasError) { return ( - <div className="flex flex-col items-center justify-center min-h-screen"> - <p className="dark:text-white/70 text-black/70 text-sm"> - Failed to connect to the server. Please try again later. - </p> + <div className="relative"> + <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5"> + <Settings + className="cursor-pointer lg:hidden" + onClick={() => setIsSettingsOpen(true)} + /> + </div> + <div className="flex flex-col items-center justify-center min-h-screen"> + <p className="dark:text-white/70 text-black/70 text-sm"> + Failed to connect to the server. Please try again later. + </p> + </div> + <SettingsDialog isOpen={isSettingsOpen} setIsOpen={setIsSettingsOpen} /> </div> ); } From 5c787bbb55fd71edc3d9d2b8889d8e274f5754b3 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 11 Jan 2025 13:10:23 +0530 Subject: [PATCH 118/282] feat(app): lint & beautify --- src/websocket/messageHandler.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index 8817aae..395c0de 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -238,7 +238,12 @@ export const handleMessage = async ( } else { await db .delete(messagesSchema) - .where(and(gt(messagesSchema.id, messageExists.id), eq(messagesSchema.chatId, parsedMessage.chatId))) + .where( + and( + gt(messagesSchema.id, messageExists.id), + eq(messagesSchema.chatId, parsedMessage.chatId), + ), + ) .execute(); } } catch (err) { From f37686189e5fe2d74d3fbfa91c15ed35e8cadcab Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:51:16 +0530 Subject: [PATCH 119/282] feat(output-parsers): add empty check --- src/lib/outputParsers/lineOutputParser.ts | 2 ++ src/lib/outputParsers/listLineOutputParser.ts | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lib/outputParsers/lineOutputParser.ts b/src/lib/outputParsers/lineOutputParser.ts index b50a20e..08711aa 100644 --- a/src/lib/outputParsers/lineOutputParser.ts +++ b/src/lib/outputParsers/lineOutputParser.ts @@ -19,6 +19,8 @@ class LineOutputParser extends BaseOutputParser<string> { lc_namespace = ['langchain', 'output_parsers', 'line_output_parser']; async parse(text: string): Promise<string> { + text = text.trim() || ''; + const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; const startKeyIndex = text.indexOf(`<${this.key}>`); const endKeyIndex = text.indexOf(`</${this.key}>`); diff --git a/src/lib/outputParsers/listLineOutputParser.ts b/src/lib/outputParsers/listLineOutputParser.ts index fcd2f07..f465ef1 100644 --- a/src/lib/outputParsers/listLineOutputParser.ts +++ b/src/lib/outputParsers/listLineOutputParser.ts @@ -19,11 +19,13 @@ class LineListOutputParser extends BaseOutputParser<string[]> { lc_namespace = ['langchain', 'output_parsers', 'line_list_output_parser']; async parse(text: string): Promise<string[]> { + text = text.trim() || ''; + const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; const startKeyIndex = text.indexOf(`<${this.key}>`); const endKeyIndex = text.indexOf(`</${this.key}>`); - if (startKeyIndex === -1 && endKeyIndex === -1) { + if (startKeyIndex === -1 || endKeyIndex === -1) { return []; } From 46541e6c0c79615eab36b363ac25865e41694967 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 2 Feb 2025 14:31:18 +0530 Subject: [PATCH 120/282] feat(package): update `markdown-to-jsx` version --- ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package.json b/ui/package.json index bdda684..a8826dc 100644 --- a/ui/package.json +++ b/ui/package.json @@ -18,7 +18,7 @@ "clsx": "^2.1.0", "langchain": "^0.1.30", "lucide-react": "^0.363.0", - "markdown-to-jsx": "^7.6.2", + "markdown-to-jsx": "^7.7.2", "next": "14.1.4", "next-themes": "^0.3.0", "react": "^18", diff --git a/ui/yarn.lock b/ui/yarn.lock index 0798ca9..7eb109f 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2210,10 +2210,10 @@ lucide-react@^0.363.0: resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== -markdown-to-jsx@^7.6.2: - version "7.6.2" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.6.2.tgz#254cbf7d412a37073486c0a2dd52266d2191a793" - integrity sha512-gEcyiJXzBxmId2Y/kydLbD6KRNccDiUy/Src1cFGn3s2X0LZZ/hUiEc2VisFyA5kUE3SXclTCczjQiAuqKZiFQ== +markdown-to-jsx@^7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" + integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g== md5@^2.3.0: version "2.3.0" From 358269505492fd8b154b1dee9693e546d53fc623 Mon Sep 17 00:00:00 2001 From: data5650 <79806567+data5650@users.noreply.github.com> Date: Wed, 5 Feb 2025 00:47:34 +0100 Subject: [PATCH 121/282] feat: add Gemini 2.0 Flash Exp models # Description Added two new Gemini models: - gemini-2.0-flash-exp - gemini-2.0-flash-thinking-exp-01-21 # Changes Made - Updated src/lib/providers/gemini.ts to include new models - Maintained consistent configuration with existing models # Testing - Tested locally using Docker - Verified models appear in UI and are selectable - Confirmed functionality with sample queries # Additional Notes These models expand the available options for users who want to use the latest Gemini capabilities. --- src/lib/providers/gemini.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 95764cf..d20c9b8 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -36,6 +36,22 @@ export const loadGeminiChatModels = async () => { apiKey: geminiApiKey, }), }, + 'gemini-2.0-flash-exp': { + displayName: 'Gemini 2.0 Flash Exp', + model: new ChatGoogleGenerativeAI({ + modelName: 'gemini-2.0-flash-exp', + temperature: 0.7, + apiKey: geminiApiKey, + }), + }, + 'gemini-2.0-flash-thinking-exp-01-21': { + displayName: 'Gemini 2.0 Flash Thinking Exp 01-21', + model: new ChatGoogleGenerativeAI({ + modelName: 'gemini-2.0-flash-thinking-exp-01-21', + temperature: 0.7, + apiKey: geminiApiKey, + }), + }, }; return chatModels; From 07dc7d7649633031fac27aa3a484e74d7d75a5da Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 15 Feb 2025 11:26:38 +0530 Subject: [PATCH 122/282] feat(config): update config & custom openai --- sample.config.toml | 27 ++++++++++---- src/config.ts | 92 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 85 insertions(+), 34 deletions(-) diff --git a/sample.config.toml b/sample.config.toml index 50ba95d..686372c 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -3,12 +3,25 @@ PORT = 3001 # Port to run the server on SIMILARITY_MEASURE = "cosine" # "cosine" or "dot" KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead of using -1 use "-1m") -[API_KEYS] -OPENAI = "" # OpenAI API key - sk-1234567890abcdef1234567890abcdef -GROQ = "" # Groq API key - gsk_1234567890abcdef1234567890abcdef -ANTHROPIC = "" # Anthropic API key - sk-ant-1234567890abcdef1234567890abcdef -GEMINI = "" # Gemini API key - sk-1234567890abcdef1234567890abcdef +[MODELS] +[MODELS.OPENAI] +API_KEY = "" + +[MODELS.GROQ] +API_KEY = "" + +[MODELS.ANTHROPIC] +API_KEY = "" + +[MODELS.GEMINI] +API_KEY = "" + +[MODELS.CUSTOM_OPENAI] +API_KEY = "" +API_URL = "" + +[MODELS.OLLAMA] +API_URL = "" # Ollama API URL - http://host.docker.internal:11434 [API_ENDPOINTS] -SEARXNG = "http://localhost:32768" # SearxNG API URL -OLLAMA = "" # Ollama API URL - http://host.docker.internal:11434 \ No newline at end of file +SEARXNG = "http://localhost:32768" # SearxNG API URL \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index 001c259..ab2a5db 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,15 +10,30 @@ interface Config { SIMILARITY_MEASURE: string; KEEP_ALIVE: string; }; - API_KEYS: { - OPENAI: string; - GROQ: string; - ANTHROPIC: string; - GEMINI: string; + MODELS: { + OPENAI: { + API_KEY: string; + }; + GROQ: { + API_KEY: string; + }; + ANTHROPIC: { + API_KEY: string; + }; + GEMINI: { + API_KEY: string; + }; + OLLAMA: { + API_URL: string; + }; + CUSTOM_OPENAI: { + API_URL: string; + API_KEY: string; + MODEL_NAME: string; + }; }; API_ENDPOINTS: { SEARXNG: string; - OLLAMA: string; }; } @@ -38,42 +53,65 @@ export const getSimilarityMeasure = () => export const getKeepAlive = () => loadConfig().GENERAL.KEEP_ALIVE; -export const getOpenaiApiKey = () => loadConfig().API_KEYS.OPENAI; +export const getOpenaiApiKey = () => loadConfig().MODELS.OPENAI.API_KEY; -export const getGroqApiKey = () => loadConfig().API_KEYS.GROQ; +export const getGroqApiKey = () => loadConfig().MODELS.GROQ.API_KEY; -export const getAnthropicApiKey = () => loadConfig().API_KEYS.ANTHROPIC; +export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; -export const getGeminiApiKey = () => loadConfig().API_KEYS.GEMINI; +export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; export const getSearxngApiEndpoint = () => process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; -export const getOllamaApiEndpoint = () => loadConfig().API_ENDPOINTS.OLLAMA; +export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; -export const updateConfig = (config: RecursivePartial<Config>) => { - const currentConfig = loadConfig(); +export const getCustomOpenaiApiKey = () => + loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; - for (const key in currentConfig) { - if (!config[key]) config[key] = {}; +export const getCustomOpenaiApiUrl = () => + loadConfig().MODELS.CUSTOM_OPENAI.API_URL; - if (typeof currentConfig[key] === 'object' && currentConfig[key] !== null) { - for (const nestedKey in currentConfig[key]) { - if ( - !config[key][nestedKey] && - currentConfig[key][nestedKey] && - config[key][nestedKey] !== '' - ) { - config[key][nestedKey] = currentConfig[key][nestedKey]; - } +export const getCustomOpenaiModelName = () => + loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; + +const mergeConfigs = (current: any, update: any): any => { + if (update === null || update === undefined) { + return current; + } + + if (typeof current !== 'object' || current === null) { + return update; + } + + const result = { ...current }; + + for (const key in update) { + if (Object.prototype.hasOwnProperty.call(update, key)) { + const updateValue = update[key]; + + if ( + typeof updateValue === 'object' && + updateValue !== null && + typeof result[key] === 'object' && + result[key] !== null + ) { + result[key] = mergeConfigs(result[key], updateValue); + } else if (updateValue !== undefined) { + result[key] = updateValue; } - } else if (currentConfig[key] && config[key] !== '') { - config[key] = currentConfig[key]; } } + return result; +}; + +export const updateConfig = (config: RecursivePartial<Config>) => { + const currentConfig = loadConfig(); + const mergedConfig = mergeConfigs(currentConfig, config); + fs.writeFileSync( path.join(__dirname, `../${configFileName}`), - toml.stringify(config), + toml.stringify(mergedConfig), ); }; From 41d056e755fb4d752df334d1c3bd53848bc4fce6 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 15 Feb 2025 11:29:08 +0530 Subject: [PATCH 123/282] feat(handlers): use new custom openai --- src/lib/providers/index.ts | 28 +++++++++++++++++++++++- src/routes/config.ts | 35 +++++++++++++++++++++++------- src/routes/images.ts | 22 +++++++------------ src/routes/search.ts | 22 ++++++++----------- src/routes/suggestions.ts | 22 +++++++------------ src/routes/videos.ts | 22 +++++++------------ src/websocket/connectionManager.ts | 27 ++++++++++++++++------- 7 files changed, 106 insertions(+), 72 deletions(-) diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 98846e7..57e9185 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -4,6 +4,12 @@ import { loadOpenAIChatModels, loadOpenAIEmbeddingsModels } from './openai'; import { loadAnthropicChatModels } from './anthropic'; import { loadTransformersEmbeddingsModels } from './transformers'; import { loadGeminiChatModels, loadGeminiEmbeddingsModels } from './gemini'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '../../config'; +import { ChatOpenAI } from '@langchain/openai'; const chatModelProviders = { openai: loadOpenAIChatModels, @@ -30,7 +36,27 @@ export const getAvailableChatModelProviders = async () => { } } - models['custom_openai'] = {}; + const customOpenAiApiKey = getCustomOpenaiApiKey(); + const customOpenAiApiUrl = getCustomOpenaiApiUrl(); + const customOpenAiModelName = getCustomOpenaiModelName(); + + models['custom_openai'] = { + ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName + ? { + [customOpenAiModelName]: { + displayName: customOpenAiModelName, + model: new ChatOpenAI({ + openAIApiKey: customOpenAiApiKey, + modelName: customOpenAiModelName, + temperature: 0.7, + configuration: { + baseURL: customOpenAiApiUrl, + }, + }), + }, + } + : {}), + }; return models; }; diff --git a/src/routes/config.ts b/src/routes/config.ts index 6ff80c6..18b370d 100644 --- a/src/routes/config.ts +++ b/src/routes/config.ts @@ -10,6 +10,9 @@ import { getGeminiApiKey, getOpenaiApiKey, updateConfig, + getCustomOpenaiApiUrl, + getCustomOpenaiApiKey, + getCustomOpenaiModelName, } from '../config'; import logger from '../utils/logger'; @@ -54,6 +57,9 @@ router.get('/', async (_, res) => { config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); config['geminiApiKey'] = getGeminiApiKey(); + config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); + config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); + config['customOpenaiModelName'] = getCustomOpenaiModelName(); res.status(200).json(config); } catch (err: any) { @@ -66,14 +72,27 @@ router.post('/', async (req, res) => { const config = req.body; const updatedConfig = { - API_KEYS: { - OPENAI: config.openaiApiKey, - GROQ: config.groqApiKey, - ANTHROPIC: config.anthropicApiKey, - GEMINI: config.geminiApiKey, - }, - API_ENDPOINTS: { - OLLAMA: config.ollamaApiUrl, + MODELS: { + OPENAI: { + API_KEY: config.openaiApiKey, + }, + GROQ: { + API_KEY: config.groqApiKey, + }, + ANTHROPIC: { + API_KEY: config.anthropicApiKey, + }, + GEMINI: { + API_KEY: config.geminiApiKey, + }, + OLLAMA: { + API_URL: config.ollamaApiUrl, + }, + CUSTOM_OPENAI: { + API_URL: config.customOpenaiApiUrl, + API_KEY: config.customOpenaiApiKey, + MODEL_NAME: config.customOpenaiModelName, + }, }, }; diff --git a/src/routes/images.ts b/src/routes/images.ts index efa095a..5671657 100644 --- a/src/routes/images.ts +++ b/src/routes/images.ts @@ -5,14 +5,17 @@ import { getAvailableChatModelProviders } from '../lib/providers'; import { HumanMessage, AIMessage } from '@langchain/core/messages'; import logger from '../utils/logger'; import { ChatOpenAI } from '@langchain/openai'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '../config'; const router = express.Router(); interface ChatModel { provider: string; model: string; - customOpenAIBaseURL?: string; - customOpenAIKey?: string; } interface ImageSearchBody { @@ -44,21 +47,12 @@ router.post('/', async (req, res) => { let llm: BaseChatModel | undefined; if (body.chatModel?.provider === 'custom_openai') { - if ( - !body.chatModel?.customOpenAIBaseURL || - !body.chatModel?.customOpenAIKey - ) { - return res - .status(400) - .json({ message: 'Missing custom OpenAI base URL or key' }); - } - llm = new ChatOpenAI({ - modelName: body.chatModel.model, - openAIApiKey: body.chatModel.customOpenAIKey, + modelName: getCustomOpenaiModelName(), + openAIApiKey: getCustomOpenaiApiKey(), temperature: 0.7, configuration: { - baseURL: body.chatModel.customOpenAIBaseURL, + baseURL: getCustomOpenaiApiUrl(), }, }) as unknown as BaseChatModel; } else if ( diff --git a/src/routes/search.ts b/src/routes/search.ts index e24b3f9..a29f64b 100644 --- a/src/routes/search.ts +++ b/src/routes/search.ts @@ -10,14 +10,19 @@ import { import { searchHandlers } from '../websocket/messageHandler'; import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { MetaSearchAgentType } from '../search/metaSearchAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '../config'; const router = express.Router(); interface chatModel { provider: string; model: string; - customOpenAIBaseURL?: string; customOpenAIKey?: string; + customOpenAIBaseURL?: string; } interface embeddingModel { @@ -78,21 +83,12 @@ router.post('/', async (req, res) => { let embeddings: Embeddings | undefined; if (body.chatModel?.provider === 'custom_openai') { - if ( - !body.chatModel?.customOpenAIBaseURL || - !body.chatModel?.customOpenAIKey - ) { - return res - .status(400) - .json({ message: 'Missing custom OpenAI base URL or key' }); - } - llm = new ChatOpenAI({ - modelName: body.chatModel.model, - openAIApiKey: body.chatModel.customOpenAIKey, + modelName: body.chatModel?.model || getCustomOpenaiModelName(), + openAIApiKey: body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), temperature: 0.7, configuration: { - baseURL: body.chatModel.customOpenAIBaseURL, + baseURL: body.chatModel?.customOpenAIBaseURL || getCustomOpenaiApiUrl(), }, }) as unknown as BaseChatModel; } else if ( diff --git a/src/routes/suggestions.ts b/src/routes/suggestions.ts index 1d46e5b..7dd1739 100644 --- a/src/routes/suggestions.ts +++ b/src/routes/suggestions.ts @@ -5,14 +5,17 @@ import { getAvailableChatModelProviders } from '../lib/providers'; import { HumanMessage, AIMessage } from '@langchain/core/messages'; import logger from '../utils/logger'; import { ChatOpenAI } from '@langchain/openai'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '../config'; const router = express.Router(); interface ChatModel { provider: string; model: string; - customOpenAIBaseURL?: string; - customOpenAIKey?: string; } interface SuggestionsBody { @@ -43,21 +46,12 @@ router.post('/', async (req, res) => { let llm: BaseChatModel | undefined; if (body.chatModel?.provider === 'custom_openai') { - if ( - !body.chatModel?.customOpenAIBaseURL || - !body.chatModel?.customOpenAIKey - ) { - return res - .status(400) - .json({ message: 'Missing custom OpenAI base URL or key' }); - } - llm = new ChatOpenAI({ - modelName: body.chatModel.model, - openAIApiKey: body.chatModel.customOpenAIKey, + modelName: getCustomOpenaiModelName(), + openAIApiKey: getCustomOpenaiApiKey(), temperature: 0.7, configuration: { - baseURL: body.chatModel.customOpenAIBaseURL, + baseURL: getCustomOpenaiApiUrl(), }, }) as unknown as BaseChatModel; } else if ( diff --git a/src/routes/videos.ts b/src/routes/videos.ts index ad87460..b631f26 100644 --- a/src/routes/videos.ts +++ b/src/routes/videos.ts @@ -5,14 +5,17 @@ import { HumanMessage, AIMessage } from '@langchain/core/messages'; import logger from '../utils/logger'; import handleVideoSearch from '../chains/videoSearchAgent'; import { ChatOpenAI } from '@langchain/openai'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '../config'; const router = express.Router(); interface ChatModel { provider: string; model: string; - customOpenAIBaseURL?: string; - customOpenAIKey?: string; } interface VideoSearchBody { @@ -44,21 +47,12 @@ router.post('/', async (req, res) => { let llm: BaseChatModel | undefined; if (body.chatModel?.provider === 'custom_openai') { - if ( - !body.chatModel?.customOpenAIBaseURL || - !body.chatModel?.customOpenAIKey - ) { - return res - .status(400) - .json({ message: 'Missing custom OpenAI base URL or key' }); - } - llm = new ChatOpenAI({ - modelName: body.chatModel.model, - openAIApiKey: body.chatModel.customOpenAIKey, + modelName: getCustomOpenaiModelName(), + openAIApiKey: getCustomOpenaiApiKey(), temperature: 0.7, configuration: { - baseURL: body.chatModel.customOpenAIBaseURL, + baseURL: getCustomOpenaiApiUrl(), }, }) as unknown as BaseChatModel; } else if ( diff --git a/src/websocket/connectionManager.ts b/src/websocket/connectionManager.ts index d980500..bb8f242 100644 --- a/src/websocket/connectionManager.ts +++ b/src/websocket/connectionManager.ts @@ -9,6 +9,11 @@ import type { Embeddings } from '@langchain/core/embeddings'; import type { IncomingMessage } from 'http'; import logger from '../utils/logger'; import { ChatOpenAI } from '@langchain/openai'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '../config'; export const handleConnection = async ( ws: WebSocket, @@ -48,14 +53,20 @@ export const handleConnection = async ( llm = chatModelProviders[chatModelProvider][chatModel] .model as unknown as BaseChatModel | undefined; } else if (chatModelProvider == 'custom_openai') { - llm = new ChatOpenAI({ - modelName: chatModel, - openAIApiKey: searchParams.get('openAIApiKey'), - temperature: 0.7, - configuration: { - baseURL: searchParams.get('openAIBaseURL'), - }, - }) as unknown as BaseChatModel; + const customOpenaiApiKey = getCustomOpenaiApiKey(); + const customOpenaiApiUrl = getCustomOpenaiApiUrl(); + const customOpenaiModelName = getCustomOpenaiModelName(); + + if (customOpenaiApiKey && customOpenaiApiUrl && customOpenaiModelName) { + llm = new ChatOpenAI({ + modelName: customOpenaiModelName, + openAIApiKey: customOpenaiApiKey, + temperature: 0.7, + configuration: { + baseURL: customOpenaiApiUrl, + }, + }) as unknown as BaseChatModel; + } } if ( From 5cbc51232243607ece7b50b2e65e2ee3811d422d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 15 Feb 2025 11:29:59 +0530 Subject: [PATCH 124/282] feat(app): add auto video & image search --- ui/components/ChatWindow.tsx | 30 ++++++++++++++++++++++-------- ui/components/SearchImages.tsx | 1 + ui/components/SearchVideos.tsx | 1 + 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index b26573f..33ef27b 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -58,14 +58,17 @@ const useSocket = ( let embeddingModelProvider = localStorage.getItem( 'embeddingModelProvider', ); - let openAIBaseURL = - chatModelProvider === 'custom_openai' - ? localStorage.getItem('openAIBaseURL') - : null; - let openAIPIKey = - chatModelProvider === 'custom_openai' - ? localStorage.getItem('openAIApiKey') - : null; + + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (!autoImageSearch) { + localStorage.setItem('autoImageSearch', 'true'); + } + + if (!autoVideoSearch) { + localStorage.setItem('autoVideoSearch', 'false'); + } const providers = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/models`, @@ -595,6 +598,17 @@ const ChatWindow = ({ id }: { id?: string }) => { }), ); } + + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (autoImageSearch === 'true') { + document.getElementById('search-images')?.click(); + } + + if (autoVideoSearch === 'true') { + document.getElementById('search-videos')?.click(); + } } }; diff --git a/ui/components/SearchImages.tsx b/ui/components/SearchImages.tsx index b083af7..383f780 100644 --- a/ui/components/SearchImages.tsx +++ b/ui/components/SearchImages.tsx @@ -27,6 +27,7 @@ const SearchImages = ({ <> {!loading && images === null && ( <button + id="search-images" onClick={async () => { setLoading(true); diff --git a/ui/components/SearchVideos.tsx b/ui/components/SearchVideos.tsx index 170df61..c284dc2 100644 --- a/ui/components/SearchVideos.tsx +++ b/ui/components/SearchVideos.tsx @@ -42,6 +42,7 @@ const Searchvideos = ({ <> {!loading && videos === null && ( <button + id="search-videos" onClick={async () => { setLoading(true); From cab1aa705ca28fcea2ea3bc9bba0f28beb04247d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 15 Feb 2025 11:31:08 +0530 Subject: [PATCH 125/282] feat(settings): add new settings page --- ui/app/settings/page.tsx | 664 +++++++++++++++++++++++++++++++ ui/components/ChatWindow.tsx | 51 +-- ui/components/EmptyChat.tsx | 10 +- ui/components/SettingsDialog.tsx | 528 ------------------------ ui/components/Sidebar.tsx | 13 +- ui/components/theme/Switcher.tsx | 3 +- ui/components/ui/Select.tsx | 28 ++ 7 files changed, 715 insertions(+), 582 deletions(-) create mode 100644 ui/app/settings/page.tsx delete mode 100644 ui/components/SettingsDialog.tsx create mode 100644 ui/components/ui/Select.tsx diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx new file mode 100644 index 0000000..4026f16 --- /dev/null +++ b/ui/app/settings/page.tsx @@ -0,0 +1,664 @@ +'use client'; + +import { Settings as SettingsIcon, ArrowLeft, Loader2 } from 'lucide-react'; +import { useEffect, useState } from 'react'; +import { cn } from '@/lib/utils'; +import { Switch } from '@headlessui/react'; +import ThemeSwitcher from '@/components/theme/Switcher'; +import { ImagesIcon, VideoIcon } from 'lucide-react'; +import Link from 'next/link'; + +interface SettingsType { + chatModelProviders: { + [key: string]: [Record<string, any>]; + }; + embeddingModelProviders: { + [key: string]: [Record<string, any>]; + }; + openaiApiKey: string; + groqApiKey: string; + anthropicApiKey: string; + geminiApiKey: string; + ollamaApiUrl: string; + customOpenaiApiKey: string; + customOpenaiApiUrl: string; + customOpenaiModelName: string; +} + +interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> { + isSaving?: boolean; + onSave?: (value: string) => void; +} + +const Input = ({ className, isSaving, onSave, ...restProps }: InputProps) => { + return ( + <div className="relative"> + <input + {...restProps} + className={cn( + 'bg-light-secondary dark:bg-dark-secondary w-full px-3 py-2 flex items-center overflow-hidden border border-light-200 dark:border-dark-200 dark:text-white rounded-lg text-sm', + isSaving && 'pr-10', + className, + )} + onBlur={(e) => onSave?.(e.target.value)} + /> + {isSaving && ( + <div className="absolute right-3 top-1/2 -translate-y-1/2"> + <Loader2 + size={16} + className="animate-spin text-black/70 dark:text-white/70" + /> + </div> + )} + </div> + ); +}; + +const Select = ({ + className, + options, + ...restProps +}: React.SelectHTMLAttributes<HTMLSelectElement> & { + options: { value: string; label: string; disabled?: boolean }[]; +}) => { + return ( + <select + {...restProps} + className={cn( + 'bg-light-secondary dark:bg-dark-secondary px-3 py-2 flex items-center overflow-hidden border border-light-200 dark:border-dark-200 dark:text-white rounded-lg text-sm', + className, + )} + > + {options.map(({ label, value, disabled }) => ( + <option key={value} value={value} disabled={disabled}> + {label} + </option> + ))} + </select> + ); +}; + +const SettingsSection = ({ + title, + children, +}: { + title: string; + children: React.ReactNode; +}) => ( + <div className="flex flex-col space-y-4 p-4 bg-light-secondary/50 dark:bg-dark-secondary/50 rounded-xl border border-light-200 dark:border-dark-200"> + <h2 className="text-black/90 dark:text-white/90 font-medium">{title}</h2> + {children} + </div> +); + +const Page = () => { + const [config, setConfig] = useState<SettingsType | null>(null); + const [chatModels, setChatModels] = useState<Record<string, any>>({}); + const [embeddingModels, setEmbeddingModels] = useState<Record<string, any>>( + {}, + ); + const [selectedChatModelProvider, setSelectedChatModelProvider] = useState< + string | null + >(null); + const [selectedChatModel, setSelectedChatModel] = useState<string | null>( + null, + ); + const [selectedEmbeddingModelProvider, setSelectedEmbeddingModelProvider] = + useState<string | null>(null); + const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState< + string | null + >(null); + const [isLoading, setIsLoading] = useState(false); + const [automaticImageSearch, setAutomaticImageSearch] = useState(false); + const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); + const [savingStates, setSavingStates] = useState<Record<string, boolean>>({}); + + useEffect(() => { + const fetchConfig = async () => { + setIsLoading(true); + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { + headers: { + 'Content-Type': 'application/json', + }, + }); + + const data = (await res.json()) as SettingsType; + setConfig(data); + + const chatModelProvidersKeys = Object.keys(data.chatModelProviders || {}); + const embeddingModelProvidersKeys = Object.keys( + data.embeddingModelProviders || {}, + ); + + const defaultChatModelProvider = + chatModelProvidersKeys.length > 0 ? chatModelProvidersKeys[0] : ''; + const defaultEmbeddingModelProvider = + embeddingModelProvidersKeys.length > 0 + ? embeddingModelProvidersKeys[0] + : ''; + + const chatModelProvider = + localStorage.getItem('chatModelProvider') || + defaultChatModelProvider || + ''; + const chatModel = + localStorage.getItem('chatModel') || + (data.chatModelProviders && + data.chatModelProviders[chatModelProvider]?.length > 0 + ? data.chatModelProviders[chatModelProvider][0].name + : undefined) || + ''; + const embeddingModelProvider = + localStorage.getItem('embeddingModelProvider') || + defaultEmbeddingModelProvider || + ''; + const embeddingModel = + localStorage.getItem('embeddingModel') || + (data.embeddingModelProviders && + data.embeddingModelProviders[embeddingModelProvider]?.[0].name) || + ''; + + setSelectedChatModelProvider(chatModelProvider); + setSelectedChatModel(chatModel); + setSelectedEmbeddingModelProvider(embeddingModelProvider); + setSelectedEmbeddingModel(embeddingModel); + setChatModels(data.chatModelProviders || {}); + setEmbeddingModels(data.embeddingModelProviders || {}); + + setAutomaticImageSearch( + localStorage.getItem('autoImageSearch') === 'true', + ); + setAutomaticVideoSearch( + localStorage.getItem('autoVideoSearch') === 'true', + ); + + setIsLoading(false); + }; + + fetchConfig(); + }, []); + + const saveConfig = async (key: string, value: any) => { + setSavingStates((prev) => ({ ...prev, [key]: true })); + + try { + const updatedConfig = { + ...config, + [key]: value, + } as SettingsType; + + const response = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/config`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(updatedConfig), + }, + ); + + if (!response.ok) { + throw new Error('Failed to update config'); + } + + setConfig(updatedConfig); + + if ( + key.toLowerCase().includes('api') || + key.toLowerCase().includes('url') + ) { + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (!res.ok) { + throw new Error('Failed to fetch updated config'); + } + + const data = await res.json(); + + setChatModels(data.chatModelProviders || {}); + setEmbeddingModels(data.embeddingModelProviders || {}); + + const currentProvider = selectedChatModelProvider; + const newProviders = Object.keys(data.chatModelProviders || {}); + + if (!currentProvider && newProviders.length > 0) { + const firstProvider = newProviders[0]; + const firstModel = data.chatModelProviders[firstProvider]?.[0]?.name; + + if (firstModel) { + setSelectedChatModelProvider(firstProvider); + setSelectedChatModel(firstModel); + localStorage.setItem('chatModelProvider', firstProvider); + localStorage.setItem('chatModel', firstModel); + } + } else if ( + currentProvider && + (!data.chatModelProviders || + !data.chatModelProviders[currentProvider] || + !Array.isArray(data.chatModelProviders[currentProvider]) || + data.chatModelProviders[currentProvider].length === 0) + ) { + const firstValidProvider = Object.entries( + data.chatModelProviders || {}, + ).find( + ([_, models]) => Array.isArray(models) && models.length > 0, + )?.[0]; + + if (firstValidProvider) { + setSelectedChatModelProvider(firstValidProvider); + setSelectedChatModel( + data.chatModelProviders[firstValidProvider][0].name, + ); + localStorage.setItem('chatModelProvider', firstValidProvider); + localStorage.setItem( + 'chatModel', + data.chatModelProviders[firstValidProvider][0].name, + ); + } else { + setSelectedChatModelProvider(null); + setSelectedChatModel(null); + localStorage.removeItem('chatModelProvider'); + localStorage.removeItem('chatModel'); + } + } + + setConfig(data); + } + + if (key === 'automaticImageSearch') { + localStorage.setItem('autoImageSearch', value.toString()); + } else if (key === 'automaticVideoSearch') { + localStorage.setItem('autoVideoSearch', value.toString()); + } else if (key === 'chatModelProvider') { + localStorage.setItem('chatModelProvider', value); + } else if (key === 'chatModel') { + localStorage.setItem('chatModel', value); + } + } catch (err) { + console.error('Failed to save:', err); + setConfig((prev) => ({ ...prev! })); + } finally { + setTimeout(() => { + setSavingStates((prev) => ({ ...prev, [key]: false })); + }, 500); + } + }; + + return ( + <div className="max-w-3xl mx-auto"> + <div className="flex flex-col pt-4"> + <div className="flex items-center space-x-2"> + <Link href="/" className="lg:hidden"> + <ArrowLeft className="text-black/70 dark:text-white/70" /> + </Link> + <div className="flex flex-row space-x-0.5 items-center"> + <SettingsIcon size={23} /> + <h1 className="text-3xl font-medium p-2">Settings</h1> + </div> + </div> + <hr className="border-t border-[#2B2C2C] my-4 w-full" /> + </div> + + {isLoading ? ( + <div className="flex flex-row items-center justify-center min-h-[50vh]"> + <svg + aria-hidden="true" + className="w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]" + viewBox="0 0 100 101" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z" + fill="currentColor" + /> + <path + d="M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z" + fill="currentFill" + /> + </svg> + </div> + ) : ( + config && ( + <div className="flex flex-col space-y-6 pb-28 lg:pb-8"> + <SettingsSection title="Appearance"> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Theme + </p> + <ThemeSwitcher /> + </div> + </SettingsSection> + + <SettingsSection title="Automatic Search"> + <div className="flex flex-col space-y-4"> + <div className="flex items-center justify-between p-3 bg-light-secondary dark:bg-dark-secondary rounded-lg hover:bg-light-200 dark:hover:bg-dark-200 transition-colors"> + <div className="flex items-center space-x-3"> + <div className="p-2 bg-light-200 dark:bg-dark-200 rounded-lg"> + <ImagesIcon + size={18} + className="text-black/70 dark:text-white/70" + /> + </div> + <div> + <p className="text-sm text-black/90 dark:text-white/90 font-medium"> + Automatic Image Search + </p> + <p className="text-xs text-black/60 dark:text-white/60 mt-0.5"> + Automatically search for relevant images in chat + responses + </p> + </div> + </div> + <Switch + checked={automaticImageSearch} + onChange={(checked) => { + setAutomaticImageSearch(checked); + saveConfig('automaticImageSearch', checked); + }} + className={cn( + automaticImageSearch + ? 'bg-[#24A0ED]' + : 'bg-light-200 dark:bg-dark-200', + 'relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none', + )} + > + <span + className={cn( + automaticImageSearch + ? 'translate-x-6' + : 'translate-x-1', + 'inline-block h-4 w-4 transform rounded-full bg-white transition-transform', + )} + /> + </Switch> + </div> + + <div className="flex items-center justify-between p-3 bg-light-secondary dark:bg-dark-secondary rounded-lg hover:bg-light-200 dark:hover:bg-dark-200 transition-colors"> + <div className="flex items-center space-x-3"> + <div className="p-2 bg-light-200 dark:bg-dark-200 rounded-lg"> + <VideoIcon + size={18} + className="text-black/70 dark:text-white/70" + /> + </div> + <div> + <p className="text-sm text-black/90 dark:text-white/90 font-medium"> + Automatic Video Search + </p> + <p className="text-xs text-black/60 dark:text-white/60 mt-0.5"> + Automatically search for relevant videos in chat + responses + </p> + </div> + </div> + <Switch + checked={automaticVideoSearch} + onChange={(checked) => { + setAutomaticVideoSearch(checked); + saveConfig('automaticVideoSearch', checked); + }} + className={cn( + automaticVideoSearch + ? 'bg-[#24A0ED]' + : 'bg-light-200 dark:bg-dark-200', + 'relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none', + )} + > + <span + className={cn( + automaticVideoSearch + ? 'translate-x-6' + : 'translate-x-1', + 'inline-block h-4 w-4 transform rounded-full bg-white transition-transform', + )} + /> + </Switch> + </div> + </div> + </SettingsSection> + + <SettingsSection title="Model Settings"> + {config.chatModelProviders && ( + <div className="flex flex-col space-y-4"> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Chat Model Provider + </p> + <Select + value={selectedChatModelProvider ?? undefined} + onChange={(e) => { + const value = e.target.value; + setSelectedChatModelProvider(value); + saveConfig('chatModelProvider', value); + // Auto-select first model of new provider + const firstModel = + config.chatModelProviders[value]?.[0]?.name; + if (firstModel) { + setSelectedChatModel(firstModel); + saveConfig('chatModel', firstModel); + } + }} + options={Object.keys(config.chatModelProviders).map( + (provider) => ({ + value: provider, + label: + provider.charAt(0).toUpperCase() + + provider.slice(1), + }), + )} + /> + </div> + + {selectedChatModelProvider && + selectedChatModelProvider != 'custom_openai' && ( + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Chat Model + </p> + <Select + value={selectedChatModel ?? undefined} + onChange={(e) => { + const value = e.target.value; + setSelectedChatModel(value); + saveConfig('chatModel', value); + }} + options={(() => { + const chatModelProvider = + config.chatModelProviders[ + selectedChatModelProvider + ]; + return chatModelProvider + ? chatModelProvider.length > 0 + ? chatModelProvider.map((model) => ({ + value: model.name, + label: model.displayName, + })) + : [ + { + value: '', + label: 'No models available', + disabled: true, + }, + ] + : [ + { + value: '', + label: + 'Invalid provider, please check backend logs', + disabled: true, + }, + ]; + })()} + /> + </div> + )} + </div> + )} + + {selectedChatModelProvider && + selectedChatModelProvider === 'custom_openai' && ( + <div className="flex flex-col space-y-4"> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Model Name + </p> + <Input + type="text" + placeholder="Model name" + defaultValue={config.customOpenaiModelName} + onChange={(e) => + setConfig({ + ...config, + customOpenaiModelName: e.target.value, + }) + } + /> + </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Custom OpenAI API Key + </p> + <Input + type="text" + placeholder="Custom OpenAI API Key" + defaultValue={config.customOpenaiApiKey} + onChange={(e) => + setConfig({ + ...config, + customOpenaiApiKey: e.target.value, + }) + } + /> + </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Custom OpenAI Base URL + </p> + <Input + type="text" + placeholder="Custom OpenAI Base URL" + defaultValue={config.customOpenaiApiUrl} + onChange={(e) => + setConfig({ + ...config, + customOpenaiApiUrl: e.target.value, + }) + } + /> + </div> + </div> + )} + </SettingsSection> + + <SettingsSection title="API Keys"> + <div className="flex flex-col space-y-4"> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + OpenAI API Key + </p> + <Input + type="text" + placeholder="OpenAI API Key" + value={config.openaiApiKey} + isSaving={savingStates['openaiApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + openaiApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('openaiApiKey', value)} + /> + </div> + + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Ollama API URL + </p> + <Input + type="text" + placeholder="Ollama API URL" + value={config.ollamaApiUrl} + isSaving={savingStates['ollamaApiUrl']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + ollamaApiUrl: e.target.value, + })); + }} + onSave={(value) => saveConfig('ollamaApiUrl', value)} + /> + </div> + + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + GROQ API Key + </p> + <Input + type="text" + placeholder="GROQ API Key" + value={config.groqApiKey} + isSaving={savingStates['groqApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + groqApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('groqApiKey', value)} + /> + </div> + + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Anthropic API Key + </p> + <Input + type="text" + placeholder="Anthropic API key" + value={config.anthropicApiKey} + isSaving={savingStates['anthropicApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + anthropicApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('anthropicApiKey', value)} + /> + </div> + + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Gemini API Key + </p> + <Input + type="text" + placeholder="Gemini API key" + value={config.geminiApiKey} + isSaving={savingStates['geminiApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + geminiApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('geminiApiKey', value)} + /> + </div> + </div> + </SettingsSection> + </div> + ) + )} + </div> + ); +}; + +export default Page; diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 33ef27b..1940f42 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -10,7 +10,7 @@ import { toast } from 'sonner'; import { useSearchParams } from 'next/navigation'; import { getSuggestions } from '@/lib/actions'; import { Settings } from 'lucide-react'; -import SettingsDialog from './SettingsDialog'; +import Link from 'next/link'; import NextError from 'next/error'; export type Message = { @@ -40,6 +40,7 @@ const useSocket = ( const isCleaningUpRef = useRef(false); const MAX_RETRIES = 3; const INITIAL_BACKOFF = 1000; // 1 second + const isConnectionErrorRef = useRef(false); const getBackoffDelay = (retryCount: number) => { return Math.min(INITIAL_BACKOFF * Math.pow(2, retryCount), 10000); // Cap at 10 seconds @@ -97,21 +98,13 @@ const useSocket = ( chatModelProvider = chatModelProvider || Object.keys(chatModelProviders)[0]; - if (chatModelProvider === 'custom_openai') { - toast.error( - 'Seems like you are using the custom OpenAI provider, please open the settings and enter a model name to use.', - ); - setError(true); - return; - } else { - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - if ( - !chatModelProviders || - Object.keys(chatModelProviders).length === 0 - ) - return toast.error('No chat models available'); - } + if ( + !chatModelProviders || + Object.keys(chatModelProviders).length === 0 + ) + return toast.error('No chat models available'); } if (!embeddingModel || !embeddingModelProvider) { @@ -142,9 +135,7 @@ const useSocket = ( if ( Object.keys(chatModelProviders).length > 0 && - (((!openAIBaseURL || !openAIPIKey) && - chatModelProvider === 'custom_openai') || - !chatModelProviders[chatModelProvider]) + !chatModelProviders[chatModelProvider] ) { const chatModelProvidersKeys = Object.keys(chatModelProviders); chatModelProvider = @@ -152,23 +143,11 @@ const useSocket = ( (key) => Object.keys(chatModelProviders[key]).length > 0, ) || chatModelProvidersKeys[0]; - if ( - chatModelProvider === 'custom_openai' && - (!openAIBaseURL || !openAIPIKey) - ) { - toast.error( - 'Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL', - ); - setError(true); - return; - } - localStorage.setItem('chatModelProvider', chatModelProvider); } if ( chatModelProvider && - (!openAIBaseURL || !openAIPIKey) && !chatModelProviders[chatModelProvider][chatModel] ) { chatModel = Object.keys( @@ -254,6 +233,8 @@ const useSocket = ( console.debug(new Date(), 'ws:connected'); } if (data.type === 'error') { + isConnectionErrorRef.current = true; + setError(true); toast.error(data.data); } }); @@ -268,7 +249,7 @@ const useSocket = ( clearTimeout(timeoutId); setIsWSReady(false); console.debug(new Date(), 'ws:disconnected'); - if (!isCleaningUpRef.current) { + if (!isCleaningUpRef.current && !isConnectionErrorRef.current) { toast.error('Connection lost. Attempting to reconnect...'); attemptReconnect(); } @@ -643,17 +624,15 @@ const ChatWindow = ({ id }: { id?: string }) => { return ( <div className="relative"> <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5"> - <Settings - className="cursor-pointer lg:hidden" - onClick={() => setIsSettingsOpen(true)} - /> + <Link href="/settings"> + <Settings className="cursor-pointer lg:hidden" /> + </Link> </div> <div className="flex flex-col items-center justify-center min-h-screen"> <p className="dark:text-white/70 text-black/70 text-sm"> Failed to connect to the server. Please try again later. </p> </div> - <SettingsDialog isOpen={isSettingsOpen} setIsOpen={setIsSettingsOpen} /> </div> ); } diff --git a/ui/components/EmptyChat.tsx b/ui/components/EmptyChat.tsx index c47c301..838849f 100644 --- a/ui/components/EmptyChat.tsx +++ b/ui/components/EmptyChat.tsx @@ -1,8 +1,8 @@ import { Settings } from 'lucide-react'; import EmptyChatMessageInput from './EmptyChatMessageInput'; -import SettingsDialog from './SettingsDialog'; import { useState } from 'react'; import { File } from './ChatWindow'; +import Link from 'next/link'; const EmptyChat = ({ sendMessage, @@ -29,12 +29,10 @@ const EmptyChat = ({ return ( <div className="relative"> - <SettingsDialog isOpen={isSettingsOpen} setIsOpen={setIsSettingsOpen} /> <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5"> - <Settings - className="cursor-pointer lg:hidden" - onClick={() => setIsSettingsOpen(true)} - /> + <Link href="/settings"> + <Settings className="cursor-pointer lg:hidden" /> + </Link> </div> <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-8"> <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> diff --git a/ui/components/SettingsDialog.tsx b/ui/components/SettingsDialog.tsx deleted file mode 100644 index 163857b..0000000 --- a/ui/components/SettingsDialog.tsx +++ /dev/null @@ -1,528 +0,0 @@ -import { cn } from '@/lib/utils'; -import { - Dialog, - DialogPanel, - DialogTitle, - Transition, - TransitionChild, -} from '@headlessui/react'; -import { CloudUpload, RefreshCcw, RefreshCw } from 'lucide-react'; -import React, { - Fragment, - useEffect, - useState, - type SelectHTMLAttributes, -} from 'react'; -import ThemeSwitcher from './theme/Switcher'; - -interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {} - -const Input = ({ className, ...restProps }: InputProps) => { - return ( - <input - {...restProps} - className={cn( - 'bg-light-secondary dark:bg-dark-secondary px-3 py-2 flex items-center overflow-hidden border border-light-200 dark:border-dark-200 dark:text-white rounded-lg text-sm', - className, - )} - /> - ); -}; - -interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> { - options: { value: string; label: string; disabled?: boolean }[]; -} - -export const Select = ({ className, options, ...restProps }: SelectProps) => { - return ( - <select - {...restProps} - className={cn( - 'bg-light-secondary dark:bg-dark-secondary px-3 py-2 flex items-center overflow-hidden border border-light-200 dark:border-dark-200 dark:text-white rounded-lg text-sm', - className, - )} - > - {options.map(({ label, value, disabled }) => { - return ( - <option key={value} value={value} disabled={disabled}> - {label} - </option> - ); - })} - </select> - ); -}; - -interface SettingsType { - chatModelProviders: { - [key: string]: [Record<string, any>]; - }; - embeddingModelProviders: { - [key: string]: [Record<string, any>]; - }; - openaiApiKey: string; - groqApiKey: string; - anthropicApiKey: string; - geminiApiKey: string; - ollamaApiUrl: string; -} - -const SettingsDialog = ({ - isOpen, - setIsOpen, -}: { - isOpen: boolean; - setIsOpen: (isOpen: boolean) => void; -}) => { - const [config, setConfig] = useState<SettingsType | null>(null); - const [chatModels, setChatModels] = useState<Record<string, any>>({}); - const [embeddingModels, setEmbeddingModels] = useState<Record<string, any>>( - {}, - ); - const [selectedChatModelProvider, setSelectedChatModelProvider] = useState< - string | null - >(null); - const [selectedChatModel, setSelectedChatModel] = useState<string | null>( - null, - ); - const [selectedEmbeddingModelProvider, setSelectedEmbeddingModelProvider] = - useState<string | null>(null); - const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState< - string | null - >(null); - const [customOpenAIApiKey, setCustomOpenAIApiKey] = useState<string>(''); - const [customOpenAIBaseURL, setCustomOpenAIBaseURL] = useState<string>(''); - const [isLoading, setIsLoading] = useState(false); - const [isUpdating, setIsUpdating] = useState(false); - - useEffect(() => { - if (isOpen) { - const fetchConfig = async () => { - setIsLoading(true); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { - headers: { - 'Content-Type': 'application/json', - }, - }); - - const data = (await res.json()) as SettingsType; - setConfig(data); - - const chatModelProvidersKeys = Object.keys( - data.chatModelProviders || {}, - ); - const embeddingModelProvidersKeys = Object.keys( - data.embeddingModelProviders || {}, - ); - - const defaultChatModelProvider = - chatModelProvidersKeys.length > 0 ? chatModelProvidersKeys[0] : ''; - const defaultEmbeddingModelProvider = - embeddingModelProvidersKeys.length > 0 - ? embeddingModelProvidersKeys[0] - : ''; - - const chatModelProvider = - localStorage.getItem('chatModelProvider') || - defaultChatModelProvider || - ''; - const chatModel = - localStorage.getItem('chatModel') || - (data.chatModelProviders && - data.chatModelProviders[chatModelProvider]?.length > 0 - ? data.chatModelProviders[chatModelProvider][0].name - : undefined) || - ''; - const embeddingModelProvider = - localStorage.getItem('embeddingModelProvider') || - defaultEmbeddingModelProvider || - ''; - const embeddingModel = - localStorage.getItem('embeddingModel') || - (data.embeddingModelProviders && - data.embeddingModelProviders[embeddingModelProvider]?.[0].name) || - ''; - - setSelectedChatModelProvider(chatModelProvider); - setSelectedChatModel(chatModel); - setSelectedEmbeddingModelProvider(embeddingModelProvider); - setSelectedEmbeddingModel(embeddingModel); - setCustomOpenAIApiKey(localStorage.getItem('openAIApiKey') || ''); - setCustomOpenAIBaseURL(localStorage.getItem('openAIBaseURL') || ''); - setChatModels(data.chatModelProviders || {}); - setEmbeddingModels(data.embeddingModelProviders || {}); - setIsLoading(false); - }; - - fetchConfig(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isOpen]); - - const handleSubmit = async () => { - setIsUpdating(true); - - try { - await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(config), - }); - - localStorage.setItem('chatModelProvider', selectedChatModelProvider!); - localStorage.setItem('chatModel', selectedChatModel!); - localStorage.setItem( - 'embeddingModelProvider', - selectedEmbeddingModelProvider!, - ); - localStorage.setItem('embeddingModel', selectedEmbeddingModel!); - localStorage.setItem('openAIApiKey', customOpenAIApiKey!); - localStorage.setItem('openAIBaseURL', customOpenAIBaseURL!); - } catch (err) { - console.log(err); - } finally { - setIsUpdating(false); - setIsOpen(false); - - window.location.reload(); - } - }; - - return ( - <Transition appear show={isOpen} as={Fragment}> - <Dialog - as="div" - className="relative z-50" - onClose={() => setIsOpen(false)} - > - <TransitionChild - as={Fragment} - enter="ease-out duration-300" - enterFrom="opacity-0" - enterTo="opacity-100" - leave="ease-in duration-200" - leaveFrom="opacity-100" - leaveTo="opacity-0" - > - <div className="fixed inset-0 bg-white/50 dark:bg-black/50" /> - </TransitionChild> - <div className="fixed inset-0 overflow-y-auto"> - <div className="flex min-h-full items-center justify-center p-4 text-center"> - <TransitionChild - as={Fragment} - enter="ease-out duration-200" - enterFrom="opacity-0 scale-95" - enterTo="opacity-100 scale-100" - leave="ease-in duration-100" - leaveFrom="opacity-100 scale-200" - leaveTo="opacity-0 scale-95" - > - <DialogPanel className="w-full max-w-md transform rounded-2xl bg-light-secondary dark:bg-dark-secondary border border-light-200 dark:border-dark-200 p-6 text-left align-middle shadow-xl transition-all"> - <DialogTitle className="text-xl font-medium leading-6 dark:text-white"> - Settings - </DialogTitle> - {config && !isLoading && ( - <div className="flex flex-col space-y-4 mt-6"> - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Theme - </p> - <ThemeSwitcher /> - </div> - {config.chatModelProviders && ( - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Chat model Provider - </p> - <Select - value={selectedChatModelProvider ?? undefined} - onChange={(e) => { - setSelectedChatModelProvider(e.target.value); - if (e.target.value === 'custom_openai') { - setSelectedChatModel(''); - } else { - setSelectedChatModel( - config.chatModelProviders[e.target.value][0] - .name, - ); - } - }} - options={Object.keys(config.chatModelProviders).map( - (provider) => ({ - value: provider, - label: - provider.charAt(0).toUpperCase() + - provider.slice(1), - }), - )} - /> - </div> - )} - {selectedChatModelProvider && - selectedChatModelProvider != 'custom_openai' && ( - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Chat Model - </p> - <Select - value={selectedChatModel ?? undefined} - onChange={(e) => - setSelectedChatModel(e.target.value) - } - options={(() => { - const chatModelProvider = - config.chatModelProviders[ - selectedChatModelProvider - ]; - - return chatModelProvider - ? chatModelProvider.length > 0 - ? chatModelProvider.map((model) => ({ - value: model.name, - label: model.displayName, - })) - : [ - { - value: '', - label: 'No models available', - disabled: true, - }, - ] - : [ - { - value: '', - label: - 'Invalid provider, please check backend logs', - disabled: true, - }, - ]; - })()} - /> - </div> - )} - {selectedChatModelProvider && - selectedChatModelProvider === 'custom_openai' && ( - <> - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Model name - </p> - <Input - type="text" - placeholder="Model name" - defaultValue={selectedChatModel!} - onChange={(e) => - setSelectedChatModel(e.target.value) - } - /> - </div> - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Custom OpenAI API Key - </p> - <Input - type="text" - placeholder="Custom OpenAI API Key" - defaultValue={customOpenAIApiKey!} - onChange={(e) => - setCustomOpenAIApiKey(e.target.value) - } - /> - </div> - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Custom OpenAI Base URL - </p> - <Input - type="text" - placeholder="Custom OpenAI Base URL" - defaultValue={customOpenAIBaseURL!} - onChange={(e) => - setCustomOpenAIBaseURL(e.target.value) - } - /> - </div> - </> - )} - {/* Embedding models */} - {config.embeddingModelProviders && ( - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Embedding model Provider - </p> - <Select - value={selectedEmbeddingModelProvider ?? undefined} - onChange={(e) => { - setSelectedEmbeddingModelProvider(e.target.value); - setSelectedEmbeddingModel( - config.embeddingModelProviders[e.target.value][0] - .name, - ); - }} - options={Object.keys( - config.embeddingModelProviders, - ).map((provider) => ({ - label: - provider.charAt(0).toUpperCase() + - provider.slice(1), - value: provider, - }))} - /> - </div> - )} - {selectedEmbeddingModelProvider && ( - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Embedding Model - </p> - <Select - value={selectedEmbeddingModel ?? undefined} - onChange={(e) => - setSelectedEmbeddingModel(e.target.value) - } - options={(() => { - const embeddingModelProvider = - config.embeddingModelProviders[ - selectedEmbeddingModelProvider - ]; - - return embeddingModelProvider - ? embeddingModelProvider.length > 0 - ? embeddingModelProvider.map((model) => ({ - label: model.displayName, - value: model.name, - })) - : [ - { - label: 'No embedding models available', - value: '', - disabled: true, - }, - ] - : [ - { - label: - 'Invalid provider, please check backend logs', - value: '', - disabled: true, - }, - ]; - })()} - /> - </div> - )} - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - OpenAI API Key - </p> - <Input - type="text" - placeholder="OpenAI API Key" - defaultValue={config.openaiApiKey} - onChange={(e) => - setConfig({ - ...config, - openaiApiKey: e.target.value, - }) - } - /> - </div> - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Ollama API URL - </p> - <Input - type="text" - placeholder="Ollama API URL" - defaultValue={config.ollamaApiUrl} - onChange={(e) => - setConfig({ - ...config, - ollamaApiUrl: e.target.value, - }) - } - /> - </div> - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - GROQ API Key - </p> - <Input - type="text" - placeholder="GROQ API Key" - defaultValue={config.groqApiKey} - onChange={(e) => - setConfig({ - ...config, - groqApiKey: e.target.value, - }) - } - /> - </div> - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Anthropic API Key - </p> - <Input - type="text" - placeholder="Anthropic API key" - defaultValue={config.anthropicApiKey} - onChange={(e) => - setConfig({ - ...config, - anthropicApiKey: e.target.value, - }) - } - /> - </div> - <div className="flex flex-col space-y-1"> - <p className="text-black/70 dark:text-white/70 text-sm"> - Gemini API Key - </p> - <Input - type="text" - placeholder="Gemini API key" - defaultValue={config.geminiApiKey} - onChange={(e) => - setConfig({ - ...config, - geminiApiKey: e.target.value, - }) - } - /> - </div> - </div> - )} - {isLoading && ( - <div className="w-full flex items-center justify-center mt-6 text-black/70 dark:text-white/70 py-6"> - <RefreshCcw className="animate-spin" /> - </div> - )} - <div className="w-full mt-6 space-y-2"> - <p className="text-xs text-black/50 dark:text-white/50"> - We'll refresh the page after updating the settings. - </p> - <button - onClick={handleSubmit} - className="bg-[#24A0ED] flex flex-row items-center space-x-2 text-white disabled:text-white/50 hover:bg-opacity-85 transition duration-100 disabled:bg-[#ececec21] rounded-full px-4 py-2" - disabled={isLoading || isUpdating} - > - {isUpdating ? ( - <RefreshCw size={20} className="animate-spin" /> - ) : ( - <CloudUpload size={20} /> - )} - </button> - </div> - </DialogPanel> - </TransitionChild> - </div> - </div> - </Dialog> - </Transition> - ); -}; - -export default SettingsDialog; diff --git a/ui/components/Sidebar.tsx b/ui/components/Sidebar.tsx index cc2097d..81db8ba 100644 --- a/ui/components/Sidebar.tsx +++ b/ui/components/Sidebar.tsx @@ -6,7 +6,6 @@ import Link from 'next/link'; import { useSelectedLayoutSegments } from 'next/navigation'; import React, { useState, type ReactNode } from 'react'; import Layout from './Layout'; -import SettingsDialog from './SettingsDialog'; const VerticalIconContainer = ({ children }: { children: ReactNode }) => { return ( @@ -67,15 +66,9 @@ const Sidebar = ({ children }: { children: React.ReactNode }) => { ))} </VerticalIconContainer> - <Settings - onClick={() => setIsSettingsOpen(!isSettingsOpen)} - className="cursor-pointer" - /> - - <SettingsDialog - isOpen={isSettingsOpen} - setIsOpen={setIsSettingsOpen} - /> + <Link href="/settings"> + <Settings className="cursor-pointer" /> + </Link> </div> </div> diff --git a/ui/components/theme/Switcher.tsx b/ui/components/theme/Switcher.tsx index 43bbdc8..b1e7371 100644 --- a/ui/components/theme/Switcher.tsx +++ b/ui/components/theme/Switcher.tsx @@ -1,8 +1,7 @@ 'use client'; import { useTheme } from 'next-themes'; -import { SunIcon, MoonIcon, MonitorIcon } from 'lucide-react'; import { useCallback, useEffect, useState } from 'react'; -import { Select } from '../SettingsDialog'; +import Select from '../ui/Select'; type Theme = 'dark' | 'light' | 'system'; diff --git a/ui/components/ui/Select.tsx b/ui/components/ui/Select.tsx new file mode 100644 index 0000000..8402149 --- /dev/null +++ b/ui/components/ui/Select.tsx @@ -0,0 +1,28 @@ +import { cn } from '@/lib/utils'; +import { SelectHTMLAttributes } from 'react'; + +interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> { + options: { value: string; label: string; disabled?: boolean }[]; +} + +export const Select = ({ className, options, ...restProps }: SelectProps) => { + return ( + <select + {...restProps} + className={cn( + 'bg-light-secondary dark:bg-dark-secondary px-3 py-2 flex items-center overflow-hidden border border-light-200 dark:border-dark-200 dark:text-white rounded-lg text-sm', + className, + )} + > + {options.map(({ label, value, disabled }) => { + return ( + <option key={value} value={value} disabled={disabled}> + {label} + </option> + ); + })} + </select> + ); +}; + +export default Select; From e9ab425cee2a8efefab5de63e21e55a72ae521d4 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 15 Feb 2025 11:34:14 +0530 Subject: [PATCH 126/282] feat(sample-config): remove unused field --- sample.config.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/sample.config.toml b/sample.config.toml index 686372c..7b09d67 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -3,7 +3,6 @@ PORT = 3001 # Port to run the server on SIMILARITY_MEASURE = "cosine" # "cosine" or "dot" KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead of using -1 use "-1m") -[MODELS] [MODELS.OPENAI] API_KEY = "" From 8e683d266a8f79826d8176fc127e0eceae8a484e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 15 Feb 2025 12:12:57 +0530 Subject: [PATCH 127/282] feat(package): bump version --- package.json | 2 +- ui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3fce442..6041377 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-backend", - "version": "1.10.0-rc2", + "version": "1.10.0-rc3", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/ui/package.json b/ui/package.json index a8826dc..e299391 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.0-rc2", + "version": "1.10.0-rc3", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From db3cea446e323c053ca2ffb8bb92fadd63b857db Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 15 Feb 2025 12:33:43 +0530 Subject: [PATCH 128/282] Update UPDATING.md --- docs/installation/UPDATING.md | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/docs/installation/UPDATING.md b/docs/installation/UPDATING.md index b41b05a..a4651df 100644 --- a/docs/installation/UPDATING.md +++ b/docs/installation/UPDATING.md @@ -7,34 +7,43 @@ To update Perplexica to the latest version, follow these steps: 1. Clone the latest version of Perplexica from GitHub: ```bash - git clone https://github.com/ItzCrazyKns/Perplexica.git + git clone https://github.com/ItzCrazyKns/Perplexica.git ``` -2. Navigate to the Project Directory. +2. Navigate to the project directory. -3. Pull latest images from registry. +3. Check for changes in the configuration files. If the `sample.config.toml` file contains new fields, delete your existing `config.toml` file, rename `sample.config.toml` to `config.toml`, and update the configuration accordingly. + +4. Pull the latest images from the registry. ```bash docker compose pull ``` -4. Update and Recreate containers. +5. Update and recreate the containers. ```bash docker compose up -d ``` -5. Once the command completes running go to http://localhost:3000 and verify the latest changes. +6. Once the command completes, go to http://localhost:3000 and verify the latest changes. -## For non Docker users +## For non-Docker users 1. Clone the latest version of Perplexica from GitHub: ```bash - git clone https://github.com/ItzCrazyKns/Perplexica.git + git clone https://github.com/ItzCrazyKns/Perplexica.git ``` -2. Navigate to the Project Directory -3. Execute `npm i` in both the `ui` folder and the root directory. -4. Once packages are updated, execute `npm run build` in both the `ui` folder and the root directory. -5. Finally, start both the frontend and the backend by running `npm run start` in both the `ui` folder and the root directory. +2. Navigate to the project directory. + +3. Check for changes in the configuration files. If the `sample.config.toml` file contains new fields, delete your existing `config.toml` file, rename `sample.config.toml` to `config.toml`, and update the configuration accordingly. + +4. Execute `npm i` in both the `ui` folder and the root directory. + +5. Once the packages are updated, execute `npm run build` in both the `ui` folder and the root directory. + +6. Finally, start both the frontend and the backend by running `npm run start` in both the `ui` folder and the root directory. + +--- From a5c79c92ede72e0f847485777dc38ed6baf37921 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 15 Feb 2025 12:52:27 +0530 Subject: [PATCH 129/282] feat(settings): add embedding provider settings --- src/routes/search.ts | 6 +- ui/app/settings/page.tsx | 145 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 140 insertions(+), 11 deletions(-) diff --git a/src/routes/search.ts b/src/routes/search.ts index a29f64b..57d90a3 100644 --- a/src/routes/search.ts +++ b/src/routes/search.ts @@ -85,10 +85,12 @@ router.post('/', async (req, res) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ modelName: body.chatModel?.model || getCustomOpenaiModelName(), - openAIApiKey: body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), + openAIApiKey: + body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), temperature: 0.7, configuration: { - baseURL: body.chatModel?.customOpenAIBaseURL || getCustomOpenaiApiUrl(), + baseURL: + body.chatModel?.customOpenAIBaseURL || getCustomOpenaiApiUrl(), }, }) as unknown as BaseChatModel; } else if ( diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx index 4026f16..371d091 100644 --- a/ui/app/settings/page.tsx +++ b/ui/app/settings/page.tsx @@ -223,11 +223,11 @@ const Page = () => { setChatModels(data.chatModelProviders || {}); setEmbeddingModels(data.embeddingModelProviders || {}); - const currentProvider = selectedChatModelProvider; - const newProviders = Object.keys(data.chatModelProviders || {}); + const currentChatProvider = selectedChatModelProvider; + const newChatProviders = Object.keys(data.chatModelProviders || {}); - if (!currentProvider && newProviders.length > 0) { - const firstProvider = newProviders[0]; + if (!currentChatProvider && newChatProviders.length > 0) { + const firstProvider = newChatProviders[0]; const firstModel = data.chatModelProviders[firstProvider]?.[0]?.name; if (firstModel) { @@ -237,11 +237,11 @@ const Page = () => { localStorage.setItem('chatModel', firstModel); } } else if ( - currentProvider && + currentChatProvider && (!data.chatModelProviders || - !data.chatModelProviders[currentProvider] || - !Array.isArray(data.chatModelProviders[currentProvider]) || - data.chatModelProviders[currentProvider].length === 0) + !data.chatModelProviders[currentChatProvider] || + !Array.isArray(data.chatModelProviders[currentChatProvider]) || + data.chatModelProviders[currentChatProvider].length === 0) ) { const firstValidProvider = Object.entries( data.chatModelProviders || {}, @@ -267,6 +267,55 @@ const Page = () => { } } + const currentEmbeddingProvider = selectedEmbeddingModelProvider; + const newEmbeddingProviders = Object.keys( + data.embeddingModelProviders || {}, + ); + + if (!currentEmbeddingProvider && newEmbeddingProviders.length > 0) { + const firstProvider = newEmbeddingProviders[0]; + const firstModel = + data.embeddingModelProviders[firstProvider]?.[0]?.name; + + if (firstModel) { + setSelectedEmbeddingModelProvider(firstProvider); + setSelectedEmbeddingModel(firstModel); + localStorage.setItem('embeddingModelProvider', firstProvider); + localStorage.setItem('embeddingModel', firstModel); + } + } else if ( + currentEmbeddingProvider && + (!data.embeddingModelProviders || + !data.embeddingModelProviders[currentEmbeddingProvider] || + !Array.isArray( + data.embeddingModelProviders[currentEmbeddingProvider], + ) || + data.embeddingModelProviders[currentEmbeddingProvider].length === 0) + ) { + const firstValidProvider = Object.entries( + data.embeddingModelProviders || {}, + ).find( + ([_, models]) => Array.isArray(models) && models.length > 0, + )?.[0]; + + if (firstValidProvider) { + setSelectedEmbeddingModelProvider(firstValidProvider); + setSelectedEmbeddingModel( + data.embeddingModelProviders[firstValidProvider][0].name, + ); + localStorage.setItem('embeddingModelProvider', firstValidProvider); + localStorage.setItem( + 'embeddingModel', + data.embeddingModelProviders[firstValidProvider][0].name, + ); + } else { + setSelectedEmbeddingModelProvider(null); + setSelectedEmbeddingModel(null); + localStorage.removeItem('embeddingModelProvider'); + localStorage.removeItem('embeddingModel'); + } + } + setConfig(data); } @@ -278,6 +327,10 @@ const Page = () => { localStorage.setItem('chatModelProvider', value); } else if (key === 'chatModel') { localStorage.setItem('chatModel', value); + } else if (key === 'embeddingModelProvider') { + localStorage.setItem('embeddingModelProvider', value); + } else if (key === 'embeddingModel') { + localStorage.setItem('embeddingModel', value); } } catch (err) { console.error('Failed to save:', err); @@ -436,7 +489,6 @@ const Page = () => { const value = e.target.value; setSelectedChatModelProvider(value); saveConfig('chatModelProvider', value); - // Auto-select first model of new provider const firstModel = config.chatModelProviders[value]?.[0]?.name; if (firstModel) { @@ -554,6 +606,81 @@ const Page = () => { </div> </div> )} + + {config.embeddingModelProviders && ( + <div className="flex flex-col space-y-4 mt-4 pt-4 border-t border-light-200 dark:border-dark-200"> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Embedding Model Provider + </p> + <Select + value={selectedEmbeddingModelProvider ?? undefined} + onChange={(e) => { + const value = e.target.value; + setSelectedEmbeddingModelProvider(value); + saveConfig('embeddingModelProvider', value); + const firstModel = + config.embeddingModelProviders[value]?.[0]?.name; + if (firstModel) { + setSelectedEmbeddingModel(firstModel); + saveConfig('embeddingModel', firstModel); + } + }} + options={Object.keys(config.embeddingModelProviders).map( + (provider) => ({ + value: provider, + label: + provider.charAt(0).toUpperCase() + + provider.slice(1), + }), + )} + /> + </div> + + {selectedEmbeddingModelProvider && ( + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Embedding Model + </p> + <Select + value={selectedEmbeddingModel ?? undefined} + onChange={(e) => { + const value = e.target.value; + setSelectedEmbeddingModel(value); + saveConfig('embeddingModel', value); + }} + options={(() => { + const embeddingModelProvider = + config.embeddingModelProviders[ + selectedEmbeddingModelProvider + ]; + return embeddingModelProvider + ? embeddingModelProvider.length > 0 + ? embeddingModelProvider.map((model) => ({ + value: model.name, + label: model.displayName, + })) + : [ + { + value: '', + label: 'No models available', + disabled: true, + }, + ] + : [ + { + value: '', + label: + 'Invalid provider, please check backend logs', + disabled: true, + }, + ]; + })()} + /> + </div> + )} + </div> + )} </SettingsSection> <SettingsSection title="API Keys"> From 8aaee2c40ca8d4f983c2cc15e668b0a64d95b0d6 Mon Sep 17 00:00:00 2001 From: wellCh4n <wellCh4n@foxmail.com> Date: Sat, 15 Feb 2025 16:48:21 +0800 Subject: [PATCH 130/282] feat(app): support complex title --- src/utils/documents.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/documents.ts b/src/utils/documents.ts index 5cd0366..3656689 100644 --- a/src/utils/documents.ts +++ b/src/utils/documents.ts @@ -65,7 +65,7 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { const splittedText = await splitter.splitText(parsedText); const title = res.data .toString('utf8') - .match(/<title>(.*?)<\/title>/)?.[1]; + .match(/<title.*>(.*?)<\/title>/)?.[1]; const linkDocs = splittedText.map((text) => { return new Document({ From 5f0b87f4a9060585bbeda804d6ffacc436a473ff Mon Sep 17 00:00:00 2001 From: user1007017 <user1007017@users.noreply.github.com> Date: Sat, 15 Feb 2025 19:06:46 +0100 Subject: [PATCH 131/282] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf9e459..39c3266 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Want to know more about its architecture and how it works? You can read it [here - **Normal Mode:** Processes your query and performs a web search. - **Focus Modes:** Special modes to better answer specific types of questions. Perplexica currently has 6 focus modes: - **All Mode:** Searches the entire web to find the best results. - - **Writing Assistant Mode:** Helpful for writing tasks that does not require searching the web. + - **Writing Assistant Mode:** Helpful for writing tasks that do not require searching the web. - **Academic Search Mode:** Finds articles and papers, ideal for academic research. - **YouTube Search Mode:** Finds YouTube videos based on the search query. - **Wolfram Alpha Search Mode:** Answers queries that need calculations or data analysis using Wolfram Alpha. From 4c73caadf6af4951f10d0689689bce192d223beb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 17 Feb 2025 16:24:41 +0530 Subject: [PATCH 132/282] feat(custom-openai): save live changes --- ui/app/settings/page.tsx | 42 ++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx index 371d091..6aff1b0 100644 --- a/ui/app/settings/page.tsx +++ b/ui/app/settings/page.tsx @@ -563,12 +563,16 @@ const Page = () => { <Input type="text" placeholder="Model name" - defaultValue={config.customOpenaiModelName} - onChange={(e) => - setConfig({ - ...config, + value={config.customOpenaiModelName} + isSaving={savingStates['customOpenaiModelName']} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => { + setConfig((prev) => ({ + ...prev!, customOpenaiModelName: e.target.value, - }) + })); + }} + onSave={(value) => + saveConfig('customOpenaiModelName', value) } /> </div> @@ -579,12 +583,16 @@ const Page = () => { <Input type="text" placeholder="Custom OpenAI API Key" - defaultValue={config.customOpenaiApiKey} - onChange={(e) => - setConfig({ - ...config, + value={config.customOpenaiApiKey} + isSaving={savingStates['customOpenaiApiKey']} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => { + setConfig((prev) => ({ + ...prev!, customOpenaiApiKey: e.target.value, - }) + })); + }} + onSave={(value) => + saveConfig('customOpenaiApiKey', value) } /> </div> @@ -595,12 +603,16 @@ const Page = () => { <Input type="text" placeholder="Custom OpenAI Base URL" - defaultValue={config.customOpenaiApiUrl} - onChange={(e) => - setConfig({ - ...config, + value={config.customOpenaiApiUrl} + isSaving={savingStates['customOpenaiApiUrl']} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => { + setConfig((prev) => ({ + ...prev!, customOpenaiApiUrl: e.target.value, - }) + })); + }} + onSave={(value) => + saveConfig('customOpenaiApiUrl', value) } /> </div> From 2e166c217bb7177f90661342400d789c03943533 Mon Sep 17 00:00:00 2001 From: wellCh4n <wellCh4n@foxmail.com> Date: Wed, 19 Feb 2025 10:34:51 +0800 Subject: [PATCH 133/282] fix(MessageBox): break too long message title --- ui/components/MessageBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index f23127c..a7942d1 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -68,7 +68,7 @@ const MessageBox = ({ return ( <div> {message.role === 'user' && ( - <div className={cn('w-full', messageIndex === 0 ? 'pt-16' : 'pt-8')}> + <div className={cn('w-full', messageIndex === 0 ? 'pt-16' : 'pt-8', 'break-words')}> <h2 className="text-black dark:text-white font-medium text-3xl lg:w-9/12"> {message.content} </h2> From bb3f1805832956f922f26250f1702c57e83e0edd Mon Sep 17 00:00:00 2001 From: QuietlyChan <1013893148@qq.com> Date: Tue, 25 Feb 2025 17:26:33 +0800 Subject: [PATCH 134/282] fix(ui): improve dark mode text color for attachment buttons --- ui/components/MessageInputActions/Attach.tsx | 4 ++-- ui/components/MessageInputActions/AttachSmall.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/components/MessageInputActions/Attach.tsx b/ui/components/MessageInputActions/Attach.tsx index 61cc86a..b3ac855 100644 --- a/ui/components/MessageInputActions/Attach.tsx +++ b/ui/components/MessageInputActions/Attach.tsx @@ -110,7 +110,7 @@ const Attach = ({ <button type="button" onClick={() => fileInputRef.current.click()} - className="flex flex-row items-center space-x-1 text-white/70 hover:text-white transition duration-200" + className="flex flex-row items-center space-x-1 text-black/70 dark:text-white/70 hover:text-black hover:dark:text-white transition duration-200" > <input type="file" @@ -128,7 +128,7 @@ const Attach = ({ setFiles([]); setFileIds([]); }} - className="flex flex-row items-center space-x-1 text-white/70 hover:text-white transition duration-200" + className="flex flex-row items-center space-x-1 text-black/70 dark:text-white/70 hover:text-black hover:dark:text-white transition duration-200" > <Trash size={14} /> <p className="text-xs">Clear</p> diff --git a/ui/components/MessageInputActions/AttachSmall.tsx b/ui/components/MessageInputActions/AttachSmall.tsx index 3514a58..3403caf 100644 --- a/ui/components/MessageInputActions/AttachSmall.tsx +++ b/ui/components/MessageInputActions/AttachSmall.tsx @@ -82,7 +82,7 @@ const AttachSmall = ({ <button type="button" onClick={() => fileInputRef.current.click()} - className="flex flex-row items-center space-x-1 text-white/70 hover:text-white transition duration-200" + className="flex flex-row items-center space-x-1 text-black/70 dark:text-white/70 hover:text-black hover:dark:text-white transition duration-200" > <input type="file" @@ -100,7 +100,7 @@ const AttachSmall = ({ setFiles([]); setFileIds([]); }} - className="flex flex-row items-center space-x-1 text-white/70 hover:text-white transition duration-200" + className="flex flex-row items-center space-x-1 text-black/70 dark:text-white/70 hover:text-black hover:dark:text-white transition duration-200" > <Trash size={14} /> <p className="text-xs">Clear</p> From 216576128d9133fb85ecde8aaf14c2e2ec1d16d1 Mon Sep 17 00:00:00 2001 From: QuietlyChan <1013893148@qq.com> Date: Tue, 25 Feb 2025 19:26:58 +0800 Subject: [PATCH 135/282] fix(ui): update attachment text color for light and dark modes --- ui/components/MessageInputActions/Attach.tsx | 2 +- ui/components/MessageInputActions/AttachSmall.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/components/MessageInputActions/Attach.tsx b/ui/components/MessageInputActions/Attach.tsx index b3ac855..d5c1448 100644 --- a/ui/components/MessageInputActions/Attach.tsx +++ b/ui/components/MessageInputActions/Attach.tsx @@ -145,7 +145,7 @@ const Attach = ({ <div className="bg-dark-100 flex items-center justify-center w-10 h-10 rounded-md"> <File size={16} className="text-white/70" /> </div> - <p className="text-white/70 text-sm"> + <p className="text-black/70 dark:text-white/70 text-sm"> {file.fileName.length > 25 ? file.fileName.replace(/\.\w+$/, '').substring(0, 25) + '...' + diff --git a/ui/components/MessageInputActions/AttachSmall.tsx b/ui/components/MessageInputActions/AttachSmall.tsx index 3403caf..a0d4b45 100644 --- a/ui/components/MessageInputActions/AttachSmall.tsx +++ b/ui/components/MessageInputActions/AttachSmall.tsx @@ -117,7 +117,7 @@ const AttachSmall = ({ <div className="bg-dark-100 flex items-center justify-center w-10 h-10 rounded-md"> <File size={16} className="text-white/70" /> </div> - <p className="text-white/70 text-sm"> + <p className="text-black/70 dark:text-white/70 text-sm"> {file.fileName.length > 25 ? file.fileName.replace(/\.\w+$/, '').substring(0, 25) + '...' + From d584067bb16887ce4a7076c862f92a85d4a6c890 Mon Sep 17 00:00:00 2001 From: ShortCipher5 <me@shortcipher.me> Date: Thu, 27 Feb 2025 23:26:45 -0800 Subject: [PATCH 136/282] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 39c3266..866b585 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ You can access Perplexica over your home network by following our networking gui ## One-Click Deployment +[![Deploy to Sealos](https://raw.githubusercontent.com/labring-actions/templates/main/Deploy-on-Sealos.svg)](https://usw.sealos.io/?openapp=system-template%3FtemplateName%3Dperplexica) [![Deploy to RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploylobe.svg)](https://repocloud.io/details/?app_id=267) ## Upcoming Features From bf4cf8eaebc96ba581380a7e9f9f11c5a362232e Mon Sep 17 00:00:00 2001 From: Eric Chen <54382303+ericdachen@users.noreply.github.com> Date: Tue, 4 Mar 2025 12:14:17 -0500 Subject: [PATCH 137/282] Update README.md --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 866b585..f9715de 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,18 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> +<div align="center" markdown="1"> + <sup>Special thanks to:</sup> + <br> + <br> + <a href="https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=fzf"> + <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/ab8dd143-b0fd-4904-bdc5-dd7ecac94eae"> + </a> + +### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=fzf) +[Available for MacOS, Linux, & Windows](https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=fzf)<br> + +</div> + [![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) From 064c0fbe42d7ad2571b3ba9d0cd3a2c107ab93fa Mon Sep 17 00:00:00 2001 From: Eric Chen <54382303+ericdachen@users.noreply.github.com> Date: Tue, 4 Mar 2025 12:16:10 -0500 Subject: [PATCH 138/282] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f9715de..ad4b4b9 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ </a> ### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=fzf) -[Available for MacOS, Linux, & Windows](https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=fzf)<br> +[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica)<br> </div> From aa834f7f0442d7d8dd18ad4cc9562614c62e2b41 Mon Sep 17 00:00:00 2001 From: Eric Chen <54382303+ericdachen@users.noreply.github.com> Date: Tue, 4 Mar 2025 14:45:10 -0500 Subject: [PATCH 139/282] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad4b4b9..5e5bb1f 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/ab8dd143-b0fd-4904-bdc5-dd7ecac94eae"> </a> -### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=fzf) +### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica) [Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica)<br> </div> From a32eb1dda395b456e9cf7682d3cc6a8d9b9fc06a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:55:02 +0530 Subject: [PATCH 140/282] feat(readme): lint & beautify, update anchor URL --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5e5bb1f..3618b07 100644 --- a/README.md +++ b/README.md @@ -4,18 +4,18 @@ <sup>Special thanks to:</sup> <br> <br> - <a href="https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=fzf"> + <a href="https://www.warp.dev/perplexica"> <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/ab8dd143-b0fd-4904-bdc5-dd7ecac94eae"> </a> ### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica) + [Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica)<br> </div> [![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) - ![preview](.assets/perplexica-screenshot.png?) ## Table of Contents <!-- omit in toc --> From bbd2e9c359fd19bfce5544a6d0afdf5828b4e748 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 5 Mar 2025 11:05:25 +0530 Subject: [PATCH 141/282] feat(readme): update warp banner --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3618b07..b6028b2 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,17 @@ <br> <br> <a href="https://www.warp.dev/perplexica"> - <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/ab8dd143-b0fd-4904-bdc5-dd7ecac94eae"> + <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/775dd593-9b5f-40f1-bf48-479faff4c27b"> </a> ### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica) -[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica)<br> +[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica) </div> +<hr/><br/> + [![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) ![preview](.assets/perplexica-screenshot.png?) From 7756340dd9cdab9684d9dccfd761bc84764aba4e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 5 Mar 2025 11:09:19 +0530 Subject: [PATCH 142/282] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b6028b2..291ea19 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ </div> -<hr/><br/> +<hr/> [![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) From e6b87f89ec478a74911ffde0d5c5f02e43c01cdb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 8 Mar 2025 20:08:27 +0530 Subject: [PATCH 143/282] feat(sample-config): add custom openai model name --- sample.config.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/sample.config.toml b/sample.config.toml index 7b09d67..cddb19d 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -18,6 +18,7 @@ API_KEY = "" [MODELS.CUSTOM_OPENAI] API_KEY = "" API_URL = "" +MODEL_NAME = "" [MODELS.OLLAMA] API_URL = "" # Ollama API URL - http://host.docker.internal:11434 From 060c68a90079317256b9f17a6a51a5997c6dfa2c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:05:07 +0530 Subject: [PATCH 144/282] feat(message-box): lint & beautify --- ui/components/MessageBox.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index a7942d1..61f4f05 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -68,7 +68,13 @@ const MessageBox = ({ return ( <div> {message.role === 'user' && ( - <div className={cn('w-full', messageIndex === 0 ? 'pt-16' : 'pt-8', 'break-words')}> + <div + className={cn( + 'w-full', + messageIndex === 0 ? 'pt-16' : 'pt-8', + 'break-words', + )} + > <h2 className="text-black dark:text-white font-medium text-3xl lg:w-9/12"> {message.content} </h2> From 9a2c4fe3b68a4165acbaa35645e93a7eb820e83f Mon Sep 17 00:00:00 2001 From: sjiampojamarn <18257803+sjiampojamarn@users.noreply.github.com> Date: Sun, 16 Mar 2025 09:23:22 -0700 Subject: [PATCH 145/282] Only set scrollIntoView for user msg. --- ui/components/Chat.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/components/Chat.tsx b/ui/components/Chat.tsx index 81aa32f..0cf125b 100644 --- a/ui/components/Chat.tsx +++ b/ui/components/Chat.tsx @@ -48,11 +48,17 @@ const Chat = ({ }); useEffect(() => { - messageEnd.current?.scrollIntoView({ behavior: 'smooth' }); + const scroll = () => { + messageEnd.current?.scrollIntoView({ behavior: 'smooth' }); + }; if (messages.length === 1) { document.title = `${messages[0].content.substring(0, 30)} - Perplexica`; } + + if (messages[messages.length - 1]?.role == 'user') { + scroll(); + } }, [messages]); return ( From 6b5bd9d79bd5e875a51b9aa392901a2f14c1d959 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:23:21 +0530 Subject: [PATCH 146/282] feat(prompts): move to UI --- ui/lib/prompts/academicSearch.ts | 65 ++++++++++++++++++ ui/lib/prompts/index.ts | 32 +++++++++ ui/lib/prompts/redditSearch.ts | 65 ++++++++++++++++++ ui/lib/prompts/webSearch.ts | 106 +++++++++++++++++++++++++++++ ui/lib/prompts/wolframAlpha.ts | 65 ++++++++++++++++++ ui/lib/prompts/writingAssistant.ts | 13 ++++ ui/lib/prompts/youtubeSearch.ts | 65 ++++++++++++++++++ 7 files changed, 411 insertions(+) create mode 100644 ui/lib/prompts/academicSearch.ts create mode 100644 ui/lib/prompts/index.ts create mode 100644 ui/lib/prompts/redditSearch.ts create mode 100644 ui/lib/prompts/webSearch.ts create mode 100644 ui/lib/prompts/wolframAlpha.ts create mode 100644 ui/lib/prompts/writingAssistant.ts create mode 100644 ui/lib/prompts/youtubeSearch.ts diff --git a/ui/lib/prompts/academicSearch.ts b/ui/lib/prompts/academicSearch.ts new file mode 100644 index 0000000..c2946ff --- /dev/null +++ b/ui/lib/prompts/academicSearch.ts @@ -0,0 +1,65 @@ +export const academicSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: How does stable diffusion work? +Rephrased: Stable diffusion working + +2. Follow up question: What is linear algebra? +Rephrased: Linear algebra + +3. Follow up question: What is the third law of thermodynamics? +Rephrased: Third law of thermodynamics + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const academicSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; diff --git a/ui/lib/prompts/index.ts b/ui/lib/prompts/index.ts new file mode 100644 index 0000000..f479185 --- /dev/null +++ b/ui/lib/prompts/index.ts @@ -0,0 +1,32 @@ +import { + academicSearchResponsePrompt, + academicSearchRetrieverPrompt, +} from './academicSearch'; +import { + redditSearchResponsePrompt, + redditSearchRetrieverPrompt, +} from './redditSearch'; +import { webSearchResponsePrompt, webSearchRetrieverPrompt } from './webSearch'; +import { + wolframAlphaSearchResponsePrompt, + wolframAlphaSearchRetrieverPrompt, +} from './wolframAlpha'; +import { writingAssistantPrompt } from './writingAssistant'; +import { + youtubeSearchResponsePrompt, + youtubeSearchRetrieverPrompt, +} from './youtubeSearch'; + +export default { + webSearchResponsePrompt, + webSearchRetrieverPrompt, + academicSearchResponsePrompt, + academicSearchRetrieverPrompt, + redditSearchResponsePrompt, + redditSearchRetrieverPrompt, + wolframAlphaSearchResponsePrompt, + wolframAlphaSearchRetrieverPrompt, + writingAssistantPrompt, + youtubeSearchResponsePrompt, + youtubeSearchRetrieverPrompt, +}; diff --git a/ui/lib/prompts/redditSearch.ts b/ui/lib/prompts/redditSearch.ts new file mode 100644 index 0000000..fc71957 --- /dev/null +++ b/ui/lib/prompts/redditSearch.ts @@ -0,0 +1,65 @@ +export const redditSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: Which company is most likely to create an AGI +Rephrased: Which company is most likely to create an AGI + +2. Follow up question: Is Earth flat? +Rephrased: Is Earth flat? + +3. Follow up question: Is there life on Mars? +Rephrased: Is there life on Mars? + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const redditSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; diff --git a/ui/lib/prompts/webSearch.ts b/ui/lib/prompts/webSearch.ts new file mode 100644 index 0000000..d8269c8 --- /dev/null +++ b/ui/lib/prompts/webSearch.ts @@ -0,0 +1,106 @@ +export const webSearchRetrieverPrompt = ` +You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. +If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). +If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. +You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. + +There are several examples attached for your reference inside the below \`examples\` XML block + +<examples> +1. Follow up question: What is the capital of France +Rephrased question:\` +<question> +Capital of france +</question> +\` + +2. Hi, how are you? +Rephrased question\` +<question> +not_needed +</question> +\` + +3. Follow up question: What is Docker? +Rephrased question: \` +<question> +What is Docker +</question> +\` + +4. Follow up question: Can you tell me what is X from https://example.com +Rephrased question: \` +<question> +Can you tell me what is X? +</question> + +<links> +https://example.com +</links> +\` + +5. Follow up question: Summarize the content from https://example.com +Rephrased question: \` +<question> +summarize +</question> + +<links> +https://example.com +</links> +\` +</examples> + +Anything below is the part of the actual conversation and you need to use conversation and the follow-up question to rephrase the follow-up question as a standalone question based on the guidelines shared above. + +<conversation> +{chat_history} +</conversation> + +Follow up question: {query} +Rephrased question: +`; + +export const webSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; diff --git a/ui/lib/prompts/wolframAlpha.ts b/ui/lib/prompts/wolframAlpha.ts new file mode 100644 index 0000000..40410c1 --- /dev/null +++ b/ui/lib/prompts/wolframAlpha.ts @@ -0,0 +1,65 @@ +export const wolframAlphaSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: What is the atomic radius of S? +Rephrased: Atomic radius of S + +2. Follow up question: What is linear algebra? +Rephrased: Linear algebra + +3. Follow up question: What is the third law of thermodynamics? +Rephrased: Third law of thermodynamics + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const wolframAlphaSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; diff --git a/ui/lib/prompts/writingAssistant.ts b/ui/lib/prompts/writingAssistant.ts new file mode 100644 index 0000000..f56bf47 --- /dev/null +++ b/ui/lib/prompts/writingAssistant.ts @@ -0,0 +1,13 @@ +export const writingAssistantPrompt = ` +You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are currently set on focus mode 'Writing Assistant', this means you will be helping the user write a response to a given query. +Since you are a writing assistant, you would not perform web searches. If you think you lack information to answer the query, you can ask the user for more information or suggest them to switch to a different focus mode. +You will be shared a context that can contain information from files user has uploaded to get answers from. You will have to generate answers upon that. + +You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. +Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. +However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + +<context> +{context} +</context> +`; diff --git a/ui/lib/prompts/youtubeSearch.ts b/ui/lib/prompts/youtubeSearch.ts new file mode 100644 index 0000000..5805b54 --- /dev/null +++ b/ui/lib/prompts/youtubeSearch.ts @@ -0,0 +1,65 @@ +export const youtubeSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: How does an A.C work? +Rephrased: A.C working + +2. Follow up question: Linear algebra explanation video +Rephrased: What is linear algebra? + +3. Follow up question: What is theory of relativity? +Rephrased: What is theory of relativity? + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const youtubeSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcrip + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; From 5c313e9bed47b7ee7fe7576780b1c71ac0507f44 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:23:59 +0530 Subject: [PATCH 147/282] feat(ui): update packages, add config, add searxng --- ui/lib/config.ts | 117 ++++++++ ui/lib/searxng.ts | 48 ++++ ui/next.config.mjs | 1 + ui/package.json | 11 +- ui/tsconfig.json | 24 +- ui/yarn.lock | 693 +++++++++++++++++++++++++++++++++++++++------ 6 files changed, 809 insertions(+), 85 deletions(-) create mode 100644 ui/lib/config.ts create mode 100644 ui/lib/searxng.ts diff --git a/ui/lib/config.ts b/ui/lib/config.ts new file mode 100644 index 0000000..1e5148d --- /dev/null +++ b/ui/lib/config.ts @@ -0,0 +1,117 @@ +import fs from 'fs'; +import path from 'path'; +import toml from '@iarna/toml'; + +const configFileName = 'config.toml'; + +interface Config { + GENERAL: { + PORT: number; + SIMILARITY_MEASURE: string; + KEEP_ALIVE: string; + }; + MODELS: { + OPENAI: { + API_KEY: string; + }; + GROQ: { + API_KEY: string; + }; + ANTHROPIC: { + API_KEY: string; + }; + GEMINI: { + API_KEY: string; + }; + OLLAMA: { + API_URL: string; + }; + CUSTOM_OPENAI: { + API_URL: string; + API_KEY: string; + MODEL_NAME: string; + }; + }; + API_ENDPOINTS: { + SEARXNG: string; + }; +} + +type RecursivePartial<T> = { + [P in keyof T]?: RecursivePartial<T[P]>; +}; + +const loadConfig = () => + toml.parse( + fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), + ) as any as Config; + +export const getPort = () => loadConfig().GENERAL.PORT; + +export const getSimilarityMeasure = () => + loadConfig().GENERAL.SIMILARITY_MEASURE; + +export const getKeepAlive = () => loadConfig().GENERAL.KEEP_ALIVE; + +export const getOpenaiApiKey = () => loadConfig().MODELS.OPENAI.API_KEY; + +export const getGroqApiKey = () => loadConfig().MODELS.GROQ.API_KEY; + +export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; + +export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; + +export const getSearxngApiEndpoint = () => + process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; + +export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; + +export const getCustomOpenaiApiKey = () => + loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; + +export const getCustomOpenaiApiUrl = () => + loadConfig().MODELS.CUSTOM_OPENAI.API_URL; + +export const getCustomOpenaiModelName = () => + loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; + +const mergeConfigs = (current: any, update: any): any => { + if (update === null || update === undefined) { + return current; + } + + if (typeof current !== 'object' || current === null) { + return update; + } + + const result = { ...current }; + + for (const key in update) { + if (Object.prototype.hasOwnProperty.call(update, key)) { + const updateValue = update[key]; + + if ( + typeof updateValue === 'object' && + updateValue !== null && + typeof result[key] === 'object' && + result[key] !== null + ) { + result[key] = mergeConfigs(result[key], updateValue); + } else if (updateValue !== undefined) { + result[key] = updateValue; + } + } + } + + return result; +}; + +export const updateConfig = (config: RecursivePartial<Config>) => { + const currentConfig = loadConfig(); + const mergedConfig = mergeConfigs(currentConfig, config); + + fs.writeFileSync( + path.join(__dirname, `../${configFileName}`), + toml.stringify(mergedConfig), + ); +}; \ No newline at end of file diff --git a/ui/lib/searxng.ts b/ui/lib/searxng.ts new file mode 100644 index 0000000..ae19db2 --- /dev/null +++ b/ui/lib/searxng.ts @@ -0,0 +1,48 @@ +import axios from 'axios'; +import { getSearxngApiEndpoint } from './config'; + +interface SearxngSearchOptions { + categories?: string[]; + engines?: string[]; + language?: string; + pageno?: number; +} + +interface SearxngSearchResult { + title: string; + url: string; + img_src?: string; + thumbnail_src?: string; + thumbnail?: string; + content?: string; + author?: string; + iframe_src?: string; +} + +export const searchSearxng = async ( + query: string, + opts?: SearxngSearchOptions, +) => { + const searxngURL = getSearxngApiEndpoint(); + + const url = new URL(`${searxngURL}/search?format=json`); + url.searchParams.append('q', query); + + if (opts) { + Object.keys(opts).forEach((key) => { + const value = opts[key as keyof SearxngSearchOptions]; + if (Array.isArray(value)) { + url.searchParams.append(key, value.join(',')); + return; + } + url.searchParams.append(key, value as string); + }); + } + + const res = await axios.get(url.toString()); + + const results: SearxngSearchResult[] = res.data.results; + const suggestions: string[] = res.data.suggestions; + + return { results, suggestions }; +}; diff --git a/ui/next.config.mjs b/ui/next.config.mjs index c3f2e1a..a5db257 100644 --- a/ui/next.config.mjs +++ b/ui/next.config.mjs @@ -7,6 +7,7 @@ const nextConfig = { }, ], }, + serverExternalPackages: ['pdf-parse'] }; export default nextConfig; diff --git a/ui/package.json b/ui/package.json index e299391..c9a7a94 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,26 +12,35 @@ }, "dependencies": { "@headlessui/react": "^2.2.0", + "@iarna/toml": "^2.2.5", "@icons-pack/react-simple-icons": "^9.4.0", "@langchain/openai": "^0.0.25", "@tailwindcss/typography": "^0.5.12", + "axios": "^1.8.3", "clsx": "^2.1.0", + "compute-cosine-similarity": "^1.1.0", + "compute-dot": "^1.1.0", + "html-to-text": "^9.0.5", "langchain": "^0.1.30", "lucide-react": "^0.363.0", "markdown-to-jsx": "^7.7.2", - "next": "14.1.4", + "next": "^15.2.2", "next-themes": "^0.3.0", + "pdf-parse": "^1.1.1", "react": "^18", "react-dom": "^18", "react-text-to-speech": "^0.14.5", "react-textarea-autosize": "^8.5.3", "sonner": "^1.4.41", "tailwind-merge": "^2.2.2", + "winston": "^3.17.0", "yet-another-react-lightbox": "^3.17.2", "zod": "^3.22.4" }, "devDependencies": { + "@types/html-to-text": "^9.0.4", "@types/node": "^20", + "@types/pdf-parse": "^1.1.4", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.0.1", diff --git a/ui/tsconfig.json b/ui/tsconfig.json index e7ff90f..d81d4ee 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -18,9 +22,19 @@ } ], "paths": { - "@/*": ["./*"] - } + "@/*": [ + "./*" + ] + }, + "target": "ES2017" }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/ui/yarn.lock b/ui/yarn.lock index 7eb109f..427693e 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -34,6 +34,27 @@ dependencies: regenerator-runtime "^0.14.0" +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@emnapi/runtime@^1.2.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" + integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== + dependencies: + tslib "^2.4.0" + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -131,11 +152,129 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@iarna/toml@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + "@icons-pack/react-simple-icons@^9.4.0": version "9.4.0" resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-9.4.0.tgz#37871d830f9ec9cfa1d1aab186036df2ab075f26" integrity sha512-fZtC4Zv53hE+IQE2dJlFt3EB6UOifwTrUNMuEu4hSXemtqMahd05Dpvj2K0j2ewVc+j/ibavud3xjfaMB2Nj7g== +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -233,10 +372,10 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" -"@next/env@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.4.tgz#432e80651733fbd67230bf262aee28be65252674" - integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ== +"@next/env@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" + integrity sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ== "@next/eslint-plugin-next@14.1.4": version "14.1.4" @@ -245,50 +384,45 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz#a3bca0dc4393ac4cf3169bbf24df63441de66bb7" - integrity sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg== +"@next/swc-darwin-arm64@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.2.tgz#d3131279d4815ed7604eba7bf0063e0b8bfd2135" + integrity sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw== -"@next/swc-darwin-x64@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz#ba3683d4e2d30099f3f2864dd7349a4d9f440140" - integrity sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ== +"@next/swc-darwin-x64@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.2.tgz#8562f6b51177aa30f3a6e95a8b3e0e176a6cb04f" + integrity sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA== -"@next/swc-linux-arm64-gnu@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz#3519969293f16379954b7e196deb0c1eecbb2f8b" - integrity sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA== +"@next/swc-linux-arm64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.2.tgz#c2466cffc541f39ae4d435087c81f5899d401903" + integrity sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ== -"@next/swc-linux-arm64-musl@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz#4bb3196bd402b3f84cf5373ff1021f547264d62f" - integrity sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g== +"@next/swc-linux-arm64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.2.tgz#24ed87fe47325597e986bd01c427efae53d6b677" + integrity sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA== -"@next/swc-linux-x64-gnu@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz#1b3372c98c83dcdab946cdb4ee06e068b8139ba3" - integrity sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw== +"@next/swc-linux-x64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.2.tgz#0240f44530ca39c1fc899fabe8f33aa35d7e77da" + integrity sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA== -"@next/swc-linux-x64-musl@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz#8459088bdc872648ff78f121db596f2533df5808" - integrity sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg== +"@next/swc-linux-x64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.2.tgz#cca6ce8e9ec89afaa618673f0f8658682c30ff56" + integrity sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw== -"@next/swc-win32-arm64-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz#84280a08c00cc3be24ddd3a12f4617b108e6dea6" - integrity sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag== +"@next/swc-win32-arm64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.2.tgz#08f621602ed53fa21ddf6f656160b9186860be15" + integrity sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg== -"@next/swc-win32-ia32-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz#23ff7f4bd0a27177428669ef6fa5c3923c738031" - integrity sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw== - -"@next/swc-win32-x64-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz#bccf5beccfde66d6c66fa4e2509118c796385eda" - integrity sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w== +"@next/swc-win32-x64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.2.tgz#2072d69374f8c944134a5c5a80ce03ff84254cfa" + integrity sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -372,14 +506,20 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf" integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg== -"@swc/helpers@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== +"@selderee/plugin-htmlparser2@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" + integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== dependencies: - tslib "^2.4.0" + domhandler "^5.0.3" + selderee "^0.11.0" -"@swc/helpers@^0.5.0": +"@swc/counter@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.15", "@swc/helpers@^0.5.0": version "0.5.15" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== @@ -408,6 +548,11 @@ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== +"@types/html-to-text@^9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" + integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -435,6 +580,11 @@ dependencies: undici-types "~5.26.4" +"@types/pdf-parse@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" + integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== + "@types/prop-types@*": version "15.7.12" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" @@ -460,6 +610,11 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@types/uuid@^9.0.1": version "9.0.8" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" @@ -716,6 +871,11 @@ ast-types-flow@^0.0.8: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -745,6 +905,15 @@ axe-core@=4.7.0: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axios@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8" + integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" @@ -842,7 +1011,12 @@ camelcase@6: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: +caniuse-lite@^1.0.30001579: + version "1.0.30001705" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz#dc3510bcdef261444ca944b7be9c8d0bb7fafeef" + integrity sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg== + +caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: version "1.0.30001606" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== @@ -890,6 +1064,13 @@ clsx@^2.1.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== +color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -897,11 +1078,48 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0, color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -919,6 +1137,32 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +compute-cosine-similarity@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" + integrity sha512-FXhNx0ILLjGi9Z9+lglLzM12+0uoTnYkHm7GiadXDAr0HGVLm25OivUS1B/LPkbzzvlcXz/1EvWg9ZYyJSdhTw== + dependencies: + compute-dot "^1.1.0" + compute-l2norm "^1.1.0" + validate.io-array "^1.0.5" + validate.io-function "^1.0.2" + +compute-dot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-dot/-/compute-dot-1.1.0.tgz#01a5ba2c7af73b99002acb258459c9576a8232dc" + integrity sha512-L5Ocet4DdMrXboss13K59OK23GXjiSia7+7Ukc7q4Bl+RVpIXK2W9IHMbWDZkh+JUEvJAwOKRaJDiFUa1LTnJg== + dependencies: + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + +compute-l2norm@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-l2norm/-/compute-l2norm-1.1.0.tgz#bd09131c6b36c8d70c68334e176009a4e0a989ac" + integrity sha512-6EHh1Elj90eU28SXi+h2PLnTQvZmkkHWySpoFz+WOlVNLz3DQoC4ISUHSV9n5jMxPHtKGJ01F4uu2PsXBB8sSg== + dependencies: + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -980,7 +1224,7 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -1004,6 +1248,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -1032,6 +1281,11 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -1071,6 +1325,36 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -1091,6 +1375,11 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + enhanced-resolve@^5.12.0: version "5.16.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" @@ -1099,6 +1388,11 @@ enhanced-resolve@^5.12.0: graceful-fs "^4.2.4" tapable "^2.2.0" +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" @@ -1481,6 +1775,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1522,6 +1821,16 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -1702,7 +2011,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.2.11, graceful-fs@^4.2.4: +graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -1753,6 +2062,27 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +html-to-text@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" + integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== + dependencies: + "@selderee/plugin-htmlparser2" "^0.11.0" + deepmerge "^4.3.1" + dom-serializer "^2.0.0" + htmlparser2 "^8.0.2" + selderee "^0.11.0" + +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -1786,7 +2116,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1813,6 +2143,11 @@ is-array-buffer@^3.0.4: call-bind "^1.0.2" get-intrinsic "^1.2.1" +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" @@ -1951,6 +2286,11 @@ is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: dependencies: call-bind "^1.0.7" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -2090,6 +2430,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + langchain@^0.1.30: version "0.1.31" resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" @@ -2141,6 +2486,11 @@ language-tags@^1.0.9: dependencies: language-subtag-registry "^0.3.20" +leac@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2186,6 +2536,18 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -2335,7 +2697,12 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.6, nanoid@^3.3.7: +nanoid@^3.3.6: + version "3.3.10" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.10.tgz#7bc882237698ef787d5cbba109e3b0168ba6e7b1" + integrity sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg== + +nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -2350,34 +2717,39 @@ next-themes@^0.3.0: resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== -next@14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/next/-/next-14.1.4.tgz#203310f7310578563fd5c961f0db4729ce7a502d" - integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ== +next@^15.2.2: + version "15.2.2" + resolved "https://registry.yarnpkg.com/next/-/next-15.2.2.tgz#e3941a0e0e76cfe1880b57452807489e0546e3a2" + integrity sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA== dependencies: - "@next/env" "14.1.4" - "@swc/helpers" "0.5.2" + "@next/env" "15.2.2" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.15" busboy "1.6.0" caniuse-lite "^1.0.30001579" - graceful-fs "^4.2.11" postcss "8.4.31" - styled-jsx "5.1.1" + styled-jsx "5.1.6" optionalDependencies: - "@next/swc-darwin-arm64" "14.1.4" - "@next/swc-darwin-x64" "14.1.4" - "@next/swc-linux-arm64-gnu" "14.1.4" - "@next/swc-linux-arm64-musl" "14.1.4" - "@next/swc-linux-x64-gnu" "14.1.4" - "@next/swc-linux-x64-musl" "14.1.4" - "@next/swc-win32-arm64-msvc" "14.1.4" - "@next/swc-win32-ia32-msvc" "14.1.4" - "@next/swc-win32-x64-msvc" "14.1.4" + "@next/swc-darwin-arm64" "15.2.2" + "@next/swc-darwin-x64" "15.2.2" + "@next/swc-linux-arm64-gnu" "15.2.2" + "@next/swc-linux-arm64-musl" "15.2.2" + "@next/swc-linux-x64-gnu" "15.2.2" + "@next/swc-linux-x64-musl" "15.2.2" + "@next/swc-win32-arm64-msvc" "15.2.2" + "@next/swc-win32-x64-msvc" "15.2.2" + sharp "^0.33.5" node-domexception@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== +node-ensure@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" + integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== + node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -2488,6 +2860,13 @@ once@^1.3.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + openai@^4.26.0, openai@^4.32.1: version "4.33.0" resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" @@ -2568,6 +2947,14 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parseley@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" + integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== + dependencies: + leac "^0.6.0" + peberminta "^0.9.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2601,10 +2988,23 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pdf-parse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" + integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== + dependencies: + debug "^3.1.0" + node-ensure "^0.0.0" + +peberminta@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" + integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== + picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" @@ -2715,6 +3115,11 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -2766,6 +3171,15 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^3.4.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2863,6 +3277,11 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -2872,6 +3291,11 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -2879,6 +3303,13 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +selderee@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" + integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== + dependencies: + parseley "^0.12.0" + semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -2891,6 +3322,11 @@ semver@^7.5.4: dependencies: lru-cache "^6.0.0" +semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -2913,6 +3349,35 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +sharp@^0.33.5: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== + dependencies: + color "^4.2.3" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-darwin-x64" "0.33.5" + "@img/sharp-libvips-darwin-arm64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-arm64" "1.0.4" + "@img/sharp-libvips-linux-s390x" "1.0.4" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2940,6 +3405,13 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2950,11 +3422,21 @@ sonner@^1.4.41: resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.4.41.tgz#ff085ae4f4244713daf294959beaa3e90f842d2c" integrity sha512-uG511ggnnsw6gcn/X+YKkWPo5ep9il9wYi3QJxHsYe7yTZ4+cOd1wuodOUmOpFuXL+/RE3R04LczdNCDygTDgQ== -source-map-js@^1.0.2, source-map-js@^1.2.0: +source-map-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -3033,6 +3515,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -3064,10 +3553,10 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== dependencies: client-only "0.0.1" @@ -3141,6 +3630,11 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -3172,6 +3666,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-api-utils@^1.0.1: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" @@ -3305,7 +3804,7 @@ use-latest@^1.2.1: dependencies: use-isomorphic-layout-effect "^1.1.1" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -3315,6 +3814,16 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== +validate.io-array@^1.0.3, validate.io-array@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== + +validate.io-function@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== + web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" @@ -3395,6 +3904,32 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@^3.17.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" + integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.7.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.9.0" + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" From e29a08dc46c9ed3374c6dab7706df29329659d2d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:24:16 +0530 Subject: [PATCH 148/282] feat(ui): add necessary utils --- ui/lib/types/compute-dot.d.ts | 5 ++ ui/lib/utils/computeSimilarity.ts | 17 ++++++ ui/lib/utils/documents.ts | 97 +++++++++++++++++++++++++++++++ ui/lib/utils/formatHistory.ts | 9 +++ ui/lib/utils/logger.ts | 22 +++++++ 5 files changed, 150 insertions(+) create mode 100644 ui/lib/types/compute-dot.d.ts create mode 100644 ui/lib/utils/computeSimilarity.ts create mode 100644 ui/lib/utils/documents.ts create mode 100644 ui/lib/utils/formatHistory.ts create mode 100644 ui/lib/utils/logger.ts diff --git a/ui/lib/types/compute-dot.d.ts b/ui/lib/types/compute-dot.d.ts new file mode 100644 index 0000000..6bcd481 --- /dev/null +++ b/ui/lib/types/compute-dot.d.ts @@ -0,0 +1,5 @@ +declare function computeDot(vectorA: number[], vectorB: number[]): number; + +declare module "compute-dot" { + export default computeDot; +} diff --git a/ui/lib/utils/computeSimilarity.ts b/ui/lib/utils/computeSimilarity.ts new file mode 100644 index 0000000..a635577 --- /dev/null +++ b/ui/lib/utils/computeSimilarity.ts @@ -0,0 +1,17 @@ +import dot from 'compute-dot'; +import cosineSimilarity from 'compute-cosine-similarity'; +import { getSimilarityMeasure } from '../config'; + +const computeSimilarity = (x: number[], y: number[]): number => { + const similarityMeasure = getSimilarityMeasure(); + + if (similarityMeasure === 'cosine') { + return cosineSimilarity(x, y) as number; + } else if (similarityMeasure === 'dot') { + return dot(x, y); + } + + throw new Error('Invalid similarity measure'); +}; + +export default computeSimilarity; diff --git a/ui/lib/utils/documents.ts b/ui/lib/utils/documents.ts new file mode 100644 index 0000000..07b8bef --- /dev/null +++ b/ui/lib/utils/documents.ts @@ -0,0 +1,97 @@ +import axios from 'axios'; +import { htmlToText } from 'html-to-text'; +import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; +import { Document } from '@langchain/core/documents'; +import pdfParse from 'pdf-parse'; +import logger from './logger'; + +export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { + const splitter = new RecursiveCharacterTextSplitter(); + + let docs: Document[] = []; + + await Promise.all( + links.map(async (link) => { + link = + link.startsWith('http://') || link.startsWith('https://') + ? link + : `https://${link}`; + + try { + const res = await axios.get(link, { + responseType: 'arraybuffer', + }); + + const isPdf = res.headers['content-type'] === 'application/pdf'; + + if (isPdf) { + const pdfText = await pdfParse(res.data); + const parsedText = pdfText.text + .replace(/(\r\n|\n|\r)/gm, ' ') + .replace(/\s+/g, ' ') + .trim(); + + const splittedText = await splitter.splitText(parsedText); + const title = 'PDF Document'; + + const linkDocs = splittedText.map((text) => { + return new Document({ + pageContent: text, + metadata: { + title: title, + url: link, + }, + }); + }); + + docs.push(...linkDocs); + return; + } + + const parsedText = htmlToText(res.data.toString('utf8'), { + selectors: [ + { + selector: 'a', + options: { + ignoreHref: true, + }, + }, + ], + }) + .replace(/(\r\n|\n|\r)/gm, ' ') + .replace(/\s+/g, ' ') + .trim(); + + const splittedText = await splitter.splitText(parsedText); + const title = res.data + .toString('utf8') + .match(/<title>(.*?)<\/title>/)?.[1]; + + const linkDocs = splittedText.map((text) => { + return new Document({ + pageContent: text, + metadata: { + title: title || link, + url: link, + }, + }); + }); + + docs.push(...linkDocs); + } catch (err) { + console.error("An error occurred while getting documents from links: ", err); + docs.push( + new Document({ + pageContent: `Failed to retrieve content from the link: ${err}`, + metadata: { + title: 'Failed to retrieve content', + url: link, + }, + }), + ); + } + }), + ); + + return docs; +}; diff --git a/ui/lib/utils/formatHistory.ts b/ui/lib/utils/formatHistory.ts new file mode 100644 index 0000000..6d0d309 --- /dev/null +++ b/ui/lib/utils/formatHistory.ts @@ -0,0 +1,9 @@ +import { BaseMessage } from '@langchain/core/messages'; + +const formatChatHistoryAsString = (history: BaseMessage[]) => { + return history + .map((message) => `${message._getType()}: ${message.content}`) + .join('\n'); +}; + +export default formatChatHistoryAsString; diff --git a/ui/lib/utils/logger.ts b/ui/lib/utils/logger.ts new file mode 100644 index 0000000..1c81eb9 --- /dev/null +++ b/ui/lib/utils/logger.ts @@ -0,0 +1,22 @@ +import winston from 'winston'; + +const logger = winston.createLogger({ + level: 'info', + transports: [ + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + winston.format.simple(), + ), + }), + new winston.transports.File({ + filename: 'app.log', + format: winston.format.combine( + winston.format.timestamp(), + winston.format.json(), + ), + }), + ], +}); + +export default logger; From e9e34ddff973268de14ab847e57825afc107be71 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:24:33 +0530 Subject: [PATCH 149/282] feat(ui): add meta search agent --- ui/lib/outputParsers/lineOutputParser.ts | 48 ++ ui/lib/outputParsers/listLineOutputParser.ts | 50 ++ ui/lib/search/metaSearchAgent.ts | 495 +++++++++++++++++++ 3 files changed, 593 insertions(+) create mode 100644 ui/lib/outputParsers/lineOutputParser.ts create mode 100644 ui/lib/outputParsers/listLineOutputParser.ts create mode 100644 ui/lib/search/metaSearchAgent.ts diff --git a/ui/lib/outputParsers/lineOutputParser.ts b/ui/lib/outputParsers/lineOutputParser.ts new file mode 100644 index 0000000..fcd69ef --- /dev/null +++ b/ui/lib/outputParsers/lineOutputParser.ts @@ -0,0 +1,48 @@ +import { BaseOutputParser } from '@langchain/core/output_parsers'; + +interface LineOutputParserArgs { + key?: string; +} + +class LineOutputParser extends BaseOutputParser<string> { + private key = 'questions'; + + constructor(args?: LineOutputParserArgs) { + super(); + this.key = args?.key ?? this.key; + } + + static lc_name() { + return 'LineOutputParser'; + } + + lc_namespace = ['langchain', 'output_parsers', 'line_output_parser']; + + async parse(text: string): Promise<string> { + text = text.trim() || ''; + + const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; + const startKeyIndex = text.indexOf(`<${this.key}>`); + const endKeyIndex = text.indexOf(`</${this.key}>`); + + if (startKeyIndex === -1 || endKeyIndex === -1) { + return ''; + } + + const questionsStartIndex = + startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; + const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; + const line = text + .slice(questionsStartIndex, questionsEndIndex) + .trim() + .replace(regex, ''); + + return line; + } + + getFormatInstructions(): string { + throw new Error('Not implemented.'); + } +} + +export default LineOutputParser; diff --git a/ui/lib/outputParsers/listLineOutputParser.ts b/ui/lib/outputParsers/listLineOutputParser.ts new file mode 100644 index 0000000..6409db9 --- /dev/null +++ b/ui/lib/outputParsers/listLineOutputParser.ts @@ -0,0 +1,50 @@ +import { BaseOutputParser } from '@langchain/core/output_parsers'; + +interface LineListOutputParserArgs { + key?: string; +} + +class LineListOutputParser extends BaseOutputParser<string[]> { + private key = 'questions'; + + constructor(args?: LineListOutputParserArgs) { + super(); + this.key = args?.key ?? this.key; + } + + static lc_name() { + return 'LineListOutputParser'; + } + + lc_namespace = ['langchain', 'output_parsers', 'line_list_output_parser']; + + async parse(text: string): Promise<string[]> { + text = text.trim() || ''; + + const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; + const startKeyIndex = text.indexOf(`<${this.key}>`); + const endKeyIndex = text.indexOf(`</${this.key}>`); + + if (startKeyIndex === -1 || endKeyIndex === -1) { + return []; + } + + const questionsStartIndex = + startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; + const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; + const lines = text + .slice(questionsStartIndex, questionsEndIndex) + .trim() + .split('\n') + .filter((line) => line.trim() !== '') + .map((line) => line.replace(regex, '')); + + return lines; + } + + getFormatInstructions(): string { + throw new Error('Not implemented.'); + } +} + +export default LineListOutputParser; diff --git a/ui/lib/search/metaSearchAgent.ts b/ui/lib/search/metaSearchAgent.ts new file mode 100644 index 0000000..a878ab8 --- /dev/null +++ b/ui/lib/search/metaSearchAgent.ts @@ -0,0 +1,495 @@ +import { ChatOpenAI } from '@langchain/openai'; +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import type { Embeddings } from '@langchain/core/embeddings'; +import { + ChatPromptTemplate, + MessagesPlaceholder, + PromptTemplate, +} from '@langchain/core/prompts'; +import { + RunnableLambda, + RunnableMap, + RunnableSequence, +} from '@langchain/core/runnables'; +import { BaseMessage } from '@langchain/core/messages'; +import { StringOutputParser } from '@langchain/core/output_parsers'; +import LineListOutputParser from '../outputParsers/listLineOutputParser'; +import LineOutputParser from '../outputParsers/lineOutputParser'; +import { getDocumentsFromLinks } from '../utils/documents'; +import { Document } from 'langchain/document'; +import { searchSearxng } from '../searxng'; +import path from 'node:path'; +import fs from 'node:fs'; +import computeSimilarity from '../utils/computeSimilarity'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import eventEmitter from 'events'; +import { StreamEvent } from '@langchain/core/tracers/log_stream'; + +export interface MetaSearchAgentType { + searchAndAnswer: ( + message: string, + history: BaseMessage[], + llm: BaseChatModel, + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], + ) => Promise<eventEmitter>; +} + +interface Config { + searchWeb: boolean; + rerank: boolean; + summarizer: boolean; + rerankThreshold: number; + queryGeneratorPrompt: string; + responsePrompt: string; + activeEngines: string[]; +} + +type BasicChainInput = { + chat_history: BaseMessage[]; + query: string; +}; + +class MetaSearchAgent implements MetaSearchAgentType { + private config: Config; + private strParser = new StringOutputParser(); + + constructor(config: Config) { + this.config = config; + } + + private async createSearchRetrieverChain(llm: BaseChatModel) { + (llm as unknown as ChatOpenAI).temperature = 0; + + return RunnableSequence.from([ + PromptTemplate.fromTemplate(this.config.queryGeneratorPrompt), + llm, + this.strParser, + RunnableLambda.from(async (input: string) => { + const linksOutputParser = new LineListOutputParser({ + key: 'links', + }); + + const questionOutputParser = new LineOutputParser({ + key: 'question', + }); + + const links = await linksOutputParser.parse(input); + let question = this.config.summarizer + ? await questionOutputParser.parse(input) + : input; + + if (question === 'not_needed') { + return { query: '', docs: [] }; + } + + if (links.length > 0) { + if (question.length === 0) { + question = 'summarize'; + } + + let docs: Document[] = []; + + const linkDocs = await getDocumentsFromLinks({ links }); + + const docGroups: Document[] = []; + + linkDocs.map((doc) => { + const URLDocExists = docGroups.find( + (d) => + d.metadata.url === doc.metadata.url && + d.metadata.totalDocs < 10, + ); + + if (!URLDocExists) { + docGroups.push({ + ...doc, + metadata: { + ...doc.metadata, + totalDocs: 1, + }, + }); + } + + const docIndex = docGroups.findIndex( + (d) => + d.metadata.url === doc.metadata.url && + d.metadata.totalDocs < 10, + ); + + if (docIndex !== -1) { + docGroups[docIndex].pageContent = + docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; + docGroups[docIndex].metadata.totalDocs += 1; + } + }); + + await Promise.all( + docGroups.map(async (doc) => { + const res = await llm.invoke(` + You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the + text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query. + If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary. + + - **Journalistic tone**: The summary should sound professional and journalistic, not too casual or vague. + - **Thorough and detailed**: Ensure that every key point from the text is captured and that the summary directly answers the query. + - **Not too lengthy, but detailed**: The summary should be informative but not excessively long. Focus on providing detailed information in a concise format. + + The text will be shared inside the \`text\` XML tag, and the query inside the \`query\` XML tag. + + <example> + 1. \`<text> + Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers. + It was first released in 2013 and is developed by Docker, Inc. Docker is designed to make it easier to create, deploy, and run applications + by using containers. + </text> + + <query> + What is Docker and how does it work? + </query> + + Response: + Docker is a revolutionary platform-as-a-service product developed by Docker, Inc., that uses container technology to make application + deployment more efficient. It allows developers to package their software with all necessary dependencies, making it easier to run in + any environment. Released in 2013, Docker has transformed the way applications are built, deployed, and managed. + \` + 2. \`<text> + The theory of relativity, or simply relativity, encompasses two interrelated theories of Albert Einstein: special relativity and general + relativity. However, the word "relativity" is sometimes used in reference to Galilean invariance. The term "theory of relativity" was based + on the expression "relative theory" used by Max Planck in 1906. The theory of relativity usually encompasses two interrelated theories by + Albert Einstein: special relativity and general relativity. Special relativity applies to all physical phenomena in the absence of gravity. + General relativity explains the law of gravitation and its relation to other forces of nature. It applies to the cosmological and astrophysical + realm, including astronomy. + </text> + + <query> + summarize + </query> + + Response: + The theory of relativity, developed by Albert Einstein, encompasses two main theories: special relativity and general relativity. Special + relativity applies to all physical phenomena in the absence of gravity, while general relativity explains the law of gravitation and its + relation to other forces of nature. The theory of relativity is based on the concept of "relative theory," as introduced by Max Planck in + 1906. It is a fundamental theory in physics that has revolutionized our understanding of the universe. + \` + </example> + + Everything below is the actual data you will be working with. Good luck! + + <query> + ${question} + </query> + + <text> + ${doc.pageContent} + </text> + + Make sure to answer the query in the summary. + `); + + const document = new Document({ + pageContent: res.content as string, + metadata: { + title: doc.metadata.title, + url: doc.metadata.url, + }, + }); + + docs.push(document); + }), + ); + + return { query: question, docs: docs }; + } else { + const res = await searchSearxng(question, { + language: 'en', + engines: this.config.activeEngines, + }); + + const documents = res.results.map( + (result) => + new Document({ + pageContent: + result.content || + (this.config.activeEngines.includes('youtube') + ? result.title + : '') /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */, + metadata: { + title: result.title, + url: result.url, + ...(result.img_src && { img_src: result.img_src }), + }, + }), + ); + + return { query: question, docs: documents }; + } + }), + ]); + } + + private async createAnsweringChain( + llm: BaseChatModel, + fileIds: string[], + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + ) { + return RunnableSequence.from([ + RunnableMap.from({ + query: (input: BasicChainInput) => input.query, + chat_history: (input: BasicChainInput) => input.chat_history, + date: () => new Date().toISOString(), + context: RunnableLambda.from(async (input: BasicChainInput) => { + const processedHistory = formatChatHistoryAsString( + input.chat_history, + ); + + let docs: Document[] | null = null; + let query = input.query; + + if (this.config.searchWeb) { + const searchRetrieverChain = + await this.createSearchRetrieverChain(llm); + + const searchRetrieverResult = await searchRetrieverChain.invoke({ + chat_history: processedHistory, + query, + }); + + query = searchRetrieverResult.query; + docs = searchRetrieverResult.docs; + } + + const sortedDocs = await this.rerankDocs( + query, + docs ?? [], + fileIds, + embeddings, + optimizationMode, + ); + + return sortedDocs; + }) + .withConfig({ + runName: 'FinalSourceRetriever', + }) + .pipe(this.processDocs), + }), + ChatPromptTemplate.fromMessages([ + ['system', this.config.responsePrompt], + new MessagesPlaceholder('chat_history'), + ['user', '{query}'], + ]), + llm, + this.strParser, + ]).withConfig({ + runName: 'FinalResponseGenerator', + }); + } + + private async rerankDocs( + query: string, + docs: Document[], + fileIds: string[], + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + ) { + if (docs.length === 0 && fileIds.length === 0) { + return docs; + } + + const filesData = fileIds + .map((file) => { + const filePath = path.join(process.cwd(), 'uploads', file); + + const contentPath = filePath + '-extracted.json'; + const embeddingsPath = filePath + '-embeddings.json'; + + const content = JSON.parse(fs.readFileSync(contentPath, 'utf8')); + const embeddings = JSON.parse(fs.readFileSync(embeddingsPath, 'utf8')); + + const fileSimilaritySearchObject = content.contents.map( + (c: string, i: number) => { + return { + fileName: content.title, + content: c, + embeddings: embeddings.embeddings[i], + }; + }, + ); + + return fileSimilaritySearchObject; + }) + .flat(); + + if (query.toLocaleLowerCase() === 'summarize') { + return docs.slice(0, 15); + } + + const docsWithContent = docs.filter( + (doc) => doc.pageContent && doc.pageContent.length > 0, + ); + + if (optimizationMode === 'speed' || this.config.rerank === false) { + if (filesData.length > 0) { + const [queryEmbedding] = await Promise.all([ + embeddings.embedQuery(query), + ]); + + const fileDocs = filesData.map((fileData) => { + return new Document({ + pageContent: fileData.content, + metadata: { + title: fileData.fileName, + url: `File`, + }, + }); + }); + + const similarity = filesData.map((fileData, i) => { + const sim = computeSimilarity(queryEmbedding, fileData.embeddings); + + return { + index: i, + similarity: sim, + }; + }); + + let sortedDocs = similarity + .filter( + (sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3), + ) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => fileDocs[sim.index]); + + sortedDocs = + docsWithContent.length > 0 ? sortedDocs.slice(0, 8) : sortedDocs; + + return [ + ...sortedDocs, + ...docsWithContent.slice(0, 15 - sortedDocs.length), + ]; + } else { + return docsWithContent.slice(0, 15); + } + } else if (optimizationMode === 'balanced') { + const [docEmbeddings, queryEmbedding] = await Promise.all([ + embeddings.embedDocuments( + docsWithContent.map((doc) => doc.pageContent), + ), + embeddings.embedQuery(query), + ]); + + docsWithContent.push( + ...filesData.map((fileData) => { + return new Document({ + pageContent: fileData.content, + metadata: { + title: fileData.fileName, + url: `File`, + }, + }); + }), + ); + + docEmbeddings.push(...filesData.map((fileData) => fileData.embeddings)); + + const similarity = docEmbeddings.map((docEmbedding, i) => { + const sim = computeSimilarity(queryEmbedding, docEmbedding); + + return { + index: i, + similarity: sim, + }; + }); + + const sortedDocs = similarity + .filter((sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3)) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => docsWithContent[sim.index]); + + return sortedDocs; + } + + return [] + } + + private processDocs(docs: Document[]) { + return docs + .map( + (_, index) => + `${index + 1}. ${docs[index].metadata.title} ${docs[index].pageContent}`, + ) + .join('\n'); + } + + private async handleStream( + stream: AsyncGenerator<StreamEvent, any, any>, + emitter: eventEmitter, + ) { + for await (const event of stream) { + if ( + event.event === 'on_chain_end' && + event.name === 'FinalSourceRetriever' + ) { + ``; + emitter.emit( + 'data', + JSON.stringify({ type: 'sources', data: event.data.output }), + ); + } + if ( + event.event === 'on_chain_stream' && + event.name === 'FinalResponseGenerator' + ) { + emitter.emit( + 'data', + JSON.stringify({ type: 'response', data: event.data.chunk }), + ); + } + if ( + event.event === 'on_chain_end' && + event.name === 'FinalResponseGenerator' + ) { + emitter.emit('end'); + } + } + } + + async searchAndAnswer( + message: string, + history: BaseMessage[], + llm: BaseChatModel, + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], + ) { + const emitter = new eventEmitter(); + + const answeringChain = await this.createAnsweringChain( + llm, + fileIds, + embeddings, + optimizationMode, + ); + + const stream = answeringChain.streamEvents( + { + chat_history: history, + query: message, + }, + { + version: 'v1', + }, + ); + + this.handleStream(stream, emitter); + + return emitter; + } +} + +export default MetaSearchAgent; From 6c227cab6fd973135bc51ce9d0f4efc12e5d29d9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:24:51 +0530 Subject: [PATCH 150/282] feat(providers): move providers to UI --- ui/lib/providers/index.ts | 72 +++++++++++++++++++++++++++++++ ui/lib/providers/openai.ts | 88 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 ui/lib/providers/index.ts create mode 100644 ui/lib/providers/openai.ts diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts new file mode 100644 index 0000000..cbb1677 --- /dev/null +++ b/ui/lib/providers/index.ts @@ -0,0 +1,72 @@ +import { Embeddings } from '@langchain/core/embeddings'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; +import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName } from '../config'; +import { ChatOpenAI } from '@langchain/openai'; + +export interface ChatModelProvider { + displayName: string + model: BaseChatModel +} + +export interface EmbeddingModelProvider { + displayName: string + model: Embeddings +} + +const chatModelProviders: Record<string, () => Promise<Record<string, ChatModelProvider>>> = { + openai: loadOpenAIChatModels +} + +const embeddingModelProviders: Record<string, () => Promise<Record<string, EmbeddingModelProvider>>> = { + openai: loadOpenAIEmbeddingModels +} + +export const getAvailableChatModelProviders = async () => { + const models: Record<string, Record<string, ChatModelProvider>> = {}; + + for (const provider in chatModelProviders) { + const providerModels = await chatModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; + } + } + + const customOpenAiApiKey = getCustomOpenaiApiKey(); + const customOpenAiApiUrl = getCustomOpenaiApiUrl(); + const customOpenAiModelName = getCustomOpenaiModelName(); + + models['custom_openai'] = { + ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName + ? { + [customOpenAiModelName]: { + displayName: customOpenAiModelName, + model: new ChatOpenAI({ + openAIApiKey: customOpenAiApiKey, + modelName: customOpenAiModelName, + temperature: 0.7, + configuration: { + baseURL: customOpenAiApiUrl, + }, + }), + }, + } + : {}), + }; + + return models; +}; + +export const getAvailableEmbeddingModelProviders = async () => { + const models: Record<string, Record<string, EmbeddingModelProvider>> = {}; + + for (const provider in embeddingModelProviders) { + const providerModels = await embeddingModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; + } + } + + return models; + }; + \ No newline at end of file diff --git a/ui/lib/providers/openai.ts b/ui/lib/providers/openai.ts new file mode 100644 index 0000000..9726957 --- /dev/null +++ b/ui/lib/providers/openai.ts @@ -0,0 +1,88 @@ +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai' +import { getOpenaiApiKey } from '../config' +import { ChatModelProvider, EmbeddingModelProvider } from '.' + +const openaiChatModels: Record<string, string>[] = [ + { + displayName: 'GPT-3.5 Turbo', + key: 'gpt-3.5-turbo', + }, + { + displayName: 'GPT-4', + key: 'gpt-4', + }, + { + displayName: 'GPT-4 turbo', + key: 'gpt-4-turbo', + }, + { + displayName: 'GPT-4 omni', + key: 'gpt-4o', + }, + { + displayName: 'GPT-4 omni mini', + key: 'gpt-4o-mini', + } +] + +const openaiEmbeddingModels: Record<string, string>[] = [ + { + displayName: 'Text Embedding 3 Small', + key: 'text-embedding-3-small', + }, + { + displayName: 'Text Embedding 3 Large', + key: 'text-embedding-3-large', + } +] + +export const loadOpenAIChatModels = async () => { + const openaiApiKey = getOpenaiApiKey() + + if (!openaiApiKey) return {} + + try { + const chatModels: Record<string, ChatModelProvider> = {} + + openaiChatModels.forEach(model => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: openaiApiKey, + modelName: model.key, + temperature: 0.7 + }) + } + }) + + return chatModels + } catch(err) { + console.error(`Error loading OpenAI models: ${err}`) + return {} + } +} + +export const loadOpenAIEmbeddingModels = async () => { + const openaiApiKey = getOpenaiApiKey() + + if (!openaiApiKey) return {} + + try { + const embeddingModels: Record<string, EmbeddingModelProvider> = {} + + openaiEmbeddingModels.forEach(model => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: openaiApiKey, + modelName: model.key, + }) + } + }) + + return embeddingModels + } catch(err) { + console.error(`Error loading OpenAI embeddings models: ${err}`) + return {} + } +} \ No newline at end of file From 97f6196d9b16f4ba95d68e799c54ae96ee8e1524 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:25:09 +0530 Subject: [PATCH 151/282] feat(app): add GET config route --- ui/app/api/config/route.ts | 55 ++++++++++++++++++++++++++++++++++++++ ui/app/settings/page.tsx | 4 +-- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 ui/app/api/config/route.ts diff --git a/ui/app/api/config/route.ts b/ui/app/api/config/route.ts new file mode 100644 index 0000000..7bd188e --- /dev/null +++ b/ui/app/api/config/route.ts @@ -0,0 +1,55 @@ +import { getAnthropicApiKey, getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, getGeminiApiKey, getGroqApiKey, getOllamaApiEndpoint, getOpenaiApiKey } from "@/lib/config" +import { getAvailableChatModelProviders, getAvailableEmbeddingModelProviders } from "@/lib/providers" + +export const GET = async (req: Request) => { + try { + const config: Record<string, any> = {} + + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]) + + config['chatModelProviders'] = {} + config['embeddingModelProviders'] = {} + + for (const provider in chatModelProviders) { + config['chatModelProviders'][provider] = Object.keys( + chatModelProviders[provider], + ).map(model => { + return { + name: model, + displayName: chatModelProviders[provider][model].displayName, + } + }) + } + + for (const provider in embeddingModelProviders) { + config['embeddingModelProviders'][provider] = Object.keys( + embeddingModelProviders[provider], + ).map(model => { + return { + name: model, + displayName: embeddingModelProviders[provider][model].displayName, + } + }) + } + + config['openaiApiKey'] = getOpenaiApiKey() + config['ollamaApiUrl'] = getOllamaApiEndpoint() + config['anthropicApiKey'] = getAnthropicApiKey() + config['groqApiKey'] = getGroqApiKey() + config['geminiApiKey'] = getGeminiApiKey() + config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl() + config['customOpenaiApiKey'] = getCustomOpenaiApiKey() + config['customOpenaiModelName'] = getCustomOpenaiModelName() + + return Response.json({ ...config }, { status: 200 }) + } catch (err) { + console.error('An error ocurred while getting config:', err) + return Response.json( + { message: 'An error ocurred while getting config' }, + { status: 500 }, + ) + } +} diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx index 6aff1b0..3bd1f2d 100644 --- a/ui/app/settings/page.tsx +++ b/ui/app/settings/page.tsx @@ -116,7 +116,7 @@ const Page = () => { useEffect(() => { const fetchConfig = async () => { setIsLoading(true); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { + const res = await fetch(`/api/config`, { headers: { 'Content-Type': 'application/json', }, @@ -208,7 +208,7 @@ const Page = () => { key.toLowerCase().includes('api') || key.toLowerCase().includes('url') ) { - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { + const res = await fetch(`/api/config`, { headers: { 'Content-Type': 'application/json', }, From 4cb20542a5db99e1220a5b3bea9ff6439af8e9d1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:33:32 +0530 Subject: [PATCH 152/282] feat(config): update file path, add post endpoint --- ui/app/api/config/route.ts | 102 ++++++++++++++++++++++++++++--------- ui/app/settings/page.tsx | 2 +- ui/lib/config.ts | 6 +-- 3 files changed, 82 insertions(+), 28 deletions(-) diff --git a/ui/app/api/config/route.ts b/ui/app/api/config/route.ts index 7bd188e..46c71f5 100644 --- a/ui/app/api/config/route.ts +++ b/ui/app/api/config/route.ts @@ -1,55 +1,109 @@ -import { getAnthropicApiKey, getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, getGeminiApiKey, getGroqApiKey, getOllamaApiEndpoint, getOpenaiApiKey } from "@/lib/config" -import { getAvailableChatModelProviders, getAvailableEmbeddingModelProviders } from "@/lib/providers" +import { + getAnthropicApiKey, + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, + getGeminiApiKey, + getGroqApiKey, + getOllamaApiEndpoint, + getOpenaiApiKey, + updateConfig, +} from '@/lib/config'; +import { + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '@/lib/providers'; export const GET = async (req: Request) => { try { - const config: Record<string, any> = {} + const config: Record<string, any> = {}; const [chatModelProviders, embeddingModelProviders] = await Promise.all([ getAvailableChatModelProviders(), getAvailableEmbeddingModelProviders(), - ]) + ]); - config['chatModelProviders'] = {} - config['embeddingModelProviders'] = {} + config['chatModelProviders'] = {}; + config['embeddingModelProviders'] = {}; for (const provider in chatModelProviders) { config['chatModelProviders'][provider] = Object.keys( chatModelProviders[provider], - ).map(model => { + ).map((model) => { return { name: model, displayName: chatModelProviders[provider][model].displayName, - } - }) + }; + }); } for (const provider in embeddingModelProviders) { config['embeddingModelProviders'][provider] = Object.keys( embeddingModelProviders[provider], - ).map(model => { + ).map((model) => { return { name: model, displayName: embeddingModelProviders[provider][model].displayName, - } - }) + }; + }); } - config['openaiApiKey'] = getOpenaiApiKey() - config['ollamaApiUrl'] = getOllamaApiEndpoint() - config['anthropicApiKey'] = getAnthropicApiKey() - config['groqApiKey'] = getGroqApiKey() - config['geminiApiKey'] = getGeminiApiKey() - config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl() - config['customOpenaiApiKey'] = getCustomOpenaiApiKey() - config['customOpenaiModelName'] = getCustomOpenaiModelName() + config['openaiApiKey'] = getOpenaiApiKey(); + config['ollamaApiUrl'] = getOllamaApiEndpoint(); + config['anthropicApiKey'] = getAnthropicApiKey(); + config['groqApiKey'] = getGroqApiKey(); + config['geminiApiKey'] = getGeminiApiKey(); + config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); + config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); + config['customOpenaiModelName'] = getCustomOpenaiModelName(); - return Response.json({ ...config }, { status: 200 }) + return Response.json({ ...config }, { status: 200 }); } catch (err) { - console.error('An error ocurred while getting config:', err) + console.error('An error ocurred while getting config:', err); return Response.json( { message: 'An error ocurred while getting config' }, { status: 500 }, - ) + ); } -} +}; + +export const POST = async (req: Request) => { + try { + const config = await req.json(); + + const updatedConfig = { + MODELS: { + OPENAI: { + API_KEY: config.openaiApiKey, + }, + GROQ: { + API_KEY: config.groqApiKey, + }, + ANTHROPIC: { + API_KEY: config.anthropicApiKey, + }, + GEMINI: { + API_KEY: config.geminiApiKey, + }, + OLLAMA: { + API_URL: config.ollamaApiUrl, + }, + CUSTOM_OPENAI: { + API_URL: config.customOpenaiApiUrl, + API_KEY: config.customOpenaiApiKey, + MODEL_NAME: config.customOpenaiModelName, + }, + }, + }; + + updateConfig(updatedConfig); + + return Response.json({ message: 'Config updated' }, { status: 200 }); + } catch (err) { + console.error('An error ocurred while updating config:', err); + return Response.json( + { message: 'An error ocurred while updating config' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx index 3bd1f2d..bcb9b2b 100644 --- a/ui/app/settings/page.tsx +++ b/ui/app/settings/page.tsx @@ -188,7 +188,7 @@ const Page = () => { } as SettingsType; const response = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/config`, + `/api/config`, { method: 'POST', headers: { diff --git a/ui/lib/config.ts b/ui/lib/config.ts index 1e5148d..0a314cf 100644 --- a/ui/lib/config.ts +++ b/ui/lib/config.ts @@ -109,9 +109,9 @@ const mergeConfigs = (current: any, update: any): any => { export const updateConfig = (config: RecursivePartial<Config>) => { const currentConfig = loadConfig(); const mergedConfig = mergeConfigs(currentConfig, config); - + console.log(mergedConfig); fs.writeFileSync( - path.join(__dirname, `../${configFileName}`), + path.join(path.join(process.cwd(), `${configFileName}`)), toml.stringify(mergedConfig), ); -}; \ No newline at end of file +}; From 32f26bb4e83fe372f5e645e3b44901bc849777da Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:28:47 +0530 Subject: [PATCH 153/282] feat(app): add groq, gemini & anthropic provider --- ui/lib/providers/anthropic.ts | 63 +++++++++++++++++ ui/lib/providers/gemini.ts | 94 +++++++++++++++++++++++++ ui/lib/providers/groq.ts | 107 ++++++++++++++++++++++++++++ ui/lib/providers/index.ts | 129 +++++++++++++++++++--------------- ui/lib/providers/ollama.ts | 73 +++++++++++++++++++ 5 files changed, 411 insertions(+), 55 deletions(-) create mode 100644 ui/lib/providers/anthropic.ts create mode 100644 ui/lib/providers/gemini.ts create mode 100644 ui/lib/providers/groq.ts create mode 100644 ui/lib/providers/ollama.ts diff --git a/ui/lib/providers/anthropic.ts b/ui/lib/providers/anthropic.ts new file mode 100644 index 0000000..894fda5 --- /dev/null +++ b/ui/lib/providers/anthropic.ts @@ -0,0 +1,63 @@ +import { ChatOpenAI } from '@langchain/openai'; +import { ChatModel } from '.'; +import { getAnthropicApiKey } from '../config'; + +const anthropicChatModels: Record<string, string>[] = [ + { + displayName: 'Claude 3.7 Sonnet', + key: 'claude-3-7-sonnet-20250219', + }, + { + displayName: 'Claude 3.5 Haiku', + key: 'claude-3-5-haiku-20241022', + }, + { + displayName: 'Claude 3.5 Sonnet v2', + key: 'claude-3-5-sonnet-20241022', + }, + { + displayName: 'Claude 3.5 Sonnet', + key: 'claude-3-5-sonnet-20240620', + }, + { + displayName: 'Claude 3 Opus', + key: 'claude-3-opus-20240229', + }, + { + displayName: 'Claude 3 Sonnet', + key: 'claude-3-sonnet-20240229', + }, + { + displayName: 'Claude 3 Haiku', + key: 'claude-3-haiku-20240307', + }, +]; + +export const loadAnthropicChatModels = async () => { + const anthropicApiKey = getAnthropicApiKey(); + + if (!anthropicApiKey) return {}; + + try { + const chatModels: Record<string, ChatModel> = {}; + + anthropicChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: anthropicApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { + baseURL: 'https://api.anthropic.com/v1/', + }, + }), + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Anthropic models: ${err}`); + return {}; + } +}; diff --git a/ui/lib/providers/gemini.ts b/ui/lib/providers/gemini.ts new file mode 100644 index 0000000..28a31cf --- /dev/null +++ b/ui/lib/providers/gemini.ts @@ -0,0 +1,94 @@ +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { getGeminiApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; + +const geminiChatModels: Record<string, string>[] = [ + { + displayName: 'Gemini 2.0 Flash', + key: 'gemini-2.0-flash', + }, + { + displayName: 'Gemini 2.0 Flash-Lite', + key: 'gemini-2.0-flash-lite', + }, + { + displayName: 'Gemini 2.0 Pro Experimental', + key: 'gemini-2.0-pro-exp-02-05', + }, + { + displayName: 'Gemini 1.5 Flash', + key: 'gemini-1.5-flash', + }, + { + displayName: 'Gemini 1.5 Flash-8B', + key: 'gemini-1.5-flash-8b', + }, + { + displayName: 'Gemini 1.5 Pro', + key: 'gemini-1.5-pro', + }, +]; + +const geminiEmbeddingModels: Record<string, string>[] = [ + { + displayName: 'Gemini Embedding', + key: 'gemini-embedding-exp', + }, +]; + +export const loadGeminiChatModels = async () => { + const geminiApiKey = getGeminiApiKey(); + + if (!geminiApiKey) return {}; + + try { + const chatModels: Record<string, ChatModel> = {}; + + geminiChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: geminiApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { + baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + }), + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Gemini models: ${err}`); + return {}; + } +}; + +export const loadGeminiEmbeddingModels = async () => { + const geminiApiKey = getGeminiApiKey(); + + if (!geminiApiKey) return {}; + + try { + const embeddingModels: Record<string, EmbeddingModel> = {}; + + geminiEmbeddingModels.forEach((model) => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: geminiApiKey, + modelName: model.key, + configuration: { + baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + }), + }; + }); + + return embeddingModels; + } catch (err) { + console.error(`Error loading OpenAI embeddings models: ${err}`); + return {}; + } +}; diff --git a/ui/lib/providers/groq.ts b/ui/lib/providers/groq.ts new file mode 100644 index 0000000..05947fb --- /dev/null +++ b/ui/lib/providers/groq.ts @@ -0,0 +1,107 @@ +import { ChatOpenAI } from '@langchain/openai'; +import { getGroqApiKey } from '../config'; +import { ChatModel } from '.'; + +const groqChatModels: Record<string, string>[] = [ + { + displayName: 'Gemma2 9B IT', + key: 'gemma2-9b-it', + }, + { + displayName: 'Llama 3.3 70B Versatile', + key: 'llama-3.3-70b-versatile', + }, + { + displayName: 'Llama 3.1 8B Instant', + key: 'llama-3.1-8b-instant', + }, + { + displayName: 'Llama3 70B 8192', + key: 'llama3-70b-8192', + }, + { + displayName: 'Llama3 8B 8192', + key: 'llama3-8b-8192', + }, + { + displayName: 'Mixtral 8x7B 32768', + key: 'mixtral-8x7b-32768', + }, + { + displayName: 'Qwen QWQ 32B (Preview)', + key: 'qwen-qwq-32b', + }, + { + displayName: 'Mistral Saba 24B (Preview)', + key: 'mistral-saba-24b', + }, + { + displayName: 'Qwen 2.5 Coder 32B (Preview)', + key: 'qwen-2.5-coder-32b', + }, + { + displayName: 'Qwen 2.5 32B (Preview)', + key: 'qwen-2.5-32b', + }, + { + displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', + key: 'deepseek-r1-distill-qwen-32b', + }, + { + displayName: 'DeepSeek R1 Distill Llama 70B SpecDec (Preview)', + key: 'deepseek-r1-distill-llama-70b-specdec', + }, + { + displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', + key: 'deepseek-r1-distill-llama-70b', + }, + { + displayName: 'Llama 3.3 70B SpecDec (Preview)', + key: 'llama-3.3-70b-specdec', + }, + { + displayName: 'Llama 3.2 1B Preview (Preview)', + key: 'llama-3.2-1b-preview', + }, + { + displayName: 'Llama 3.2 3B Preview (Preview)', + key: 'llama-3.2-3b-preview', + }, + { + displayName: 'Llama 3.2 11B Vision Preview (Preview)', + key: 'llama-3.2-11b-vision-preview', + }, + { + displayName: 'Llama 3.2 90B Vision Preview (Preview)', + key: 'llama-3.2-90b-vision-preview', + }, +]; + +export const loadGroqChatModels = async () => { + const groqApiKey = getGroqApiKey(); + + if (!groqApiKey) return {}; + + try { + const chatModels: Record<string, ChatModel> = {}; + + groqChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: groqApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { + baseURL: 'https://api.groq.com/openai/v1', + }, + }), + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Groq models: ${err}`); + return {}; + } +}; diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts index cbb1677..caa8074 100644 --- a/ui/lib/providers/index.ts +++ b/ui/lib/providers/index.ts @@ -1,72 +1,91 @@ import { Embeddings } from '@langchain/core/embeddings'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; -import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName } from '../config'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '../config'; import { ChatOpenAI } from '@langchain/openai'; +import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; +import { loadGroqChatModels } from './groq'; +import { loadAnthropicChatModels } from './anthropic'; +import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; -export interface ChatModelProvider { - displayName: string - model: BaseChatModel +export interface ChatModel { + displayName: string; + model: BaseChatModel; } -export interface EmbeddingModelProvider { - displayName: string - model: Embeddings +export interface EmbeddingModel { + displayName: string; + model: Embeddings; } -const chatModelProviders: Record<string, () => Promise<Record<string, ChatModelProvider>>> = { - openai: loadOpenAIChatModels -} +const chatModelProviders: Record< + string, + () => Promise<Record<string, ChatModel>> +> = { + openai: loadOpenAIChatModels, + ollama: loadOllamaChatModels, + groq: loadGroqChatModels, + anthropic: loadAnthropicChatModels, + gemini: loadGeminiChatModels +}; -const embeddingModelProviders: Record<string, () => Promise<Record<string, EmbeddingModelProvider>>> = { - openai: loadOpenAIEmbeddingModels -} +const embeddingModelProviders: Record< + string, + () => Promise<Record<string, EmbeddingModel>> +> = { + openai: loadOpenAIEmbeddingModels, + ollama: loadOllamaEmbeddingModels, + gemini: loadGeminiEmbeddingModels +}; export const getAvailableChatModelProviders = async () => { - const models: Record<string, Record<string, ChatModelProvider>> = {}; - - for (const provider in chatModelProviders) { - const providerModels = await chatModelProviders[provider](); - if (Object.keys(providerModels).length > 0) { - models[provider] = providerModels; - } + const models: Record<string, Record<string, ChatModel>> = {}; + + for (const provider in chatModelProviders) { + const providerModels = await chatModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; } - - const customOpenAiApiKey = getCustomOpenaiApiKey(); - const customOpenAiApiUrl = getCustomOpenaiApiUrl(); - const customOpenAiModelName = getCustomOpenaiModelName(); - - models['custom_openai'] = { - ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName - ? { - [customOpenAiModelName]: { - displayName: customOpenAiModelName, - model: new ChatOpenAI({ - openAIApiKey: customOpenAiApiKey, - modelName: customOpenAiModelName, - temperature: 0.7, - configuration: { - baseURL: customOpenAiApiUrl, - }, - }), - }, - } - : {}), - }; - - return models; + } + + const customOpenAiApiKey = getCustomOpenaiApiKey(); + const customOpenAiApiUrl = getCustomOpenaiApiUrl(); + const customOpenAiModelName = getCustomOpenaiModelName(); + + models['custom_openai'] = { + ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName + ? { + [customOpenAiModelName]: { + displayName: customOpenAiModelName, + model: new ChatOpenAI({ + openAIApiKey: customOpenAiApiKey, + modelName: customOpenAiModelName, + temperature: 0.7, + configuration: { + baseURL: customOpenAiApiUrl, + }, + }), + }, + } + : {}), + }; + + return models; }; export const getAvailableEmbeddingModelProviders = async () => { - const models: Record<string, Record<string, EmbeddingModelProvider>> = {}; - - for (const provider in embeddingModelProviders) { - const providerModels = await embeddingModelProviders[provider](); - if (Object.keys(providerModels).length > 0) { - models[provider] = providerModels; - } + const models: Record<string, Record<string, EmbeddingModel>> = {}; + + for (const provider in embeddingModelProviders) { + const providerModels = await embeddingModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; } - - return models; - }; - \ No newline at end of file + } + + return models; +}; diff --git a/ui/lib/providers/ollama.ts b/ui/lib/providers/ollama.ts new file mode 100644 index 0000000..92e98e4 --- /dev/null +++ b/ui/lib/providers/ollama.ts @@ -0,0 +1,73 @@ +import axios from 'axios'; +import { getKeepAlive, getOllamaApiEndpoint } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { ChatOllama } from '@langchain/community/chat_models/ollama'; +import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; + +export const loadOllamaChatModels = async () => { + const ollamaApiEndpoint = getOllamaApiEndpoint(); + + if (!ollamaApiEndpoint) return {}; + + try { + const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { + headers: { + 'Content-Type': 'application/json', + }, + }); + + const { models } = res.data; + + const chatModels: Record<string, ChatModel> = {}; + + models.forEach((model: any) => { + chatModels[model.model] = { + displayName: model.name, + model: new ChatOllama({ + baseUrl: ollamaApiEndpoint, + model: model.model, + temperature: 0.7, + keepAlive: getKeepAlive(), + }), + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Ollama models: ${err}`); + return {}; + } +}; + +export const loadOllamaEmbeddingModels = async () => { + const ollamaApiEndpoint = getOllamaApiEndpoint(); + + if (!ollamaApiEndpoint) return {}; + + try { + const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { + headers: { + 'Content-Type': 'application/json', + }, + }); + + const { models } = res.data; + + const embeddingModels: Record<string, EmbeddingModel> = {}; + + models.forEach((model: any) => { + embeddingModels[model.model] = { + displayName: model.name, + model: new OllamaEmbeddings({ + baseUrl: ollamaApiEndpoint, + model: model.model, + }), + }; + }); + + return embeddingModels; + } catch (err) { + console.error(`Error loading Ollama embeddings models: ${err}`); + return {}; + } +}; From ee6e197ec034323d5ef34382c26ab919ecd4942e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:29:04 +0530 Subject: [PATCH 154/282] feat(app): lint & beautify --- ui/app/settings/page.tsx | 15 ++--- ui/lib/providers/openai.ts | 106 +++++++++++++++---------------- ui/lib/search/metaSearchAgent.ts | 2 +- ui/lib/types/compute-dot.d.ts | 2 +- ui/lib/utils/documents.ts | 5 +- ui/next.config.mjs | 2 +- 6 files changed, 66 insertions(+), 66 deletions(-) diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx index bcb9b2b..efe54d5 100644 --- a/ui/app/settings/page.tsx +++ b/ui/app/settings/page.tsx @@ -187,16 +187,13 @@ const Page = () => { [key]: value, } as SettingsType; - const response = await fetch( - `/api/config`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(updatedConfig), + const response = await fetch(`/api/config`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify(updatedConfig), + }); if (!response.ok) { throw new Error('Failed to update config'); diff --git a/ui/lib/providers/openai.ts b/ui/lib/providers/openai.ts index 9726957..c6b938d 100644 --- a/ui/lib/providers/openai.ts +++ b/ui/lib/providers/openai.ts @@ -1,6 +1,6 @@ -import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai' -import { getOpenaiApiKey } from '../config' -import { ChatModelProvider, EmbeddingModelProvider } from '.' +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { getOpenaiApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; const openaiChatModels: Record<string, string>[] = [ { @@ -22,67 +22,67 @@ const openaiChatModels: Record<string, string>[] = [ { displayName: 'GPT-4 omni mini', key: 'gpt-4o-mini', - } -] + }, +]; const openaiEmbeddingModels: Record<string, string>[] = [ - { - displayName: 'Text Embedding 3 Small', - key: 'text-embedding-3-small', - }, - { - displayName: 'Text Embedding 3 Large', - key: 'text-embedding-3-large', - } -] + { + displayName: 'Text Embedding 3 Small', + key: 'text-embedding-3-small', + }, + { + displayName: 'Text Embedding 3 Large', + key: 'text-embedding-3-large', + }, +]; export const loadOpenAIChatModels = async () => { - const openaiApiKey = getOpenaiApiKey() + const openaiApiKey = getOpenaiApiKey(); - if (!openaiApiKey) return {} + if (!openaiApiKey) return {}; - try { - const chatModels: Record<string, ChatModelProvider> = {} + try { + const chatModels: Record<string, ChatModel> = {}; - openaiChatModels.forEach(model => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: openaiApiKey, - modelName: model.key, - temperature: 0.7 - }) - } - }) + openaiChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: openaiApiKey, + modelName: model.key, + temperature: 0.7, + }), + }; + }); - return chatModels - } catch(err) { - console.error(`Error loading OpenAI models: ${err}`) - return {} - } -} + return chatModels; + } catch (err) { + console.error(`Error loading OpenAI models: ${err}`); + return {}; + } +}; export const loadOpenAIEmbeddingModels = async () => { - const openaiApiKey = getOpenaiApiKey() + const openaiApiKey = getOpenaiApiKey(); - if (!openaiApiKey) return {} + if (!openaiApiKey) return {}; - try { - const embeddingModels: Record<string, EmbeddingModelProvider> = {} + try { + const embeddingModels: Record<string, EmbeddingModel> = {}; - openaiEmbeddingModels.forEach(model => { - embeddingModels[model.key] = { - displayName: model.displayName, - model: new OpenAIEmbeddings({ - openAIApiKey: openaiApiKey, - modelName: model.key, - }) - } - }) + openaiEmbeddingModels.forEach((model) => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: openaiApiKey, + modelName: model.key, + }), + }; + }); - return embeddingModels - } catch(err) { - console.error(`Error loading OpenAI embeddings models: ${err}`) - return {} - } -} \ No newline at end of file + return embeddingModels; + } catch (err) { + console.error(`Error loading OpenAI embeddings models: ${err}`); + return {}; + } +}; diff --git a/ui/lib/search/metaSearchAgent.ts b/ui/lib/search/metaSearchAgent.ts index a878ab8..38ea2a0 100644 --- a/ui/lib/search/metaSearchAgent.ts +++ b/ui/lib/search/metaSearchAgent.ts @@ -414,7 +414,7 @@ class MetaSearchAgent implements MetaSearchAgentType { return sortedDocs; } - return [] + return []; } private processDocs(docs: Document[]) { diff --git a/ui/lib/types/compute-dot.d.ts b/ui/lib/types/compute-dot.d.ts index 6bcd481..b671c64 100644 --- a/ui/lib/types/compute-dot.d.ts +++ b/ui/lib/types/compute-dot.d.ts @@ -1,5 +1,5 @@ declare function computeDot(vectorA: number[], vectorB: number[]): number; -declare module "compute-dot" { +declare module 'compute-dot' { export default computeDot; } diff --git a/ui/lib/utils/documents.ts b/ui/lib/utils/documents.ts index 07b8bef..900d6b0 100644 --- a/ui/lib/utils/documents.ts +++ b/ui/lib/utils/documents.ts @@ -79,7 +79,10 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { docs.push(...linkDocs); } catch (err) { - console.error("An error occurred while getting documents from links: ", err); + console.error( + 'An error occurred while getting documents from links: ', + err, + ); docs.push( new Document({ pageContent: `Failed to retrieve content from the link: ${err}`, diff --git a/ui/next.config.mjs b/ui/next.config.mjs index a5db257..74156d1 100644 --- a/ui/next.config.mjs +++ b/ui/next.config.mjs @@ -7,7 +7,7 @@ const nextConfig = { }, ], }, - serverExternalPackages: ['pdf-parse'] + serverExternalPackages: ['pdf-parse'], }; export default nextConfig; From 3bf2337697985c18a674571f30947d41f9bd4e57 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:37:01 +0530 Subject: [PATCH 155/282] feat(app): add db & schema --- ui/drizzle.config.ts | 10 + ui/lib/db/index.ts | 11 + ui/lib/db/schema.ts | 28 ++ ui/package.json | 9 +- ui/tsconfig.json | 21 +- ui/yarn.lock | 620 +++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 664 insertions(+), 35 deletions(-) create mode 100644 ui/drizzle.config.ts create mode 100644 ui/lib/db/index.ts create mode 100644 ui/lib/db/schema.ts diff --git a/ui/drizzle.config.ts b/ui/drizzle.config.ts new file mode 100644 index 0000000..76b84a9 --- /dev/null +++ b/ui/drizzle.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'drizzle-kit'; + +export default defineConfig({ + dialect: 'sqlite', + schema: './lib/db/schema.ts', + out: './drizzle', + dbCredentials: { + url: './data/db.sqlite', + }, +}); diff --git a/ui/lib/db/index.ts b/ui/lib/db/index.ts new file mode 100644 index 0000000..9b761d4 --- /dev/null +++ b/ui/lib/db/index.ts @@ -0,0 +1,11 @@ +import { drizzle } from 'drizzle-orm/better-sqlite3'; +import Database from 'better-sqlite3'; +import * as schema from './schema'; +import path from 'path'; + +const sqlite = new Database(path.join(process.cwd(), 'data/db.sqlite')); +const db = drizzle(sqlite, { + schema: schema, +}); + +export default db; diff --git a/ui/lib/db/schema.ts b/ui/lib/db/schema.ts new file mode 100644 index 0000000..cee9660 --- /dev/null +++ b/ui/lib/db/schema.ts @@ -0,0 +1,28 @@ +import { sql } from 'drizzle-orm'; +import { text, integer, sqliteTable } from 'drizzle-orm/sqlite-core'; + +export const messages = sqliteTable('messages', { + id: integer('id').primaryKey(), + content: text('content').notNull(), + chatId: text('chatId').notNull(), + messageId: text('messageId').notNull(), + role: text('type', { enum: ['assistant', 'user'] }), + metadata: text('metadata', { + mode: 'json', + }), +}); + +interface File { + name: string; + fileId: string; +} + +export const chats = sqliteTable('chats', { + id: text('id').primaryKey(), + title: text('title').notNull(), + createdAt: text('createdAt').notNull(), + focusMode: text('focusMode').notNull(), + files: text('files', { mode: 'json' }) + .$type<File[]>() + .default(sql`'[]'`), +}); diff --git a/ui/package.json b/ui/package.json index c9a7a94..9be9447 100644 --- a/ui/package.json +++ b/ui/package.json @@ -8,18 +8,21 @@ "build": "next build", "start": "next start", "lint": "next lint", - "format:write": "prettier . --write" + "format:write": "prettier . --write", + "db:push": "drizzle-kit push sqlite" }, "dependencies": { "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", - "@icons-pack/react-simple-icons": "^9.4.0", + "@icons-pack/react-simple-icons": "^12.3.0", "@langchain/openai": "^0.0.25", "@tailwindcss/typography": "^0.5.12", "axios": "^1.8.3", + "better-sqlite3": "^11.9.1", "clsx": "^2.1.0", "compute-cosine-similarity": "^1.1.0", "compute-dot": "^1.1.0", + "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", "langchain": "^0.1.30", "lucide-react": "^0.363.0", @@ -38,12 +41,14 @@ "zod": "^3.22.4" }, "devDependencies": { + "@types/better-sqlite3": "^7.6.12", "@types/html-to-text": "^9.0.4", "@types/node": "^20", "@types/pdf-parse": "^1.1.4", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.0.1", + "drizzle-kit": "^0.30.5", "eslint": "^8", "eslint-config-next": "14.1.4", "postcss": "^8", diff --git a/ui/tsconfig.json b/ui/tsconfig.json index d81d4ee..64c2104 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -1,10 +1,6 @@ { "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -22,19 +18,10 @@ } ], "paths": { - "@/*": [ - "./*" - ] + "@/*": ["./*"] }, "target": "ES2017" }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/ui/yarn.lock b/ui/yarn.lock index 427693e..259436c 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -48,6 +48,11 @@ enabled "2.0.x" kuler "^2.0.0" +"@drizzle-team/brocli@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@drizzle-team/brocli/-/brocli-0.10.2.tgz#9757c006a43daaa6f45512e6cf5fabed36fb9da7" + integrity sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w== + "@emnapi/runtime@^1.2.0": version "1.3.1" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" @@ -55,6 +60,247 @@ dependencies: tslib "^2.4.0" +"@esbuild-kit/core-utils@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" + integrity sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ== + dependencies: + esbuild "~0.18.20" + source-map-support "^0.5.21" + +"@esbuild-kit/esm-loader@^2.5.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" + integrity sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA== + dependencies: + "@esbuild-kit/core-utils" "^3.3.2" + get-tsconfig "^4.7.0" + +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -157,10 +403,10 @@ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== -"@icons-pack/react-simple-icons@^9.4.0": - version "9.4.0" - resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-9.4.0.tgz#37871d830f9ec9cfa1d1aab186036df2ab075f26" - integrity sha512-fZtC4Zv53hE+IQE2dJlFt3EB6UOifwTrUNMuEu4hSXemtqMahd05Dpvj2K0j2ewVc+j/ibavud3xjfaMB2Nj7g== +"@icons-pack/react-simple-icons@^12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-12.3.0.tgz#2089c8226842611d751fc86fa93fea053076db77" + integrity sha512-71KKdd2tg36Pctg5pQTAmPRIdFrtxsLccoSexkZLztn46eV6Ek6ov69o0Ph4t4ZPs6n4+Fw4sBnIzEsKssnXxg== "@img/sharp-darwin-arm64@0.33.5": version "0.33.5" @@ -445,6 +691,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@petamoriken/float16@^3.8.7": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@petamoriken/float16/-/float16-3.9.2.tgz#217a5d349f3655b8e286be447e0ed1eae063a78f" + integrity sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -548,6 +799,13 @@ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== +"@types/better-sqlite3@^7.6.12": + version "7.6.12" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.12.tgz#e5712d46d71097dcc2775c0b068072eadc15deb7" + integrity sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg== + dependencies: + "@types/node" "*" + "@types/html-to-text@^9.0.4": version "9.0.4" resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" @@ -931,11 +1189,19 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== -base64-js@^1.5.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +better-sqlite3@^11.9.1: + version "11.9.1" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.9.1.tgz#0540da2f2ce24cbd766bb35db412f4be2c75b8bb" + integrity sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.1.1" + binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -946,6 +1212,22 @@ binary-search@^1.3.5: resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -978,6 +1260,19 @@ browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -1049,6 +1344,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -1243,6 +1543,18 @@ decamelize@1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -1281,7 +1593,7 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-libc@^2.0.3: +detect-libc@^2.0.0, detect-libc@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== @@ -1355,6 +1667,22 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.3" +drizzle-kit@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.30.5.tgz#fce34a8ca9f82da5212f31c266e407c78523166f" + integrity sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA== + dependencies: + "@drizzle-team/brocli" "^0.10.2" + "@esbuild-kit/esm-loader" "^2.5.5" + esbuild "^0.19.7" + esbuild-register "^3.5.0" + gel "^2.0.0" + +drizzle-orm@^0.40.1: + version "0.40.1" + resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb" + integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -1380,6 +1708,13 @@ enabled@2.0.x: resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.12.0: version "5.16.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" @@ -1393,6 +1728,11 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" @@ -1509,6 +1849,70 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild-register@^3.5.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== + dependencies: + debug "^4.3.4" + +esbuild@^0.19.7: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + +esbuild@~0.18.20: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + escalade@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -1737,6 +2141,11 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expr-eval@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" @@ -1787,6 +2196,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1873,6 +2287,11 @@ fraction.js@^4.3.7: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1903,6 +2322,18 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gel@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gel/-/gel-2.0.1.tgz#587d89db54351c2d436de981d136481e37d06a7a" + integrity sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw== + dependencies: + "@petamoriken/float16" "^3.8.7" + debug "^4.3.4" + env-paths "^3.0.0" + semver "^7.6.2" + shell-quote "^1.8.1" + which "^4.0.0" + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -1930,6 +2361,18 @@ get-tsconfig@^4.5.0: dependencies: resolve-pkg-maps "^1.0.0" +get-tsconfig@^4.7.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== + dependencies: + resolve-pkg-maps "^1.0.0" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -2090,6 +2533,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" @@ -2116,11 +2564,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -2342,6 +2795,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + iterator.prototype@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" @@ -2611,6 +3069,11 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -2632,7 +3095,7 @@ minimatch@^9.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -2642,6 +3105,11 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + ml-array-mean@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" @@ -2707,6 +3175,11 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -2740,6 +3213,13 @@ next@^15.2.2: "@next/swc-win32-x64-msvc" "15.2.2" sharp "^0.33.5" +node-abi@^3.3.0: + version "3.74.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" + integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== + dependencies: + semver "^7.3.5" + node-domexception@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" @@ -2853,7 +3333,7 @@ object.values@^1.1.6, object.values@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -3096,6 +3576,24 @@ postcss@^8, postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.2.0" +prebuild-install@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -3120,6 +3618,14 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -3130,6 +3636,16 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-dom@^18: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -3171,7 +3687,7 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -readable-stream@^3.4.0, readable-stream@^3.6.2: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -3277,7 +3793,7 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -3315,6 +3831,11 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.5, semver@^7.6.2, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" @@ -3322,11 +3843,6 @@ semver@^7.5.4: dependencies: lru-cache "^6.0.0" -semver@^7.6.3: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -3390,6 +3906,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -3405,6 +3926,20 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -3432,6 +3967,19 @@ source-map-js@^1.2.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-support@^0.5.21: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -3553,6 +4101,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + styled-jsx@5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" @@ -3630,6 +4183,27 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" @@ -3696,6 +4270,13 @@ tslib@^2.4.0, tslib@^2.8.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -3904,6 +4485,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + winston-transport@^4.9.0: version "4.9.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" From d1e93616659224ad94e14368583d43b6a2a37e89 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:37:54 +0530 Subject: [PATCH 156/282] feat(routes): add discover route --- ui/app/api/discover/route.ts | 61 ++++++++++++++++++++++++++++++++++++ ui/app/discover/page.tsx | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 ui/app/api/discover/route.ts diff --git a/ui/app/api/discover/route.ts b/ui/app/api/discover/route.ts new file mode 100644 index 0000000..0c95498 --- /dev/null +++ b/ui/app/api/discover/route.ts @@ -0,0 +1,61 @@ +import { searchSearxng } from '@/lib/searxng'; + +const articleWebsites = [ + 'yahoo.com', + 'www.exchangewire.com', + 'businessinsider.com', + /* 'wired.com', + 'mashable.com', + 'theverge.com', + 'gizmodo.com', + 'cnet.com', + 'venturebeat.com', */ +]; + +const topics = ['AI', 'tech']; /* TODO: Add UI to customize this */ + +export const GET = async (req: Request) => { + try { + const data = ( + await Promise.all([ + ...new Array(articleWebsites.length * topics.length) + .fill(0) + .map(async (_, i) => { + return ( + await searchSearxng( + `site:${articleWebsites[i % articleWebsites.length]} ${ + topics[i % topics.length] + }`, + { + engines: ['bing news'], + pageno: 1, + }, + ) + ).results; + }), + ]) + ) + .map((result) => result) + .flat() + .sort(() => Math.random() - 0.5); + + return Response.json( + { + blogs: data, + }, + { + status: 200, + }, + ); + } catch (err) { + console.error(`An error ocurred in discover route: ${err}`); + return Response.json( + { + message: 'An error has occurred', + }, + { + status: 500, + }, + ); + } +}; diff --git a/ui/app/discover/page.tsx b/ui/app/discover/page.tsx index eb94040..eb7de7f 100644 --- a/ui/app/discover/page.tsx +++ b/ui/app/discover/page.tsx @@ -19,7 +19,7 @@ const Page = () => { useEffect(() => { const fetchData = async () => { try { - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/discover`, { + const res = await fetch(`/api/discover`, { method: 'GET', headers: { 'Content-Type': 'application/json', From 1130746f5de0b04f7fd03bf0340d24c3012ee863 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:38:40 +0530 Subject: [PATCH 157/282] feat(app): add image & video search functionality --- ui/app/api/images/route.ts | 83 ++++++++++++++++++++++++++ ui/app/api/videos/route.ts | 83 ++++++++++++++++++++++++++ ui/components/SearchImages.tsx | 41 +++++++------ ui/components/SearchVideos.tsx | 41 +++++++------ ui/lib/chains/imageSearchAgent.ts | 90 ++++++++++++++++++++++++++++ ui/lib/chains/videoSearchAgent.ts | 97 +++++++++++++++++++++++++++++++ 6 files changed, 393 insertions(+), 42 deletions(-) create mode 100644 ui/app/api/images/route.ts create mode 100644 ui/app/api/videos/route.ts create mode 100644 ui/lib/chains/imageSearchAgent.ts create mode 100644 ui/lib/chains/videoSearchAgent.ts diff --git a/ui/app/api/images/route.ts b/ui/app/api/images/route.ts new file mode 100644 index 0000000..4114cbd --- /dev/null +++ b/ui/app/api/images/route.ts @@ -0,0 +1,83 @@ +import handleImageSearch from '@/lib/chains/imageSearchAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; +import { getAvailableChatModelProviders } from '@/lib/providers'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { ChatOpenAI } from '@langchain/openai'; + +interface ChatModel { + provider: string; + model: string; +} + +interface ImageSearchBody { + query: string; + chatHistory: any[]; + chatModel?: ChatModel; +} + +export const POST = async (req: Request) => { + try { + const body: ImageSearchBody = await req.json(); + + const chatHistory = body.chatHistory + .map((msg: any) => { + if (msg.role === 'user') { + return new HumanMessage(msg.content); + } else if (msg.role === 'assistant') { + return new AIMessage(msg.content); + } + }) + .filter((msg) => msg !== undefined); + + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + chatModelProviders[ + body.chatModel?.provider || Object.keys(chatModelProviders)[0] + ]; + const chatModel = + chatModelProvider[ + body.chatModel?.model || Object.keys(chatModelProvider)[0] + ]; + + let llm: BaseChatModel | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + openAIApiKey: getCustomOpenaiApiKey(), + modelName: getCustomOpenaiModelName(), + temperature: 0.7, + configuration: { + baseURL: getCustomOpenaiApiUrl(), + }, + }); + } else if (chatModelProvider && chatModel) { + llm = chatModel.model; + } + + if (!llm) { + return Response.json({ error: 'Invalid chat model' }, { status: 400 }); + } + + const images = await handleImageSearch( + { + chat_history: chatHistory, + query: body.query, + }, + llm, + ); + + return Response.json({ images }, { status: 200 }); + } catch (err) { + console.error(`An error ocurred while searching images: ${err}`); + return Response.json( + { message: 'An error ocurred while searching images' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/api/videos/route.ts b/ui/app/api/videos/route.ts new file mode 100644 index 0000000..9b4bf9f --- /dev/null +++ b/ui/app/api/videos/route.ts @@ -0,0 +1,83 @@ +import handleVideoSearch from '@/lib/chains/videoSearchAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; +import { getAvailableChatModelProviders } from '@/lib/providers'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { ChatOpenAI } from '@langchain/openai'; + +interface ChatModel { + provider: string; + model: string; +} + +interface VideoSearchBody { + query: string; + chatHistory: any[]; + chatModel?: ChatModel; +} + +export const POST = async (req: Request) => { + try { + const body: VideoSearchBody = await req.json(); + + const chatHistory = body.chatHistory + .map((msg: any) => { + if (msg.role === 'user') { + return new HumanMessage(msg.content); + } else if (msg.role === 'assistant') { + return new AIMessage(msg.content); + } + }) + .filter((msg) => msg !== undefined); + + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + chatModelProviders[ + body.chatModel?.provider || Object.keys(chatModelProviders)[0] + ]; + const chatModel = + chatModelProvider[ + body.chatModel?.model || Object.keys(chatModelProvider)[0] + ]; + + let llm: BaseChatModel | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + openAIApiKey: getCustomOpenaiApiKey(), + modelName: getCustomOpenaiModelName(), + temperature: 0.7, + configuration: { + baseURL: getCustomOpenaiApiUrl(), + }, + }); + } else if (chatModelProvider && chatModel) { + llm = chatModel.model; + } + + if (!llm) { + return Response.json({ error: 'Invalid chat model' }, { status: 400 }); + } + + const videos = await handleVideoSearch( + { + chat_history: chatHistory, + query: body.query, + }, + llm, + ); + + return Response.json({ videos }, { status: 200 }); + } catch (err) { + console.error(`An error ocurred while searching videos: ${err}`); + return Response.json( + { message: 'An error ocurred while searching videos' }, + { status: 500 }, + ); + } +}; diff --git a/ui/components/SearchImages.tsx b/ui/components/SearchImages.tsx index 383f780..08c16ee 100644 --- a/ui/components/SearchImages.tsx +++ b/ui/components/SearchImages.tsx @@ -14,9 +14,11 @@ type Image = { const SearchImages = ({ query, chatHistory, + messageId, }: { query: string; chatHistory: Message[]; + messageId: string; }) => { const [images, setImages] = useState<Image[] | null>(null); const [loading, setLoading] = useState(false); @@ -27,7 +29,7 @@ const SearchImages = ({ <> {!loading && images === null && ( <button - id="search-images" + id={`search-images-${messageId}`} onClick={async () => { setLoading(true); @@ -37,27 +39,24 @@ const SearchImages = ({ const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); const customOpenAIKey = localStorage.getItem('openAIApiKey'); - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/images`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - query: query, - chatHistory: chatHistory, - chatModel: { - provider: chatModelProvider, - model: chatModel, - ...(chatModelProvider === 'custom_openai' && { - customOpenAIBaseURL: customOpenAIBaseURL, - customOpenAIKey: customOpenAIKey, - }), - }, - }), + const res = await fetch(`/api/images`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify({ + query: query, + chatHistory: chatHistory, + chatModel: { + provider: chatModelProvider, + model: chatModel, + ...(chatModelProvider === 'custom_openai' && { + customOpenAIBaseURL: customOpenAIBaseURL, + customOpenAIKey: customOpenAIKey, + }), + }, + }), + }); const data = await res.json(); diff --git a/ui/components/SearchVideos.tsx b/ui/components/SearchVideos.tsx index c284dc2..a09a0d2 100644 --- a/ui/components/SearchVideos.tsx +++ b/ui/components/SearchVideos.tsx @@ -27,9 +27,11 @@ declare module 'yet-another-react-lightbox' { const Searchvideos = ({ query, chatHistory, + messageId, }: { query: string; chatHistory: Message[]; + messageId: string; }) => { const [videos, setVideos] = useState<Video[] | null>(null); const [loading, setLoading] = useState(false); @@ -42,7 +44,7 @@ const Searchvideos = ({ <> {!loading && videos === null && ( <button - id="search-videos" + id={`search-videos-${messageId}`} onClick={async () => { setLoading(true); @@ -52,27 +54,24 @@ const Searchvideos = ({ const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); const customOpenAIKey = localStorage.getItem('openAIApiKey'); - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/videos`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - query: query, - chatHistory: chatHistory, - chatModel: { - provider: chatModelProvider, - model: chatModel, - ...(chatModelProvider === 'custom_openai' && { - customOpenAIBaseURL: customOpenAIBaseURL, - customOpenAIKey: customOpenAIKey, - }), - }, - }), + const res = await fetch(`/api/videos`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify({ + query: query, + chatHistory: chatHistory, + chatModel: { + provider: chatModelProvider, + model: chatModel, + ...(chatModelProvider === 'custom_openai' && { + customOpenAIBaseURL: customOpenAIBaseURL, + customOpenAIKey: customOpenAIKey, + }), + }, + }), + }); const data = await res.json(); diff --git a/ui/lib/chains/imageSearchAgent.ts b/ui/lib/chains/imageSearchAgent.ts new file mode 100644 index 0000000..d194612 --- /dev/null +++ b/ui/lib/chains/imageSearchAgent.ts @@ -0,0 +1,90 @@ +import { + RunnableSequence, + RunnableMap, + RunnableLambda, +} from '@langchain/core/runnables'; +import { PromptTemplate } from '@langchain/core/prompts'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import { BaseMessage } from '@langchain/core/messages'; +import { StringOutputParser } from '@langchain/core/output_parsers'; +import { searchSearxng } from '../searxng'; +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const imageSearchChainPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search the web for images. +You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. + +Example: +1. Follow up question: What is a cat? +Rephrased: A cat + +2. Follow up question: What is a car? How does it works? +Rephrased: Car working + +3. Follow up question: How does an AC work? +Rephrased: AC working + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +type ImageSearchChainInput = { + chat_history: BaseMessage[]; + query: string; +}; + +interface ImageSearchResult { + img_src: string; + url: string; + title: string; +} + +const strParser = new StringOutputParser(); + +const createImageSearchChain = (llm: BaseChatModel) => { + return RunnableSequence.from([ + RunnableMap.from({ + chat_history: (input: ImageSearchChainInput) => { + return formatChatHistoryAsString(input.chat_history); + }, + query: (input: ImageSearchChainInput) => { + return input.query; + }, + }), + PromptTemplate.fromTemplate(imageSearchChainPrompt), + llm, + strParser, + RunnableLambda.from(async (input: string) => { + const res = await searchSearxng(input, { + engines: ['bing images', 'google images'], + }); + + const images: ImageSearchResult[] = []; + + res.results.forEach((result) => { + if (result.img_src && result.url && result.title) { + images.push({ + img_src: result.img_src, + url: result.url, + title: result.title, + }); + } + }); + + return images.slice(0, 10); + }), + ]); +}; + +const handleImageSearch = ( + input: ImageSearchChainInput, + llm: BaseChatModel, +) => { + const imageSearchChain = createImageSearchChain(llm); + return imageSearchChain.invoke(input); +}; + +export default handleImageSearch; diff --git a/ui/lib/chains/videoSearchAgent.ts b/ui/lib/chains/videoSearchAgent.ts new file mode 100644 index 0000000..e1051f6 --- /dev/null +++ b/ui/lib/chains/videoSearchAgent.ts @@ -0,0 +1,97 @@ +import { + RunnableSequence, + RunnableMap, + RunnableLambda, +} from '@langchain/core/runnables'; +import { PromptTemplate } from '@langchain/core/prompts'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import { BaseMessage } from '@langchain/core/messages'; +import { StringOutputParser } from '@langchain/core/output_parsers'; +import { searchSearxng } from '../searxng'; +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const VideoSearchChainPrompt = ` + You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos. + You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. + + Example: + 1. Follow up question: How does a car work? + Rephrased: How does a car work? + + 2. Follow up question: What is the theory of relativity? + Rephrased: What is theory of relativity + + 3. Follow up question: How does an AC work? + Rephrased: How does an AC work + + Conversation: + {chat_history} + + Follow up question: {query} + Rephrased question: + `; + +type VideoSearchChainInput = { + chat_history: BaseMessage[]; + query: string; +}; + +interface VideoSearchResult { + img_src: string; + url: string; + title: string; + iframe_src: string; +} + +const strParser = new StringOutputParser(); + +const createVideoSearchChain = (llm: BaseChatModel) => { + return RunnableSequence.from([ + RunnableMap.from({ + chat_history: (input: VideoSearchChainInput) => { + return formatChatHistoryAsString(input.chat_history); + }, + query: (input: VideoSearchChainInput) => { + return input.query; + }, + }), + PromptTemplate.fromTemplate(VideoSearchChainPrompt), + llm, + strParser, + RunnableLambda.from(async (input: string) => { + const res = await searchSearxng(input, { + engines: ['youtube'], + }); + + const videos: VideoSearchResult[] = []; + + res.results.forEach((result) => { + if ( + result.thumbnail && + result.url && + result.title && + result.iframe_src + ) { + videos.push({ + img_src: result.thumbnail, + url: result.url, + title: result.title, + iframe_src: result.iframe_src, + }); + } + }); + + return videos.slice(0, 10); + }), + ]); +}; + +const handleVideoSearch = ( + input: VideoSearchChainInput, + llm: BaseChatModel, +) => { + const VideoSearchChain = createVideoSearchChain(llm); + return VideoSearchChain.invoke(input); +}; + +export default handleVideoSearch; From bab32e8d70013351ef76294e1fe3eddaf126f13d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:40:10 +0530 Subject: [PATCH 158/282] feat(app): add suggestions route --- ui/app/api/suggestions/route.ts | 81 +++++++++++++++++++++++ ui/lib/chains/suggestionGeneratorAgent.ts | 55 +++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 ui/app/api/suggestions/route.ts create mode 100644 ui/lib/chains/suggestionGeneratorAgent.ts diff --git a/ui/app/api/suggestions/route.ts b/ui/app/api/suggestions/route.ts new file mode 100644 index 0000000..f28092e --- /dev/null +++ b/ui/app/api/suggestions/route.ts @@ -0,0 +1,81 @@ +import generateSuggestions from '@/lib/chains/suggestionGeneratorAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; +import { getAvailableChatModelProviders } from '@/lib/providers'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { ChatOpenAI } from '@langchain/openai'; + +interface ChatModel { + provider: string; + model: string; +} + +interface SuggestionsGenerationBody { + chatHistory: any[]; + chatModel?: ChatModel; +} + +export const POST = async (req: Request) => { + try { + const body: SuggestionsGenerationBody = await req.json(); + + const chatHistory = body.chatHistory + .map((msg: any) => { + if (msg.role === 'user') { + return new HumanMessage(msg.content); + } else if (msg.role === 'assistant') { + return new AIMessage(msg.content); + } + }) + .filter((msg) => msg !== undefined); + + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + chatModelProviders[ + body.chatModel?.provider || Object.keys(chatModelProviders)[0] + ]; + const chatModel = + chatModelProvider[ + body.chatModel?.model || Object.keys(chatModelProvider)[0] + ]; + + let llm: BaseChatModel | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + openAIApiKey: getCustomOpenaiApiKey(), + modelName: getCustomOpenaiModelName(), + temperature: 0.7, + configuration: { + baseURL: getCustomOpenaiApiUrl(), + }, + }); + } else if (chatModelProvider && chatModel) { + llm = chatModel.model; + } + + if (!llm) { + return Response.json({ error: 'Invalid chat model' }, { status: 400 }); + } + + const suggestions = await generateSuggestions( + { + chat_history: chatHistory, + }, + llm, + ); + + return Response.json({ suggestions }, { status: 200 }); + } catch (err) { + console.error(`An error ocurred while generating suggestions: ${err}`); + return Response.json( + { message: 'An error ocurred while generating suggestions' }, + { status: 500 }, + ); + } +}; diff --git a/ui/lib/chains/suggestionGeneratorAgent.ts b/ui/lib/chains/suggestionGeneratorAgent.ts new file mode 100644 index 0000000..9129059 --- /dev/null +++ b/ui/lib/chains/suggestionGeneratorAgent.ts @@ -0,0 +1,55 @@ +import { RunnableSequence, RunnableMap } from '@langchain/core/runnables'; +import ListLineOutputParser from '../outputParsers/listLineOutputParser'; +import { PromptTemplate } from '@langchain/core/prompts'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import { BaseMessage } from '@langchain/core/messages'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { ChatOpenAI } from '@langchain/openai'; + +const suggestionGeneratorPrompt = ` +You are an AI suggestion generator for an AI powered search engine. You will be given a conversation below. You need to generate 4-5 suggestions based on the conversation. The suggestion should be relevant to the conversation that can be used by the user to ask the chat model for more information. +You need to make sure the suggestions are relevant to the conversation and are helpful to the user. Keep a note that the user might use these suggestions to ask a chat model for more information. +Make sure the suggestions are medium in length and are informative and relevant to the conversation. + +Provide these suggestions separated by newlines between the XML tags <suggestions> and </suggestions>. For example: + +<suggestions> +Tell me more about SpaceX and their recent projects +What is the latest news on SpaceX? +Who is the CEO of SpaceX? +</suggestions> + +Conversation: +{chat_history} +`; + +type SuggestionGeneratorInput = { + chat_history: BaseMessage[]; +}; + +const outputParser = new ListLineOutputParser({ + key: 'suggestions', +}); + +const createSuggestionGeneratorChain = (llm: BaseChatModel) => { + return RunnableSequence.from([ + RunnableMap.from({ + chat_history: (input: SuggestionGeneratorInput) => + formatChatHistoryAsString(input.chat_history), + }), + PromptTemplate.fromTemplate(suggestionGeneratorPrompt), + llm, + outputParser, + ]); +}; + +const generateSuggestions = ( + input: SuggestionGeneratorInput, + llm: BaseChatModel, +) => { + (llm as unknown as ChatOpenAI).temperature = 0; + const suggestionGeneratorChain = createSuggestionGeneratorChain(llm); + return suggestionGeneratorChain.invoke(input); +}; + +export default generateSuggestions; From c46fd7a9c8836356eb934d3be9b82ffdc0ca81d7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:40:35 +0530 Subject: [PATCH 159/282] feat(utils): add files utils, remove logger, fix API url --- ui/lib/actions.ts | 2 +- ui/lib/config.ts | 1 - ui/lib/utils/documents.ts | 1 - ui/lib/utils/files.ts | 17 +++++++++++++++++ ui/lib/utils/logger.ts | 22 ---------------------- 5 files changed, 18 insertions(+), 25 deletions(-) create mode 100644 ui/lib/utils/files.ts delete mode 100644 ui/lib/utils/logger.ts diff --git a/ui/lib/actions.ts b/ui/lib/actions.ts index a4409b0..0f4c0f0 100644 --- a/ui/lib/actions.ts +++ b/ui/lib/actions.ts @@ -7,7 +7,7 @@ export const getSuggestions = async (chatHisory: Message[]) => { const customOpenAIKey = localStorage.getItem('openAIApiKey'); const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/suggestions`, { + const res = await fetch(`/api/suggestions`, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/ui/lib/config.ts b/ui/lib/config.ts index 0a314cf..489fec3 100644 --- a/ui/lib/config.ts +++ b/ui/lib/config.ts @@ -109,7 +109,6 @@ const mergeConfigs = (current: any, update: any): any => { export const updateConfig = (config: RecursivePartial<Config>) => { const currentConfig = loadConfig(); const mergedConfig = mergeConfigs(currentConfig, config); - console.log(mergedConfig); fs.writeFileSync( path.join(path.join(process.cwd(), `${configFileName}`)), toml.stringify(mergedConfig), diff --git a/ui/lib/utils/documents.ts b/ui/lib/utils/documents.ts index 900d6b0..ad64180 100644 --- a/ui/lib/utils/documents.ts +++ b/ui/lib/utils/documents.ts @@ -3,7 +3,6 @@ import { htmlToText } from 'html-to-text'; import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; import { Document } from '@langchain/core/documents'; import pdfParse from 'pdf-parse'; -import logger from './logger'; export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { const splitter = new RecursiveCharacterTextSplitter(); diff --git a/ui/lib/utils/files.ts b/ui/lib/utils/files.ts new file mode 100644 index 0000000..e6e91df --- /dev/null +++ b/ui/lib/utils/files.ts @@ -0,0 +1,17 @@ +import path from 'path'; +import fs from 'fs'; + +export const getFileDetails = (fileId: string) => { + const fileLoc = path.join( + process.cwd(), + './uploads', + fileId + '-extracted.json', + ); + + const parsedFile = JSON.parse(fs.readFileSync(fileLoc, 'utf8')); + + return { + name: parsedFile.title, + fileId: fileId, + }; +}; diff --git a/ui/lib/utils/logger.ts b/ui/lib/utils/logger.ts deleted file mode 100644 index 1c81eb9..0000000 --- a/ui/lib/utils/logger.ts +++ /dev/null @@ -1,22 +0,0 @@ -import winston from 'winston'; - -const logger = winston.createLogger({ - level: 'info', - transports: [ - new winston.transports.Console({ - format: winston.format.combine( - winston.format.colorize(), - winston.format.simple(), - ), - }), - new winston.transports.File({ - filename: 'app.log', - format: winston.format.combine( - winston.format.timestamp(), - winston.format.json(), - ), - }), - ], -}); - -export default logger; From 3150c21f176ed0416fe7e795d72d2f6c3af04c96 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:41:01 +0530 Subject: [PATCH 160/282] feat(icons): fix type errors --- ui/components/MessageInputActions/Focus.tsx | 16 ++-------------- ui/data/.gitignore | 2 ++ 2 files changed, 4 insertions(+), 14 deletions(-) create mode 100644 ui/data/.gitignore diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index 613078b..875dbf7 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -45,25 +45,13 @@ const focusModes = [ key: 'youtubeSearch', title: 'Youtube', description: 'Search and watch videos', - icon: ( - <SiYoutube - className="h-5 w-auto mr-0.5" - onPointerEnterCapture={undefined} - onPointerLeaveCapture={undefined} - /> - ), + icon: <SiYoutube className="h-5 w-auto mr-0.5" />, }, { key: 'redditSearch', title: 'Reddit', description: 'Search for discussions and opinions', - icon: ( - <SiReddit - className="h-5 w-auto mr-0.5" - onPointerEnterCapture={undefined} - onPointerLeaveCapture={undefined} - /> - ), + icon: <SiReddit className="h-5 w-auto mr-0.5" />, }, ]; diff --git a/ui/data/.gitignore b/ui/data/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/ui/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore From c24edac16da9e8c720eb4cbc5f599e0b51b88ecc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:41:52 +0530 Subject: [PATCH 161/282] feat(app): add chat functionality --- ui/app/api/chat/route.ts | 346 +++++++++++++++++++++++++++++++++++ ui/app/api/models/route.ts | 47 +++++ ui/components/ChatWindow.tsx | 320 ++++++++++++++------------------ ui/lib/providers/index.ts | 8 +- 4 files changed, 535 insertions(+), 186 deletions(-) create mode 100644 ui/app/api/chat/route.ts create mode 100644 ui/app/api/models/route.ts diff --git a/ui/app/api/chat/route.ts b/ui/app/api/chat/route.ts new file mode 100644 index 0000000..0b130de --- /dev/null +++ b/ui/app/api/chat/route.ts @@ -0,0 +1,346 @@ +import prompts from '@/lib/prompts'; +import MetaSearchAgent from '@/lib/search/metaSearchAgent'; +import crypto from 'crypto'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; +import { EventEmitter } from 'stream'; +import { chatModelProviders, embeddingModelProviders } from '@/lib/providers'; +import db from '@/lib/db'; +import { chats, messages as messagesSchema } from '@/lib/db/schema'; +import { and, eq, gt } from 'drizzle-orm'; +import { getFileDetails } from '@/lib/utils/files'; + +export const runtime = 'nodejs'; +export const dynamic = 'force-dynamic'; + +export const searchHandlers: Record<string, MetaSearchAgent> = { + webSearch: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, + responsePrompt: prompts.webSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: true, + }), + academicSearch: new MetaSearchAgent({ + activeEngines: ['arxiv', 'google scholar', 'pubmed'], + queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, + responsePrompt: prompts.academicSearchResponsePrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + writingAssistant: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: '', + responsePrompt: prompts.writingAssistantPrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: false, + summarizer: false, + }), + wolframAlphaSearch: new MetaSearchAgent({ + activeEngines: ['wolframalpha'], + queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, + responsePrompt: prompts.wolframAlphaSearchResponsePrompt, + rerank: false, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + youtubeSearch: new MetaSearchAgent({ + activeEngines: ['youtube'], + queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, + responsePrompt: prompts.youtubeSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), + redditSearch: new MetaSearchAgent({ + activeEngines: ['reddit'], + queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, + responsePrompt: prompts.redditSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), +}; + +type Message = { + messageId: string; + chatId: string; + content: string; +}; + +type ChatModel = { + provider: string; + name: string; +}; + +type EmbeddingModel = { + provider: string; + name: string; +}; + +type Body = { + message: Message; + optimizationMode: 'speed' | 'balanced' | 'quality'; + focusMode: string; + history: Array<[string, string]>; + files: Array<string>; + chatModel: ChatModel; + embeddingModel: EmbeddingModel; +}; + +const handleEmitterEvents = async ( + stream: EventEmitter, + writer: WritableStreamDefaultWriter, + encoder: TextEncoder, + aiMessageId: string, + chatId: string, +) => { + let recievedMessage = ''; + let sources: any[] = []; + + stream.on('data', (data) => { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'message', + data: parsedData.data, + messageId: aiMessageId, + }) + '\n', + ), + ); + + recievedMessage += parsedData.data; + } else if (parsedData.type === 'sources') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'sources', + data: parsedData.data, + messageId: aiMessageId, + }) + '\n', + ), + ); + + sources = parsedData.data; + } + }); + stream.on('end', () => { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'messageEnd', + messageId: aiMessageId, + }) + '\n', + ), + ); + writer.close(); + + db.insert(messagesSchema) + .values({ + content: recievedMessage, + chatId: chatId, + messageId: aiMessageId, + role: 'assistant', + metadata: JSON.stringify({ + createdAt: new Date(), + ...(sources && sources.length > 0 && { sources }), + }), + }) + .execute(); + }); + stream.on('error', (data) => { + const parsedData = JSON.parse(data); + writer.write( + encoder.encode( + JSON.stringify({ + type: 'error', + data: parsedData.data, + }), + ), + ); + writer.close(); + }); +}; + +const handleHistorySave = async ( + message: Message, + humanMessageId: string, + focusMode: string, + files: string[], +) => { + const chat = await db.query.chats.findFirst({ + where: eq(chats.id, message.chatId), + }); + + if (!chat) { + await db + .insert(chats) + .values({ + id: message.chatId, + title: message.content, + createdAt: new Date().toString(), + focusMode: focusMode, + files: files.map(getFileDetails), + }) + .execute(); + } + + const messageExists = await db.query.messages.findFirst({ + where: eq(messagesSchema.messageId, humanMessageId), + }); + + if (!messageExists) { + await db + .insert(messagesSchema) + .values({ + content: message.content, + chatId: message.chatId, + messageId: humanMessageId, + role: 'user', + metadata: JSON.stringify({ + createdAt: new Date(), + }), + }) + .execute(); + } else { + await db + .delete(messagesSchema) + .where( + and( + gt(messagesSchema.id, messageExists.id), + eq(messagesSchema.chatId, message.chatId), + ), + ) + .execute(); + } +}; + +export const POST = async (req: Request) => { + try { + const body = (await req.json()) as Body; + const { message, chatModel, embeddingModel } = body; + + if (message.content === '') { + return Response.json( + { + message: 'Please provide a message to process', + }, + { status: 400 }, + ); + } + + const getProviderChatModels = chatModelProviders[chatModel.provider]; + + if (!getProviderChatModels) { + return Response.json( + { + message: 'Invalid chat model provider', + }, + { status: 400 }, + ); + } + + const chatModels = await getProviderChatModels(); + + const llm = chatModels[chatModel.name].model; + + if (!llm) { + return Response.json( + { + message: 'Invalid chat model', + }, + { status: 400 }, + ); + } + + const getProviderEmbeddingModels = + embeddingModelProviders[embeddingModel.provider]; + + if (!getProviderEmbeddingModels) { + return Response.json( + { + message: 'Invalid embedding model provider', + }, + { status: 400 }, + ); + } + + const embeddingModels = await getProviderEmbeddingModels(); + const embedding = embeddingModels[embeddingModel.name].model; + + if (!embedding) { + return Response.json( + { + message: 'Invalid embedding model', + }, + { status: 400 }, + ); + } + + const humanMessageId = + message.messageId ?? crypto.randomBytes(7).toString('hex'); + const aiMessageId = crypto.randomBytes(7).toString('hex'); + + const history: BaseMessage[] = body.history.map((msg) => { + if (msg[0] === 'human') { + return new HumanMessage({ + content: msg[1], + }); + } else { + return new AIMessage({ + content: msg[1], + }); + } + }); + + const handler = searchHandlers[body.focusMode]; + + if (!handler) { + return Response.json( + { + message: 'Invalid focus mode', + }, + { status: 400 }, + ); + } + + const stream = await handler.searchAndAnswer( + message.content, + history, + llm, + embedding, + body.optimizationMode, + body.files, + ); + + const responseStream = new TransformStream(); + const writer = responseStream.writable.getWriter(); + const encoder = new TextEncoder(); + + handleEmitterEvents(stream, writer, encoder, aiMessageId, message.chatId); + handleHistorySave(message, humanMessageId, body.focusMode, body.files); + + return new Response(responseStream.readable, { + headers: { + 'Content-Type': 'text/event-stream', + Connection: 'keep-alive', + 'Cache-Control': 'no-cache, no-transform', + }, + }); + } catch (err) { + console.error('An error ocurred while processing chat request:', err); + return Response.json( + { message: 'An error ocurred while processing chat request' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/api/models/route.ts b/ui/app/api/models/route.ts new file mode 100644 index 0000000..a5e5b43 --- /dev/null +++ b/ui/app/api/models/route.ts @@ -0,0 +1,47 @@ +import { + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '@/lib/providers'; + +export const GET = async (req: Request) => { + try { + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); + + Object.keys(chatModelProviders).forEach((provider) => { + Object.keys(chatModelProviders[provider]).forEach((model) => { + delete (chatModelProviders[provider][model] as { model?: unknown }) + .model; + }); + }); + + Object.keys(embeddingModelProviders).forEach((provider) => { + Object.keys(embeddingModelProviders[provider]).forEach((model) => { + delete (embeddingModelProviders[provider][model] as { model?: unknown }) + .model; + }); + }); + + return Response.json( + { + chatModelProviders, + embeddingModelProviders, + }, + { + status: 200, + }, + ); + } catch (err) { + console.error('An error ocurred while fetching models', err); + return Response.json( + { + message: 'An error has occurred.', + }, + { + status: 500, + }, + ); + } +}; diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 1940f42..f642525 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -29,29 +29,24 @@ export interface File { fileId: string; } -const useSocket = ( - url: string, - setIsWSReady: (ready: boolean) => void, - setError: (error: boolean) => void, +interface ChatModelProvider { + name: string; + provider: string; +} + +interface EmbeddingModelProvider { + name: string; + provider: string; +} + +const checkConfig = async ( + setChatModelProvider: (provider: ChatModelProvider) => void, + setEmbeddingModelProvider: (provider: EmbeddingModelProvider) => void, + setIsConfigReady: (ready: boolean) => void, + setHasError: (hasError: boolean) => void, ) => { - const wsRef = useRef<WebSocket | null>(null); - const reconnectTimeoutRef = useRef<NodeJS.Timeout>(); - const retryCountRef = useRef(0); - const isCleaningUpRef = useRef(false); - const MAX_RETRIES = 3; - const INITIAL_BACKOFF = 1000; // 1 second - const isConnectionErrorRef = useRef(false); - - const getBackoffDelay = (retryCount: number) => { - return Math.min(INITIAL_BACKOFF * Math.pow(2, retryCount), 10000); // Cap at 10 seconds - }; - useEffect(() => { - const connectWs = async () => { - if (wsRef.current?.readyState === WebSocket.OPEN) { - wsRef.current.close(); - } - + const checkConfig = async () => { try { let chatModel = localStorage.getItem('chatModel'); let chatModelProvider = localStorage.getItem('chatModelProvider'); @@ -71,14 +66,11 @@ const useSocket = ( localStorage.setItem('autoVideoSearch', 'false'); } - const providers = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/models`, - { - headers: { - 'Content-Type': 'application/json', - }, + const providers = await fetch(`/api/models`, { + headers: { + 'Content-Type': 'application/json', }, - ).then(async (res) => { + }).then(async (res) => { if (!res.ok) throw new Error( `Failed to fetch models: ${res.status} ${res.statusText}`, @@ -182,127 +174,30 @@ const useSocket = ( } } - const wsURL = new URL(url); - const searchParams = new URLSearchParams({}); - - searchParams.append('chatModel', chatModel!); - searchParams.append('chatModelProvider', chatModelProvider); - - if (chatModelProvider === 'custom_openai') { - searchParams.append( - 'openAIApiKey', - localStorage.getItem('openAIApiKey')!, - ); - searchParams.append( - 'openAIBaseURL', - localStorage.getItem('openAIBaseURL')!, - ); - } - - searchParams.append('embeddingModel', embeddingModel!); - searchParams.append('embeddingModelProvider', embeddingModelProvider); - - wsURL.search = searchParams.toString(); - - const ws = new WebSocket(wsURL.toString()); - wsRef.current = ws; - - const timeoutId = setTimeout(() => { - if (ws.readyState !== 1) { - toast.error( - 'Failed to connect to the server. Please try again later.', - ); - } - }, 10000); - - ws.addEventListener('message', (e) => { - const data = JSON.parse(e.data); - if (data.type === 'signal' && data.data === 'open') { - const interval = setInterval(() => { - if (ws.readyState === 1) { - setIsWSReady(true); - setError(false); - if (retryCountRef.current > 0) { - toast.success('Connection restored.'); - } - retryCountRef.current = 0; - clearInterval(interval); - } - }, 5); - clearTimeout(timeoutId); - console.debug(new Date(), 'ws:connected'); - } - if (data.type === 'error') { - isConnectionErrorRef.current = true; - setError(true); - toast.error(data.data); - } + setChatModelProvider({ + name: chatModel!, + provider: chatModelProvider, }); - ws.onerror = () => { - clearTimeout(timeoutId); - setIsWSReady(false); - toast.error('WebSocket connection error.'); - }; + setEmbeddingModelProvider({ + name: embeddingModel!, + provider: embeddingModelProvider, + }); - ws.onclose = () => { - clearTimeout(timeoutId); - setIsWSReady(false); - console.debug(new Date(), 'ws:disconnected'); - if (!isCleaningUpRef.current && !isConnectionErrorRef.current) { - toast.error('Connection lost. Attempting to reconnect...'); - attemptReconnect(); - } - }; - } catch (error) { - console.debug(new Date(), 'ws:error', error); - setIsWSReady(false); - attemptReconnect(); - } - }; - - const attemptReconnect = () => { - retryCountRef.current += 1; - - if (retryCountRef.current > MAX_RETRIES) { - console.debug(new Date(), 'ws:max_retries'); - setError(true); - toast.error( - 'Unable to connect to server after multiple attempts. Please refresh the page to try again.', + setIsConfigReady(true); + } catch (err) { + console.error( + 'An error occurred while checking the configuration:', + err, ); - return; - } - - const backoffDelay = getBackoffDelay(retryCountRef.current); - console.debug( - new Date(), - `ws:retry attempt=${retryCountRef.current}/${MAX_RETRIES} delay=${backoffDelay}ms`, - ); - - if (reconnectTimeoutRef.current) { - clearTimeout(reconnectTimeoutRef.current); - } - - reconnectTimeoutRef.current = setTimeout(() => { - connectWs(); - }, backoffDelay); - }; - - connectWs(); - - return () => { - if (reconnectTimeoutRef.current) { - clearTimeout(reconnectTimeoutRef.current); - } - if (wsRef.current?.readyState === WebSocket.OPEN) { - wsRef.current.close(); - isCleaningUpRef.current = true; - console.debug(new Date(), 'ws:cleanup'); + setIsConfigReady(false); + setHasError(true); } }; - }, [url, setIsWSReady, setError]); - return wsRef.current; + checkConfig(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); }; const loadMessages = async ( @@ -315,15 +210,12 @@ const loadMessages = async ( setFiles: (files: File[]) => void, setFileIds: (fileIds: string[]) => void, ) => { - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/chats/${chatId}`, - { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, + const res = await fetch(`/api/chats/${chatId}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', }, - ); + }); if (res.status === 404) { setNotFound(true); @@ -373,13 +265,27 @@ const ChatWindow = ({ id }: { id?: string }) => { const [chatId, setChatId] = useState<string | undefined>(id); const [newChatCreated, setNewChatCreated] = useState(false); + const [chatModelProvider, setChatModelProvider] = useState<ChatModelProvider>( + { + name: '', + provider: '', + }, + ); + + const [embeddingModelProvider, setEmbeddingModelProvider] = + useState<EmbeddingModelProvider>({ + name: '', + provider: '', + }); + + const [isConfigReady, setIsConfigReady] = useState(false); const [hasError, setHasError] = useState(false); const [isReady, setIsReady] = useState(false); - const [isWSReady, setIsWSReady] = useState(false); - const ws = useSocket( - process.env.NEXT_PUBLIC_WS_URL!, - setIsWSReady, + checkConfig( + setChatModelProvider, + setEmbeddingModelProvider, + setIsConfigReady, setHasError, ); @@ -399,8 +305,6 @@ const ChatWindow = ({ id }: { id?: string }) => { const [notFound, setNotFound] = useState(false); - const [isSettingsOpen, setIsSettingsOpen] = useState(false); - useEffect(() => { if ( chatId && @@ -426,16 +330,6 @@ const ChatWindow = ({ id }: { id?: string }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - useEffect(() => { - return () => { - if (ws?.readyState === 1) { - ws.close(); - console.debug(new Date(), 'ws:cleanup'); - } - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - const messagesRef = useRef<Message[]>([]); useEffect(() => { @@ -443,18 +337,18 @@ const ChatWindow = ({ id }: { id?: string }) => { }, [messages]); useEffect(() => { - if (isMessagesLoaded && isWSReady) { + if (isMessagesLoaded && isConfigReady) { setIsReady(true); console.debug(new Date(), 'app:ready'); } else { setIsReady(false); } - }, [isMessagesLoaded, isWSReady]); + }, [isMessagesLoaded, isConfigReady]); const sendMessage = async (message: string, messageId?: string) => { if (loading) return; - if (!ws || ws.readyState !== WebSocket.OPEN) { - toast.error('Cannot send message while disconnected'); + if (!isConfigReady) { + toast.error('Cannot send message before the configuration is ready'); return; } @@ -467,18 +361,27 @@ const ChatWindow = ({ id }: { id?: string }) => { messageId = messageId ?? crypto.randomBytes(7).toString('hex'); - ws.send( + console.log( JSON.stringify({ - type: 'message', + content: message, message: { messageId: messageId, chatId: chatId!, content: message, }, + chatId: chatId!, files: fileIds, focusMode: focusMode, optimizationMode: optimizationMode, - history: [...chatHistory, ['human', message]], + history: chatHistory, + chatModel: { + name: chatModelProvider.name, + provider: chatModelProvider.provider, + }, + embeddingModel: { + name: embeddingModelProvider.name, + provider: embeddingModelProvider.provider, + }, }), ); @@ -493,9 +396,7 @@ const ChatWindow = ({ id }: { id?: string }) => { }, ]); - const messageHandler = async (e: MessageEvent) => { - const data = JSON.parse(e.data); - + const messageHandler = async (data: any) => { if (data.type === 'error') { toast.error(data.data); setLoading(false); @@ -558,7 +459,6 @@ const ChatWindow = ({ id }: { id?: string }) => { ['assistant', recievedMessage], ]); - ws?.removeEventListener('message', messageHandler); setLoading(false); const lastMsg = messagesRef.current[messagesRef.current.length - 1]; @@ -584,16 +484,72 @@ const ChatWindow = ({ id }: { id?: string }) => { const autoVideoSearch = localStorage.getItem('autoVideoSearch'); if (autoImageSearch === 'true') { - document.getElementById('search-images')?.click(); + document + .getElementById(`search-images-${lastMsg.messageId}`) + ?.click(); } if (autoVideoSearch === 'true') { - document.getElementById('search-videos')?.click(); + document + .getElementById(`search-videos-${lastMsg.messageId}`) + ?.click(); } } }; - ws?.addEventListener('message', messageHandler); + const res = await fetch('/api/chat', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + content: message, + message: { + messageId: messageId, + chatId: chatId!, + content: message, + }, + chatId: chatId!, + files: fileIds, + focusMode: focusMode, + optimizationMode: optimizationMode, + history: chatHistory, + chatModel: { + name: chatModelProvider.name, + provider: chatModelProvider.provider, + }, + embeddingModel: { + name: embeddingModelProvider.name, + provider: embeddingModelProvider.provider, + }, + }), + }); + + if (!res.body) throw new Error('No response body'); + + const reader = res.body?.getReader(); + const decoder = new TextDecoder('utf-8'); + + let partialChunk = ''; + + while (true) { + const { value, done } = await reader.read(); + if (done) break; + + partialChunk += decoder.decode(value, { stream: true }); + + try { + const messages = partialChunk.split('\n'); + for (const msg of messages) { + if (!msg.trim()) continue; + const json = JSON.parse(msg); + messageHandler(json); + } + partialChunk = ''; + } catch (error) { + console.warn('Incomplete JSON, waiting for next chunk...'); + } + } }; const rewrite = (messageId: string) => { @@ -614,11 +570,11 @@ const ChatWindow = ({ id }: { id?: string }) => { }; useEffect(() => { - if (isReady && initialMessage && ws?.readyState === 1) { + if (isReady && initialMessage && isConfigReady) { sendMessage(initialMessage); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ws?.readyState, isReady, initialMessage, isWSReady]); + }, [isConfigReady, isReady, initialMessage]); if (hasError) { return ( diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts index caa8074..e45c09d 100644 --- a/ui/lib/providers/index.ts +++ b/ui/lib/providers/index.ts @@ -22,7 +22,7 @@ export interface EmbeddingModel { model: Embeddings; } -const chatModelProviders: Record< +export const chatModelProviders: Record< string, () => Promise<Record<string, ChatModel>> > = { @@ -30,16 +30,16 @@ const chatModelProviders: Record< ollama: loadOllamaChatModels, groq: loadGroqChatModels, anthropic: loadAnthropicChatModels, - gemini: loadGeminiChatModels + gemini: loadGeminiChatModels, }; -const embeddingModelProviders: Record< +export const embeddingModelProviders: Record< string, () => Promise<Record<string, EmbeddingModel>> > = { openai: loadOpenAIEmbeddingModels, ollama: loadOllamaEmbeddingModels, - gemini: loadGeminiEmbeddingModels + gemini: loadGeminiEmbeddingModels, }; export const getAvailableChatModelProviders = async () => { From bab5dba6e1800d6f54aa660a75861479111fabbc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:42:15 +0530 Subject: [PATCH 162/282] feat(app): port history saving features --- ui/app/api/chats/[id]/route.ts | 69 ++++++++++++++++++++++++++++++++++ ui/app/api/chats/route.ts | 15 ++++++++ ui/app/c/[chatId]/page.tsx | 6 ++- ui/app/library/page.tsx | 2 +- ui/components/DeleteChat.tsx | 13 +++---- 5 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 ui/app/api/chats/[id]/route.ts create mode 100644 ui/app/api/chats/route.ts diff --git a/ui/app/api/chats/[id]/route.ts b/ui/app/api/chats/[id]/route.ts new file mode 100644 index 0000000..6891454 --- /dev/null +++ b/ui/app/api/chats/[id]/route.ts @@ -0,0 +1,69 @@ +import db from '@/lib/db'; +import { chats, messages } from '@/lib/db/schema'; +import { eq } from 'drizzle-orm'; + +export const GET = async ( + req: Request, + { params }: { params: Promise<{ id: string }> }, +) => { + try { + const { id } = await params; + + const chatExists = await db.query.chats.findFirst({ + where: eq(chats.id, id), + }); + + if (!chatExists) { + return Response.json({ message: 'Chat not found' }, { status: 404 }); + } + + const chatMessages = await db.query.messages.findMany({ + where: eq(messages.chatId, id), + }); + + return Response.json( + { + chat: chatExists, + messages: chatMessages, + }, + { status: 200 }, + ); + } catch (err) { + console.error('Error in getting chat by id: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; + +export const DELETE = async ( + req: Request, + { params }: { params: Promise<{ id: string }> }, +) => { + try { + const { id } = await params; + + const chatExists = await db.query.chats.findFirst({ + where: eq(chats.id, id), + }); + + if (!chatExists) { + return Response.json({ message: 'Chat not found' }, { status: 404 }); + } + + await db.delete(chats).where(eq(chats.id, id)).execute(); + await db.delete(messages).where(eq(messages.chatId, id)).execute(); + + return Response.json( + { message: 'Chat deleted successfully' }, + { status: 200 }, + ); + } catch (err) { + console.error('Error in deleting chat by id: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/api/chats/route.ts b/ui/app/api/chats/route.ts new file mode 100644 index 0000000..986a192 --- /dev/null +++ b/ui/app/api/chats/route.ts @@ -0,0 +1,15 @@ +import db from '@/lib/db'; + +export const GET = async (req: Request) => { + try { + let chats = await db.query.chats.findMany(); + chats = chats.reverse(); + return Response.json({ chats: chats }, { status: 200 }); + } catch (err) { + console.error('Error in getting chats: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/c/[chatId]/page.tsx b/ui/app/c/[chatId]/page.tsx index dc3c92a..aac125a 100644 --- a/ui/app/c/[chatId]/page.tsx +++ b/ui/app/c/[chatId]/page.tsx @@ -1,7 +1,9 @@ import ChatWindow from '@/components/ChatWindow'; +import React from 'react'; -const Page = ({ params }: { params: { chatId: string } }) => { - return <ChatWindow id={params.chatId} />; +const Page = ({ params }: { params: Promise<{ chatId: string }> }) => { + const { chatId } = React.use(params); + return <ChatWindow id={chatId} />; }; export default Page; diff --git a/ui/app/library/page.tsx b/ui/app/library/page.tsx index 379596c..9c40b2b 100644 --- a/ui/app/library/page.tsx +++ b/ui/app/library/page.tsx @@ -21,7 +21,7 @@ const Page = () => { const fetchChats = async () => { setLoading(true); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/chats`, { + const res = await fetch(`/api/chats`, { method: 'GET', headers: { 'Content-Type': 'application/json', diff --git a/ui/components/DeleteChat.tsx b/ui/components/DeleteChat.tsx index 2857fc8..3acc9fc 100644 --- a/ui/components/DeleteChat.tsx +++ b/ui/components/DeleteChat.tsx @@ -29,15 +29,12 @@ const DeleteChat = ({ const handleDelete = async () => { setLoading(true); try { - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/chats/${chatId}`, - { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, + const res = await fetch(`/api/chats/${chatId}`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', }, - ); + }); if (res.status != 200) { throw new Error('Failed to delete chat'); From 649c68f2920f34c5cd461fc7ab221dcc59f5ed0f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:42:28 +0530 Subject: [PATCH 163/282] feat(ui): fix type errors --- ui/components/MessageBox.tsx | 2 ++ ui/components/MessageSources.tsx | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index 61f4f05..499c3d6 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -193,10 +193,12 @@ const MessageBox = ({ <SearchImages query={history[messageIndex - 1].content} chatHistory={history.slice(0, messageIndex - 1)} + messageId={message.messageId} /> <SearchVideos chatHistory={history.slice(0, messageIndex - 1)} query={history[messageIndex - 1].content} + messageId={message.messageId} /> </div> </div> diff --git a/ui/components/MessageSources.tsx b/ui/components/MessageSources.tsx index c7ee945..fb2b5bb 100644 --- a/ui/components/MessageSources.tsx +++ b/ui/components/MessageSources.tsx @@ -69,11 +69,15 @@ const MessageSources = ({ sources }: { sources: Document[] }) => { <div className="flex flex-row items-center space-x-1"> {sources.slice(3, 6).map((source, i) => { return source.metadata.url === 'File' ? ( - <div className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full"> + <div + key={i} + className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full" + > <File size={12} className="text-white/70" /> </div> ) : ( <img + key={i} src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`} width={16} height={16} From 8a24572cd28570d8e8b5f61933a213f164b32ed2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:32:32 +0530 Subject: [PATCH 164/282] feat(app): add upload functionality --- ui/.prettierignore | 41 +++ ui/app/api/uploads/route.ts | 134 ++++++++ ui/components/MessageInputActions/Attach.tsx | 2 +- .../MessageInputActions/AttachSmall.tsx | 2 +- ui/package.json | 3 + ui/uploads/.gitignore | 2 + ui/yarn.lock | 321 +++++++++++++++++- 7 files changed, 498 insertions(+), 7 deletions(-) create mode 100644 ui/.prettierignore create mode 100644 ui/app/api/uploads/route.ts create mode 100644 ui/uploads/.gitignore diff --git a/ui/.prettierignore b/ui/.prettierignore new file mode 100644 index 0000000..55d3c7c --- /dev/null +++ b/ui/.prettierignore @@ -0,0 +1,41 @@ +# Ignore all files in the node_modules directory +node_modules + +# Ignore all files in the .next directory (Next.js build output) +.next + +# Ignore all files in the .out directory (TypeScript build output) +.out + +# Ignore all files in the .cache directory (Prettier cache) +.cache + +# Ignore all files in the .vscode directory (Visual Studio Code settings) +.vscode + +# Ignore all files in the .idea directory (IntelliJ IDEA settings) +.idea + +# Ignore all files in the dist directory (build output) +dist + +# Ignore all files in the build directory (build output) +build + +# Ignore all files in the coverage directory (test coverage reports) +coverage + +# Ignore all files with the .log extension +*.log + +# Ignore all files with the .tmp extension +*.tmp + +# Ignore all files with the .swp extension +*.swp + +# Ignore all files with the .DS_Store extension (macOS specific) +.DS_Store + +# Ignore all files in uploads directory +uploads \ No newline at end of file diff --git a/ui/app/api/uploads/route.ts b/ui/app/api/uploads/route.ts new file mode 100644 index 0000000..9fbaf2d --- /dev/null +++ b/ui/app/api/uploads/route.ts @@ -0,0 +1,134 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs'; +import path from 'path'; +import crypto from 'crypto'; +import { getAvailableEmbeddingModelProviders } from '@/lib/providers'; +import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf'; +import { DocxLoader } from '@langchain/community/document_loaders/fs/docx'; +import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'; +import { Document } from 'langchain/document'; + +interface FileRes { + fileName: string; + fileExtension: string; + fileId: string; +} + +const uploadDir = path.join(process.cwd(), 'uploads'); + +if (!fs.existsSync(uploadDir)) { + fs.mkdirSync(uploadDir, { recursive: true }); +} + +const splitter = new RecursiveCharacterTextSplitter({ + chunkSize: 500, + chunkOverlap: 100, +}); + +export async function POST(req: Request) { + try { + const formData = await req.formData(); + + const files = formData.getAll('files') as File[]; + const embedding_model = formData.get('embedding_model'); + const embedding_model_provider = formData.get('embedding_model_provider'); + + if (!embedding_model || !embedding_model_provider) { + return NextResponse.json( + { message: 'Missing embedding model or provider' }, + { status: 400 }, + ); + } + + const embeddingModels = await getAvailableEmbeddingModelProviders(); + const provider = + embedding_model_provider ?? Object.keys(embeddingModels)[0]; + const embeddingModel = + embedding_model ?? Object.keys(embeddingModels[provider as string])[0]; + + let embeddingsModel = + embeddingModels[provider as string]?.[embeddingModel as string]?.model; + if (!embeddingsModel) { + return NextResponse.json( + { message: 'Invalid embedding model selected' }, + { status: 400 }, + ); + } + + const processedFiles: FileRes[] = []; + + await Promise.all( + files.map(async (file: any) => { + const fileExtension = file.name.split('.').pop(); + if (!['pdf', 'docx', 'txt'].includes(fileExtension!)) { + return NextResponse.json( + { message: 'File type not supported' }, + { status: 400 }, + ); + } + + const uniqueFileName = `${crypto.randomBytes(16).toString('hex')}.${fileExtension}`; + const filePath = path.join(uploadDir, uniqueFileName); + + const buffer = Buffer.from(await file.arrayBuffer()); + fs.writeFileSync(filePath, new Uint8Array(buffer)); + + let docs: any[] = []; + if (fileExtension === 'pdf') { + const loader = new PDFLoader(filePath); + docs = await loader.load(); + } else if (fileExtension === 'docx') { + const loader = new DocxLoader(filePath); + docs = await loader.load(); + } else if (fileExtension === 'txt') { + const text = fs.readFileSync(filePath, 'utf-8'); + docs = [ + new Document({ pageContent: text, metadata: { title: file.name } }), + ]; + } + + const splitted = await splitter.splitDocuments(docs); + + const extractedDataPath = filePath.replace(/\.\w+$/, '-extracted.json'); + fs.writeFileSync( + extractedDataPath, + JSON.stringify({ + title: file.name, + contents: splitted.map((doc) => doc.pageContent), + }), + ); + + const embeddings = await embeddingsModel.embedDocuments( + splitted.map((doc) => doc.pageContent), + ); + const embeddingsDataPath = filePath.replace( + /\.\w+$/, + '-embeddings.json', + ); + fs.writeFileSync( + embeddingsDataPath, + JSON.stringify({ + title: file.name, + embeddings, + }), + ); + + processedFiles.push({ + fileName: file.name, + fileExtension: fileExtension, + fileId: uniqueFileName.replace(/\.\w+$/, ''), + }); + }), + ); + + return NextResponse.json({ + files: processedFiles, + }); + } catch (error) { + console.error('Error uploading file:', error); + return NextResponse.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +} diff --git a/ui/components/MessageInputActions/Attach.tsx b/ui/components/MessageInputActions/Attach.tsx index d5c1448..7e2f7f2 100644 --- a/ui/components/MessageInputActions/Attach.tsx +++ b/ui/components/MessageInputActions/Attach.tsx @@ -41,7 +41,7 @@ const Attach = ({ data.append('embedding_model_provider', embeddingModelProvider!); data.append('embedding_model', embeddingModel!); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/uploads`, { + const res = await fetch(`/api/uploads`, { method: 'POST', body: data, }); diff --git a/ui/components/MessageInputActions/AttachSmall.tsx b/ui/components/MessageInputActions/AttachSmall.tsx index a0d4b45..044b652 100644 --- a/ui/components/MessageInputActions/AttachSmall.tsx +++ b/ui/components/MessageInputActions/AttachSmall.tsx @@ -39,7 +39,7 @@ const AttachSmall = ({ data.append('embedding_model_provider', embeddingModelProvider!); data.append('embedding_model', embeddingModel!); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/uploads`, { + const res = await fetch(`/api/uploads`, { method: 'POST', body: data, }); diff --git a/ui/package.json b/ui/package.json index 9be9447..c9314b4 100644 --- a/ui/package.json +++ b/ui/package.json @@ -15,7 +15,10 @@ "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/community": "^0.3.36", + "@langchain/core": "^0.3.42", "@langchain/openai": "^0.0.25", + "@langchain/textsplitters": "^0.1.0", "@tailwindcss/typography": "^0.5.12", "axios": "^1.8.3", "better-sqlite3": "^11.9.1", diff --git a/ui/uploads/.gitignore b/ui/uploads/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/ui/uploads/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/ui/yarn.lock b/ui/yarn.lock index 259436c..31abdb3 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -34,6 +34,11 @@ dependencies: regenerator-runtime "^0.14.0" +"@cfworker/json-schema@^4.0.2": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" + integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== + "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" @@ -565,6 +570,22 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@langchain/community@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" + integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA== + dependencies: + "@langchain/openai" ">=0.2.0 <0.5.0" + binary-extensions "^2.2.0" + expr-eval "^2.0.2" + flat "^5.0.2" + js-yaml "^4.1.0" + langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" + langsmith ">=0.2.8 <0.4.0" + uuid "^10.0.0" + zod "^3.22.3" + zod-to-json-schema "^3.22.5" + "@langchain/community@~0.0.41": version "0.0.44" resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416" @@ -579,6 +600,24 @@ zod "^3.22.3" zod-to-json-schema "^3.22.5" +"@langchain/core@^0.3.42": + version "0.3.42" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363" + integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg== + dependencies: + "@cfworker/json-schema" "^4.0.2" + ansi-styles "^5.0.0" + camelcase "6" + decamelize "1.2.0" + js-tiktoken "^1.0.12" + langsmith ">=0.2.8 <0.4.0" + mustache "^4.2.0" + p-queue "^6.6.2" + p-retry "4" + uuid "^10.0.0" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" + "@langchain/core@~0.1.44", "@langchain/core@~0.1.45": version "0.1.54" resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4" @@ -596,6 +635,16 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" + integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ== + dependencies: + js-tiktoken "^1.0.12" + openai "^4.87.3" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" + "@langchain/openai@^0.0.25": version "0.0.25" resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" @@ -618,6 +667,13 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.1.0.tgz#f37620992192df09ecda3dfbd545b36a6bcbae46" + integrity sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw== + dependencies: + js-tiktoken "^1.0.12" + "@next/env@15.2.2": version "15.2.2" resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" @@ -806,16 +862,68 @@ dependencies: "@types/node" "*" +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/html-to-text@^9.0.4": version "9.0.4" resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/multer@^1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" + integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== + dependencies: + "@types/express" "*" + "@types/node-fetch@^2.6.4": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" @@ -848,6 +956,16 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== +"@types/qs@*": + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + "@types/react-dom@^18": version "18.2.24" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" @@ -868,11 +986,33 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + "@types/triple-beam@^1.3.2": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/uuid@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" + integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== + "@types/uuid@^9.0.1": version "9.0.8" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" @@ -1003,6 +1143,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== + arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -1273,7 +1418,7 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -busboy@1.6.0: +busboy@1.6.0, busboy@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== @@ -1316,7 +1461,7 @@ caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1468,6 +1613,28 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-table-printer@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" + integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== + dependencies: + simple-wcswidth "^1.0.1" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2564,7 +2731,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2790,6 +2957,11 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -2825,6 +2997,13 @@ jiti@^1.21.0: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +js-tiktoken@^1.0.12: + version "1.0.19" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78" + integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g== + dependencies: + base64-js "^1.5.1" + js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" @@ -2893,6 +3072,24 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== +"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0": + version "0.3.19" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b" + integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw== + dependencies: + "@langchain/openai" ">=0.1.0 <0.5.0" + "@langchain/textsplitters" ">=0.0.0 <0.2.0" + js-tiktoken "^1.0.12" + js-yaml "^4.1.0" + jsonpointer "^5.0.1" + langsmith ">=0.2.8 <0.4.0" + openapi-types "^12.1.3" + p-retry "4" + uuid "^10.0.0" + yaml "^2.2.1" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" + langchain@^0.1.30: version "0.1.31" resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" @@ -2921,6 +3118,19 @@ langchainhub@~0.0.8: resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== +"langsmith@>=0.2.8 <0.4.0": + version "0.3.14" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f" + integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ== + dependencies: + "@types/uuid" "^10.0.0" + chalk "^4.1.2" + console-table-printer "^2.12.1" + p-queue "^6.6.2" + p-retry "4" + semver "^7.6.3" + uuid "^10.0.0" + langsmith@~0.1.1, langsmith@~0.1.7: version "0.1.14" resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" @@ -3044,6 +3254,11 @@ md5@^2.3.0: crypt "0.0.2" is-buffer "~1.1.6" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -3062,7 +3277,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-types@^2.1.12, mime-types@~2.1.24: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -3110,6 +3325,13 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + ml-array-mean@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" @@ -3156,6 +3378,24 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multer@^1.4.5-lts.1: + version "1.4.5-lts.1" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" + integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== + dependencies: + append-field "^1.0.0" + busboy "^1.0.0" + concat-stream "^1.5.2" + mkdirp "^0.5.4" + object-assign "^4.1.1" + type-is "^1.6.4" + xtend "^4.0.0" + +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -3361,6 +3601,19 @@ openai@^4.26.0, openai@^4.32.1: node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +openai@^4.87.3: + version "4.87.4" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902" + integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + openapi-types@^12.1.3: version "12.1.3" resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" @@ -3604,6 +3857,11 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -3687,6 +3945,19 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^2.2.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -3798,6 +4069,11 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -3947,6 +4223,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simple-wcswidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" + integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -4070,6 +4351,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4289,6 +4577,14 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-is@^1.6.4: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" @@ -4333,6 +4629,11 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + typescript@^5: version "5.4.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" @@ -4385,11 +4686,16 @@ use-latest@^1.2.1: dependencies: use-isomorphic-layout-effect "^1.1.1" -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + uuid@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" @@ -4541,6 +4847,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" From 217736d05afeb5b10bb61827203f189b55b2c6cc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:23:27 +0530 Subject: [PATCH 165/282] feat(app): remove backend --- ui/.eslintrc.json => .eslintrc.json | 0 .gitignore | 6 +- .prettierrc.js | 1 - app.dockerfile | 19 +- backend.dockerfile | 17 - docker-compose.yaml | 35 +- drizzle.config.ts | 2 +- next-env.d.ts | 5 + ui/next.config.mjs => next.config.mjs | 0 package.json | 81 +- ui/postcss.config.js => postcss.config.js | 0 {ui/public => public}/next.svg | 0 {ui/public => public}/vercel.svg | 0 sample.config.toml | 2 +- src/app.ts | 38 - {ui => src}/app/api/chat/route.ts | 90 +- {ui => src}/app/api/chats/[id]/route.ts | 0 {ui => src}/app/api/chats/route.ts | 0 {ui => src}/app/api/config/route.ts | 0 {ui => src}/app/api/discover/route.ts | 0 {ui => src}/app/api/images/route.ts | 6 +- {ui => src}/app/api/models/route.ts | 0 {ui => src}/app/api/suggestions/route.ts | 6 +- {ui => src}/app/api/uploads/route.ts | 0 {ui => src}/app/api/videos/route.ts | 6 +- {ui => src}/app/c/[chatId]/page.tsx | 0 {ui => src}/app/discover/page.tsx | 0 {ui => src}/app/favicon.ico | Bin {ui => src}/app/globals.css | 0 {ui => src}/app/layout.tsx | 0 {ui => src}/app/library/layout.tsx | 0 {ui => src}/app/library/page.tsx | 0 {ui => src}/app/page.tsx | 0 {ui => src}/app/settings/page.tsx | 0 src/chains/imageSearchAgent.ts | 84 - src/chains/suggestionGeneratorAgent.ts | 55 - src/chains/videoSearchAgent.ts | 90 - {ui => src}/components/Chat.tsx | 0 {ui => src}/components/ChatWindow.tsx | 280 +- {ui => src}/components/DeleteChat.tsx | 0 {ui => src}/components/EmptyChat.tsx | 0 .../components/EmptyChatMessageInput.tsx | 0 {ui => src}/components/Layout.tsx | 0 .../components/MessageActions/Copy.tsx | 0 .../components/MessageActions/Rewrite.tsx | 0 {ui => src}/components/MessageBox.tsx | 0 {ui => src}/components/MessageBoxLoading.tsx | 0 {ui => src}/components/MessageInput.tsx | 0 .../components/MessageInputActions/Attach.tsx | 0 .../MessageInputActions/AttachSmall.tsx | 0 .../MessageInputActions/Copilot.tsx | 0 .../components/MessageInputActions/Focus.tsx | 0 .../MessageInputActions/Optimization.tsx | 0 {ui => src}/components/MessageSources.tsx | 0 {ui => src}/components/Navbar.tsx | 0 {ui => src}/components/SearchImages.tsx | 0 {ui => src}/components/SearchVideos.tsx | 0 {ui => src}/components/Sidebar.tsx | 0 {ui => src}/components/theme/Provider.tsx | 0 {ui => src}/components/theme/Switcher.tsx | 0 {ui => src}/components/ui/Select.tsx | 0 src/config.ts | 117 - src/db/index.ts | 10 - {ui => src}/lib/actions.ts | 0 {ui => src}/lib/chains/imageSearchAgent.ts | 0 .../lib/chains/suggestionGeneratorAgent.ts | 0 {ui => src}/lib/chains/videoSearchAgent.ts | 0 {ui => src}/lib/config.ts | 2 +- {ui => src}/lib/db/index.ts | 0 src/{ => lib}/db/schema.ts | 0 src/lib/huggingfaceTransformer.ts | 82 - src/lib/outputParsers/lineOutputParser.ts | 2 +- src/lib/outputParsers/listLineOutputParser.ts | 2 +- src/{ => lib}/prompts/academicSearch.ts | 0 src/{ => lib}/prompts/index.ts | 0 src/{ => lib}/prompts/redditSearch.ts | 0 src/{ => lib}/prompts/webSearch.ts | 0 src/{ => lib}/prompts/wolframAlpha.ts | 0 src/{ => lib}/prompts/writingAssistant.ts | 0 src/{ => lib}/prompts/youtubeSearch.ts | 0 src/lib/providers/anthropic.ts | 95 +- src/lib/providers/gemini.ts | 129 +- src/lib/providers/groq.ts | 212 +- src/lib/providers/index.ts | 50 +- src/lib/providers/ollama.ts | 59 +- src/lib/providers/openai.ts | 129 +- src/lib/providers/transformers.ts | 32 - {ui => src}/lib/search/metaSearchAgent.ts | 0 src/lib/searxng.ts | 9 +- {ui => src}/lib/types/compute-dot.d.ts | 0 {ui => src}/lib/utils.ts | 0 {ui => src}/lib/utils/computeSimilarity.ts | 0 {ui => src}/lib/utils/documents.ts | 0 src/{ => lib}/utils/files.ts | 0 src/{ => lib}/utils/formatHistory.ts | 0 src/routes/chats.ts | 66 - src/routes/config.ts | 104 - src/routes/discover.ts | 48 - src/routes/images.ts | 82 - src/routes/index.ts | 24 - src/routes/models.ts | 36 - src/routes/search.ts | 158 - src/routes/suggestions.ts | 81 - src/routes/uploads.ts | 151 - src/routes/videos.ts | 82 - src/search/metaSearchAgent.ts | 494 -- src/utils/computeSimilarity.ts | 17 - src/utils/documents.ts | 99 - src/utils/logger.ts | 22 - src/websocket/connectionManager.ts | 122 - src/websocket/index.ts | 8 - src/websocket/messageHandler.ts | 272 - src/websocket/websocketServer.ts | 16 - ui/tailwind.config.ts => tailwind.config.ts | 6 +- tsconfig.json | 35 +- ui/.env.example | 2 - ui/.gitignore | 34 - ui/.prettierignore | 41 - ui/.prettierrc.js | 11 - ui/data/.gitignore | 2 - ui/drizzle.config.ts | 10 - ui/lib/db/schema.ts | 28 - ui/lib/outputParsers/lineOutputParser.ts | 48 - ui/lib/outputParsers/listLineOutputParser.ts | 50 - ui/lib/prompts/academicSearch.ts | 65 - ui/lib/prompts/index.ts | 32 - ui/lib/prompts/redditSearch.ts | 65 - ui/lib/prompts/webSearch.ts | 106 - ui/lib/prompts/wolframAlpha.ts | 65 - ui/lib/prompts/writingAssistant.ts | 13 - ui/lib/prompts/youtubeSearch.ts | 65 - ui/lib/providers/anthropic.ts | 63 - ui/lib/providers/gemini.ts | 94 - ui/lib/providers/groq.ts | 107 - ui/lib/providers/index.ts | 91 - ui/lib/providers/ollama.ts | 73 - ui/lib/providers/openai.ts | 88 - ui/lib/searxng.ts | 48 - ui/lib/utils/files.ts | 17 - ui/lib/utils/formatHistory.ts | 9 - ui/package.json | 62 - ui/tsconfig.json | 27 - ui/uploads/.gitignore | 2 - ui/yarn.lock | 4883 ----------------- yarn.lock | 4185 +++++++++----- 145 files changed, 3546 insertions(+), 10516 deletions(-) rename ui/.eslintrc.json => .eslintrc.json (100%) delete mode 100644 backend.dockerfile create mode 100644 next-env.d.ts rename ui/next.config.mjs => next.config.mjs (100%) rename ui/postcss.config.js => postcss.config.js (100%) rename {ui/public => public}/next.svg (100%) rename {ui/public => public}/vercel.svg (100%) delete mode 100644 src/app.ts rename {ui => src}/app/api/chat/route.ts (80%) rename {ui => src}/app/api/chats/[id]/route.ts (100%) rename {ui => src}/app/api/chats/route.ts (100%) rename {ui => src}/app/api/config/route.ts (100%) rename {ui => src}/app/api/discover/route.ts (100%) rename {ui => src}/app/api/images/route.ts (92%) rename {ui => src}/app/api/models/route.ts (100%) rename {ui => src}/app/api/suggestions/route.ts (92%) rename {ui => src}/app/api/uploads/route.ts (100%) rename {ui => src}/app/api/videos/route.ts (92%) rename {ui => src}/app/c/[chatId]/page.tsx (100%) rename {ui => src}/app/discover/page.tsx (100%) rename {ui => src}/app/favicon.ico (100%) rename {ui => src}/app/globals.css (100%) rename {ui => src}/app/layout.tsx (100%) rename {ui => src}/app/library/layout.tsx (100%) rename {ui => src}/app/library/page.tsx (100%) rename {ui => src}/app/page.tsx (100%) rename {ui => src}/app/settings/page.tsx (100%) delete mode 100644 src/chains/imageSearchAgent.ts delete mode 100644 src/chains/suggestionGeneratorAgent.ts delete mode 100644 src/chains/videoSearchAgent.ts rename {ui => src}/components/Chat.tsx (100%) rename {ui => src}/components/ChatWindow.tsx (73%) rename {ui => src}/components/DeleteChat.tsx (100%) rename {ui => src}/components/EmptyChat.tsx (100%) rename {ui => src}/components/EmptyChatMessageInput.tsx (100%) rename {ui => src}/components/Layout.tsx (100%) rename {ui => src}/components/MessageActions/Copy.tsx (100%) rename {ui => src}/components/MessageActions/Rewrite.tsx (100%) rename {ui => src}/components/MessageBox.tsx (100%) rename {ui => src}/components/MessageBoxLoading.tsx (100%) rename {ui => src}/components/MessageInput.tsx (100%) rename {ui => src}/components/MessageInputActions/Attach.tsx (100%) rename {ui => src}/components/MessageInputActions/AttachSmall.tsx (100%) rename {ui => src}/components/MessageInputActions/Copilot.tsx (100%) rename {ui => src}/components/MessageInputActions/Focus.tsx (100%) rename {ui => src}/components/MessageInputActions/Optimization.tsx (100%) rename {ui => src}/components/MessageSources.tsx (100%) rename {ui => src}/components/Navbar.tsx (100%) rename {ui => src}/components/SearchImages.tsx (100%) rename {ui => src}/components/SearchVideos.tsx (100%) rename {ui => src}/components/Sidebar.tsx (100%) rename {ui => src}/components/theme/Provider.tsx (100%) rename {ui => src}/components/theme/Switcher.tsx (100%) rename {ui => src}/components/ui/Select.tsx (100%) delete mode 100644 src/config.ts delete mode 100644 src/db/index.ts rename {ui => src}/lib/actions.ts (100%) rename {ui => src}/lib/chains/imageSearchAgent.ts (100%) rename {ui => src}/lib/chains/suggestionGeneratorAgent.ts (100%) rename {ui => src}/lib/chains/videoSearchAgent.ts (100%) rename {ui => src}/lib/config.ts (97%) rename {ui => src}/lib/db/index.ts (100%) rename src/{ => lib}/db/schema.ts (100%) delete mode 100644 src/lib/huggingfaceTransformer.ts rename src/{ => lib}/prompts/academicSearch.ts (100%) rename src/{ => lib}/prompts/index.ts (100%) rename src/{ => lib}/prompts/redditSearch.ts (100%) rename src/{ => lib}/prompts/webSearch.ts (100%) rename src/{ => lib}/prompts/wolframAlpha.ts (100%) rename src/{ => lib}/prompts/writingAssistant.ts (100%) rename src/{ => lib}/prompts/youtubeSearch.ts (100%) delete mode 100644 src/lib/providers/transformers.ts rename {ui => src}/lib/search/metaSearchAgent.ts (100%) rename {ui => src}/lib/types/compute-dot.d.ts (100%) rename {ui => src}/lib/utils.ts (100%) rename {ui => src}/lib/utils/computeSimilarity.ts (100%) rename {ui => src}/lib/utils/documents.ts (100%) rename src/{ => lib}/utils/files.ts (100%) rename src/{ => lib}/utils/formatHistory.ts (100%) delete mode 100644 src/routes/chats.ts delete mode 100644 src/routes/config.ts delete mode 100644 src/routes/discover.ts delete mode 100644 src/routes/images.ts delete mode 100644 src/routes/index.ts delete mode 100644 src/routes/models.ts delete mode 100644 src/routes/search.ts delete mode 100644 src/routes/suggestions.ts delete mode 100644 src/routes/uploads.ts delete mode 100644 src/routes/videos.ts delete mode 100644 src/search/metaSearchAgent.ts delete mode 100644 src/utils/computeSimilarity.ts delete mode 100644 src/utils/documents.ts delete mode 100644 src/utils/logger.ts delete mode 100644 src/websocket/connectionManager.ts delete mode 100644 src/websocket/index.ts delete mode 100644 src/websocket/messageHandler.ts delete mode 100644 src/websocket/websocketServer.ts rename ui/tailwind.config.ts => tailwind.config.ts (88%) delete mode 100644 ui/.env.example delete mode 100644 ui/.gitignore delete mode 100644 ui/.prettierignore delete mode 100644 ui/.prettierrc.js delete mode 100644 ui/data/.gitignore delete mode 100644 ui/drizzle.config.ts delete mode 100644 ui/lib/db/schema.ts delete mode 100644 ui/lib/outputParsers/lineOutputParser.ts delete mode 100644 ui/lib/outputParsers/listLineOutputParser.ts delete mode 100644 ui/lib/prompts/academicSearch.ts delete mode 100644 ui/lib/prompts/index.ts delete mode 100644 ui/lib/prompts/redditSearch.ts delete mode 100644 ui/lib/prompts/webSearch.ts delete mode 100644 ui/lib/prompts/wolframAlpha.ts delete mode 100644 ui/lib/prompts/writingAssistant.ts delete mode 100644 ui/lib/prompts/youtubeSearch.ts delete mode 100644 ui/lib/providers/anthropic.ts delete mode 100644 ui/lib/providers/gemini.ts delete mode 100644 ui/lib/providers/groq.ts delete mode 100644 ui/lib/providers/index.ts delete mode 100644 ui/lib/providers/ollama.ts delete mode 100644 ui/lib/providers/openai.ts delete mode 100644 ui/lib/searxng.ts delete mode 100644 ui/lib/utils/files.ts delete mode 100644 ui/lib/utils/formatHistory.ts delete mode 100644 ui/package.json delete mode 100644 ui/tsconfig.json delete mode 100644 ui/uploads/.gitignore delete mode 100644 ui/yarn.lock diff --git a/ui/.eslintrc.json b/.eslintrc.json similarity index 100% rename from ui/.eslintrc.json rename to .eslintrc.json diff --git a/.gitignore b/.gitignore index 8391d19..c95173d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,9 @@ npm-debug.log yarn-error.log # Build output -/.next/ -/out/ -/dist/ +.next/ +out/ +dist/ # IDE/Editor specific .vscode/ diff --git a/.prettierrc.js b/.prettierrc.js index 1937ff1..8ca480f 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -6,7 +6,6 @@ const config = { endOfLine: 'auto', singleQuote: true, tabWidth: 2, - semi: true, }; module.exports = config; diff --git a/app.dockerfile b/app.dockerfile index 488e64b..97c6a96 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,13 +1,20 @@ FROM node:20.18.0-alpine -ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 -ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api -ENV NEXT_PUBLIC_WS_URL=${NEXT_PUBLIC_WS_URL} -ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} - WORKDIR /home/perplexica -COPY ui /home/perplexica/ +COPY src /home/perplexica/src +COPY public /home/perplexica/public +COPY package.json /home/perplexica/package.json +COPY yarn.lock /home/perplexica/yarn.lock +COPY tsconfig.json /home/perplexica/tsconfig.json +COPY next.config.mjs /home/perplexica/next.config.mjs +COPY next-env.d.ts /home/perplexica/next-env.d.ts +COPY postcss.config.js /home/perplexica/postcss.config.js +COPY drizzle.config.ts /home/perplexica/drizzle.config.ts +COPY tailwind.config.ts /home/perplexica/tailwind.config.ts + +RUN mkdir /home/perplexica/data +RUN mkdir /home/perplexica/uploads RUN yarn install --frozen-lockfile RUN yarn build diff --git a/backend.dockerfile b/backend.dockerfile deleted file mode 100644 index b6ab95a..0000000 --- a/backend.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM node:18-slim - -WORKDIR /home/perplexica - -COPY src /home/perplexica/src -COPY tsconfig.json /home/perplexica/ -COPY drizzle.config.ts /home/perplexica/ -COPY package.json /home/perplexica/ -COPY yarn.lock /home/perplexica/ - -RUN mkdir /home/perplexica/data -RUN mkdir /home/perplexica/uploads - -RUN yarn install --frozen-lockfile --network-timeout 600000 -RUN yarn build - -CMD ["yarn", "start"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index a0e1d73..631e42b 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -9,41 +9,20 @@ services: - perplexica-network restart: unless-stopped - perplexica-backend: - build: - context: . - dockerfile: backend.dockerfile - image: itzcrazykns1337/perplexica-backend:main - environment: - - SEARXNG_API_URL=http://searxng:8080 - depends_on: - - searxng - ports: - - 3001:3001 - volumes: - - backend-dbstore:/home/perplexica/data - - uploads:/home/perplexica/uploads - - ./config.toml:/home/perplexica/config.toml - extra_hosts: - - 'host.docker.internal:host-gateway' - networks: - - perplexica-network - restart: unless-stopped - - perplexica-frontend: + app: build: context: . dockerfile: app.dockerfile - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - image: itzcrazykns1337/perplexica-frontend:main - depends_on: - - perplexica-backend + environment: + - SEARXNG_API_URL=http://searxng:8080 ports: - 3000:3000 networks: - perplexica-network + volumes: + - backend-dbstore:/home/perplexica/data + - uploads:/home/perplexica/uploads + - ./config.toml:/home/perplexica/config.toml restart: unless-stopped networks: diff --git a/drizzle.config.ts b/drizzle.config.ts index 9ac3ec5..58de9e0 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'drizzle-kit'; export default defineConfig({ dialect: 'sqlite', - schema: './src/db/schema.ts', + schema: './src/lib/db/schema.ts', out: './drizzle', dbCredentials: { url: './data/db.sqlite', diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..1b3be08 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// <reference types="next" /> +/// <reference types="next/image-types/global" /> + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/ui/next.config.mjs b/next.config.mjs similarity index 100% rename from ui/next.config.mjs rename to next.config.mjs diff --git a/package.json b/package.json index 6041377..c9314b4 100644 --- a/package.json +++ b/package.json @@ -1,53 +1,62 @@ { - "name": "perplexica-backend", + "name": "perplexica-frontend", "version": "1.10.0-rc3", "license": "MIT", "author": "ItzCrazyKns", "scripts": { - "start": "npm run db:push && node dist/app.js", - "build": "tsc", - "dev": "nodemon --ignore uploads/ src/app.ts ", - "db:push": "drizzle-kit push sqlite", - "format": "prettier . --check", - "format:write": "prettier . --write" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.10", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/html-to-text": "^9.0.4", - "@types/multer": "^1.4.12", - "@types/pdf-parse": "^1.1.4", - "@types/readable-stream": "^4.0.11", - "@types/ws": "^8.5.12", - "drizzle-kit": "^0.22.7", - "nodemon": "^3.1.0", - "prettier": "^3.2.5", - "ts-node": "^10.9.2", - "typescript": "^5.4.3" + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "format:write": "prettier . --write", + "db:push": "drizzle-kit push sqlite" }, "dependencies": { + "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", - "@langchain/anthropic": "^0.2.3", - "@langchain/community": "^0.2.16", + "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/community": "^0.3.36", + "@langchain/core": "^0.3.42", "@langchain/openai": "^0.0.25", - "@langchain/google-genai": "^0.0.23", - "@xenova/transformers": "^2.17.1", - "axios": "^1.6.8", - "better-sqlite3": "^11.0.0", + "@langchain/textsplitters": "^0.1.0", + "@tailwindcss/typography": "^0.5.12", + "axios": "^1.8.3", + "better-sqlite3": "^11.9.1", + "clsx": "^2.1.0", "compute-cosine-similarity": "^1.1.0", "compute-dot": "^1.1.0", - "cors": "^2.8.5", - "dotenv": "^16.4.5", - "drizzle-orm": "^0.31.2", - "express": "^4.19.2", + "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", "langchain": "^0.1.30", - "mammoth": "^1.8.0", - "multer": "^1.4.5-lts.1", + "lucide-react": "^0.363.0", + "markdown-to-jsx": "^7.7.2", + "next": "^15.2.2", + "next-themes": "^0.3.0", "pdf-parse": "^1.1.1", - "winston": "^3.13.0", - "ws": "^8.17.1", + "react": "^18", + "react-dom": "^18", + "react-text-to-speech": "^0.14.5", + "react-textarea-autosize": "^8.5.3", + "sonner": "^1.4.41", + "tailwind-merge": "^2.2.2", + "winston": "^3.17.0", + "yet-another-react-lightbox": "^3.17.2", "zod": "^3.22.4" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.12", + "@types/html-to-text": "^9.0.4", + "@types/node": "^20", + "@types/pdf-parse": "^1.1.4", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "drizzle-kit": "^0.30.5", + "eslint": "^8", + "eslint-config-next": "14.1.4", + "postcss": "^8", + "prettier": "^3.2.5", + "tailwindcss": "^3.3.0", + "typescript": "^5" } } diff --git a/ui/postcss.config.js b/postcss.config.js similarity index 100% rename from ui/postcss.config.js rename to postcss.config.js diff --git a/ui/public/next.svg b/public/next.svg similarity index 100% rename from ui/public/next.svg rename to public/next.svg diff --git a/ui/public/vercel.svg b/public/vercel.svg similarity index 100% rename from ui/public/vercel.svg rename to public/vercel.svg diff --git a/sample.config.toml b/sample.config.toml index cddb19d..0a800a0 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -24,4 +24,4 @@ MODEL_NAME = "" API_URL = "" # Ollama API URL - http://host.docker.internal:11434 [API_ENDPOINTS] -SEARXNG = "http://localhost:32768" # SearxNG API URL \ No newline at end of file +SEARXNG = "" # SearxNG API URL - http://localhost:32768 \ No newline at end of file diff --git a/src/app.ts b/src/app.ts deleted file mode 100644 index 96b3a0c..0000000 --- a/src/app.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { startWebSocketServer } from './websocket'; -import express from 'express'; -import cors from 'cors'; -import http from 'http'; -import routes from './routes'; -import { getPort } from './config'; -import logger from './utils/logger'; - -const port = getPort(); - -const app = express(); -const server = http.createServer(app); - -const corsOptions = { - origin: '*', -}; - -app.use(cors(corsOptions)); -app.use(express.json()); - -app.use('/api', routes); -app.get('/api', (_, res) => { - res.status(200).json({ status: 'ok' }); -}); - -server.listen(port, () => { - logger.info(`Server is running on port ${port}`); -}); - -startWebSocketServer(server); - -process.on('uncaughtException', (err, origin) => { - logger.error(`Uncaught Exception at ${origin}: ${err}`); -}); - -process.on('unhandledRejection', (reason, promise) => { - logger.error(`Unhandled Rejection at: ${promise}, reason: ${reason}`); -}); diff --git a/ui/app/api/chat/route.ts b/src/app/api/chat/route.ts similarity index 80% rename from ui/app/api/chat/route.ts rename to src/app/api/chat/route.ts index 0b130de..918fd48 100644 --- a/ui/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -3,16 +3,28 @@ import MetaSearchAgent from '@/lib/search/metaSearchAgent'; import crypto from 'crypto'; import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { EventEmitter } from 'stream'; -import { chatModelProviders, embeddingModelProviders } from '@/lib/providers'; +import { + chatModelProviders, + embeddingModelProviders, + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '@/lib/providers'; import db from '@/lib/db'; import { chats, messages as messagesSchema } from '@/lib/db/schema'; import { and, eq, gt } from 'drizzle-orm'; import { getFileDetails } from '@/lib/utils/files'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { ChatOpenAI } from '@langchain/openai'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; export const runtime = 'nodejs'; export const dynamic = 'force-dynamic'; -export const searchHandlers: Record<string, MetaSearchAgent> = { +const searchHandlers: Record<string, MetaSearchAgent> = { webSearch: new MetaSearchAgent({ activeEngines: [], queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, @@ -227,7 +239,7 @@ const handleHistorySave = async ( export const POST = async (req: Request) => { try { const body = (await req.json()) as Body; - const { message, chatModel, embeddingModel } = body; + const { message } = body; if (message.content === '') { return Response.json( @@ -238,50 +250,52 @@ export const POST = async (req: Request) => { ); } - const getProviderChatModels = chatModelProviders[chatModel.provider]; + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); - if (!getProviderChatModels) { - return Response.json( - { - message: 'Invalid chat model provider', + const chatModelProvider = + chatModelProviders[ + body.chatModel?.provider || Object.keys(chatModelProviders)[0] + ]; + const chatModel = + chatModelProvider[ + body.chatModel?.name || Object.keys(chatModelProvider)[0] + ]; + + const embeddingProvider = + embeddingModelProviders[ + body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0] + ]; + const embeddingModel = + embeddingProvider[ + body.embeddingModel?.name || Object.keys(embeddingProvider)[0] + ]; + + let llm: BaseChatModel | undefined; + let embedding = embeddingModel.model; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + openAIApiKey: getCustomOpenaiApiKey(), + modelName: getCustomOpenaiModelName(), + temperature: 0.7, + configuration: { + baseURL: getCustomOpenaiApiUrl(), }, - { status: 400 }, - ); + }) as unknown as BaseChatModel; + } else if (chatModelProvider && chatModel) { + llm = chatModel.model; } - const chatModels = await getProviderChatModels(); - - const llm = chatModels[chatModel.name].model; - if (!llm) { - return Response.json( - { - message: 'Invalid chat model', - }, - { status: 400 }, - ); + return Response.json({ error: 'Invalid chat model' }, { status: 400 }); } - const getProviderEmbeddingModels = - embeddingModelProviders[embeddingModel.provider]; - - if (!getProviderEmbeddingModels) { - return Response.json( - { - message: 'Invalid embedding model provider', - }, - { status: 400 }, - ); - } - - const embeddingModels = await getProviderEmbeddingModels(); - const embedding = embeddingModels[embeddingModel.name].model; - if (!embedding) { return Response.json( - { - message: 'Invalid embedding model', - }, + { error: 'Invalid embedding model' }, { status: 400 }, ); } diff --git a/ui/app/api/chats/[id]/route.ts b/src/app/api/chats/[id]/route.ts similarity index 100% rename from ui/app/api/chats/[id]/route.ts rename to src/app/api/chats/[id]/route.ts diff --git a/ui/app/api/chats/route.ts b/src/app/api/chats/route.ts similarity index 100% rename from ui/app/api/chats/route.ts rename to src/app/api/chats/route.ts diff --git a/ui/app/api/config/route.ts b/src/app/api/config/route.ts similarity index 100% rename from ui/app/api/config/route.ts rename to src/app/api/config/route.ts diff --git a/ui/app/api/discover/route.ts b/src/app/api/discover/route.ts similarity index 100% rename from ui/app/api/discover/route.ts rename to src/app/api/discover/route.ts diff --git a/ui/app/api/images/route.ts b/src/app/api/images/route.ts similarity index 92% rename from ui/app/api/images/route.ts rename to src/app/api/images/route.ts index 4114cbd..f0a6773 100644 --- a/ui/app/api/images/route.ts +++ b/src/app/api/images/route.ts @@ -6,7 +6,7 @@ import { } from '@/lib/config'; import { getAvailableChatModelProviders } from '@/lib/providers'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { ChatOpenAI } from '@langchain/openai'; interface ChatModel { @@ -32,7 +32,7 @@ export const POST = async (req: Request) => { return new AIMessage(msg.content); } }) - .filter((msg) => msg !== undefined); + .filter((msg) => msg !== undefined) as BaseMessage[]; const chatModelProviders = await getAvailableChatModelProviders(); @@ -55,7 +55,7 @@ export const POST = async (req: Request) => { configuration: { baseURL: getCustomOpenaiApiUrl(), }, - }); + }) as unknown as BaseChatModel; } else if (chatModelProvider && chatModel) { llm = chatModel.model; } diff --git a/ui/app/api/models/route.ts b/src/app/api/models/route.ts similarity index 100% rename from ui/app/api/models/route.ts rename to src/app/api/models/route.ts diff --git a/ui/app/api/suggestions/route.ts b/src/app/api/suggestions/route.ts similarity index 92% rename from ui/app/api/suggestions/route.ts rename to src/app/api/suggestions/route.ts index f28092e..4a931df 100644 --- a/ui/app/api/suggestions/route.ts +++ b/src/app/api/suggestions/route.ts @@ -6,7 +6,7 @@ import { } from '@/lib/config'; import { getAvailableChatModelProviders } from '@/lib/providers'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { ChatOpenAI } from '@langchain/openai'; interface ChatModel { @@ -31,7 +31,7 @@ export const POST = async (req: Request) => { return new AIMessage(msg.content); } }) - .filter((msg) => msg !== undefined); + .filter((msg) => msg !== undefined) as BaseMessage[]; const chatModelProviders = await getAvailableChatModelProviders(); @@ -54,7 +54,7 @@ export const POST = async (req: Request) => { configuration: { baseURL: getCustomOpenaiApiUrl(), }, - }); + }) as unknown as BaseChatModel; } else if (chatModelProvider && chatModel) { llm = chatModel.model; } diff --git a/ui/app/api/uploads/route.ts b/src/app/api/uploads/route.ts similarity index 100% rename from ui/app/api/uploads/route.ts rename to src/app/api/uploads/route.ts diff --git a/ui/app/api/videos/route.ts b/src/app/api/videos/route.ts similarity index 92% rename from ui/app/api/videos/route.ts rename to src/app/api/videos/route.ts index 9b4bf9f..6153490 100644 --- a/ui/app/api/videos/route.ts +++ b/src/app/api/videos/route.ts @@ -6,7 +6,7 @@ import { } from '@/lib/config'; import { getAvailableChatModelProviders } from '@/lib/providers'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { ChatOpenAI } from '@langchain/openai'; interface ChatModel { @@ -32,7 +32,7 @@ export const POST = async (req: Request) => { return new AIMessage(msg.content); } }) - .filter((msg) => msg !== undefined); + .filter((msg) => msg !== undefined) as BaseMessage[]; const chatModelProviders = await getAvailableChatModelProviders(); @@ -55,7 +55,7 @@ export const POST = async (req: Request) => { configuration: { baseURL: getCustomOpenaiApiUrl(), }, - }); + }) as unknown as BaseChatModel; } else if (chatModelProvider && chatModel) { llm = chatModel.model; } diff --git a/ui/app/c/[chatId]/page.tsx b/src/app/c/[chatId]/page.tsx similarity index 100% rename from ui/app/c/[chatId]/page.tsx rename to src/app/c/[chatId]/page.tsx diff --git a/ui/app/discover/page.tsx b/src/app/discover/page.tsx similarity index 100% rename from ui/app/discover/page.tsx rename to src/app/discover/page.tsx diff --git a/ui/app/favicon.ico b/src/app/favicon.ico similarity index 100% rename from ui/app/favicon.ico rename to src/app/favicon.ico diff --git a/ui/app/globals.css b/src/app/globals.css similarity index 100% rename from ui/app/globals.css rename to src/app/globals.css diff --git a/ui/app/layout.tsx b/src/app/layout.tsx similarity index 100% rename from ui/app/layout.tsx rename to src/app/layout.tsx diff --git a/ui/app/library/layout.tsx b/src/app/library/layout.tsx similarity index 100% rename from ui/app/library/layout.tsx rename to src/app/library/layout.tsx diff --git a/ui/app/library/page.tsx b/src/app/library/page.tsx similarity index 100% rename from ui/app/library/page.tsx rename to src/app/library/page.tsx diff --git a/ui/app/page.tsx b/src/app/page.tsx similarity index 100% rename from ui/app/page.tsx rename to src/app/page.tsx diff --git a/ui/app/settings/page.tsx b/src/app/settings/page.tsx similarity index 100% rename from ui/app/settings/page.tsx rename to src/app/settings/page.tsx diff --git a/src/chains/imageSearchAgent.ts b/src/chains/imageSearchAgent.ts deleted file mode 100644 index 167019f..0000000 --- a/src/chains/imageSearchAgent.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { PromptTemplate } from '@langchain/core/prompts'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import { BaseMessage } from '@langchain/core/messages'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { searchSearxng } from '../lib/searxng'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; - -const imageSearchChainPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search the web for images. -You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. - -Example: -1. Follow up question: What is a cat? -Rephrased: A cat - -2. Follow up question: What is a car? How does it works? -Rephrased: Car working - -3. Follow up question: How does an AC work? -Rephrased: AC working - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -type ImageSearchChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const strParser = new StringOutputParser(); - -const createImageSearchChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - RunnableMap.from({ - chat_history: (input: ImageSearchChainInput) => { - return formatChatHistoryAsString(input.chat_history); - }, - query: (input: ImageSearchChainInput) => { - return input.query; - }, - }), - PromptTemplate.fromTemplate(imageSearchChainPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - const res = await searchSearxng(input, { - engines: ['bing images', 'google images'], - }); - - const images = []; - - res.results.forEach((result) => { - if (result.img_src && result.url && result.title) { - images.push({ - img_src: result.img_src, - url: result.url, - title: result.title, - }); - } - }); - - return images.slice(0, 10); - }), - ]); -}; - -const handleImageSearch = ( - input: ImageSearchChainInput, - llm: BaseChatModel, -) => { - const imageSearchChain = createImageSearchChain(llm); - return imageSearchChain.invoke(input); -}; - -export default handleImageSearch; diff --git a/src/chains/suggestionGeneratorAgent.ts b/src/chains/suggestionGeneratorAgent.ts deleted file mode 100644 index 6ba255d..0000000 --- a/src/chains/suggestionGeneratorAgent.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { RunnableSequence, RunnableMap } from '@langchain/core/runnables'; -import ListLineOutputParser from '../lib/outputParsers/listLineOutputParser'; -import { PromptTemplate } from '@langchain/core/prompts'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import { BaseMessage } from '@langchain/core/messages'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { ChatOpenAI } from '@langchain/openai'; - -const suggestionGeneratorPrompt = ` -You are an AI suggestion generator for an AI powered search engine. You will be given a conversation below. You need to generate 4-5 suggestions based on the conversation. The suggestion should be relevant to the conversation that can be used by the user to ask the chat model for more information. -You need to make sure the suggestions are relevant to the conversation and are helpful to the user. Keep a note that the user might use these suggestions to ask a chat model for more information. -Make sure the suggestions are medium in length and are informative and relevant to the conversation. - -Provide these suggestions separated by newlines between the XML tags <suggestions> and </suggestions>. For example: - -<suggestions> -Tell me more about SpaceX and their recent projects -What is the latest news on SpaceX? -Who is the CEO of SpaceX? -</suggestions> - -Conversation: -{chat_history} -`; - -type SuggestionGeneratorInput = { - chat_history: BaseMessage[]; -}; - -const outputParser = new ListLineOutputParser({ - key: 'suggestions', -}); - -const createSuggestionGeneratorChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - RunnableMap.from({ - chat_history: (input: SuggestionGeneratorInput) => - formatChatHistoryAsString(input.chat_history), - }), - PromptTemplate.fromTemplate(suggestionGeneratorPrompt), - llm, - outputParser, - ]); -}; - -const generateSuggestions = ( - input: SuggestionGeneratorInput, - llm: BaseChatModel, -) => { - (llm as unknown as ChatOpenAI).temperature = 0; - const suggestionGeneratorChain = createSuggestionGeneratorChain(llm); - return suggestionGeneratorChain.invoke(input); -}; - -export default generateSuggestions; diff --git a/src/chains/videoSearchAgent.ts b/src/chains/videoSearchAgent.ts deleted file mode 100644 index cdd1ac0..0000000 --- a/src/chains/videoSearchAgent.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { PromptTemplate } from '@langchain/core/prompts'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import { BaseMessage } from '@langchain/core/messages'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { searchSearxng } from '../lib/searxng'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; - -const VideoSearchChainPrompt = ` - You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos. - You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. - - Example: - 1. Follow up question: How does a car work? - Rephrased: How does a car work? - - 2. Follow up question: What is the theory of relativity? - Rephrased: What is theory of relativity - - 3. Follow up question: How does an AC work? - Rephrased: How does an AC work - - Conversation: - {chat_history} - - Follow up question: {query} - Rephrased question: - `; - -type VideoSearchChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const strParser = new StringOutputParser(); - -const createVideoSearchChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - RunnableMap.from({ - chat_history: (input: VideoSearchChainInput) => { - return formatChatHistoryAsString(input.chat_history); - }, - query: (input: VideoSearchChainInput) => { - return input.query; - }, - }), - PromptTemplate.fromTemplate(VideoSearchChainPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - const res = await searchSearxng(input, { - engines: ['youtube'], - }); - - const videos = []; - - res.results.forEach((result) => { - if ( - result.thumbnail && - result.url && - result.title && - result.iframe_src - ) { - videos.push({ - img_src: result.thumbnail, - url: result.url, - title: result.title, - iframe_src: result.iframe_src, - }); - } - }); - - return videos.slice(0, 10); - }), - ]); -}; - -const handleVideoSearch = ( - input: VideoSearchChainInput, - llm: BaseChatModel, -) => { - const VideoSearchChain = createVideoSearchChain(llm); - return VideoSearchChain.invoke(input); -}; - -export default handleVideoSearch; diff --git a/ui/components/Chat.tsx b/src/components/Chat.tsx similarity index 100% rename from ui/components/Chat.tsx rename to src/components/Chat.tsx diff --git a/ui/components/ChatWindow.tsx b/src/components/ChatWindow.tsx similarity index 73% rename from ui/components/ChatWindow.tsx rename to src/components/ChatWindow.tsx index f642525..47bbab2 100644 --- a/ui/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -45,159 +45,138 @@ const checkConfig = async ( setIsConfigReady: (ready: boolean) => void, setHasError: (hasError: boolean) => void, ) => { - useEffect(() => { - const checkConfig = async () => { - try { - let chatModel = localStorage.getItem('chatModel'); - let chatModelProvider = localStorage.getItem('chatModelProvider'); - let embeddingModel = localStorage.getItem('embeddingModel'); - let embeddingModelProvider = localStorage.getItem( - 'embeddingModelProvider', + try { + let chatModel = localStorage.getItem('chatModel'); + let chatModelProvider = localStorage.getItem('chatModelProvider'); + let embeddingModel = localStorage.getItem('embeddingModel'); + let embeddingModelProvider = localStorage.getItem('embeddingModelProvider'); + + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (!autoImageSearch) { + localStorage.setItem('autoImageSearch', 'true'); + } + + if (!autoVideoSearch) { + localStorage.setItem('autoVideoSearch', 'false'); + } + + const providers = await fetch(`/api/models`, { + headers: { + 'Content-Type': 'application/json', + }, + }).then(async (res) => { + if (!res.ok) + throw new Error( + `Failed to fetch models: ${res.status} ${res.statusText}`, ); + return res.json(); + }); - const autoImageSearch = localStorage.getItem('autoImageSearch'); - const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + if ( + !chatModel || + !chatModelProvider || + !embeddingModel || + !embeddingModelProvider + ) { + if (!chatModel || !chatModelProvider) { + const chatModelProviders = providers.chatModelProviders; - if (!autoImageSearch) { - localStorage.setItem('autoImageSearch', 'true'); - } + chatModelProvider = + chatModelProvider || Object.keys(chatModelProviders)[0]; - if (!autoVideoSearch) { - localStorage.setItem('autoVideoSearch', 'false'); - } + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - const providers = await fetch(`/api/models`, { - headers: { - 'Content-Type': 'application/json', - }, - }).then(async (res) => { - if (!res.ok) - throw new Error( - `Failed to fetch models: ${res.status} ${res.statusText}`, - ); - return res.json(); - }); + if (!chatModelProviders || Object.keys(chatModelProviders).length === 0) + return toast.error('No chat models available'); + } + + if (!embeddingModel || !embeddingModelProvider) { + const embeddingModelProviders = providers.embeddingModelProviders; if ( - !chatModel || - !chatModelProvider || - !embeddingModel || - !embeddingModelProvider - ) { - if (!chatModel || !chatModelProvider) { - const chatModelProviders = providers.chatModelProviders; + !embeddingModelProviders || + Object.keys(embeddingModelProviders).length === 0 + ) + return toast.error('No embedding models available'); - chatModelProvider = - chatModelProvider || Object.keys(chatModelProviders)[0]; - - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - - if ( - !chatModelProviders || - Object.keys(chatModelProviders).length === 0 - ) - return toast.error('No chat models available'); - } - - if (!embeddingModel || !embeddingModelProvider) { - const embeddingModelProviders = providers.embeddingModelProviders; - - if ( - !embeddingModelProviders || - Object.keys(embeddingModelProviders).length === 0 - ) - return toast.error('No embedding models available'); - - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; - } - - localStorage.setItem('chatModel', chatModel!); - localStorage.setItem('chatModelProvider', chatModelProvider); - localStorage.setItem('embeddingModel', embeddingModel!); - localStorage.setItem( - 'embeddingModelProvider', - embeddingModelProvider, - ); - } else { - const chatModelProviders = providers.chatModelProviders; - const embeddingModelProviders = providers.embeddingModelProviders; - - if ( - Object.keys(chatModelProviders).length > 0 && - !chatModelProviders[chatModelProvider] - ) { - const chatModelProvidersKeys = Object.keys(chatModelProviders); - chatModelProvider = - chatModelProvidersKeys.find( - (key) => Object.keys(chatModelProviders[key]).length > 0, - ) || chatModelProvidersKeys[0]; - - localStorage.setItem('chatModelProvider', chatModelProvider); - } - - if ( - chatModelProvider && - !chatModelProviders[chatModelProvider][chatModel] - ) { - chatModel = Object.keys( - chatModelProviders[ - Object.keys(chatModelProviders[chatModelProvider]).length > 0 - ? chatModelProvider - : Object.keys(chatModelProviders)[0] - ], - )[0]; - localStorage.setItem('chatModel', chatModel); - } - - if ( - Object.keys(embeddingModelProviders).length > 0 && - !embeddingModelProviders[embeddingModelProvider] - ) { - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - localStorage.setItem( - 'embeddingModelProvider', - embeddingModelProvider, - ); - } - - if ( - embeddingModelProvider && - !embeddingModelProviders[embeddingModelProvider][embeddingModel] - ) { - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; - localStorage.setItem('embeddingModel', embeddingModel); - } - } - - setChatModelProvider({ - name: chatModel!, - provider: chatModelProvider, - }); - - setEmbeddingModelProvider({ - name: embeddingModel!, - provider: embeddingModelProvider, - }); - - setIsConfigReady(true); - } catch (err) { - console.error( - 'An error occurred while checking the configuration:', - err, - ); - setIsConfigReady(false); - setHasError(true); + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; } - }; - checkConfig(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + localStorage.setItem('chatModel', chatModel!); + localStorage.setItem('chatModelProvider', chatModelProvider); + localStorage.setItem('embeddingModel', embeddingModel!); + localStorage.setItem('embeddingModelProvider', embeddingModelProvider); + } else { + const chatModelProviders = providers.chatModelProviders; + const embeddingModelProviders = providers.embeddingModelProviders; + + if ( + Object.keys(chatModelProviders).length > 0 && + !chatModelProviders[chatModelProvider] + ) { + const chatModelProvidersKeys = Object.keys(chatModelProviders); + chatModelProvider = + chatModelProvidersKeys.find( + (key) => Object.keys(chatModelProviders[key]).length > 0, + ) || chatModelProvidersKeys[0]; + + localStorage.setItem('chatModelProvider', chatModelProvider); + } + + if ( + chatModelProvider && + !chatModelProviders[chatModelProvider][chatModel] + ) { + chatModel = Object.keys( + chatModelProviders[ + Object.keys(chatModelProviders[chatModelProvider]).length > 0 + ? chatModelProvider + : Object.keys(chatModelProviders)[0] + ], + )[0]; + localStorage.setItem('chatModel', chatModel); + } + + if ( + Object.keys(embeddingModelProviders).length > 0 && + !embeddingModelProviders[embeddingModelProvider] + ) { + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + localStorage.setItem('embeddingModelProvider', embeddingModelProvider); + } + + if ( + embeddingModelProvider && + !embeddingModelProviders[embeddingModelProvider][embeddingModel] + ) { + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + localStorage.setItem('embeddingModel', embeddingModel); + } + } + + setChatModelProvider({ + name: chatModel!, + provider: chatModelProvider, + }); + + setEmbeddingModelProvider({ + name: embeddingModel!, + provider: embeddingModelProvider, + }); + + setIsConfigReady(true); + } catch (err) { + console.error('An error occurred while checking the configuration:', err); + setIsConfigReady(false); + setHasError(true); + } }; const loadMessages = async ( @@ -282,12 +261,15 @@ const ChatWindow = ({ id }: { id?: string }) => { const [hasError, setHasError] = useState(false); const [isReady, setIsReady] = useState(false); - checkConfig( - setChatModelProvider, - setEmbeddingModelProvider, - setIsConfigReady, - setHasError, - ); + useEffect(() => { + checkConfig( + setChatModelProvider, + setEmbeddingModelProvider, + setIsConfigReady, + setHasError, + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); const [loading, setLoading] = useState(false); const [messageAppeared, setMessageAppeared] = useState(false); diff --git a/ui/components/DeleteChat.tsx b/src/components/DeleteChat.tsx similarity index 100% rename from ui/components/DeleteChat.tsx rename to src/components/DeleteChat.tsx diff --git a/ui/components/EmptyChat.tsx b/src/components/EmptyChat.tsx similarity index 100% rename from ui/components/EmptyChat.tsx rename to src/components/EmptyChat.tsx diff --git a/ui/components/EmptyChatMessageInput.tsx b/src/components/EmptyChatMessageInput.tsx similarity index 100% rename from ui/components/EmptyChatMessageInput.tsx rename to src/components/EmptyChatMessageInput.tsx diff --git a/ui/components/Layout.tsx b/src/components/Layout.tsx similarity index 100% rename from ui/components/Layout.tsx rename to src/components/Layout.tsx diff --git a/ui/components/MessageActions/Copy.tsx b/src/components/MessageActions/Copy.tsx similarity index 100% rename from ui/components/MessageActions/Copy.tsx rename to src/components/MessageActions/Copy.tsx diff --git a/ui/components/MessageActions/Rewrite.tsx b/src/components/MessageActions/Rewrite.tsx similarity index 100% rename from ui/components/MessageActions/Rewrite.tsx rename to src/components/MessageActions/Rewrite.tsx diff --git a/ui/components/MessageBox.tsx b/src/components/MessageBox.tsx similarity index 100% rename from ui/components/MessageBox.tsx rename to src/components/MessageBox.tsx diff --git a/ui/components/MessageBoxLoading.tsx b/src/components/MessageBoxLoading.tsx similarity index 100% rename from ui/components/MessageBoxLoading.tsx rename to src/components/MessageBoxLoading.tsx diff --git a/ui/components/MessageInput.tsx b/src/components/MessageInput.tsx similarity index 100% rename from ui/components/MessageInput.tsx rename to src/components/MessageInput.tsx diff --git a/ui/components/MessageInputActions/Attach.tsx b/src/components/MessageInputActions/Attach.tsx similarity index 100% rename from ui/components/MessageInputActions/Attach.tsx rename to src/components/MessageInputActions/Attach.tsx diff --git a/ui/components/MessageInputActions/AttachSmall.tsx b/src/components/MessageInputActions/AttachSmall.tsx similarity index 100% rename from ui/components/MessageInputActions/AttachSmall.tsx rename to src/components/MessageInputActions/AttachSmall.tsx diff --git a/ui/components/MessageInputActions/Copilot.tsx b/src/components/MessageInputActions/Copilot.tsx similarity index 100% rename from ui/components/MessageInputActions/Copilot.tsx rename to src/components/MessageInputActions/Copilot.tsx diff --git a/ui/components/MessageInputActions/Focus.tsx b/src/components/MessageInputActions/Focus.tsx similarity index 100% rename from ui/components/MessageInputActions/Focus.tsx rename to src/components/MessageInputActions/Focus.tsx diff --git a/ui/components/MessageInputActions/Optimization.tsx b/src/components/MessageInputActions/Optimization.tsx similarity index 100% rename from ui/components/MessageInputActions/Optimization.tsx rename to src/components/MessageInputActions/Optimization.tsx diff --git a/ui/components/MessageSources.tsx b/src/components/MessageSources.tsx similarity index 100% rename from ui/components/MessageSources.tsx rename to src/components/MessageSources.tsx diff --git a/ui/components/Navbar.tsx b/src/components/Navbar.tsx similarity index 100% rename from ui/components/Navbar.tsx rename to src/components/Navbar.tsx diff --git a/ui/components/SearchImages.tsx b/src/components/SearchImages.tsx similarity index 100% rename from ui/components/SearchImages.tsx rename to src/components/SearchImages.tsx diff --git a/ui/components/SearchVideos.tsx b/src/components/SearchVideos.tsx similarity index 100% rename from ui/components/SearchVideos.tsx rename to src/components/SearchVideos.tsx diff --git a/ui/components/Sidebar.tsx b/src/components/Sidebar.tsx similarity index 100% rename from ui/components/Sidebar.tsx rename to src/components/Sidebar.tsx diff --git a/ui/components/theme/Provider.tsx b/src/components/theme/Provider.tsx similarity index 100% rename from ui/components/theme/Provider.tsx rename to src/components/theme/Provider.tsx diff --git a/ui/components/theme/Switcher.tsx b/src/components/theme/Switcher.tsx similarity index 100% rename from ui/components/theme/Switcher.tsx rename to src/components/theme/Switcher.tsx diff --git a/ui/components/ui/Select.tsx b/src/components/ui/Select.tsx similarity index 100% rename from ui/components/ui/Select.tsx rename to src/components/ui/Select.tsx diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index ab2a5db..0000000 --- a/src/config.ts +++ /dev/null @@ -1,117 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import toml from '@iarna/toml'; - -const configFileName = 'config.toml'; - -interface Config { - GENERAL: { - PORT: number; - SIMILARITY_MEASURE: string; - KEEP_ALIVE: string; - }; - MODELS: { - OPENAI: { - API_KEY: string; - }; - GROQ: { - API_KEY: string; - }; - ANTHROPIC: { - API_KEY: string; - }; - GEMINI: { - API_KEY: string; - }; - OLLAMA: { - API_URL: string; - }; - CUSTOM_OPENAI: { - API_URL: string; - API_KEY: string; - MODEL_NAME: string; - }; - }; - API_ENDPOINTS: { - SEARXNG: string; - }; -} - -type RecursivePartial<T> = { - [P in keyof T]?: RecursivePartial<T[P]>; -}; - -const loadConfig = () => - toml.parse( - fs.readFileSync(path.join(__dirname, `../${configFileName}`), 'utf-8'), - ) as any as Config; - -export const getPort = () => loadConfig().GENERAL.PORT; - -export const getSimilarityMeasure = () => - loadConfig().GENERAL.SIMILARITY_MEASURE; - -export const getKeepAlive = () => loadConfig().GENERAL.KEEP_ALIVE; - -export const getOpenaiApiKey = () => loadConfig().MODELS.OPENAI.API_KEY; - -export const getGroqApiKey = () => loadConfig().MODELS.GROQ.API_KEY; - -export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; - -export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; - -export const getSearxngApiEndpoint = () => - process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; - -export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; - -export const getCustomOpenaiApiKey = () => - loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; - -export const getCustomOpenaiApiUrl = () => - loadConfig().MODELS.CUSTOM_OPENAI.API_URL; - -export const getCustomOpenaiModelName = () => - loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; - -const mergeConfigs = (current: any, update: any): any => { - if (update === null || update === undefined) { - return current; - } - - if (typeof current !== 'object' || current === null) { - return update; - } - - const result = { ...current }; - - for (const key in update) { - if (Object.prototype.hasOwnProperty.call(update, key)) { - const updateValue = update[key]; - - if ( - typeof updateValue === 'object' && - updateValue !== null && - typeof result[key] === 'object' && - result[key] !== null - ) { - result[key] = mergeConfigs(result[key], updateValue); - } else if (updateValue !== undefined) { - result[key] = updateValue; - } - } - } - - return result; -}; - -export const updateConfig = (config: RecursivePartial<Config>) => { - const currentConfig = loadConfig(); - const mergedConfig = mergeConfigs(currentConfig, config); - - fs.writeFileSync( - path.join(__dirname, `../${configFileName}`), - toml.stringify(mergedConfig), - ); -}; diff --git a/src/db/index.ts b/src/db/index.ts deleted file mode 100644 index b431b47..0000000 --- a/src/db/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { drizzle } from 'drizzle-orm/better-sqlite3'; -import Database from 'better-sqlite3'; -import * as schema from './schema'; - -const sqlite = new Database('data/db.sqlite'); -const db = drizzle(sqlite, { - schema: schema, -}); - -export default db; diff --git a/ui/lib/actions.ts b/src/lib/actions.ts similarity index 100% rename from ui/lib/actions.ts rename to src/lib/actions.ts diff --git a/ui/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts similarity index 100% rename from ui/lib/chains/imageSearchAgent.ts rename to src/lib/chains/imageSearchAgent.ts diff --git a/ui/lib/chains/suggestionGeneratorAgent.ts b/src/lib/chains/suggestionGeneratorAgent.ts similarity index 100% rename from ui/lib/chains/suggestionGeneratorAgent.ts rename to src/lib/chains/suggestionGeneratorAgent.ts diff --git a/ui/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts similarity index 100% rename from ui/lib/chains/videoSearchAgent.ts rename to src/lib/chains/videoSearchAgent.ts diff --git a/ui/lib/config.ts b/src/lib/config.ts similarity index 97% rename from ui/lib/config.ts rename to src/lib/config.ts index 489fec3..9a20ce5 100644 --- a/ui/lib/config.ts +++ b/src/lib/config.ts @@ -62,7 +62,7 @@ export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; export const getSearxngApiEndpoint = () => - process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; + loadConfig().API_ENDPOINTS.SEARXNG || process.env.SEARXNG_API_URL; export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; diff --git a/ui/lib/db/index.ts b/src/lib/db/index.ts similarity index 100% rename from ui/lib/db/index.ts rename to src/lib/db/index.ts diff --git a/src/db/schema.ts b/src/lib/db/schema.ts similarity index 100% rename from src/db/schema.ts rename to src/lib/db/schema.ts diff --git a/src/lib/huggingfaceTransformer.ts b/src/lib/huggingfaceTransformer.ts deleted file mode 100644 index 7a959ca..0000000 --- a/src/lib/huggingfaceTransformer.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Embeddings, type EmbeddingsParams } from '@langchain/core/embeddings'; -import { chunkArray } from '@langchain/core/utils/chunk_array'; - -export interface HuggingFaceTransformersEmbeddingsParams - extends EmbeddingsParams { - modelName: string; - - model: string; - - timeout?: number; - - batchSize?: number; - - stripNewLines?: boolean; -} - -export class HuggingFaceTransformersEmbeddings - extends Embeddings - implements HuggingFaceTransformersEmbeddingsParams -{ - modelName = 'Xenova/all-MiniLM-L6-v2'; - - model = 'Xenova/all-MiniLM-L6-v2'; - - batchSize = 512; - - stripNewLines = true; - - timeout?: number; - - private pipelinePromise: Promise<any>; - - constructor(fields?: Partial<HuggingFaceTransformersEmbeddingsParams>) { - super(fields ?? {}); - - this.modelName = fields?.model ?? fields?.modelName ?? this.model; - this.model = this.modelName; - this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines; - this.timeout = fields?.timeout; - } - - async embedDocuments(texts: string[]): Promise<number[][]> { - const batches = chunkArray( - this.stripNewLines ? texts.map((t) => t.replace(/\n/g, ' ')) : texts, - this.batchSize, - ); - - const batchRequests = batches.map((batch) => this.runEmbedding(batch)); - const batchResponses = await Promise.all(batchRequests); - const embeddings: number[][] = []; - - for (let i = 0; i < batchResponses.length; i += 1) { - const batchResponse = batchResponses[i]; - for (let j = 0; j < batchResponse.length; j += 1) { - embeddings.push(batchResponse[j]); - } - } - - return embeddings; - } - - async embedQuery(text: string): Promise<number[]> { - const data = await this.runEmbedding([ - this.stripNewLines ? text.replace(/\n/g, ' ') : text, - ]); - return data[0]; - } - - private async runEmbedding(texts: string[]) { - const { pipeline } = await import('@xenova/transformers'); - - const pipe = await (this.pipelinePromise ??= pipeline( - 'feature-extraction', - this.model, - )); - - return this.caller.call(async () => { - const output = await pipe(texts, { pooling: 'mean', normalize: true }); - return output.tolist(); - }); - } -} diff --git a/src/lib/outputParsers/lineOutputParser.ts b/src/lib/outputParsers/lineOutputParser.ts index 08711aa..fcd69ef 100644 --- a/src/lib/outputParsers/lineOutputParser.ts +++ b/src/lib/outputParsers/lineOutputParser.ts @@ -9,7 +9,7 @@ class LineOutputParser extends BaseOutputParser<string> { constructor(args?: LineOutputParserArgs) { super(); - this.key = args.key ?? this.key; + this.key = args?.key ?? this.key; } static lc_name() { diff --git a/src/lib/outputParsers/listLineOutputParser.ts b/src/lib/outputParsers/listLineOutputParser.ts index f465ef1..6409db9 100644 --- a/src/lib/outputParsers/listLineOutputParser.ts +++ b/src/lib/outputParsers/listLineOutputParser.ts @@ -9,7 +9,7 @@ class LineListOutputParser extends BaseOutputParser<string[]> { constructor(args?: LineListOutputParserArgs) { super(); - this.key = args.key ?? this.key; + this.key = args?.key ?? this.key; } static lc_name() { diff --git a/src/prompts/academicSearch.ts b/src/lib/prompts/academicSearch.ts similarity index 100% rename from src/prompts/academicSearch.ts rename to src/lib/prompts/academicSearch.ts diff --git a/src/prompts/index.ts b/src/lib/prompts/index.ts similarity index 100% rename from src/prompts/index.ts rename to src/lib/prompts/index.ts diff --git a/src/prompts/redditSearch.ts b/src/lib/prompts/redditSearch.ts similarity index 100% rename from src/prompts/redditSearch.ts rename to src/lib/prompts/redditSearch.ts diff --git a/src/prompts/webSearch.ts b/src/lib/prompts/webSearch.ts similarity index 100% rename from src/prompts/webSearch.ts rename to src/lib/prompts/webSearch.ts diff --git a/src/prompts/wolframAlpha.ts b/src/lib/prompts/wolframAlpha.ts similarity index 100% rename from src/prompts/wolframAlpha.ts rename to src/lib/prompts/wolframAlpha.ts diff --git a/src/prompts/writingAssistant.ts b/src/lib/prompts/writingAssistant.ts similarity index 100% rename from src/prompts/writingAssistant.ts rename to src/lib/prompts/writingAssistant.ts diff --git a/src/prompts/youtubeSearch.ts b/src/lib/prompts/youtubeSearch.ts similarity index 100% rename from src/prompts/youtubeSearch.ts rename to src/lib/prompts/youtubeSearch.ts diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index 642a6cb..e44d70d 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -1,6 +1,38 @@ -import { ChatAnthropic } from '@langchain/anthropic'; -import { getAnthropicApiKey } from '../../config'; -import logger from '../../utils/logger'; +import { ChatOpenAI } from '@langchain/openai'; +import { ChatModel } from '.'; +import { getAnthropicApiKey } from '../config'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const anthropicChatModels: Record<string, string>[] = [ + { + displayName: 'Claude 3.7 Sonnet', + key: 'claude-3-7-sonnet-20250219', + }, + { + displayName: 'Claude 3.5 Haiku', + key: 'claude-3-5-haiku-20241022', + }, + { + displayName: 'Claude 3.5 Sonnet v2', + key: 'claude-3-5-sonnet-20241022', + }, + { + displayName: 'Claude 3.5 Sonnet', + key: 'claude-3-5-sonnet-20240620', + }, + { + displayName: 'Claude 3 Opus', + key: 'claude-3-opus-20240229', + }, + { + displayName: 'Claude 3 Sonnet', + key: 'claude-3-sonnet-20240229', + }, + { + displayName: 'Claude 3 Haiku', + key: 'claude-3-haiku-20240307', + }, +]; export const loadAnthropicChatModels = async () => { const anthropicApiKey = getAnthropicApiKey(); @@ -8,52 +40,25 @@ export const loadAnthropicChatModels = async () => { if (!anthropicApiKey) return {}; try { - const chatModels = { - 'claude-3-5-sonnet-20241022': { - displayName: 'Claude 3.5 Sonnet', - model: new ChatAnthropic({ + const chatModels: Record<string, ChatModel> = {}; + + anthropicChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: anthropicApiKey, + modelName: model.key, temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-5-sonnet-20241022', - }), - }, - 'claude-3-5-haiku-20241022': { - displayName: 'Claude 3.5 Haiku', - model: new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-5-haiku-20241022', - }), - }, - 'claude-3-opus-20240229': { - displayName: 'Claude 3 Opus', - model: new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-opus-20240229', - }), - }, - 'claude-3-sonnet-20240229': { - displayName: 'Claude 3 Sonnet', - model: new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-sonnet-20240229', - }), - }, - 'claude-3-haiku-20240307': { - displayName: 'Claude 3 Haiku', - model: new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-haiku-20240307', - }), - }, - }; + configuration: { + baseURL: 'https://api.anthropic.com/v1/', + }, + }) as unknown as BaseChatModel, + }; + }); return chatModels; } catch (err) { - logger.error(`Error loading Anthropic models: ${err}`); + console.error(`Error loading Anthropic models: ${err}`); return {}; } }; diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index d20c9b8..6806fb6 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -1,9 +1,42 @@ -import { - ChatGoogleGenerativeAI, - GoogleGenerativeAIEmbeddings, -} from '@langchain/google-genai'; -import { getGeminiApiKey } from '../../config'; -import logger from '../../utils/logger'; +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { getGeminiApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { Embeddings } from '@langchain/core/embeddings'; + +const geminiChatModels: Record<string, string>[] = [ + { + displayName: 'Gemini 2.0 Flash', + key: 'gemini-2.0-flash', + }, + { + displayName: 'Gemini 2.0 Flash-Lite', + key: 'gemini-2.0-flash-lite', + }, + { + displayName: 'Gemini 2.0 Pro Experimental', + key: 'gemini-2.0-pro-exp-02-05', + }, + { + displayName: 'Gemini 1.5 Flash', + key: 'gemini-1.5-flash', + }, + { + displayName: 'Gemini 1.5 Flash-8B', + key: 'gemini-1.5-flash-8b', + }, + { + displayName: 'Gemini 1.5 Pro', + key: 'gemini-1.5-pro', + }, +]; + +const geminiEmbeddingModels: Record<string, string>[] = [ + { + displayName: 'Gemini Embedding', + key: 'gemini-embedding-exp', + }, +]; export const loadGeminiChatModels = async () => { const geminiApiKey = getGeminiApiKey(); @@ -11,75 +44,53 @@ export const loadGeminiChatModels = async () => { if (!geminiApiKey) return {}; try { - const chatModels = { - 'gemini-1.5-flash': { - displayName: 'Gemini 1.5 Flash', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-1.5-flash', + const chatModels: Record<string, ChatModel> = {}; + + geminiChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: geminiApiKey, + modelName: model.key, temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - 'gemini-1.5-flash-8b': { - displayName: 'Gemini 1.5 Flash 8B', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-1.5-flash-8b', - temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - 'gemini-1.5-pro': { - displayName: 'Gemini 1.5 Pro', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-1.5-pro', - temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - 'gemini-2.0-flash-exp': { - displayName: 'Gemini 2.0 Flash Exp', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-2.0-flash-exp', - temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - 'gemini-2.0-flash-thinking-exp-01-21': { - displayName: 'Gemini 2.0 Flash Thinking Exp 01-21', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-2.0-flash-thinking-exp-01-21', - temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - }; + configuration: { + baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + }) as unknown as BaseChatModel, + }; + }); return chatModels; } catch (err) { - logger.error(`Error loading Gemini models: ${err}`); + console.error(`Error loading Gemini models: ${err}`); return {}; } }; -export const loadGeminiEmbeddingsModels = async () => { +export const loadGeminiEmbeddingModels = async () => { const geminiApiKey = getGeminiApiKey(); if (!geminiApiKey) return {}; try { - const embeddingModels = { - 'text-embedding-004': { - displayName: 'Text Embedding', - model: new GoogleGenerativeAIEmbeddings({ - apiKey: geminiApiKey, - modelName: 'text-embedding-004', - }), - }, - }; + const embeddingModels: Record<string, EmbeddingModel> = {}; + + geminiEmbeddingModels.forEach((model) => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: geminiApiKey, + modelName: model.key, + configuration: { + baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + }) as unknown as Embeddings, + }; + }); return embeddingModels; } catch (err) { - logger.error(`Error loading Gemini embeddings model: ${err}`); + console.error(`Error loading OpenAI embeddings models: ${err}`); return {}; } }; diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 41004ec..6377690 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -1,6 +1,82 @@ import { ChatOpenAI } from '@langchain/openai'; -import { getGroqApiKey } from '../../config'; -import logger from '../../utils/logger'; +import { getGroqApiKey } from '../config'; +import { ChatModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const groqChatModels: Record<string, string>[] = [ + { + displayName: 'Gemma2 9B IT', + key: 'gemma2-9b-it', + }, + { + displayName: 'Llama 3.3 70B Versatile', + key: 'llama-3.3-70b-versatile', + }, + { + displayName: 'Llama 3.1 8B Instant', + key: 'llama-3.1-8b-instant', + }, + { + displayName: 'Llama3 70B 8192', + key: 'llama3-70b-8192', + }, + { + displayName: 'Llama3 8B 8192', + key: 'llama3-8b-8192', + }, + { + displayName: 'Mixtral 8x7B 32768', + key: 'mixtral-8x7b-32768', + }, + { + displayName: 'Qwen QWQ 32B (Preview)', + key: 'qwen-qwq-32b', + }, + { + displayName: 'Mistral Saba 24B (Preview)', + key: 'mistral-saba-24b', + }, + { + displayName: 'Qwen 2.5 Coder 32B (Preview)', + key: 'qwen-2.5-coder-32b', + }, + { + displayName: 'Qwen 2.5 32B (Preview)', + key: 'qwen-2.5-32b', + }, + { + displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', + key: 'deepseek-r1-distill-qwen-32b', + }, + { + displayName: 'DeepSeek R1 Distill Llama 70B SpecDec (Preview)', + key: 'deepseek-r1-distill-llama-70b-specdec', + }, + { + displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', + key: 'deepseek-r1-distill-llama-70b', + }, + { + displayName: 'Llama 3.3 70B SpecDec (Preview)', + key: 'llama-3.3-70b-specdec', + }, + { + displayName: 'Llama 3.2 1B Preview (Preview)', + key: 'llama-3.2-1b-preview', + }, + { + displayName: 'Llama 3.2 3B Preview (Preview)', + key: 'llama-3.2-3b-preview', + }, + { + displayName: 'Llama 3.2 11B Vision Preview (Preview)', + key: 'llama-3.2-11b-vision-preview', + }, + { + displayName: 'Llama 3.2 90B Vision Preview (Preview)', + key: 'llama-3.2-90b-vision-preview', + }, +]; export const loadGroqChatModels = async () => { const groqApiKey = getGroqApiKey(); @@ -8,129 +84,25 @@ export const loadGroqChatModels = async () => { if (!groqApiKey) return {}; try { - const chatModels = { - 'llama-3.3-70b-versatile': { - displayName: 'Llama 3.3 70B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.3-70b-versatile', - temperature: 0.7, - }, - { + const chatModels: Record<string, ChatModel> = {}; + + groqChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: groqApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { baseURL: 'https://api.groq.com/openai/v1', }, - ), - }, - 'llama-3.2-3b-preview': { - displayName: 'Llama 3.2 3B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.2-3b-preview', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama-3.2-11b-vision-preview': { - displayName: 'Llama 3.2 11B Vision', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.2-11b-vision-preview', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama-3.2-90b-vision-preview': { - displayName: 'Llama 3.2 90B Vision', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.2-90b-vision-preview', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama-3.1-8b-instant': { - displayName: 'Llama 3.1 8B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.1-8b-instant', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama3-8b-8192': { - displayName: 'LLaMA3 8B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama3-8b-8192', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama3-70b-8192': { - displayName: 'LLaMA3 70B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama3-70b-8192', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'mixtral-8x7b-32768': { - displayName: 'Mixtral 8x7B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'mixtral-8x7b-32768', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'gemma2-9b-it': { - displayName: 'Gemma2 9B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'gemma2-9b-it', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - }; + }) as unknown as BaseChatModel, + }; + }); return chatModels; } catch (err) { - logger.error(`Error loading Groq models: ${err}`); + console.error(`Error loading Groq models: ${err}`); return {}; } }; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 57e9185..3b3cf63 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -1,33 +1,49 @@ -import { loadGroqChatModels } from './groq'; -import { loadOllamaChatModels, loadOllamaEmbeddingsModels } from './ollama'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingsModels } from './openai'; -import { loadAnthropicChatModels } from './anthropic'; -import { loadTransformersEmbeddingsModels } from './transformers'; -import { loadGeminiChatModels, loadGeminiEmbeddingsModels } from './gemini'; +import { Embeddings } from '@langchain/core/embeddings'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, -} from '../../config'; +} from '../config'; import { ChatOpenAI } from '@langchain/openai'; +import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; +import { loadGroqChatModels } from './groq'; +import { loadAnthropicChatModels } from './anthropic'; +import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; -const chatModelProviders = { +export interface ChatModel { + displayName: string; + model: BaseChatModel; +} + +export interface EmbeddingModel { + displayName: string; + model: Embeddings; +} + +export const chatModelProviders: Record< + string, + () => Promise<Record<string, ChatModel>> +> = { openai: loadOpenAIChatModels, - groq: loadGroqChatModels, ollama: loadOllamaChatModels, + groq: loadGroqChatModels, anthropic: loadAnthropicChatModels, gemini: loadGeminiChatModels, }; -const embeddingModelProviders = { - openai: loadOpenAIEmbeddingsModels, - local: loadTransformersEmbeddingsModels, - ollama: loadOllamaEmbeddingsModels, - gemini: loadGeminiEmbeddingsModels, +export const embeddingModelProviders: Record< + string, + () => Promise<Record<string, EmbeddingModel>> +> = { + openai: loadOpenAIEmbeddingModels, + ollama: loadOllamaEmbeddingModels, + gemini: loadGeminiEmbeddingModels, }; export const getAvailableChatModelProviders = async () => { - const models = {}; + const models: Record<string, Record<string, ChatModel>> = {}; for (const provider in chatModelProviders) { const providerModels = await chatModelProviders[provider](); @@ -52,7 +68,7 @@ export const getAvailableChatModelProviders = async () => { configuration: { baseURL: customOpenAiApiUrl, }, - }), + }) as unknown as BaseChatModel, }, } : {}), @@ -62,7 +78,7 @@ export const getAvailableChatModelProviders = async () => { }; export const getAvailableEmbeddingModelProviders = async () => { - const models = {}; + const models: Record<string, Record<string, EmbeddingModel>> = {}; for (const provider in embeddingModelProviders) { const providerModels = await embeddingModelProviders[provider](); diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index 7277b27..92e98e4 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -1,74 +1,73 @@ -import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; -import { getKeepAlive, getOllamaApiEndpoint } from '../../config'; -import logger from '../../utils/logger'; -import { ChatOllama } from '@langchain/community/chat_models/ollama'; import axios from 'axios'; +import { getKeepAlive, getOllamaApiEndpoint } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { ChatOllama } from '@langchain/community/chat_models/ollama'; +import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; export const loadOllamaChatModels = async () => { - const ollamaEndpoint = getOllamaApiEndpoint(); - const keepAlive = getKeepAlive(); + const ollamaApiEndpoint = getOllamaApiEndpoint(); - if (!ollamaEndpoint) return {}; + if (!ollamaApiEndpoint) return {}; try { - const response = await axios.get(`${ollamaEndpoint}/api/tags`, { + const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { headers: { 'Content-Type': 'application/json', }, }); - const { models: ollamaModels } = response.data; + const { models } = res.data; - const chatModels = ollamaModels.reduce((acc, model) => { - acc[model.model] = { + const chatModels: Record<string, ChatModel> = {}; + + models.forEach((model: any) => { + chatModels[model.model] = { displayName: model.name, model: new ChatOllama({ - baseUrl: ollamaEndpoint, + baseUrl: ollamaApiEndpoint, model: model.model, temperature: 0.7, - keepAlive: keepAlive, + keepAlive: getKeepAlive(), }), }; - - return acc; - }, {}); + }); return chatModels; } catch (err) { - logger.error(`Error loading Ollama models: ${err}`); + console.error(`Error loading Ollama models: ${err}`); return {}; } }; -export const loadOllamaEmbeddingsModels = async () => { - const ollamaEndpoint = getOllamaApiEndpoint(); +export const loadOllamaEmbeddingModels = async () => { + const ollamaApiEndpoint = getOllamaApiEndpoint(); - if (!ollamaEndpoint) return {}; + if (!ollamaApiEndpoint) return {}; try { - const response = await axios.get(`${ollamaEndpoint}/api/tags`, { + const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { headers: { 'Content-Type': 'application/json', }, }); - const { models: ollamaModels } = response.data; + const { models } = res.data; - const embeddingsModels = ollamaModels.reduce((acc, model) => { - acc[model.model] = { + const embeddingModels: Record<string, EmbeddingModel> = {}; + + models.forEach((model: any) => { + embeddingModels[model.model] = { displayName: model.name, model: new OllamaEmbeddings({ - baseUrl: ollamaEndpoint, + baseUrl: ollamaApiEndpoint, model: model.model, }), }; + }); - return acc; - }, {}); - - return embeddingsModels; + return embeddingModels; } catch (err) { - logger.error(`Error loading Ollama embeddings model: ${err}`); + console.error(`Error loading Ollama embeddings models: ${err}`); return {}; } }; diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 3747e37..01bacc6 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -1,89 +1,90 @@ import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; -import { getOpenaiApiKey } from '../../config'; -import logger from '../../utils/logger'; +import { getOpenaiApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { Embeddings } from '@langchain/core/embeddings'; + +const openaiChatModels: Record<string, string>[] = [ + { + displayName: 'GPT-3.5 Turbo', + key: 'gpt-3.5-turbo', + }, + { + displayName: 'GPT-4', + key: 'gpt-4', + }, + { + displayName: 'GPT-4 turbo', + key: 'gpt-4-turbo', + }, + { + displayName: 'GPT-4 omni', + key: 'gpt-4o', + }, + { + displayName: 'GPT-4 omni mini', + key: 'gpt-4o-mini', + }, +]; + +const openaiEmbeddingModels: Record<string, string>[] = [ + { + displayName: 'Text Embedding 3 Small', + key: 'text-embedding-3-small', + }, + { + displayName: 'Text Embedding 3 Large', + key: 'text-embedding-3-large', + }, +]; export const loadOpenAIChatModels = async () => { - const openAIApiKey = getOpenaiApiKey(); + const openaiApiKey = getOpenaiApiKey(); - if (!openAIApiKey) return {}; + if (!openaiApiKey) return {}; try { - const chatModels = { - 'gpt-3.5-turbo': { - displayName: 'GPT-3.5 Turbo', + const chatModels: Record<string, ChatModel> = {}; + + openaiChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-3.5-turbo', + openAIApiKey: openaiApiKey, + modelName: model.key, temperature: 0.7, - }), - }, - 'gpt-4': { - displayName: 'GPT-4', - model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4', - temperature: 0.7, - }), - }, - 'gpt-4-turbo': { - displayName: 'GPT-4 turbo', - model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4-turbo', - temperature: 0.7, - }), - }, - 'gpt-4o': { - displayName: 'GPT-4 omni', - model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4o', - temperature: 0.7, - }), - }, - 'gpt-4o-mini': { - displayName: 'GPT-4 omni mini', - model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4o-mini', - temperature: 0.7, - }), - }, - }; + }) as unknown as BaseChatModel, + }; + }); return chatModels; } catch (err) { - logger.error(`Error loading OpenAI models: ${err}`); + console.error(`Error loading OpenAI models: ${err}`); return {}; } }; -export const loadOpenAIEmbeddingsModels = async () => { - const openAIApiKey = getOpenaiApiKey(); +export const loadOpenAIEmbeddingModels = async () => { + const openaiApiKey = getOpenaiApiKey(); - if (!openAIApiKey) return {}; + if (!openaiApiKey) return {}; try { - const embeddingModels = { - 'text-embedding-3-small': { - displayName: 'Text Embedding 3 Small', + const embeddingModels: Record<string, EmbeddingModel> = {}; + + openaiEmbeddingModels.forEach((model) => { + embeddingModels[model.key] = { + displayName: model.displayName, model: new OpenAIEmbeddings({ - openAIApiKey, - modelName: 'text-embedding-3-small', - }), - }, - 'text-embedding-3-large': { - displayName: 'Text Embedding 3 Large', - model: new OpenAIEmbeddings({ - openAIApiKey, - modelName: 'text-embedding-3-large', - }), - }, - }; + openAIApiKey: openaiApiKey, + modelName: model.key, + }) as unknown as Embeddings, + }; + }); return embeddingModels; } catch (err) { - logger.error(`Error loading OpenAI embeddings model: ${err}`); + console.error(`Error loading OpenAI embeddings models: ${err}`); return {}; } }; diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts deleted file mode 100644 index 8a3417d..0000000 --- a/src/lib/providers/transformers.ts +++ /dev/null @@ -1,32 +0,0 @@ -import logger from '../../utils/logger'; -import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; - -export const loadTransformersEmbeddingsModels = async () => { - try { - const embeddingModels = { - 'xenova-bge-small-en-v1.5': { - displayName: 'BGE Small', - model: new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/bge-small-en-v1.5', - }), - }, - 'xenova-gte-small': { - displayName: 'GTE Small', - model: new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/gte-small', - }), - }, - 'xenova-bert-base-multilingual-uncased': { - displayName: 'Bert Multilingual', - model: new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/bert-base-multilingual-uncased', - }), - }, - }; - - return embeddingModels; - } catch (err) { - logger.error(`Error loading Transformers embeddings model: ${err}`); - return {}; - } -}; diff --git a/ui/lib/search/metaSearchAgent.ts b/src/lib/search/metaSearchAgent.ts similarity index 100% rename from ui/lib/search/metaSearchAgent.ts rename to src/lib/search/metaSearchAgent.ts diff --git a/src/lib/searxng.ts b/src/lib/searxng.ts index da62457..ae19db2 100644 --- a/src/lib/searxng.ts +++ b/src/lib/searxng.ts @@ -1,5 +1,5 @@ import axios from 'axios'; -import { getSearxngApiEndpoint } from '../config'; +import { getSearxngApiEndpoint } from './config'; interface SearxngSearchOptions { categories?: string[]; @@ -30,11 +30,12 @@ export const searchSearxng = async ( if (opts) { Object.keys(opts).forEach((key) => { - if (Array.isArray(opts[key])) { - url.searchParams.append(key, opts[key].join(',')); + const value = opts[key as keyof SearxngSearchOptions]; + if (Array.isArray(value)) { + url.searchParams.append(key, value.join(',')); return; } - url.searchParams.append(key, opts[key]); + url.searchParams.append(key, value as string); }); } diff --git a/ui/lib/types/compute-dot.d.ts b/src/lib/types/compute-dot.d.ts similarity index 100% rename from ui/lib/types/compute-dot.d.ts rename to src/lib/types/compute-dot.d.ts diff --git a/ui/lib/utils.ts b/src/lib/utils.ts similarity index 100% rename from ui/lib/utils.ts rename to src/lib/utils.ts diff --git a/ui/lib/utils/computeSimilarity.ts b/src/lib/utils/computeSimilarity.ts similarity index 100% rename from ui/lib/utils/computeSimilarity.ts rename to src/lib/utils/computeSimilarity.ts diff --git a/ui/lib/utils/documents.ts b/src/lib/utils/documents.ts similarity index 100% rename from ui/lib/utils/documents.ts rename to src/lib/utils/documents.ts diff --git a/src/utils/files.ts b/src/lib/utils/files.ts similarity index 100% rename from src/utils/files.ts rename to src/lib/utils/files.ts diff --git a/src/utils/formatHistory.ts b/src/lib/utils/formatHistory.ts similarity index 100% rename from src/utils/formatHistory.ts rename to src/lib/utils/formatHistory.ts diff --git a/src/routes/chats.ts b/src/routes/chats.ts deleted file mode 100644 index afa74f9..0000000 --- a/src/routes/chats.ts +++ /dev/null @@ -1,66 +0,0 @@ -import express from 'express'; -import logger from '../utils/logger'; -import db from '../db/index'; -import { eq } from 'drizzle-orm'; -import { chats, messages } from '../db/schema'; - -const router = express.Router(); - -router.get('/', async (_, res) => { - try { - let chats = await db.query.chats.findMany(); - - chats = chats.reverse(); - - return res.status(200).json({ chats: chats }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in getting chats: ${err.message}`); - } -}); - -router.get('/:id', async (req, res) => { - try { - const chatExists = await db.query.chats.findFirst({ - where: eq(chats.id, req.params.id), - }); - - if (!chatExists) { - return res.status(404).json({ message: 'Chat not found' }); - } - - const chatMessages = await db.query.messages.findMany({ - where: eq(messages.chatId, req.params.id), - }); - - return res.status(200).json({ chat: chatExists, messages: chatMessages }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in getting chat: ${err.message}`); - } -}); - -router.delete(`/:id`, async (req, res) => { - try { - const chatExists = await db.query.chats.findFirst({ - where: eq(chats.id, req.params.id), - }); - - if (!chatExists) { - return res.status(404).json({ message: 'Chat not found' }); - } - - await db.delete(chats).where(eq(chats.id, req.params.id)).execute(); - await db - .delete(messages) - .where(eq(messages.chatId, req.params.id)) - .execute(); - - return res.status(200).json({ message: 'Chat deleted successfully' }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in deleting chat: ${err.message}`); - } -}); - -export default router; diff --git a/src/routes/config.ts b/src/routes/config.ts deleted file mode 100644 index 18b370d..0000000 --- a/src/routes/config.ts +++ /dev/null @@ -1,104 +0,0 @@ -import express from 'express'; -import { - getAvailableChatModelProviders, - getAvailableEmbeddingModelProviders, -} from '../lib/providers'; -import { - getGroqApiKey, - getOllamaApiEndpoint, - getAnthropicApiKey, - getGeminiApiKey, - getOpenaiApiKey, - updateConfig, - getCustomOpenaiApiUrl, - getCustomOpenaiApiKey, - getCustomOpenaiModelName, -} from '../config'; -import logger from '../utils/logger'; - -const router = express.Router(); - -router.get('/', async (_, res) => { - try { - const config = {}; - - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); - - config['chatModelProviders'] = {}; - config['embeddingModelProviders'] = {}; - - for (const provider in chatModelProviders) { - config['chatModelProviders'][provider] = Object.keys( - chatModelProviders[provider], - ).map((model) => { - return { - name: model, - displayName: chatModelProviders[provider][model].displayName, - }; - }); - } - - for (const provider in embeddingModelProviders) { - config['embeddingModelProviders'][provider] = Object.keys( - embeddingModelProviders[provider], - ).map((model) => { - return { - name: model, - displayName: embeddingModelProviders[provider][model].displayName, - }; - }); - } - - config['openaiApiKey'] = getOpenaiApiKey(); - config['ollamaApiUrl'] = getOllamaApiEndpoint(); - config['anthropicApiKey'] = getAnthropicApiKey(); - config['groqApiKey'] = getGroqApiKey(); - config['geminiApiKey'] = getGeminiApiKey(); - config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); - config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); - config['customOpenaiModelName'] = getCustomOpenaiModelName(); - - res.status(200).json(config); - } catch (err: any) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error getting config: ${err.message}`); - } -}); - -router.post('/', async (req, res) => { - const config = req.body; - - const updatedConfig = { - MODELS: { - OPENAI: { - API_KEY: config.openaiApiKey, - }, - GROQ: { - API_KEY: config.groqApiKey, - }, - ANTHROPIC: { - API_KEY: config.anthropicApiKey, - }, - GEMINI: { - API_KEY: config.geminiApiKey, - }, - OLLAMA: { - API_URL: config.ollamaApiUrl, - }, - CUSTOM_OPENAI: { - API_URL: config.customOpenaiApiUrl, - API_KEY: config.customOpenaiApiKey, - MODEL_NAME: config.customOpenaiModelName, - }, - }, - }; - - updateConfig(updatedConfig); - - res.status(200).json({ message: 'Config updated' }); -}); - -export default router; diff --git a/src/routes/discover.ts b/src/routes/discover.ts deleted file mode 100644 index b6f8ff9..0000000 --- a/src/routes/discover.ts +++ /dev/null @@ -1,48 +0,0 @@ -import express from 'express'; -import { searchSearxng } from '../lib/searxng'; -import logger from '../utils/logger'; - -const router = express.Router(); - -router.get('/', async (req, res) => { - try { - const data = ( - await Promise.all([ - searchSearxng('site:businessinsider.com AI', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:www.exchangewire.com AI', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:yahoo.com AI', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:businessinsider.com tech', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:www.exchangewire.com tech', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:yahoo.com tech', { - engines: ['bing news'], - pageno: 1, - }), - ]) - ) - .map((result) => result.results) - .flat() - .sort(() => Math.random() - 0.5); - - return res.json({ blogs: data }); - } catch (err: any) { - logger.error(`Error in discover route: ${err.message}`); - return res.status(500).json({ message: 'An error has occurred' }); - } -}); - -export default router; diff --git a/src/routes/images.ts b/src/routes/images.ts deleted file mode 100644 index 5671657..0000000 --- a/src/routes/images.ts +++ /dev/null @@ -1,82 +0,0 @@ -import express from 'express'; -import handleImageSearch from '../chains/imageSearchAgent'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { getAvailableChatModelProviders } from '../lib/providers'; -import { HumanMessage, AIMessage } from '@langchain/core/messages'; -import logger from '../utils/logger'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -const router = express.Router(); - -interface ChatModel { - provider: string; - model: string; -} - -interface ImageSearchBody { - query: string; - chatHistory: any[]; - chatModel?: ChatModel; -} - -router.post('/', async (req, res) => { - try { - let body: ImageSearchBody = req.body; - - const chatHistory = body.chatHistory.map((msg: any) => { - if (msg.role === 'user') { - return new HumanMessage(msg.content); - } else if (msg.role === 'assistant') { - return new AIMessage(msg.content); - } - }); - - const chatModelProviders = await getAvailableChatModelProviders(); - - const chatModelProvider = - body.chatModel?.provider || Object.keys(chatModelProviders)[0]; - const chatModel = - body.chatModel?.model || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - let llm: BaseChatModel | undefined; - - if (body.chatModel?.provider === 'custom_openai') { - llm = new ChatOpenAI({ - modelName: getCustomOpenaiModelName(), - openAIApiKey: getCustomOpenaiApiKey(), - temperature: 0.7, - configuration: { - baseURL: getCustomOpenaiApiUrl(), - }, - }) as unknown as BaseChatModel; - } else if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } - - if (!llm) { - return res.status(400).json({ message: 'Invalid model selected' }); - } - - const images = await handleImageSearch( - { query: body.query, chat_history: chatHistory }, - llm, - ); - - res.status(200).json({ images }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in image search: ${err.message}`); - } -}); - -export default router; diff --git a/src/routes/index.ts b/src/routes/index.ts deleted file mode 100644 index cb2c915..0000000 --- a/src/routes/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import express from 'express'; -import imagesRouter from './images'; -import videosRouter from './videos'; -import configRouter from './config'; -import modelsRouter from './models'; -import suggestionsRouter from './suggestions'; -import chatsRouter from './chats'; -import searchRouter from './search'; -import discoverRouter from './discover'; -import uploadsRouter from './uploads'; - -const router = express.Router(); - -router.use('/images', imagesRouter); -router.use('/videos', videosRouter); -router.use('/config', configRouter); -router.use('/models', modelsRouter); -router.use('/suggestions', suggestionsRouter); -router.use('/chats', chatsRouter); -router.use('/search', searchRouter); -router.use('/discover', discoverRouter); -router.use('/uploads', uploadsRouter); - -export default router; diff --git a/src/routes/models.ts b/src/routes/models.ts deleted file mode 100644 index b5fbe12..0000000 --- a/src/routes/models.ts +++ /dev/null @@ -1,36 +0,0 @@ -import express from 'express'; -import logger from '../utils/logger'; -import { - getAvailableChatModelProviders, - getAvailableEmbeddingModelProviders, -} from '../lib/providers'; - -const router = express.Router(); - -router.get('/', async (req, res) => { - try { - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); - - Object.keys(chatModelProviders).forEach((provider) => { - Object.keys(chatModelProviders[provider]).forEach((model) => { - delete chatModelProviders[provider][model].model; - }); - }); - - Object.keys(embeddingModelProviders).forEach((provider) => { - Object.keys(embeddingModelProviders[provider]).forEach((model) => { - delete embeddingModelProviders[provider][model].model; - }); - }); - - res.status(200).json({ chatModelProviders, embeddingModelProviders }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(err.message); - } -}); - -export default router; diff --git a/src/routes/search.ts b/src/routes/search.ts deleted file mode 100644 index 57d90a3..0000000 --- a/src/routes/search.ts +++ /dev/null @@ -1,158 +0,0 @@ -import express from 'express'; -import logger from '../utils/logger'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getAvailableChatModelProviders, - getAvailableEmbeddingModelProviders, -} from '../lib/providers'; -import { searchHandlers } from '../websocket/messageHandler'; -import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; -import { MetaSearchAgentType } from '../search/metaSearchAgent'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -const router = express.Router(); - -interface chatModel { - provider: string; - model: string; - customOpenAIKey?: string; - customOpenAIBaseURL?: string; -} - -interface embeddingModel { - provider: string; - model: string; -} - -interface ChatRequestBody { - optimizationMode: 'speed' | 'balanced'; - focusMode: string; - chatModel?: chatModel; - embeddingModel?: embeddingModel; - query: string; - history: Array<[string, string]>; -} - -router.post('/', async (req, res) => { - try { - const body: ChatRequestBody = req.body; - - if (!body.focusMode || !body.query) { - return res.status(400).json({ message: 'Missing focus mode or query' }); - } - - body.history = body.history || []; - body.optimizationMode = body.optimizationMode || 'balanced'; - - const history: BaseMessage[] = body.history.map((msg) => { - if (msg[0] === 'human') { - return new HumanMessage({ - content: msg[1], - }); - } else { - return new AIMessage({ - content: msg[1], - }); - } - }); - - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); - - const chatModelProvider = - body.chatModel?.provider || Object.keys(chatModelProviders)[0]; - const chatModel = - body.chatModel?.model || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - const embeddingModelProvider = - body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0]; - const embeddingModel = - body.embeddingModel?.model || - Object.keys(embeddingModelProviders[embeddingModelProvider])[0]; - - let llm: BaseChatModel | undefined; - let embeddings: Embeddings | undefined; - - if (body.chatModel?.provider === 'custom_openai') { - llm = new ChatOpenAI({ - modelName: body.chatModel?.model || getCustomOpenaiModelName(), - openAIApiKey: - body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), - temperature: 0.7, - configuration: { - baseURL: - body.chatModel?.customOpenAIBaseURL || getCustomOpenaiApiUrl(), - }, - }) as unknown as BaseChatModel; - } else if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } - - if ( - embeddingModelProviders[embeddingModelProvider] && - embeddingModelProviders[embeddingModelProvider][embeddingModel] - ) { - embeddings = embeddingModelProviders[embeddingModelProvider][ - embeddingModel - ].model as Embeddings | undefined; - } - - if (!llm || !embeddings) { - return res.status(400).json({ message: 'Invalid model selected' }); - } - - const searchHandler: MetaSearchAgentType = searchHandlers[body.focusMode]; - - if (!searchHandler) { - return res.status(400).json({ message: 'Invalid focus mode' }); - } - - const emitter = await searchHandler.searchAndAnswer( - body.query, - history, - llm, - embeddings, - body.optimizationMode, - [], - ); - - let message = ''; - let sources = []; - - emitter.on('data', (data) => { - const parsedData = JSON.parse(data); - if (parsedData.type === 'response') { - message += parsedData.data; - } else if (parsedData.type === 'sources') { - sources = parsedData.data; - } - }); - - emitter.on('end', () => { - res.status(200).json({ message, sources }); - }); - - emitter.on('error', (data) => { - const parsedData = JSON.parse(data); - res.status(500).json({ message: parsedData.data }); - }); - } catch (err: any) { - logger.error(`Error in getting search results: ${err.message}`); - res.status(500).json({ message: 'An error has occurred.' }); - } -}); - -export default router; diff --git a/src/routes/suggestions.ts b/src/routes/suggestions.ts deleted file mode 100644 index 7dd1739..0000000 --- a/src/routes/suggestions.ts +++ /dev/null @@ -1,81 +0,0 @@ -import express from 'express'; -import generateSuggestions from '../chains/suggestionGeneratorAgent'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { getAvailableChatModelProviders } from '../lib/providers'; -import { HumanMessage, AIMessage } from '@langchain/core/messages'; -import logger from '../utils/logger'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -const router = express.Router(); - -interface ChatModel { - provider: string; - model: string; -} - -interface SuggestionsBody { - chatHistory: any[]; - chatModel?: ChatModel; -} - -router.post('/', async (req, res) => { - try { - let body: SuggestionsBody = req.body; - - const chatHistory = body.chatHistory.map((msg: any) => { - if (msg.role === 'user') { - return new HumanMessage(msg.content); - } else if (msg.role === 'assistant') { - return new AIMessage(msg.content); - } - }); - - const chatModelProviders = await getAvailableChatModelProviders(); - - const chatModelProvider = - body.chatModel?.provider || Object.keys(chatModelProviders)[0]; - const chatModel = - body.chatModel?.model || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - let llm: BaseChatModel | undefined; - - if (body.chatModel?.provider === 'custom_openai') { - llm = new ChatOpenAI({ - modelName: getCustomOpenaiModelName(), - openAIApiKey: getCustomOpenaiApiKey(), - temperature: 0.7, - configuration: { - baseURL: getCustomOpenaiApiUrl(), - }, - }) as unknown as BaseChatModel; - } else if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } - - if (!llm) { - return res.status(400).json({ message: 'Invalid model selected' }); - } - - const suggestions = await generateSuggestions( - { chat_history: chatHistory }, - llm, - ); - - res.status(200).json({ suggestions: suggestions }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in generating suggestions: ${err.message}`); - } -}); - -export default router; diff --git a/src/routes/uploads.ts b/src/routes/uploads.ts deleted file mode 100644 index 7b063fc..0000000 --- a/src/routes/uploads.ts +++ /dev/null @@ -1,151 +0,0 @@ -import express from 'express'; -import logger from '../utils/logger'; -import multer from 'multer'; -import path from 'path'; -import crypto from 'crypto'; -import fs from 'fs'; -import { Embeddings } from '@langchain/core/embeddings'; -import { getAvailableEmbeddingModelProviders } from '../lib/providers'; -import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf'; -import { DocxLoader } from '@langchain/community/document_loaders/fs/docx'; -import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'; -import { Document } from 'langchain/document'; - -const router = express.Router(); - -const splitter = new RecursiveCharacterTextSplitter({ - chunkSize: 500, - chunkOverlap: 100, -}); - -const storage = multer.diskStorage({ - destination: (req, file, cb) => { - cb(null, path.join(process.cwd(), './uploads')); - }, - filename: (req, file, cb) => { - const splitedFileName = file.originalname.split('.'); - const fileExtension = splitedFileName[splitedFileName.length - 1]; - if (!['pdf', 'docx', 'txt'].includes(fileExtension)) { - return cb(new Error('File type is not supported'), ''); - } - cb(null, `${crypto.randomBytes(16).toString('hex')}.${fileExtension}`); - }, -}); - -const upload = multer({ storage }); - -router.post( - '/', - upload.fields([ - { name: 'files' }, - { name: 'embedding_model', maxCount: 1 }, - { name: 'embedding_model_provider', maxCount: 1 }, - ]), - async (req, res) => { - try { - const { embedding_model, embedding_model_provider } = req.body; - - if (!embedding_model || !embedding_model_provider) { - res - .status(400) - .json({ message: 'Missing embedding model or provider' }); - return; - } - - const embeddingModels = await getAvailableEmbeddingModelProviders(); - const provider = - embedding_model_provider ?? Object.keys(embeddingModels)[0]; - const embeddingModel: Embeddings = - embedding_model ?? Object.keys(embeddingModels[provider])[0]; - - let embeddingsModel: Embeddings | undefined; - - if ( - embeddingModels[provider] && - embeddingModels[provider][embeddingModel] - ) { - embeddingsModel = embeddingModels[provider][embeddingModel].model as - | Embeddings - | undefined; - } - - if (!embeddingsModel) { - res.status(400).json({ message: 'Invalid LLM model selected' }); - return; - } - - const files = req.files['files'] as Express.Multer.File[]; - if (!files || files.length === 0) { - res.status(400).json({ message: 'No files uploaded' }); - return; - } - - await Promise.all( - files.map(async (file) => { - let docs: Document[] = []; - - if (file.mimetype === 'application/pdf') { - const loader = new PDFLoader(file.path); - docs = await loader.load(); - } else if ( - file.mimetype === - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' - ) { - const loader = new DocxLoader(file.path); - docs = await loader.load(); - } else if (file.mimetype === 'text/plain') { - const text = fs.readFileSync(file.path, 'utf-8'); - docs = [ - new Document({ - pageContent: text, - metadata: { - title: file.originalname, - }, - }), - ]; - } - - const splitted = await splitter.splitDocuments(docs); - - const json = JSON.stringify({ - title: file.originalname, - contents: splitted.map((doc) => doc.pageContent), - }); - - const pathToSave = file.path.replace(/\.\w+$/, '-extracted.json'); - fs.writeFileSync(pathToSave, json); - - const embeddings = await embeddingsModel.embedDocuments( - splitted.map((doc) => doc.pageContent), - ); - - const embeddingsJSON = JSON.stringify({ - title: file.originalname, - embeddings: embeddings, - }); - - const pathToSaveEmbeddings = file.path.replace( - /\.\w+$/, - '-embeddings.json', - ); - fs.writeFileSync(pathToSaveEmbeddings, embeddingsJSON); - }), - ); - - res.status(200).json({ - files: files.map((file) => { - return { - fileName: file.originalname, - fileExtension: file.filename.split('.').pop(), - fileId: file.filename.replace(/\.\w+$/, ''), - }; - }), - }); - } catch (err: any) { - logger.error(`Error in uploading file results: ${err.message}`); - res.status(500).json({ message: 'An error has occurred.' }); - } - }, -); - -export default router; diff --git a/src/routes/videos.ts b/src/routes/videos.ts deleted file mode 100644 index b631f26..0000000 --- a/src/routes/videos.ts +++ /dev/null @@ -1,82 +0,0 @@ -import express from 'express'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { getAvailableChatModelProviders } from '../lib/providers'; -import { HumanMessage, AIMessage } from '@langchain/core/messages'; -import logger from '../utils/logger'; -import handleVideoSearch from '../chains/videoSearchAgent'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -const router = express.Router(); - -interface ChatModel { - provider: string; - model: string; -} - -interface VideoSearchBody { - query: string; - chatHistory: any[]; - chatModel?: ChatModel; -} - -router.post('/', async (req, res) => { - try { - let body: VideoSearchBody = req.body; - - const chatHistory = body.chatHistory.map((msg: any) => { - if (msg.role === 'user') { - return new HumanMessage(msg.content); - } else if (msg.role === 'assistant') { - return new AIMessage(msg.content); - } - }); - - const chatModelProviders = await getAvailableChatModelProviders(); - - const chatModelProvider = - body.chatModel?.provider || Object.keys(chatModelProviders)[0]; - const chatModel = - body.chatModel?.model || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - let llm: BaseChatModel | undefined; - - if (body.chatModel?.provider === 'custom_openai') { - llm = new ChatOpenAI({ - modelName: getCustomOpenaiModelName(), - openAIApiKey: getCustomOpenaiApiKey(), - temperature: 0.7, - configuration: { - baseURL: getCustomOpenaiApiUrl(), - }, - }) as unknown as BaseChatModel; - } else if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } - - if (!llm) { - return res.status(400).json({ message: 'Invalid model selected' }); - } - - const videos = await handleVideoSearch( - { chat_history: chatHistory, query: body.query }, - llm, - ); - - res.status(200).json({ videos }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in video search: ${err.message}`); - } -}); - -export default router; diff --git a/src/search/metaSearchAgent.ts b/src/search/metaSearchAgent.ts deleted file mode 100644 index ee82c10..0000000 --- a/src/search/metaSearchAgent.ts +++ /dev/null @@ -1,494 +0,0 @@ -import { ChatOpenAI } from '@langchain/openai'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import { - ChatPromptTemplate, - MessagesPlaceholder, - PromptTemplate, -} from '@langchain/core/prompts'; -import { - RunnableLambda, - RunnableMap, - RunnableSequence, -} from '@langchain/core/runnables'; -import { BaseMessage } from '@langchain/core/messages'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import LineListOutputParser from '../lib/outputParsers/listLineOutputParser'; -import LineOutputParser from '../lib/outputParsers/lineOutputParser'; -import { getDocumentsFromLinks } from '../utils/documents'; -import { Document } from 'langchain/document'; -import { searchSearxng } from '../lib/searxng'; -import path from 'path'; -import fs from 'fs'; -import computeSimilarity from '../utils/computeSimilarity'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import eventEmitter from 'events'; -import { StreamEvent } from '@langchain/core/tracers/log_stream'; -import { IterableReadableStream } from '@langchain/core/utils/stream'; - -export interface MetaSearchAgentType { - searchAndAnswer: ( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - fileIds: string[], - ) => Promise<eventEmitter>; -} - -interface Config { - searchWeb: boolean; - rerank: boolean; - summarizer: boolean; - rerankThreshold: number; - queryGeneratorPrompt: string; - responsePrompt: string; - activeEngines: string[]; -} - -type BasicChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -class MetaSearchAgent implements MetaSearchAgentType { - private config: Config; - private strParser = new StringOutputParser(); - - constructor(config: Config) { - this.config = config; - } - - private async createSearchRetrieverChain(llm: BaseChatModel) { - (llm as unknown as ChatOpenAI).temperature = 0; - - return RunnableSequence.from([ - PromptTemplate.fromTemplate(this.config.queryGeneratorPrompt), - llm, - this.strParser, - RunnableLambda.from(async (input: string) => { - const linksOutputParser = new LineListOutputParser({ - key: 'links', - }); - - const questionOutputParser = new LineOutputParser({ - key: 'question', - }); - - const links = await linksOutputParser.parse(input); - let question = this.config.summarizer - ? await questionOutputParser.parse(input) - : input; - - if (question === 'not_needed') { - return { query: '', docs: [] }; - } - - if (links.length > 0) { - if (question.length === 0) { - question = 'summarize'; - } - - let docs = []; - - const linkDocs = await getDocumentsFromLinks({ links }); - - const docGroups: Document[] = []; - - linkDocs.map((doc) => { - const URLDocExists = docGroups.find( - (d) => - d.metadata.url === doc.metadata.url && - d.metadata.totalDocs < 10, - ); - - if (!URLDocExists) { - docGroups.push({ - ...doc, - metadata: { - ...doc.metadata, - totalDocs: 1, - }, - }); - } - - const docIndex = docGroups.findIndex( - (d) => - d.metadata.url === doc.metadata.url && - d.metadata.totalDocs < 10, - ); - - if (docIndex !== -1) { - docGroups[docIndex].pageContent = - docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; - docGroups[docIndex].metadata.totalDocs += 1; - } - }); - - await Promise.all( - docGroups.map(async (doc) => { - const res = await llm.invoke(` - You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the - text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query. - If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary. - - - **Journalistic tone**: The summary should sound professional and journalistic, not too casual or vague. - - **Thorough and detailed**: Ensure that every key point from the text is captured and that the summary directly answers the query. - - **Not too lengthy, but detailed**: The summary should be informative but not excessively long. Focus on providing detailed information in a concise format. - - The text will be shared inside the \`text\` XML tag, and the query inside the \`query\` XML tag. - - <example> - 1. \`<text> - Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers. - It was first released in 2013 and is developed by Docker, Inc. Docker is designed to make it easier to create, deploy, and run applications - by using containers. - </text> - - <query> - What is Docker and how does it work? - </query> - - Response: - Docker is a revolutionary platform-as-a-service product developed by Docker, Inc., that uses container technology to make application - deployment more efficient. It allows developers to package their software with all necessary dependencies, making it easier to run in - any environment. Released in 2013, Docker has transformed the way applications are built, deployed, and managed. - \` - 2. \`<text> - The theory of relativity, or simply relativity, encompasses two interrelated theories of Albert Einstein: special relativity and general - relativity. However, the word "relativity" is sometimes used in reference to Galilean invariance. The term "theory of relativity" was based - on the expression "relative theory" used by Max Planck in 1906. The theory of relativity usually encompasses two interrelated theories by - Albert Einstein: special relativity and general relativity. Special relativity applies to all physical phenomena in the absence of gravity. - General relativity explains the law of gravitation and its relation to other forces of nature. It applies to the cosmological and astrophysical - realm, including astronomy. - </text> - - <query> - summarize - </query> - - Response: - The theory of relativity, developed by Albert Einstein, encompasses two main theories: special relativity and general relativity. Special - relativity applies to all physical phenomena in the absence of gravity, while general relativity explains the law of gravitation and its - relation to other forces of nature. The theory of relativity is based on the concept of "relative theory," as introduced by Max Planck in - 1906. It is a fundamental theory in physics that has revolutionized our understanding of the universe. - \` - </example> - - Everything below is the actual data you will be working with. Good luck! - - <query> - ${question} - </query> - - <text> - ${doc.pageContent} - </text> - - Make sure to answer the query in the summary. - `); - - const document = new Document({ - pageContent: res.content as string, - metadata: { - title: doc.metadata.title, - url: doc.metadata.url, - }, - }); - - docs.push(document); - }), - ); - - return { query: question, docs: docs }; - } else { - const res = await searchSearxng(question, { - language: 'en', - engines: this.config.activeEngines, - }); - - const documents = res.results.map( - (result) => - new Document({ - pageContent: - result.content || - (this.config.activeEngines.includes('youtube') - ? result.title - : '') /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */, - metadata: { - title: result.title, - url: result.url, - ...(result.img_src && { img_src: result.img_src }), - }, - }), - ); - - return { query: question, docs: documents }; - } - }), - ]); - } - - private async createAnsweringChain( - llm: BaseChatModel, - fileIds: string[], - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - ) { - return RunnableSequence.from([ - RunnableMap.from({ - query: (input: BasicChainInput) => input.query, - chat_history: (input: BasicChainInput) => input.chat_history, - date: () => new Date().toISOString(), - context: RunnableLambda.from(async (input: BasicChainInput) => { - const processedHistory = formatChatHistoryAsString( - input.chat_history, - ); - - let docs: Document[] | null = null; - let query = input.query; - - if (this.config.searchWeb) { - const searchRetrieverChain = - await this.createSearchRetrieverChain(llm); - - const searchRetrieverResult = await searchRetrieverChain.invoke({ - chat_history: processedHistory, - query, - }); - - query = searchRetrieverResult.query; - docs = searchRetrieverResult.docs; - } - - const sortedDocs = await this.rerankDocs( - query, - docs ?? [], - fileIds, - embeddings, - optimizationMode, - ); - - return sortedDocs; - }) - .withConfig({ - runName: 'FinalSourceRetriever', - }) - .pipe(this.processDocs), - }), - ChatPromptTemplate.fromMessages([ - ['system', this.config.responsePrompt], - new MessagesPlaceholder('chat_history'), - ['user', '{query}'], - ]), - llm, - this.strParser, - ]).withConfig({ - runName: 'FinalResponseGenerator', - }); - } - - private async rerankDocs( - query: string, - docs: Document[], - fileIds: string[], - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - ) { - if (docs.length === 0 && fileIds.length === 0) { - return docs; - } - - const filesData = fileIds - .map((file) => { - const filePath = path.join(process.cwd(), 'uploads', file); - - const contentPath = filePath + '-extracted.json'; - const embeddingsPath = filePath + '-embeddings.json'; - - const content = JSON.parse(fs.readFileSync(contentPath, 'utf8')); - const embeddings = JSON.parse(fs.readFileSync(embeddingsPath, 'utf8')); - - const fileSimilaritySearchObject = content.contents.map( - (c: string, i) => { - return { - fileName: content.title, - content: c, - embeddings: embeddings.embeddings[i], - }; - }, - ); - - return fileSimilaritySearchObject; - }) - .flat(); - - if (query.toLocaleLowerCase() === 'summarize') { - return docs.slice(0, 15); - } - - const docsWithContent = docs.filter( - (doc) => doc.pageContent && doc.pageContent.length > 0, - ); - - if (optimizationMode === 'speed' || this.config.rerank === false) { - if (filesData.length > 0) { - const [queryEmbedding] = await Promise.all([ - embeddings.embedQuery(query), - ]); - - const fileDocs = filesData.map((fileData) => { - return new Document({ - pageContent: fileData.content, - metadata: { - title: fileData.fileName, - url: `File`, - }, - }); - }); - - const similarity = filesData.map((fileData, i) => { - const sim = computeSimilarity(queryEmbedding, fileData.embeddings); - - return { - index: i, - similarity: sim, - }; - }); - - let sortedDocs = similarity - .filter( - (sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3), - ) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => fileDocs[sim.index]); - - sortedDocs = - docsWithContent.length > 0 ? sortedDocs.slice(0, 8) : sortedDocs; - - return [ - ...sortedDocs, - ...docsWithContent.slice(0, 15 - sortedDocs.length), - ]; - } else { - return docsWithContent.slice(0, 15); - } - } else if (optimizationMode === 'balanced') { - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments( - docsWithContent.map((doc) => doc.pageContent), - ), - embeddings.embedQuery(query), - ]); - - docsWithContent.push( - ...filesData.map((fileData) => { - return new Document({ - pageContent: fileData.content, - metadata: { - title: fileData.fileName, - url: `File`, - }, - }); - }), - ); - - docEmbeddings.push(...filesData.map((fileData) => fileData.embeddings)); - - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); - - return { - index: i, - similarity: sim, - }; - }); - - const sortedDocs = similarity - .filter((sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3)) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); - - return sortedDocs; - } - } - - private processDocs(docs: Document[]) { - return docs - .map( - (_, index) => - `${index + 1}. ${docs[index].metadata.title} ${docs[index].pageContent}`, - ) - .join('\n'); - } - - private async handleStream( - stream: IterableReadableStream<StreamEvent>, - emitter: eventEmitter, - ) { - for await (const event of stream) { - if ( - event.event === 'on_chain_end' && - event.name === 'FinalSourceRetriever' - ) { - ``; - emitter.emit( - 'data', - JSON.stringify({ type: 'sources', data: event.data.output }), - ); - } - if ( - event.event === 'on_chain_stream' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'response', data: event.data.chunk }), - ); - } - if ( - event.event === 'on_chain_end' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit('end'); - } - } - } - - async searchAndAnswer( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - fileIds: string[], - ) { - const emitter = new eventEmitter(); - - const answeringChain = await this.createAnsweringChain( - llm, - fileIds, - embeddings, - optimizationMode, - ); - - const stream = answeringChain.streamEvents( - { - chat_history: history, - query: message, - }, - { - version: 'v1', - }, - ); - - this.handleStream(stream, emitter); - - return emitter; - } -} - -export default MetaSearchAgent; diff --git a/src/utils/computeSimilarity.ts b/src/utils/computeSimilarity.ts deleted file mode 100644 index 6e36b75..0000000 --- a/src/utils/computeSimilarity.ts +++ /dev/null @@ -1,17 +0,0 @@ -import dot from 'compute-dot'; -import cosineSimilarity from 'compute-cosine-similarity'; -import { getSimilarityMeasure } from '../config'; - -const computeSimilarity = (x: number[], y: number[]): number => { - const similarityMeasure = getSimilarityMeasure(); - - if (similarityMeasure === 'cosine') { - return cosineSimilarity(x, y); - } else if (similarityMeasure === 'dot') { - return dot(x, y); - } - - throw new Error('Invalid similarity measure'); -}; - -export default computeSimilarity; diff --git a/src/utils/documents.ts b/src/utils/documents.ts deleted file mode 100644 index 5cd0366..0000000 --- a/src/utils/documents.ts +++ /dev/null @@ -1,99 +0,0 @@ -import axios from 'axios'; -import { htmlToText } from 'html-to-text'; -import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; -import { Document } from '@langchain/core/documents'; -import pdfParse from 'pdf-parse'; -import logger from './logger'; - -export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { - const splitter = new RecursiveCharacterTextSplitter(); - - let docs: Document[] = []; - - await Promise.all( - links.map(async (link) => { - link = - link.startsWith('http://') || link.startsWith('https://') - ? link - : `https://${link}`; - - try { - const res = await axios.get(link, { - responseType: 'arraybuffer', - }); - - const isPdf = res.headers['content-type'] === 'application/pdf'; - - if (isPdf) { - const pdfText = await pdfParse(res.data); - const parsedText = pdfText.text - .replace(/(\r\n|\n|\r)/gm, ' ') - .replace(/\s+/g, ' ') - .trim(); - - const splittedText = await splitter.splitText(parsedText); - const title = 'PDF Document'; - - const linkDocs = splittedText.map((text) => { - return new Document({ - pageContent: text, - metadata: { - title: title, - url: link, - }, - }); - }); - - docs.push(...linkDocs); - return; - } - - const parsedText = htmlToText(res.data.toString('utf8'), { - selectors: [ - { - selector: 'a', - options: { - ignoreHref: true, - }, - }, - ], - }) - .replace(/(\r\n|\n|\r)/gm, ' ') - .replace(/\s+/g, ' ') - .trim(); - - const splittedText = await splitter.splitText(parsedText); - const title = res.data - .toString('utf8') - .match(/<title>(.*?)<\/title>/)?.[1]; - - const linkDocs = splittedText.map((text) => { - return new Document({ - pageContent: text, - metadata: { - title: title || link, - url: link, - }, - }); - }); - - docs.push(...linkDocs); - } catch (err) { - logger.error( - `Error at generating documents from links: ${err.message}`, - ); - docs.push( - new Document({ - pageContent: `Failed to retrieve content from the link: ${err.message}`, - metadata: { - title: 'Failed to retrieve content', - url: link, - }, - }), - ); - } - }), - ); - - return docs; -}; diff --git a/src/utils/logger.ts b/src/utils/logger.ts deleted file mode 100644 index 1c81eb9..0000000 --- a/src/utils/logger.ts +++ /dev/null @@ -1,22 +0,0 @@ -import winston from 'winston'; - -const logger = winston.createLogger({ - level: 'info', - transports: [ - new winston.transports.Console({ - format: winston.format.combine( - winston.format.colorize(), - winston.format.simple(), - ), - }), - new winston.transports.File({ - filename: 'app.log', - format: winston.format.combine( - winston.format.timestamp(), - winston.format.json(), - ), - }), - ], -}); - -export default logger; diff --git a/src/websocket/connectionManager.ts b/src/websocket/connectionManager.ts deleted file mode 100644 index bb8f242..0000000 --- a/src/websocket/connectionManager.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { WebSocket } from 'ws'; -import { handleMessage } from './messageHandler'; -import { - getAvailableEmbeddingModelProviders, - getAvailableChatModelProviders, -} from '../lib/providers'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import type { IncomingMessage } from 'http'; -import logger from '../utils/logger'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -export const handleConnection = async ( - ws: WebSocket, - request: IncomingMessage, -) => { - try { - const searchParams = new URL(request.url, `http://${request.headers.host}`) - .searchParams; - - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); - - const chatModelProvider = - searchParams.get('chatModelProvider') || - Object.keys(chatModelProviders)[0]; - const chatModel = - searchParams.get('chatModel') || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - const embeddingModelProvider = - searchParams.get('embeddingModelProvider') || - Object.keys(embeddingModelProviders)[0]; - const embeddingModel = - searchParams.get('embeddingModel') || - Object.keys(embeddingModelProviders[embeddingModelProvider])[0]; - - let llm: BaseChatModel | undefined; - let embeddings: Embeddings | undefined; - - if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] && - chatModelProvider != 'custom_openai' - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } else if (chatModelProvider == 'custom_openai') { - const customOpenaiApiKey = getCustomOpenaiApiKey(); - const customOpenaiApiUrl = getCustomOpenaiApiUrl(); - const customOpenaiModelName = getCustomOpenaiModelName(); - - if (customOpenaiApiKey && customOpenaiApiUrl && customOpenaiModelName) { - llm = new ChatOpenAI({ - modelName: customOpenaiModelName, - openAIApiKey: customOpenaiApiKey, - temperature: 0.7, - configuration: { - baseURL: customOpenaiApiUrl, - }, - }) as unknown as BaseChatModel; - } - } - - if ( - embeddingModelProviders[embeddingModelProvider] && - embeddingModelProviders[embeddingModelProvider][embeddingModel] - ) { - embeddings = embeddingModelProviders[embeddingModelProvider][ - embeddingModel - ].model as Embeddings | undefined; - } - - if (!llm || !embeddings) { - ws.send( - JSON.stringify({ - type: 'error', - data: 'Invalid LLM or embeddings model selected, please refresh the page and try again.', - key: 'INVALID_MODEL_SELECTED', - }), - ); - ws.close(); - } - - const interval = setInterval(() => { - if (ws.readyState === ws.OPEN) { - ws.send( - JSON.stringify({ - type: 'signal', - data: 'open', - }), - ); - clearInterval(interval); - } - }, 5); - - ws.on( - 'message', - async (message) => - await handleMessage(message.toString(), ws, llm, embeddings), - ); - - ws.on('close', () => logger.debug('Connection closed')); - } catch (err) { - ws.send( - JSON.stringify({ - type: 'error', - data: 'Internal server error.', - key: 'INTERNAL_SERVER_ERROR', - }), - ); - ws.close(); - logger.error(err); - } -}; diff --git a/src/websocket/index.ts b/src/websocket/index.ts deleted file mode 100644 index 1b9ae77..0000000 --- a/src/websocket/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { initServer } from './websocketServer'; -import http from 'http'; - -export const startWebSocketServer = ( - server: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, -) => { - initServer(server); -}; diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts deleted file mode 100644 index 395c0de..0000000 --- a/src/websocket/messageHandler.ts +++ /dev/null @@ -1,272 +0,0 @@ -import { EventEmitter, WebSocket } from 'ws'; -import { BaseMessage, AIMessage, HumanMessage } from '@langchain/core/messages'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import logger from '../utils/logger'; -import db from '../db'; -import { chats, messages as messagesSchema } from '../db/schema'; -import { eq, asc, gt, and } from 'drizzle-orm'; -import crypto from 'crypto'; -import { getFileDetails } from '../utils/files'; -import MetaSearchAgent, { - MetaSearchAgentType, -} from '../search/metaSearchAgent'; -import prompts from '../prompts'; - -type Message = { - messageId: string; - chatId: string; - content: string; -}; - -type WSMessage = { - message: Message; - optimizationMode: 'speed' | 'balanced' | 'quality'; - type: string; - focusMode: string; - history: Array<[string, string]>; - files: Array<string>; -}; - -export const searchHandlers = { - webSearch: new MetaSearchAgent({ - activeEngines: [], - queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, - responsePrompt: prompts.webSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: true, - }), - academicSearch: new MetaSearchAgent({ - activeEngines: ['arxiv', 'google scholar', 'pubmed'], - queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, - responsePrompt: prompts.academicSearchResponsePrompt, - rerank: true, - rerankThreshold: 0, - searchWeb: true, - summarizer: false, - }), - writingAssistant: new MetaSearchAgent({ - activeEngines: [], - queryGeneratorPrompt: '', - responsePrompt: prompts.writingAssistantPrompt, - rerank: true, - rerankThreshold: 0, - searchWeb: false, - summarizer: false, - }), - wolframAlphaSearch: new MetaSearchAgent({ - activeEngines: ['wolframalpha'], - queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, - responsePrompt: prompts.wolframAlphaSearchResponsePrompt, - rerank: false, - rerankThreshold: 0, - searchWeb: true, - summarizer: false, - }), - youtubeSearch: new MetaSearchAgent({ - activeEngines: ['youtube'], - queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, - responsePrompt: prompts.youtubeSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: false, - }), - redditSearch: new MetaSearchAgent({ - activeEngines: ['reddit'], - queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, - responsePrompt: prompts.redditSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: false, - }), -}; - -const handleEmitterEvents = ( - emitter: EventEmitter, - ws: WebSocket, - messageId: string, - chatId: string, -) => { - let recievedMessage = ''; - let sources = []; - - emitter.on('data', (data) => { - const parsedData = JSON.parse(data); - if (parsedData.type === 'response') { - ws.send( - JSON.stringify({ - type: 'message', - data: parsedData.data, - messageId: messageId, - }), - ); - recievedMessage += parsedData.data; - } else if (parsedData.type === 'sources') { - ws.send( - JSON.stringify({ - type: 'sources', - data: parsedData.data, - messageId: messageId, - }), - ); - sources = parsedData.data; - } - }); - emitter.on('end', () => { - ws.send(JSON.stringify({ type: 'messageEnd', messageId: messageId })); - - db.insert(messagesSchema) - .values({ - content: recievedMessage, - chatId: chatId, - messageId: messageId, - role: 'assistant', - metadata: JSON.stringify({ - createdAt: new Date(), - ...(sources && sources.length > 0 && { sources }), - }), - }) - .execute(); - }); - emitter.on('error', (data) => { - const parsedData = JSON.parse(data); - ws.send( - JSON.stringify({ - type: 'error', - data: parsedData.data, - key: 'CHAIN_ERROR', - }), - ); - }); -}; - -export const handleMessage = async ( - message: string, - ws: WebSocket, - llm: BaseChatModel, - embeddings: Embeddings, -) => { - try { - const parsedWSMessage = JSON.parse(message) as WSMessage; - const parsedMessage = parsedWSMessage.message; - - if (parsedWSMessage.files.length > 0) { - /* TODO: Implement uploads in other classes/single meta class system*/ - parsedWSMessage.focusMode = 'webSearch'; - } - - const humanMessageId = - parsedMessage.messageId ?? crypto.randomBytes(7).toString('hex'); - const aiMessageId = crypto.randomBytes(7).toString('hex'); - - if (!parsedMessage.content) - return ws.send( - JSON.stringify({ - type: 'error', - data: 'Invalid message format', - key: 'INVALID_FORMAT', - }), - ); - - const history: BaseMessage[] = parsedWSMessage.history.map((msg) => { - if (msg[0] === 'human') { - return new HumanMessage({ - content: msg[1], - }); - } else { - return new AIMessage({ - content: msg[1], - }); - } - }); - - if (parsedWSMessage.type === 'message') { - const handler: MetaSearchAgentType = - searchHandlers[parsedWSMessage.focusMode]; - - if (handler) { - try { - const emitter = await handler.searchAndAnswer( - parsedMessage.content, - history, - llm, - embeddings, - parsedWSMessage.optimizationMode, - parsedWSMessage.files, - ); - - handleEmitterEvents(emitter, ws, aiMessageId, parsedMessage.chatId); - - const chat = await db.query.chats.findFirst({ - where: eq(chats.id, parsedMessage.chatId), - }); - - if (!chat) { - await db - .insert(chats) - .values({ - id: parsedMessage.chatId, - title: parsedMessage.content, - createdAt: new Date().toString(), - focusMode: parsedWSMessage.focusMode, - files: parsedWSMessage.files.map(getFileDetails), - }) - .execute(); - } - - const messageExists = await db.query.messages.findFirst({ - where: eq(messagesSchema.messageId, humanMessageId), - }); - - if (!messageExists) { - await db - .insert(messagesSchema) - .values({ - content: parsedMessage.content, - chatId: parsedMessage.chatId, - messageId: humanMessageId, - role: 'user', - metadata: JSON.stringify({ - createdAt: new Date(), - }), - }) - .execute(); - } else { - await db - .delete(messagesSchema) - .where( - and( - gt(messagesSchema.id, messageExists.id), - eq(messagesSchema.chatId, parsedMessage.chatId), - ), - ) - .execute(); - } - } catch (err) { - console.log(err); - } - } else { - ws.send( - JSON.stringify({ - type: 'error', - data: 'Invalid focus mode', - key: 'INVALID_FOCUS_MODE', - }), - ); - } - } - } catch (err) { - ws.send( - JSON.stringify({ - type: 'error', - data: 'Invalid message format', - key: 'INVALID_FORMAT', - }), - ); - logger.error(`Failed to handle message: ${err}`); - } -}; diff --git a/src/websocket/websocketServer.ts b/src/websocket/websocketServer.ts deleted file mode 100644 index 3ab0b51..0000000 --- a/src/websocket/websocketServer.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { WebSocketServer } from 'ws'; -import { handleConnection } from './connectionManager'; -import http from 'http'; -import { getPort } from '../config'; -import logger from '../utils/logger'; - -export const initServer = ( - server: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, -) => { - const port = getPort(); - const wss = new WebSocketServer({ server }); - - wss.on('connection', handleConnection); - - logger.info(`WebSocket server started on port ${port}`); -}; diff --git a/ui/tailwind.config.ts b/tailwind.config.ts similarity index 88% rename from ui/tailwind.config.ts rename to tailwind.config.ts index 00ae10a..ae2cba9 100644 --- a/ui/tailwind.config.ts +++ b/tailwind.config.ts @@ -15,9 +15,9 @@ const themeLight = (colors: DefaultColors) => ({ const config: Config = { content: [ - './pages/**/*.{js,ts,jsx,tsx,mdx}', - './components/**/*.{js,ts,jsx,tsx,mdx}', - './app/**/*.{js,ts,jsx,tsx,mdx}', + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', ], darkMode: 'class', theme: { diff --git a/tsconfig.json b/tsconfig.json index 48e6042..51d0dbc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,27 @@ { "compilerOptions": { - "lib": ["ESNext"], - "module": "Node16", - "moduleResolution": "Node16", - "target": "ESNext", - "outDir": "dist", - "sourceMap": false, - "esModuleInterop": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "allowSyntheticDefaultImports": true, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, "skipLibCheck": true, - "skipDefaultLibCheck": true + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + }, + "target": "ES2017" }, - "include": ["src"], - "exclude": ["node_modules", "**/*.spec.ts"] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/ui/.env.example b/ui/.env.example deleted file mode 100644 index 57a3ed9..0000000 --- a/ui/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -NEXT_PUBLIC_WS_URL=ws://localhost:3001 -NEXT_PUBLIC_API_URL=http://localhost:3001/api \ No newline at end of file diff --git a/ui/.gitignore b/ui/.gitignore deleted file mode 100644 index 5913b49..0000000 --- a/ui/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/ui/.prettierignore b/ui/.prettierignore deleted file mode 100644 index 55d3c7c..0000000 --- a/ui/.prettierignore +++ /dev/null @@ -1,41 +0,0 @@ -# Ignore all files in the node_modules directory -node_modules - -# Ignore all files in the .next directory (Next.js build output) -.next - -# Ignore all files in the .out directory (TypeScript build output) -.out - -# Ignore all files in the .cache directory (Prettier cache) -.cache - -# Ignore all files in the .vscode directory (Visual Studio Code settings) -.vscode - -# Ignore all files in the .idea directory (IntelliJ IDEA settings) -.idea - -# Ignore all files in the dist directory (build output) -dist - -# Ignore all files in the build directory (build output) -build - -# Ignore all files in the coverage directory (test coverage reports) -coverage - -# Ignore all files with the .log extension -*.log - -# Ignore all files with the .tmp extension -*.tmp - -# Ignore all files with the .swp extension -*.swp - -# Ignore all files with the .DS_Store extension (macOS specific) -.DS_Store - -# Ignore all files in uploads directory -uploads \ No newline at end of file diff --git a/ui/.prettierrc.js b/ui/.prettierrc.js deleted file mode 100644 index 8ca480f..0000000 --- a/ui/.prettierrc.js +++ /dev/null @@ -1,11 +0,0 @@ -/** @type {import("prettier").Config} */ - -const config = { - printWidth: 80, - trailingComma: 'all', - endOfLine: 'auto', - singleQuote: true, - tabWidth: 2, -}; - -module.exports = config; diff --git a/ui/data/.gitignore b/ui/data/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/ui/data/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/ui/drizzle.config.ts b/ui/drizzle.config.ts deleted file mode 100644 index 76b84a9..0000000 --- a/ui/drizzle.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'drizzle-kit'; - -export default defineConfig({ - dialect: 'sqlite', - schema: './lib/db/schema.ts', - out: './drizzle', - dbCredentials: { - url: './data/db.sqlite', - }, -}); diff --git a/ui/lib/db/schema.ts b/ui/lib/db/schema.ts deleted file mode 100644 index cee9660..0000000 --- a/ui/lib/db/schema.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { sql } from 'drizzle-orm'; -import { text, integer, sqliteTable } from 'drizzle-orm/sqlite-core'; - -export const messages = sqliteTable('messages', { - id: integer('id').primaryKey(), - content: text('content').notNull(), - chatId: text('chatId').notNull(), - messageId: text('messageId').notNull(), - role: text('type', { enum: ['assistant', 'user'] }), - metadata: text('metadata', { - mode: 'json', - }), -}); - -interface File { - name: string; - fileId: string; -} - -export const chats = sqliteTable('chats', { - id: text('id').primaryKey(), - title: text('title').notNull(), - createdAt: text('createdAt').notNull(), - focusMode: text('focusMode').notNull(), - files: text('files', { mode: 'json' }) - .$type<File[]>() - .default(sql`'[]'`), -}); diff --git a/ui/lib/outputParsers/lineOutputParser.ts b/ui/lib/outputParsers/lineOutputParser.ts deleted file mode 100644 index fcd69ef..0000000 --- a/ui/lib/outputParsers/lineOutputParser.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BaseOutputParser } from '@langchain/core/output_parsers'; - -interface LineOutputParserArgs { - key?: string; -} - -class LineOutputParser extends BaseOutputParser<string> { - private key = 'questions'; - - constructor(args?: LineOutputParserArgs) { - super(); - this.key = args?.key ?? this.key; - } - - static lc_name() { - return 'LineOutputParser'; - } - - lc_namespace = ['langchain', 'output_parsers', 'line_output_parser']; - - async parse(text: string): Promise<string> { - text = text.trim() || ''; - - const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; - const startKeyIndex = text.indexOf(`<${this.key}>`); - const endKeyIndex = text.indexOf(`</${this.key}>`); - - if (startKeyIndex === -1 || endKeyIndex === -1) { - return ''; - } - - const questionsStartIndex = - startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; - const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; - const line = text - .slice(questionsStartIndex, questionsEndIndex) - .trim() - .replace(regex, ''); - - return line; - } - - getFormatInstructions(): string { - throw new Error('Not implemented.'); - } -} - -export default LineOutputParser; diff --git a/ui/lib/outputParsers/listLineOutputParser.ts b/ui/lib/outputParsers/listLineOutputParser.ts deleted file mode 100644 index 6409db9..0000000 --- a/ui/lib/outputParsers/listLineOutputParser.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { BaseOutputParser } from '@langchain/core/output_parsers'; - -interface LineListOutputParserArgs { - key?: string; -} - -class LineListOutputParser extends BaseOutputParser<string[]> { - private key = 'questions'; - - constructor(args?: LineListOutputParserArgs) { - super(); - this.key = args?.key ?? this.key; - } - - static lc_name() { - return 'LineListOutputParser'; - } - - lc_namespace = ['langchain', 'output_parsers', 'line_list_output_parser']; - - async parse(text: string): Promise<string[]> { - text = text.trim() || ''; - - const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; - const startKeyIndex = text.indexOf(`<${this.key}>`); - const endKeyIndex = text.indexOf(`</${this.key}>`); - - if (startKeyIndex === -1 || endKeyIndex === -1) { - return []; - } - - const questionsStartIndex = - startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; - const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; - const lines = text - .slice(questionsStartIndex, questionsEndIndex) - .trim() - .split('\n') - .filter((line) => line.trim() !== '') - .map((line) => line.replace(regex, '')); - - return lines; - } - - getFormatInstructions(): string { - throw new Error('Not implemented.'); - } -} - -export default LineListOutputParser; diff --git a/ui/lib/prompts/academicSearch.ts b/ui/lib/prompts/academicSearch.ts deleted file mode 100644 index c2946ff..0000000 --- a/ui/lib/prompts/academicSearch.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const academicSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: How does stable diffusion work? -Rephrased: Stable diffusion working - -2. Follow up question: What is linear algebra? -Rephrased: Linear algebra - -3. Follow up question: What is the third law of thermodynamics? -Rephrased: Third law of thermodynamics - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -export const academicSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/prompts/index.ts b/ui/lib/prompts/index.ts deleted file mode 100644 index f479185..0000000 --- a/ui/lib/prompts/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - academicSearchResponsePrompt, - academicSearchRetrieverPrompt, -} from './academicSearch'; -import { - redditSearchResponsePrompt, - redditSearchRetrieverPrompt, -} from './redditSearch'; -import { webSearchResponsePrompt, webSearchRetrieverPrompt } from './webSearch'; -import { - wolframAlphaSearchResponsePrompt, - wolframAlphaSearchRetrieverPrompt, -} from './wolframAlpha'; -import { writingAssistantPrompt } from './writingAssistant'; -import { - youtubeSearchResponsePrompt, - youtubeSearchRetrieverPrompt, -} from './youtubeSearch'; - -export default { - webSearchResponsePrompt, - webSearchRetrieverPrompt, - academicSearchResponsePrompt, - academicSearchRetrieverPrompt, - redditSearchResponsePrompt, - redditSearchRetrieverPrompt, - wolframAlphaSearchResponsePrompt, - wolframAlphaSearchRetrieverPrompt, - writingAssistantPrompt, - youtubeSearchResponsePrompt, - youtubeSearchRetrieverPrompt, -}; diff --git a/ui/lib/prompts/redditSearch.ts b/ui/lib/prompts/redditSearch.ts deleted file mode 100644 index fc71957..0000000 --- a/ui/lib/prompts/redditSearch.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const redditSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: Which company is most likely to create an AGI -Rephrased: Which company is most likely to create an AGI - -2. Follow up question: Is Earth flat? -Rephrased: Is Earth flat? - -3. Follow up question: Is there life on Mars? -Rephrased: Is there life on Mars? - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -export const redditSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/prompts/webSearch.ts b/ui/lib/prompts/webSearch.ts deleted file mode 100644 index d8269c8..0000000 --- a/ui/lib/prompts/webSearch.ts +++ /dev/null @@ -1,106 +0,0 @@ -export const webSearchRetrieverPrompt = ` -You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. -If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). -If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. -You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. - -There are several examples attached for your reference inside the below \`examples\` XML block - -<examples> -1. Follow up question: What is the capital of France -Rephrased question:\` -<question> -Capital of france -</question> -\` - -2. Hi, how are you? -Rephrased question\` -<question> -not_needed -</question> -\` - -3. Follow up question: What is Docker? -Rephrased question: \` -<question> -What is Docker -</question> -\` - -4. Follow up question: Can you tell me what is X from https://example.com -Rephrased question: \` -<question> -Can you tell me what is X? -</question> - -<links> -https://example.com -</links> -\` - -5. Follow up question: Summarize the content from https://example.com -Rephrased question: \` -<question> -summarize -</question> - -<links> -https://example.com -</links> -\` -</examples> - -Anything below is the part of the actual conversation and you need to use conversation and the follow-up question to rephrase the follow-up question as a standalone question based on the guidelines shared above. - -<conversation> -{chat_history} -</conversation> - -Follow up question: {query} -Rephrased question: -`; - -export const webSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/prompts/wolframAlpha.ts b/ui/lib/prompts/wolframAlpha.ts deleted file mode 100644 index 40410c1..0000000 --- a/ui/lib/prompts/wolframAlpha.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const wolframAlphaSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: What is the atomic radius of S? -Rephrased: Atomic radius of S - -2. Follow up question: What is linear algebra? -Rephrased: Linear algebra - -3. Follow up question: What is the third law of thermodynamics? -Rephrased: Third law of thermodynamics - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -export const wolframAlphaSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/prompts/writingAssistant.ts b/ui/lib/prompts/writingAssistant.ts deleted file mode 100644 index f56bf47..0000000 --- a/ui/lib/prompts/writingAssistant.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const writingAssistantPrompt = ` -You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are currently set on focus mode 'Writing Assistant', this means you will be helping the user write a response to a given query. -Since you are a writing assistant, you would not perform web searches. If you think you lack information to answer the query, you can ask the user for more information or suggest them to switch to a different focus mode. -You will be shared a context that can contain information from files user has uploaded to get answers from. You will have to generate answers upon that. - -You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. -Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. -However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. - -<context> -{context} -</context> -`; diff --git a/ui/lib/prompts/youtubeSearch.ts b/ui/lib/prompts/youtubeSearch.ts deleted file mode 100644 index 5805b54..0000000 --- a/ui/lib/prompts/youtubeSearch.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const youtubeSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: How does an A.C work? -Rephrased: A.C working - -2. Follow up question: Linear algebra explanation video -Rephrased: What is linear algebra? - -3. Follow up question: What is theory of relativity? -Rephrased: What is theory of relativity? - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -export const youtubeSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcrip - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/providers/anthropic.ts b/ui/lib/providers/anthropic.ts deleted file mode 100644 index 894fda5..0000000 --- a/ui/lib/providers/anthropic.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { ChatOpenAI } from '@langchain/openai'; -import { ChatModel } from '.'; -import { getAnthropicApiKey } from '../config'; - -const anthropicChatModels: Record<string, string>[] = [ - { - displayName: 'Claude 3.7 Sonnet', - key: 'claude-3-7-sonnet-20250219', - }, - { - displayName: 'Claude 3.5 Haiku', - key: 'claude-3-5-haiku-20241022', - }, - { - displayName: 'Claude 3.5 Sonnet v2', - key: 'claude-3-5-sonnet-20241022', - }, - { - displayName: 'Claude 3.5 Sonnet', - key: 'claude-3-5-sonnet-20240620', - }, - { - displayName: 'Claude 3 Opus', - key: 'claude-3-opus-20240229', - }, - { - displayName: 'Claude 3 Sonnet', - key: 'claude-3-sonnet-20240229', - }, - { - displayName: 'Claude 3 Haiku', - key: 'claude-3-haiku-20240307', - }, -]; - -export const loadAnthropicChatModels = async () => { - const anthropicApiKey = getAnthropicApiKey(); - - if (!anthropicApiKey) return {}; - - try { - const chatModels: Record<string, ChatModel> = {}; - - anthropicChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: anthropicApiKey, - modelName: model.key, - temperature: 0.7, - configuration: { - baseURL: 'https://api.anthropic.com/v1/', - }, - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading Anthropic models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/providers/gemini.ts b/ui/lib/providers/gemini.ts deleted file mode 100644 index 28a31cf..0000000 --- a/ui/lib/providers/gemini.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; -import { getGeminiApiKey } from '../config'; -import { ChatModel, EmbeddingModel } from '.'; - -const geminiChatModels: Record<string, string>[] = [ - { - displayName: 'Gemini 2.0 Flash', - key: 'gemini-2.0-flash', - }, - { - displayName: 'Gemini 2.0 Flash-Lite', - key: 'gemini-2.0-flash-lite', - }, - { - displayName: 'Gemini 2.0 Pro Experimental', - key: 'gemini-2.0-pro-exp-02-05', - }, - { - displayName: 'Gemini 1.5 Flash', - key: 'gemini-1.5-flash', - }, - { - displayName: 'Gemini 1.5 Flash-8B', - key: 'gemini-1.5-flash-8b', - }, - { - displayName: 'Gemini 1.5 Pro', - key: 'gemini-1.5-pro', - }, -]; - -const geminiEmbeddingModels: Record<string, string>[] = [ - { - displayName: 'Gemini Embedding', - key: 'gemini-embedding-exp', - }, -]; - -export const loadGeminiChatModels = async () => { - const geminiApiKey = getGeminiApiKey(); - - if (!geminiApiKey) return {}; - - try { - const chatModels: Record<string, ChatModel> = {}; - - geminiChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: geminiApiKey, - modelName: model.key, - temperature: 0.7, - configuration: { - baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', - }, - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading Gemini models: ${err}`); - return {}; - } -}; - -export const loadGeminiEmbeddingModels = async () => { - const geminiApiKey = getGeminiApiKey(); - - if (!geminiApiKey) return {}; - - try { - const embeddingModels: Record<string, EmbeddingModel> = {}; - - geminiEmbeddingModels.forEach((model) => { - embeddingModels[model.key] = { - displayName: model.displayName, - model: new OpenAIEmbeddings({ - openAIApiKey: geminiApiKey, - modelName: model.key, - configuration: { - baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', - }, - }), - }; - }); - - return embeddingModels; - } catch (err) { - console.error(`Error loading OpenAI embeddings models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/providers/groq.ts b/ui/lib/providers/groq.ts deleted file mode 100644 index 05947fb..0000000 --- a/ui/lib/providers/groq.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { ChatOpenAI } from '@langchain/openai'; -import { getGroqApiKey } from '../config'; -import { ChatModel } from '.'; - -const groqChatModels: Record<string, string>[] = [ - { - displayName: 'Gemma2 9B IT', - key: 'gemma2-9b-it', - }, - { - displayName: 'Llama 3.3 70B Versatile', - key: 'llama-3.3-70b-versatile', - }, - { - displayName: 'Llama 3.1 8B Instant', - key: 'llama-3.1-8b-instant', - }, - { - displayName: 'Llama3 70B 8192', - key: 'llama3-70b-8192', - }, - { - displayName: 'Llama3 8B 8192', - key: 'llama3-8b-8192', - }, - { - displayName: 'Mixtral 8x7B 32768', - key: 'mixtral-8x7b-32768', - }, - { - displayName: 'Qwen QWQ 32B (Preview)', - key: 'qwen-qwq-32b', - }, - { - displayName: 'Mistral Saba 24B (Preview)', - key: 'mistral-saba-24b', - }, - { - displayName: 'Qwen 2.5 Coder 32B (Preview)', - key: 'qwen-2.5-coder-32b', - }, - { - displayName: 'Qwen 2.5 32B (Preview)', - key: 'qwen-2.5-32b', - }, - { - displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', - key: 'deepseek-r1-distill-qwen-32b', - }, - { - displayName: 'DeepSeek R1 Distill Llama 70B SpecDec (Preview)', - key: 'deepseek-r1-distill-llama-70b-specdec', - }, - { - displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', - key: 'deepseek-r1-distill-llama-70b', - }, - { - displayName: 'Llama 3.3 70B SpecDec (Preview)', - key: 'llama-3.3-70b-specdec', - }, - { - displayName: 'Llama 3.2 1B Preview (Preview)', - key: 'llama-3.2-1b-preview', - }, - { - displayName: 'Llama 3.2 3B Preview (Preview)', - key: 'llama-3.2-3b-preview', - }, - { - displayName: 'Llama 3.2 11B Vision Preview (Preview)', - key: 'llama-3.2-11b-vision-preview', - }, - { - displayName: 'Llama 3.2 90B Vision Preview (Preview)', - key: 'llama-3.2-90b-vision-preview', - }, -]; - -export const loadGroqChatModels = async () => { - const groqApiKey = getGroqApiKey(); - - if (!groqApiKey) return {}; - - try { - const chatModels: Record<string, ChatModel> = {}; - - groqChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: groqApiKey, - modelName: model.key, - temperature: 0.7, - configuration: { - baseURL: 'https://api.groq.com/openai/v1', - }, - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading Groq models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts deleted file mode 100644 index e45c09d..0000000 --- a/ui/lib/providers/index.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Embeddings } from '@langchain/core/embeddings'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; -import { ChatOpenAI } from '@langchain/openai'; -import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; -import { loadGroqChatModels } from './groq'; -import { loadAnthropicChatModels } from './anthropic'; -import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; - -export interface ChatModel { - displayName: string; - model: BaseChatModel; -} - -export interface EmbeddingModel { - displayName: string; - model: Embeddings; -} - -export const chatModelProviders: Record< - string, - () => Promise<Record<string, ChatModel>> -> = { - openai: loadOpenAIChatModels, - ollama: loadOllamaChatModels, - groq: loadGroqChatModels, - anthropic: loadAnthropicChatModels, - gemini: loadGeminiChatModels, -}; - -export const embeddingModelProviders: Record< - string, - () => Promise<Record<string, EmbeddingModel>> -> = { - openai: loadOpenAIEmbeddingModels, - ollama: loadOllamaEmbeddingModels, - gemini: loadGeminiEmbeddingModels, -}; - -export const getAvailableChatModelProviders = async () => { - const models: Record<string, Record<string, ChatModel>> = {}; - - for (const provider in chatModelProviders) { - const providerModels = await chatModelProviders[provider](); - if (Object.keys(providerModels).length > 0) { - models[provider] = providerModels; - } - } - - const customOpenAiApiKey = getCustomOpenaiApiKey(); - const customOpenAiApiUrl = getCustomOpenaiApiUrl(); - const customOpenAiModelName = getCustomOpenaiModelName(); - - models['custom_openai'] = { - ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName - ? { - [customOpenAiModelName]: { - displayName: customOpenAiModelName, - model: new ChatOpenAI({ - openAIApiKey: customOpenAiApiKey, - modelName: customOpenAiModelName, - temperature: 0.7, - configuration: { - baseURL: customOpenAiApiUrl, - }, - }), - }, - } - : {}), - }; - - return models; -}; - -export const getAvailableEmbeddingModelProviders = async () => { - const models: Record<string, Record<string, EmbeddingModel>> = {}; - - for (const provider in embeddingModelProviders) { - const providerModels = await embeddingModelProviders[provider](); - if (Object.keys(providerModels).length > 0) { - models[provider] = providerModels; - } - } - - return models; -}; diff --git a/ui/lib/providers/ollama.ts b/ui/lib/providers/ollama.ts deleted file mode 100644 index 92e98e4..0000000 --- a/ui/lib/providers/ollama.ts +++ /dev/null @@ -1,73 +0,0 @@ -import axios from 'axios'; -import { getKeepAlive, getOllamaApiEndpoint } from '../config'; -import { ChatModel, EmbeddingModel } from '.'; -import { ChatOllama } from '@langchain/community/chat_models/ollama'; -import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; - -export const loadOllamaChatModels = async () => { - const ollamaApiEndpoint = getOllamaApiEndpoint(); - - if (!ollamaApiEndpoint) return {}; - - try { - const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { - headers: { - 'Content-Type': 'application/json', - }, - }); - - const { models } = res.data; - - const chatModels: Record<string, ChatModel> = {}; - - models.forEach((model: any) => { - chatModels[model.model] = { - displayName: model.name, - model: new ChatOllama({ - baseUrl: ollamaApiEndpoint, - model: model.model, - temperature: 0.7, - keepAlive: getKeepAlive(), - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading Ollama models: ${err}`); - return {}; - } -}; - -export const loadOllamaEmbeddingModels = async () => { - const ollamaApiEndpoint = getOllamaApiEndpoint(); - - if (!ollamaApiEndpoint) return {}; - - try { - const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { - headers: { - 'Content-Type': 'application/json', - }, - }); - - const { models } = res.data; - - const embeddingModels: Record<string, EmbeddingModel> = {}; - - models.forEach((model: any) => { - embeddingModels[model.model] = { - displayName: model.name, - model: new OllamaEmbeddings({ - baseUrl: ollamaApiEndpoint, - model: model.model, - }), - }; - }); - - return embeddingModels; - } catch (err) { - console.error(`Error loading Ollama embeddings models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/providers/openai.ts b/ui/lib/providers/openai.ts deleted file mode 100644 index c6b938d..0000000 --- a/ui/lib/providers/openai.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; -import { getOpenaiApiKey } from '../config'; -import { ChatModel, EmbeddingModel } from '.'; - -const openaiChatModels: Record<string, string>[] = [ - { - displayName: 'GPT-3.5 Turbo', - key: 'gpt-3.5-turbo', - }, - { - displayName: 'GPT-4', - key: 'gpt-4', - }, - { - displayName: 'GPT-4 turbo', - key: 'gpt-4-turbo', - }, - { - displayName: 'GPT-4 omni', - key: 'gpt-4o', - }, - { - displayName: 'GPT-4 omni mini', - key: 'gpt-4o-mini', - }, -]; - -const openaiEmbeddingModels: Record<string, string>[] = [ - { - displayName: 'Text Embedding 3 Small', - key: 'text-embedding-3-small', - }, - { - displayName: 'Text Embedding 3 Large', - key: 'text-embedding-3-large', - }, -]; - -export const loadOpenAIChatModels = async () => { - const openaiApiKey = getOpenaiApiKey(); - - if (!openaiApiKey) return {}; - - try { - const chatModels: Record<string, ChatModel> = {}; - - openaiChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: openaiApiKey, - modelName: model.key, - temperature: 0.7, - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading OpenAI models: ${err}`); - return {}; - } -}; - -export const loadOpenAIEmbeddingModels = async () => { - const openaiApiKey = getOpenaiApiKey(); - - if (!openaiApiKey) return {}; - - try { - const embeddingModels: Record<string, EmbeddingModel> = {}; - - openaiEmbeddingModels.forEach((model) => { - embeddingModels[model.key] = { - displayName: model.displayName, - model: new OpenAIEmbeddings({ - openAIApiKey: openaiApiKey, - modelName: model.key, - }), - }; - }); - - return embeddingModels; - } catch (err) { - console.error(`Error loading OpenAI embeddings models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/searxng.ts b/ui/lib/searxng.ts deleted file mode 100644 index ae19db2..0000000 --- a/ui/lib/searxng.ts +++ /dev/null @@ -1,48 +0,0 @@ -import axios from 'axios'; -import { getSearxngApiEndpoint } from './config'; - -interface SearxngSearchOptions { - categories?: string[]; - engines?: string[]; - language?: string; - pageno?: number; -} - -interface SearxngSearchResult { - title: string; - url: string; - img_src?: string; - thumbnail_src?: string; - thumbnail?: string; - content?: string; - author?: string; - iframe_src?: string; -} - -export const searchSearxng = async ( - query: string, - opts?: SearxngSearchOptions, -) => { - const searxngURL = getSearxngApiEndpoint(); - - const url = new URL(`${searxngURL}/search?format=json`); - url.searchParams.append('q', query); - - if (opts) { - Object.keys(opts).forEach((key) => { - const value = opts[key as keyof SearxngSearchOptions]; - if (Array.isArray(value)) { - url.searchParams.append(key, value.join(',')); - return; - } - url.searchParams.append(key, value as string); - }); - } - - const res = await axios.get(url.toString()); - - const results: SearxngSearchResult[] = res.data.results; - const suggestions: string[] = res.data.suggestions; - - return { results, suggestions }; -}; diff --git a/ui/lib/utils/files.ts b/ui/lib/utils/files.ts deleted file mode 100644 index e6e91df..0000000 --- a/ui/lib/utils/files.ts +++ /dev/null @@ -1,17 +0,0 @@ -import path from 'path'; -import fs from 'fs'; - -export const getFileDetails = (fileId: string) => { - const fileLoc = path.join( - process.cwd(), - './uploads', - fileId + '-extracted.json', - ); - - const parsedFile = JSON.parse(fs.readFileSync(fileLoc, 'utf8')); - - return { - name: parsedFile.title, - fileId: fileId, - }; -}; diff --git a/ui/lib/utils/formatHistory.ts b/ui/lib/utils/formatHistory.ts deleted file mode 100644 index 6d0d309..0000000 --- a/ui/lib/utils/formatHistory.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { BaseMessage } from '@langchain/core/messages'; - -const formatChatHistoryAsString = (history: BaseMessage[]) => { - return history - .map((message) => `${message._getType()}: ${message.content}`) - .join('\n'); -}; - -export default formatChatHistoryAsString; diff --git a/ui/package.json b/ui/package.json deleted file mode 100644 index c9314b4..0000000 --- a/ui/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "perplexica-frontend", - "version": "1.10.0-rc3", - "license": "MIT", - "author": "ItzCrazyKns", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "format:write": "prettier . --write", - "db:push": "drizzle-kit push sqlite" - }, - "dependencies": { - "@headlessui/react": "^2.2.0", - "@iarna/toml": "^2.2.5", - "@icons-pack/react-simple-icons": "^12.3.0", - "@langchain/community": "^0.3.36", - "@langchain/core": "^0.3.42", - "@langchain/openai": "^0.0.25", - "@langchain/textsplitters": "^0.1.0", - "@tailwindcss/typography": "^0.5.12", - "axios": "^1.8.3", - "better-sqlite3": "^11.9.1", - "clsx": "^2.1.0", - "compute-cosine-similarity": "^1.1.0", - "compute-dot": "^1.1.0", - "drizzle-orm": "^0.40.1", - "html-to-text": "^9.0.5", - "langchain": "^0.1.30", - "lucide-react": "^0.363.0", - "markdown-to-jsx": "^7.7.2", - "next": "^15.2.2", - "next-themes": "^0.3.0", - "pdf-parse": "^1.1.1", - "react": "^18", - "react-dom": "^18", - "react-text-to-speech": "^0.14.5", - "react-textarea-autosize": "^8.5.3", - "sonner": "^1.4.41", - "tailwind-merge": "^2.2.2", - "winston": "^3.17.0", - "yet-another-react-lightbox": "^3.17.2", - "zod": "^3.22.4" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.12", - "@types/html-to-text": "^9.0.4", - "@types/node": "^20", - "@types/pdf-parse": "^1.1.4", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "drizzle-kit": "^0.30.5", - "eslint": "^8", - "eslint-config-next": "14.1.4", - "postcss": "^8", - "prettier": "^3.2.5", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} diff --git a/ui/tsconfig.json b/ui/tsconfig.json deleted file mode 100644 index 64c2104..0000000 --- a/ui/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./*"] - }, - "target": "ES2017" - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/ui/uploads/.gitignore b/ui/uploads/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/ui/uploads/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/ui/yarn.lock b/ui/yarn.lock deleted file mode 100644 index 31abdb3..0000000 --- a/ui/yarn.lock +++ /dev/null @@ -1,4883 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@anthropic-ai/sdk@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" - integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - digest-fetch "^1.3.0" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" - -"@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== - dependencies: - regenerator-runtime "^0.14.0" - -"@cfworker/json-schema@^4.0.2": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" - integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== - -"@colors/colors@1.6.0", "@colors/colors@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" - integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== - -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@drizzle-team/brocli@^0.10.2": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@drizzle-team/brocli/-/brocli-0.10.2.tgz#9757c006a43daaa6f45512e6cf5fabed36fb9da7" - integrity sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w== - -"@emnapi/runtime@^1.2.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" - integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== - dependencies: - tslib "^2.4.0" - -"@esbuild-kit/core-utils@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" - integrity sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ== - dependencies: - esbuild "~0.18.20" - source-map-support "^0.5.21" - -"@esbuild-kit/esm-loader@^2.5.5": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" - integrity sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA== - dependencies: - "@esbuild-kit/core-utils" "^3.3.2" - get-tsconfig "^4.7.0" - -"@esbuild/aix-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" - integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== - -"@esbuild/android-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" - integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== - -"@esbuild/android-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" - integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== - -"@esbuild/android-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" - integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== - -"@esbuild/android-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" - integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== - -"@esbuild/android-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" - integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== - -"@esbuild/android-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" - integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== - -"@esbuild/darwin-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" - integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== - -"@esbuild/darwin-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" - integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== - -"@esbuild/darwin-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" - integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== - -"@esbuild/darwin-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" - integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== - -"@esbuild/freebsd-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" - integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== - -"@esbuild/freebsd-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" - integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== - -"@esbuild/freebsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" - integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== - -"@esbuild/freebsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" - integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== - -"@esbuild/linux-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" - integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== - -"@esbuild/linux-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" - integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== - -"@esbuild/linux-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" - integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== - -"@esbuild/linux-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" - integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== - -"@esbuild/linux-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" - integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== - -"@esbuild/linux-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" - integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== - -"@esbuild/linux-loong64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" - integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== - -"@esbuild/linux-loong64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" - integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== - -"@esbuild/linux-mips64el@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" - integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== - -"@esbuild/linux-mips64el@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" - integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== - -"@esbuild/linux-ppc64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" - integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== - -"@esbuild/linux-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" - integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== - -"@esbuild/linux-riscv64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" - integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== - -"@esbuild/linux-riscv64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" - integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== - -"@esbuild/linux-s390x@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" - integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== - -"@esbuild/linux-s390x@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" - integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== - -"@esbuild/linux-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" - integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== - -"@esbuild/linux-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" - integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== - -"@esbuild/netbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" - integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== - -"@esbuild/netbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" - integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== - -"@esbuild/openbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" - integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== - -"@esbuild/openbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" - integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== - -"@esbuild/sunos-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" - integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== - -"@esbuild/sunos-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" - integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== - -"@esbuild/win32-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" - integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== - -"@esbuild/win32-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" - integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== - -"@esbuild/win32-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" - integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== - -"@esbuild/win32-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" - integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== - -"@esbuild/win32-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" - integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== - -"@esbuild/win32-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" - integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@floating-ui/core@^1.6.0": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" - integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== - dependencies: - "@floating-ui/utils" "^0.2.8" - -"@floating-ui/dom@^1.0.0": - version "1.6.12" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" - integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== - dependencies: - "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.8" - -"@floating-ui/react-dom@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" - integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== - dependencies: - "@floating-ui/dom" "^1.0.0" - -"@floating-ui/react@^0.26.16": - version "0.26.28" - resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" - integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== - dependencies: - "@floating-ui/react-dom" "^2.1.2" - "@floating-ui/utils" "^0.2.8" - tabbable "^6.0.0" - -"@floating-ui/utils@^0.2.8": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" - integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== - -"@headlessui/react@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.2.0.tgz#a8e32f0899862849a1ce1615fa280e7891431ab7" - integrity sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ== - dependencies: - "@floating-ui/react" "^0.26.16" - "@react-aria/focus" "^3.17.1" - "@react-aria/interactions" "^3.21.3" - "@tanstack/react-virtual" "^3.8.1" - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@iarna/toml@^2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" - integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== - -"@icons-pack/react-simple-icons@^12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-12.3.0.tgz#2089c8226842611d751fc86fa93fea053076db77" - integrity sha512-71KKdd2tg36Pctg5pQTAmPRIdFrtxsLccoSexkZLztn46eV6Ek6ov69o0Ph4t4ZPs6n4+Fw4sBnIzEsKssnXxg== - -"@img/sharp-darwin-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" - integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== - optionalDependencies: - "@img/sharp-libvips-darwin-arm64" "1.0.4" - -"@img/sharp-darwin-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" - integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== - optionalDependencies: - "@img/sharp-libvips-darwin-x64" "1.0.4" - -"@img/sharp-libvips-darwin-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" - integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== - -"@img/sharp-libvips-darwin-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" - integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== - -"@img/sharp-libvips-linux-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" - integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== - -"@img/sharp-libvips-linux-arm@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" - integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== - -"@img/sharp-libvips-linux-s390x@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" - integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== - -"@img/sharp-libvips-linux-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" - integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== - -"@img/sharp-libvips-linuxmusl-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" - integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== - -"@img/sharp-libvips-linuxmusl-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" - integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== - -"@img/sharp-linux-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" - integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== - optionalDependencies: - "@img/sharp-libvips-linux-arm64" "1.0.4" - -"@img/sharp-linux-arm@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" - integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== - optionalDependencies: - "@img/sharp-libvips-linux-arm" "1.0.5" - -"@img/sharp-linux-s390x@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" - integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== - optionalDependencies: - "@img/sharp-libvips-linux-s390x" "1.0.4" - -"@img/sharp-linux-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" - integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== - optionalDependencies: - "@img/sharp-libvips-linux-x64" "1.0.4" - -"@img/sharp-linuxmusl-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" - integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" - -"@img/sharp-linuxmusl-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" - integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64" "1.0.4" - -"@img/sharp-wasm32@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" - integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== - dependencies: - "@emnapi/runtime" "^1.2.0" - -"@img/sharp-win32-ia32@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" - integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== - -"@img/sharp-win32-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" - integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@langchain/community@^0.3.36": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" - integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA== - dependencies: - "@langchain/openai" ">=0.2.0 <0.5.0" - binary-extensions "^2.2.0" - expr-eval "^2.0.2" - flat "^5.0.2" - js-yaml "^4.1.0" - langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" - langsmith ">=0.2.8 <0.4.0" - uuid "^10.0.0" - zod "^3.22.3" - zod-to-json-schema "^3.22.5" - -"@langchain/community@~0.0.41": - version "0.0.44" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416" - integrity sha512-II9Hz90jJmfWRICtxTg1auQWzFw0npqacWiiOpaxNhzs6rptdf56gyfC48Z6n1ii4R8FfAlfX6YxhOE7lGGKXg== - dependencies: - "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.19" - expr-eval "^2.0.2" - flat "^5.0.2" - langsmith "~0.1.1" - uuid "^9.0.0" - zod "^3.22.3" - zod-to-json-schema "^3.22.5" - -"@langchain/core@^0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363" - integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg== - dependencies: - "@cfworker/json-schema" "^4.0.2" - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.12" - langsmith ">=0.2.8 <0.4.0" - mustache "^4.2.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^10.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/core@~0.1.44", "@langchain/core@~0.1.45": - version "0.1.54" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4" - integrity sha512-87pQ8dnWY8P1Kgnu/SgnRijLRNSEzTzkjBK6O/Z1klXf/eQTXAG5O5cKwe3lwM6Afn+4U2byzSMYjwViAYuR4g== - dependencies: - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" - integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ== - dependencies: - js-tiktoken "^1.0.12" - openai "^4.87.3" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@^0.0.25": - version "0.0.25" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" - integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q== - dependencies: - "@langchain/core" "~0.1.45" - js-tiktoken "^1.0.7" - openai "^4.26.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@~0.0.19", "@langchain/openai@~0.0.26": - version "0.0.26" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.26.tgz#ab989085e03f8bcc26a40d4d5abe9a2b73e5f2a8" - integrity sha512-FpqYvVRP2CkFFjTLrj2tbXeY6JTIgbq8tRoi0rvGzmhRpoi6cWHlfgclSzDm+e6P9DqKBkzDjo6SPTJgTOabNA== - dependencies: - "@langchain/core" "~0.1.45" - js-tiktoken "^1.0.7" - openai "^4.32.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.1.0.tgz#f37620992192df09ecda3dfbd545b36a6bcbae46" - integrity sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw== - dependencies: - js-tiktoken "^1.0.12" - -"@next/env@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" - integrity sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ== - -"@next/eslint-plugin-next@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" - integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== - dependencies: - glob "10.3.10" - -"@next/swc-darwin-arm64@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.2.tgz#d3131279d4815ed7604eba7bf0063e0b8bfd2135" - integrity sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw== - -"@next/swc-darwin-x64@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.2.tgz#8562f6b51177aa30f3a6e95a8b3e0e176a6cb04f" - integrity sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA== - -"@next/swc-linux-arm64-gnu@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.2.tgz#c2466cffc541f39ae4d435087c81f5899d401903" - integrity sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ== - -"@next/swc-linux-arm64-musl@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.2.tgz#24ed87fe47325597e986bd01c427efae53d6b677" - integrity sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA== - -"@next/swc-linux-x64-gnu@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.2.tgz#0240f44530ca39c1fc899fabe8f33aa35d7e77da" - integrity sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA== - -"@next/swc-linux-x64-musl@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.2.tgz#cca6ce8e9ec89afaa618673f0f8658682c30ff56" - integrity sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw== - -"@next/swc-win32-arm64-msvc@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.2.tgz#08f621602ed53fa21ddf6f656160b9186860be15" - integrity sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg== - -"@next/swc-win32-x64-msvc@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.2.tgz#2072d69374f8c944134a5c5a80ce03ff84254cfa" - integrity sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@petamoriken/float16@^3.8.7": - version "3.9.2" - resolved "https://registry.yarnpkg.com/@petamoriken/float16/-/float16-3.9.2.tgz#217a5d349f3655b8e286be447e0ed1eae063a78f" - integrity sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog== - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@react-aria/focus@^3.17.1": - version "3.18.4" - resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" - integrity sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA== - dependencies: - "@react-aria/interactions" "^3.22.4" - "@react-aria/utils" "^3.25.3" - "@react-types/shared" "^3.25.0" - "@swc/helpers" "^0.5.0" - clsx "^2.0.0" - -"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.4": - version "3.22.4" - resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.4.tgz#88ed61ab6a485f869bc1f65ae6688d48ca96064b" - integrity sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww== - dependencies: - "@react-aria/ssr" "^3.9.6" - "@react-aria/utils" "^3.25.3" - "@react-types/shared" "^3.25.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/ssr@^3.9.6": - version "3.9.6" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.6.tgz#a9e8b351acdc8238f2b5215b0ce904636c6ea690" - integrity sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA== - dependencies: - "@swc/helpers" "^0.5.0" - -"@react-aria/utils@^3.25.3": - version "3.25.3" - resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.25.3.tgz#cad9bffc07b045cdc283df2cb65c18747acbf76d" - integrity sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA== - dependencies: - "@react-aria/ssr" "^3.9.6" - "@react-stately/utils" "^3.10.4" - "@react-types/shared" "^3.25.0" - "@swc/helpers" "^0.5.0" - clsx "^2.0.0" - -"@react-stately/utils@^3.10.4": - version "3.10.4" - resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.4.tgz#310663a834b67048d305e1680ed258130092fe51" - integrity sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw== - dependencies: - "@swc/helpers" "^0.5.0" - -"@react-types/shared@^3.25.0": - version "3.25.0" - resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.25.0.tgz#7223baf72256e918a3c29081bb1ecc6fad4fbf58" - integrity sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ== - -"@rushstack/eslint-patch@^1.3.3": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf" - integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg== - -"@selderee/plugin-htmlparser2@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" - integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== - dependencies: - domhandler "^5.0.3" - selderee "^0.11.0" - -"@swc/counter@0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/helpers@0.5.15", "@swc/helpers@^0.5.0": - version "0.5.15" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" - integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== - dependencies: - tslib "^2.8.0" - -"@tailwindcss/typography@^0.5.12": - version "0.5.12" - resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.12.tgz#c0532fd594427b7f4e8e38eff7bf272c63a1dca4" - integrity sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg== - dependencies: - lodash.castarray "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - postcss-selector-parser "6.0.10" - -"@tanstack/react-virtual@^3.8.1": - version "3.10.9" - resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz#40606b6dd8aba8e977f576d8f7df07f69ca63eea" - integrity sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g== - dependencies: - "@tanstack/virtual-core" "3.10.9" - -"@tanstack/virtual-core@3.10.9": - version "3.10.9" - resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" - integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== - -"@types/better-sqlite3@^7.6.12": - version "7.6.12" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.12.tgz#e5712d46d71097dcc2775c0b068072eadc15deb7" - integrity sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg== - dependencies: - "@types/node" "*" - -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^5.0.0": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" - integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/html-to-text@^9.0.4": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" - integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/multer@^1.4.12": - version "1.4.12" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" - integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== - dependencies: - "@types/express" "*" - -"@types/node-fetch@^2.6.4": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - -"@types/node@*", "@types/node@^20": - version "20.12.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" - integrity sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw== - dependencies: - undici-types "~5.26.4" - -"@types/node@^18.11.18": - version "18.19.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327" - integrity sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg== - dependencies: - undici-types "~5.26.4" - -"@types/pdf-parse@^1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" - integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/qs@*": - version "6.9.18" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" - integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/react-dom@^18": - version "18.2.24" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" - integrity sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18": - version "18.2.74" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.74.tgz#2d52eb80e4e7c4ea8812c89181d6d590b53f958c" - integrity sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -"@types/triple-beam@^1.3.2": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" - integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== - -"@types/uuid@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" - integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== - -"@types/uuid@^9.0.1": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== - -"@typescript-eslint/parser@^5.4.2 || ^6.0.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== - dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== - -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -append-field@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" - integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlast@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -async@^3.2.3: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -autoprefixer@^10.0.1: - version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" - integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== - dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001599" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== - -axios@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8" - integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== - -base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -better-sqlite3@^11.9.1: - version "11.9.1" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.9.1.tgz#0540da2f2ce24cbd766bb35db412f4be2c75b8bb" - integrity sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ== - dependencies: - bindings "^1.5.0" - prebuild-install "^7.1.1" - -binary-extensions@^2.0.0, binary-extensions@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -binary-search@^1.3.5: - version "1.3.6" - resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" - integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -busboy@1.6.0, busboy@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@6: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001579: - version "1.0.30001705" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz#dc3510bcdef261444ca944b7be9c8d0bb7fafeef" - integrity sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg== - -caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001606" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" - integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== - -chalk@^4.0.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -client-only@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -clsx@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -clsx@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" - integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== - -color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0, color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -compute-cosine-similarity@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" - integrity sha512-FXhNx0ILLjGi9Z9+lglLzM12+0uoTnYkHm7GiadXDAr0HGVLm25OivUS1B/LPkbzzvlcXz/1EvWg9ZYyJSdhTw== - dependencies: - compute-dot "^1.1.0" - compute-l2norm "^1.1.0" - validate.io-array "^1.0.5" - validate.io-function "^1.0.2" - -compute-dot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-dot/-/compute-dot-1.1.0.tgz#01a5ba2c7af73b99002acb258459c9576a8232dc" - integrity sha512-L5Ocet4DdMrXboss13K59OK23GXjiSia7+7Ukc7q4Bl+RVpIXK2W9IHMbWDZkh+JUEvJAwOKRaJDiFUa1LTnJg== - dependencies: - validate.io-array "^1.0.3" - validate.io-function "^1.0.2" - -compute-l2norm@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-l2norm/-/compute-l2norm-1.1.0.tgz#bd09131c6b36c8d70c68334e176009a4e0a989ac" - integrity sha512-6EHh1Elj90eU28SXi+h2PLnTQvZmkkHWySpoFz+WOlVNLz3DQoC4ISUHSV9n5jMxPHtKGJ01F4uu2PsXBB8sSg== - dependencies: - validate.io-array "^1.0.3" - validate.io-function "^1.0.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-table-printer@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" - integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== - dependencies: - simple-wcswidth "^1.0.1" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-libc@^2.0.0, detect-libc@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -digest-fetch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" - integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA== - dependencies: - base-64 "^0.1.0" - md5 "^2.3.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" - integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -drizzle-kit@^0.30.5: - version "0.30.5" - resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.30.5.tgz#fce34a8ca9f82da5212f31c266e407c78523166f" - integrity sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA== - dependencies: - "@drizzle-team/brocli" "^0.10.2" - "@esbuild-kit/esm-loader" "^2.5.5" - esbuild "^0.19.7" - esbuild-register "^3.5.0" - gel "^2.0.0" - -drizzle-orm@^0.40.1: - version "0.40.1" - resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb" - integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.4.668: - version "1.4.729" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz#8477d21e2a50993781950885b2731d92ad532c00" - integrity sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -env-paths@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" - integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -esbuild-register@^3.5.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" - integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== - dependencies: - debug "^4.3.4" - -esbuild@^0.19.7: - version "0.19.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" - -esbuild@~0.18.20: - version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" - integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== - optionalDependencies: - "@esbuild/android-arm" "0.18.20" - "@esbuild/android-arm64" "0.18.20" - "@esbuild/android-x64" "0.18.20" - "@esbuild/darwin-arm64" "0.18.20" - "@esbuild/darwin-x64" "0.18.20" - "@esbuild/freebsd-arm64" "0.18.20" - "@esbuild/freebsd-x64" "0.18.20" - "@esbuild/linux-arm" "0.18.20" - "@esbuild/linux-arm64" "0.18.20" - "@esbuild/linux-ia32" "0.18.20" - "@esbuild/linux-loong64" "0.18.20" - "@esbuild/linux-mips64el" "0.18.20" - "@esbuild/linux-ppc64" "0.18.20" - "@esbuild/linux-riscv64" "0.18.20" - "@esbuild/linux-s390x" "0.18.20" - "@esbuild/linux-x64" "0.18.20" - "@esbuild/netbsd-x64" "0.18.20" - "@esbuild/openbsd-x64" "0.18.20" - "@esbuild/sunos-x64" "0.18.20" - "@esbuild/win32-arm64" "0.18.20" - "@esbuild/win32-ia32" "0.18.20" - "@esbuild/win32-x64" "0.18.20" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-next@14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" - integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== - dependencies: - "@next/eslint-plugin-next" "14.1.4" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.28.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== - dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.33.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" - array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.10" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -expr-eval@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" - integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data-encoder@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" - integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formdata-node@^4.3.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" - integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== - dependencies: - node-domexception "1.0.0" - web-streams-polyfill "4.0.0-beta.3" - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gel@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/gel/-/gel-2.0.1.tgz#587d89db54351c2d436de981d136481e37d06a7a" - integrity sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw== - dependencies: - "@petamoriken/float16" "^3.8.7" - debug "^4.3.4" - env-paths "^3.0.0" - semver "^7.6.2" - shell-quote "^1.8.1" - which "^4.0.0" - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== - dependencies: - resolve-pkg-maps "^1.0.0" - -get-tsconfig@^4.7.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" - integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== - dependencies: - resolve-pkg-maps "^1.0.0" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@^10.3.10: - version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" - integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.10.2" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -html-to-text@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" - integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== - dependencies: - "@selderee/plugin-htmlparser2" "^0.11.0" - deepmerge "^4.3.1" - dom-serializer "^2.0.0" - htmlparser2 "^8.0.2" - selderee "^0.11.0" - -htmlparser2@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-any-array@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" - integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isexe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" - integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jackspeak@^2.3.5, jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -js-tiktoken@^1.0.12: - version "1.0.19" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78" - integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g== - dependencies: - base64-js "^1.5.1" - -js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" - integrity sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA== - dependencies: - base64-js "^1.5.1" - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonpointer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" - integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0": - version "0.3.19" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b" - integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw== - dependencies: - "@langchain/openai" ">=0.1.0 <0.5.0" - "@langchain/textsplitters" ">=0.0.0 <0.2.0" - js-tiktoken "^1.0.12" - js-yaml "^4.1.0" - jsonpointer "^5.0.1" - langsmith ">=0.2.8 <0.4.0" - openapi-types "^12.1.3" - p-retry "4" - uuid "^10.0.0" - yaml "^2.2.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -langchain@^0.1.30: - version "0.1.31" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" - integrity sha512-J2iZZL48Nwdo1XDU5cS5YYm91b2L6sL3a8hH1gBljvDzCY7jbtUOTuIoRVx5iHN3DXuuLnszS4lhqg0u9hQxBQ== - dependencies: - "@anthropic-ai/sdk" "^0.9.1" - "@langchain/community" "~0.0.41" - "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.26" - binary-extensions "^2.2.0" - js-tiktoken "^1.0.7" - js-yaml "^4.1.0" - jsonpointer "^5.0.1" - langchainhub "~0.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" - openapi-types "^12.1.3" - p-retry "4" - uuid "^9.0.0" - yaml "^2.2.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -langchainhub@~0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" - integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== - -"langsmith@>=0.2.8 <0.4.0": - version "0.3.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f" - integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ== - dependencies: - "@types/uuid" "^10.0.0" - chalk "^4.1.2" - console-table-printer "^2.12.1" - p-queue "^6.6.2" - p-retry "4" - semver "^7.6.3" - uuid "^10.0.0" - -langsmith@~0.1.1, langsmith@~0.1.7: - version "0.1.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" - integrity sha512-iEzQLLB7/0nRpAwNBAR7B7N64fyByg5UsNjSvLaCCkQ9AS68PSafjB8xQkyI8QXXrGjU1dEqDRoa8m4SUuRdUw== - dependencies: - "@types/uuid" "^9.0.1" - commander "^10.0.1" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - -language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -leac@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" - integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.castarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" - integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -logform@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" - integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== - dependencies: - "@colors/colors" "1.6.0" - "@types/triple-beam" "^1.3.2" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lucide-react@^0.363.0: - version "0.363.0" - resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" - integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== - -markdown-to-jsx@^7.7.2: - version "7.7.2" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" - integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g== - -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.24: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.1: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.4: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -ml-array-mean@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" - integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== - dependencies: - ml-array-sum "^1.1.6" - -ml-array-sum@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" - integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== - dependencies: - is-any-array "^2.0.0" - -ml-distance-euclidean@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" - integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== - -ml-distance@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" - integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw== - dependencies: - ml-array-mean "^1.1.6" - ml-distance-euclidean "^2.0.0" - ml-tree-similarity "^1.0.0" - -ml-tree-similarity@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" - integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== - dependencies: - binary-search "^1.3.5" - num-sort "^2.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.0.0, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multer@^1.4.5-lts.1: - version "1.4.5-lts.1" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" - integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== - dependencies: - append-field "^1.0.0" - busboy "^1.0.0" - concat-stream "^1.5.2" - mkdirp "^0.5.4" - object-assign "^4.1.1" - type-is "^1.6.4" - xtend "^4.0.0" - -mustache@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.6: - version "3.3.10" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.10.tgz#7bc882237698ef787d5cbba109e3b0168ba6e7b1" - integrity sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -napi-build-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" - integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next-themes@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" - integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== - -next@^15.2.2: - version "15.2.2" - resolved "https://registry.yarnpkg.com/next/-/next-15.2.2.tgz#e3941a0e0e76cfe1880b57452807489e0546e3a2" - integrity sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA== - dependencies: - "@next/env" "15.2.2" - "@swc/counter" "0.1.3" - "@swc/helpers" "0.5.15" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - postcss "8.4.31" - styled-jsx "5.1.6" - optionalDependencies: - "@next/swc-darwin-arm64" "15.2.2" - "@next/swc-darwin-x64" "15.2.2" - "@next/swc-linux-arm64-gnu" "15.2.2" - "@next/swc-linux-arm64-musl" "15.2.2" - "@next/swc-linux-x64-gnu" "15.2.2" - "@next/swc-linux-x64-musl" "15.2.2" - "@next/swc-win32-arm64-msvc" "15.2.2" - "@next/swc-win32-x64-msvc" "15.2.2" - sharp "^0.33.5" - -node-abi@^3.3.0: - version "3.74.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" - integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== - dependencies: - semver "^7.3.5" - -node-domexception@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-ensure@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" - integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== - -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -num-sort@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" - integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.hasown@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.values@^1.1.6, object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -openai@^4.26.0, openai@^4.32.1: - version "4.33.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" - integrity sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" - -openai@^4.87.3: - version "4.87.4" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902" - integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - -openapi-types@^12.1.3: - version "12.1.3" - resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" - integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-queue@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-retry@4: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parseley@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" - integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== - dependencies: - leac "^0.6.0" - peberminta "^0.9.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.10.1, path-scurry@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" - integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pdf-parse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" - integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== - dependencies: - debug "^3.1.0" - node-ensure "^0.0.0" - -peberminta@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" - integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== - -picocolors@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== - dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@6.0.10: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^6.0.11: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8, postcss@^8.4.23: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -prebuild-install@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" - integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^2.0.0" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-dom@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-text-to-speech@^0.14.5: - version "0.14.5" - resolved "https://registry.yarnpkg.com/react-text-to-speech/-/react-text-to-speech-0.14.5.tgz#f918786ab283311535682011045bd49777193300" - integrity sha512-3brr/IrK/5YTtOZSTo+Y8b+dnWelzfZiDZvkXnOct1e7O7fgA/h9bYAVrtwSRo/VxKfdw+wh6glkj6M0mlQuQQ== - -react-textarea-autosize@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" - integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== - dependencies: - "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readable-stream@^2.2.2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.1" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -safe-stable-stringify@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" - integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -selderee@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" - integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== - dependencies: - parseley "^0.12.0" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.5, semver@^7.6.2, semver@^7.6.3: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== - -semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1, set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -sharp@^0.33.5: - version "0.33.5" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" - integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== - dependencies: - color "^4.2.3" - detect-libc "^2.0.3" - semver "^7.6.3" - optionalDependencies: - "@img/sharp-darwin-arm64" "0.33.5" - "@img/sharp-darwin-x64" "0.33.5" - "@img/sharp-libvips-darwin-arm64" "1.0.4" - "@img/sharp-libvips-darwin-x64" "1.0.4" - "@img/sharp-libvips-linux-arm" "1.0.5" - "@img/sharp-libvips-linux-arm64" "1.0.4" - "@img/sharp-libvips-linux-s390x" "1.0.4" - "@img/sharp-libvips-linux-x64" "1.0.4" - "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" - "@img/sharp-libvips-linuxmusl-x64" "1.0.4" - "@img/sharp-linux-arm" "0.33.5" - "@img/sharp-linux-arm64" "0.33.5" - "@img/sharp-linux-s390x" "0.33.5" - "@img/sharp-linux-x64" "0.33.5" - "@img/sharp-linuxmusl-arm64" "0.33.5" - "@img/sharp-linuxmusl-x64" "0.33.5" - "@img/sharp-wasm32" "0.33.5" - "@img/sharp-win32-ia32" "0.33.5" - "@img/sharp-win32-x64" "0.33.5" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" - integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== - -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -simple-wcswidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" - integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sonner@^1.4.41: - version "1.4.41" - resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.4.41.tgz#ff085ae4f4244713daf294959beaa3e90f842d2c" - integrity sha512-uG511ggnnsw6gcn/X+YKkWPo5ep9il9wYi3QJxHsYe7yTZ4+cOd1wuodOUmOpFuXL+/RE3R04LczdNCDygTDgQ== - -source-map-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map-support@^0.5.21: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.matchall@^4.0.10: - version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" - integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - regexp.prototype.flags "^1.5.2" - set-function-name "^2.0.2" - side-channel "^1.0.6" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -styled-jsx@5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" - integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== - dependencies: - client-only "0.0.1" - -sucrase@^3.32.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tabbable@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" - integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== - -tailwind-merge@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.2.2.tgz#87341e7604f0e20499939e152cd2841f41f7a3df" - integrity sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw== - dependencies: - "@babel/runtime" "^7.24.0" - -tailwindcss@^3.3.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" - integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.21.0" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar-fs@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" - integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -triple-beam@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" - integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== - -ts-api-utils@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.4.0, tslib@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-is@^1.6.4: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typescript@^5: - version "5.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" - integrity sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" - integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== - -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -validate.io-array@^1.0.3, validate.io-array@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" - integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== - -validate.io-function@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" - integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== - -web-streams-polyfill@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" - integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== - -web-streams-polyfill@^3.2.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" - integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== - dependencies: - isexe "^3.1.1" - -winston-transport@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" - integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== - dependencies: - logform "^2.7.0" - readable-stream "^3.6.2" - triple-beam "^1.3.0" - -winston@^3.17.0: - version "3.17.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" - integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== - dependencies: - "@colors/colors" "^1.6.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.7.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.9.0" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.2.1, yaml@^2.3.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== - -yet-another-react-lightbox@^3.17.2: - version "3.17.2" - resolved "https://registry.yarnpkg.com/yet-another-react-lightbox/-/yet-another-react-lightbox-3.17.2.tgz#00474b83189ec4d81302792211ca31ffb808554c" - integrity sha512-fM+Br5nR2kt/oBAOHDqVdUmogiHRLCt4iuIJHPS9Q+ME+h+ciME6vEpLt3IPgGU8whib1agEyZBgWJOAKjgadQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5: - version "3.22.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" - integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== - -zod@^3.22.3, zod@^3.22.4: - version "3.22.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" - integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== diff --git a/yarn.lock b/yarn.lock index 5764b3c..da8c916 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,19 +2,15 @@ # yarn lockfile v1 -"@anthropic-ai/sdk@^0.22.0": - version "0.22.0" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.22.0.tgz#548e4218d9810fd494e595d4e57cb2d46d301a1a" - integrity sha512-dv4BCC6FZJw3w66WNLsHlUFjhu19fS1L/5jMPApwhZLa/Oy1j0A2i3RypmDtHEPp4Wwg3aZkSHksp7VzYWjzmw== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@anthropic-ai/sdk@^0.9.1": version "0.9.1" @@ -31,18 +27,23 @@ node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +"@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + dependencies: + regenerator-runtime "^0.14.0" + +"@cfworker/json-schema@^4.0.2": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" + integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== + "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - "@dabh/diagnostics@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" @@ -52,6 +53,18 @@ enabled "2.0.x" kuler "^2.0.0" +"@drizzle-team/brocli@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@drizzle-team/brocli/-/brocli-0.10.2.tgz#9757c006a43daaa6f45512e6cf5fabed36fb9da7" + integrity sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w== + +"@emnapi/runtime@^1.2.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" + integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== + dependencies: + tslib "^2.4.0" + "@esbuild-kit/core-utils@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" @@ -293,71 +306,290 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== -"@google/generative-ai@^0.7.0": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.7.1.tgz#eb187c75080c0706245699dbc06816c830d8c6a7" - integrity sha512-WTjMLLYL/xfA5BW6xAycRPiAX7FNHKAxrid/ayqC1QMam0KAK0NbMeS9Lubw80gVg5xFMLE+H7pw4wdNzTOlxw== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" -"@huggingface/jinja@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" - integrity sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA== +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@floating-ui/core@^1.6.0": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== + dependencies: + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/dom@^1.0.0": + version "1.6.12" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" + integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/react-dom@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.16": + version "0.26.28" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" + integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== + dependencies: + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.8" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== + +"@headlessui/react@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.2.0.tgz#a8e32f0899862849a1ce1615fa280e7891431ab7" + integrity sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ== + dependencies: + "@floating-ui/react" "^0.26.16" + "@react-aria/focus" "^3.17.1" + "@react-aria/interactions" "^3.21.3" + "@tanstack/react-virtual" "^3.8.1" + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@iarna/toml@^2.2.5": version "2.2.5" resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== -"@jridgewell/resolve-uri@^3.0.3": +"@icons-pack/react-simple-icons@^12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-12.3.0.tgz#2089c8226842611d751fc86fa93fea053076db77" + integrity sha512-71KKdd2tg36Pctg5pQTAmPRIdFrtxsLccoSexkZLztn46eV6Ek6ov69o0Ph4t4ZPs6n4+Fw4sBnIzEsKssnXxg== + +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@langchain/anthropic@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.2.3.tgz#1505da939f47c90e53dfede0407c497b8177bdf0" - integrity sha512-f2fqzLGcvsXXUyZ1vl8cgwkKDGLshOGrPuR9hkhGuBG5m91eq755OqPBxWJuS1TFtNU813cXft3xh0MQbxavwg== +"@langchain/community@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" + integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA== dependencies: - "@anthropic-ai/sdk" "^0.22.0" - "@langchain/core" ">=0.2.9 <0.3.0" - fast-xml-parser "^4.3.5" - zod "^3.22.4" - zod-to-json-schema "^3.22.4" - -"@langchain/community@^0.2.16": - version "0.2.16" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.2.16.tgz#5888baf7fc7ea272c5f91aaa0e71bc444167262d" - integrity sha512-dFDcMabKACvuRd0w6EIRLWf1ubPGZEeEwFt9v1jiEr4HCFxH0OF+iM1QUCcVRbB2fK5lqmKeTD1XAeZV8+AyXA== - dependencies: - "@langchain/core" "~0.2.11" - "@langchain/openai" "~0.1.0" + "@langchain/openai" ">=0.2.0 <0.5.0" binary-extensions "^2.2.0" expr-eval "^2.0.2" flat "^5.0.2" js-yaml "^4.1.0" - langchain "0.2.3" - langsmith "~0.1.30" - uuid "^9.0.0" + langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" + langsmith ">=0.2.8 <0.4.0" + uuid "^10.0.0" zod "^3.22.3" zod-to-json-schema "^3.22.5" "@langchain/community@~0.0.41": - version "0.0.43" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.43.tgz#017e2f9b3209b3999482f10df5aec2520731a63c" - integrity sha512-60TjV3knGGOPHfbJxLpuwARr8oA0r6Txm8wTFvFx+TjRUrloyBUcWSbJIdm62gAwBJDEHmdjjyWOOzU+eewcuA== + version "0.0.44" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416" + integrity sha512-II9Hz90jJmfWRICtxTg1auQWzFw0npqacWiiOpaxNhzs6rptdf56gyfC48Z6n1ii4R8FfAlfX6YxhOE7lGGKXg== dependencies: "@langchain/core" "~0.1.44" "@langchain/openai" "~0.0.19" @@ -366,53 +598,19 @@ langsmith "~0.1.1" uuid "^9.0.0" zod "^3.22.3" + zod-to-json-schema "^3.22.5" -"@langchain/core@>0.1.56 <0.3.0", "@langchain/core@>0.2.0 <0.3.0", "@langchain/core@>=0.2.5 <0.3.0", "@langchain/core@~0.2.0", "@langchain/core@~0.2.11": - version "0.2.11" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.11.tgz#5f47467e20e56b250831baef20083657c6facb4c" - integrity sha512-d4SNL7WI0c3oHrV4WxCRH1/TNqdePXEzYjYwIb4aEH6lW1aM0utGhLbNthX+aYkOL4Ynx2FoG4h91ECIipiKWQ== +"@langchain/core@^0.3.42": + version "0.3.42" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363" + integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg== dependencies: + "@cfworker/json-schema" "^4.0.2" ansi-styles "^5.0.0" camelcase "6" decamelize "1.2.0" js-tiktoken "^1.0.12" - langsmith "~0.1.30" - ml-distance "^4.0.0" - mustache "^4.2.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/core@>=0.2.16 <0.3.0": - version "0.2.36" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.36.tgz#75754c33aa5b9310dcf117047374a1ae011005a4" - integrity sha512-qHLvScqERDeH7y2cLuJaSAlMwg3f/3Oc9nayRSXRU2UuaK/SOhI42cxiPLj1FnuHJSmN0rBQFkrLx02gI4mcVg== - dependencies: - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.12" - langsmith "^0.1.56-rc.1" - mustache "^4.2.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^10.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/core@>=0.2.9 <0.3.0": - version "0.2.15" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.15.tgz#1bb99ac4fffe935c7ba37edcaa91abfba3c82219" - integrity sha512-L096itIBQ5XNsy5BCCPqIQEk/x4rzI+U4BhYT+fDBYtljESshIi/WzXdmiGfY/6MpVjB76jNuaRgMDmo1m9NeQ== - dependencies: - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.12" - langsmith "~0.1.30" - ml-distance "^4.0.0" + langsmith ">=0.2.8 <0.4.0" mustache "^4.2.0" p-queue "^6.6.2" p-retry "4" @@ -421,9 +619,9 @@ zod-to-json-schema "^3.22.3" "@langchain/core@~0.1.44", "@langchain/core@~0.1.45": - version "0.1.52" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.52.tgz#7619310b83ffa841628efe2e1eda873ca714d068" - integrity sha512-AEyP99r7jijF33pyzaWtqCkiO9crotgethqq7jznAGlIojMCL9BT/id2DjVyN32SGFTpet273kkjsmEdFSHqpA== + version "0.1.54" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4" + integrity sha512-87pQ8dnWY8P1Kgnu/SgnRijLRNSEzTzkjBK6O/Z1klXf/eQTXAG5O5cKwe3lwM6Afn+4U2byzSMYjwViAYuR4g== dependencies: ansi-styles "^5.0.0" camelcase "6" @@ -437,16 +635,17 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" -"@langchain/google-genai@^0.0.23": - version "0.0.23" - resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.0.23.tgz#e73af501bc1df4c7642b531759b82dc3eb7ae459" - integrity sha512-MTSCJEoKsfU1inz0PWvAjITdNFM4s41uvBCwLpcgx3jWJIEisczFD82x86ahYqJlb2fD6tohYSaCH/4tKAdkXA== +"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" + integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ== dependencies: - "@google/generative-ai" "^0.7.0" - "@langchain/core" ">=0.2.16 <0.3.0" - zod-to-json-schema "^3.22.4" + js-tiktoken "^1.0.12" + openai "^4.87.3" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" -"@langchain/openai@^0.0.25", "@langchain/openai@~0.0.19": +"@langchain/openai@^0.0.25": version "0.0.25" resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q== @@ -457,88 +656,162 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" -"@langchain/openai@~0.0.28": - version "0.0.34" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.34.tgz#36c9bca0721ab9f7e5d40927e7c0429cacbd5b56" - integrity sha512-M+CW4oXle5fdoz2T2SwdOef8pl3/1XmUx1vjn2mXUVM/128aO0l23FMF0SNBsAbRV6P+p/TuzjodchJbi0Ht/A== +"@langchain/openai@~0.0.19", "@langchain/openai@~0.0.26": + version "0.0.26" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.26.tgz#ab989085e03f8bcc26a40d4d5abe9a2b73e5f2a8" + integrity sha512-FpqYvVRP2CkFFjTLrj2tbXeY6JTIgbq8tRoi0rvGzmhRpoi6cWHlfgclSzDm+e6P9DqKBkzDjo6SPTJgTOabNA== dependencies: - "@langchain/core" ">0.1.56 <0.3.0" - js-tiktoken "^1.0.12" - openai "^4.41.1" + "@langchain/core" "~0.1.45" + js-tiktoken "^1.0.7" + openai "^4.32.1" zod "^3.22.4" zod-to-json-schema "^3.22.3" -"@langchain/openai@~0.1.0": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.1.3.tgz#6eb0994e970d85ffa9aaeafb94449024ccf6ca63" - integrity sha512-riv/JC9x2A8b7GcHu8sx+mlZJ8KAwSSi231IPTlcciYnKozmrQ5H0vrtiD31fxiDbaRsk7tyCpkSBIOQEo7CyQ== +"@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.1.0.tgz#f37620992192df09ecda3dfbd545b36a6bcbae46" + integrity sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw== dependencies: - "@langchain/core" ">=0.2.5 <0.3.0" - js-tiktoken "^1.0.12" - openai "^4.49.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/textsplitters@~0.0.0": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.0.3.tgz#1a3cc93dd2ab330edb225400ded190a22fea14e3" - integrity sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA== - dependencies: - "@langchain/core" ">0.2.0 <0.3.0" js-tiktoken "^1.0.12" -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== +"@next/env@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" + integrity sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ== -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== +"@next/eslint-plugin-next@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" + integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" + glob "10.3.10" -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== +"@next/swc-darwin-arm64@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.2.tgz#d3131279d4815ed7604eba7bf0063e0b8bfd2135" + integrity sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw== -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== +"@next/swc-darwin-x64@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.2.tgz#8562f6b51177aa30f3a6e95a8b3e0e176a6cb04f" + integrity sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA== -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== +"@next/swc-linux-arm64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.2.tgz#c2466cffc541f39ae4d435087c81f5899d401903" + integrity sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ== -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== +"@next/swc-linux-arm64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.2.tgz#24ed87fe47325597e986bd01c427efae53d6b677" + integrity sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA== -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@next/swc-linux-x64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.2.tgz#0240f44530ca39c1fc899fabe8f33aa35d7e77da" + integrity sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA== + +"@next/swc-linux-x64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.2.tgz#cca6ce8e9ec89afaa618673f0f8658682c30ff56" + integrity sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw== + +"@next/swc-win32-arm64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.2.tgz#08f621602ed53fa21ddf6f656160b9186860be15" + integrity sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg== + +"@next/swc-win32-x64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.2.tgz#2072d69374f8c944134a5c5a80ce03ff84254cfa" + integrity sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@petamoriken/float16@^3.8.7": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@petamoriken/float16/-/float16-3.9.2.tgz#217a5d349f3655b8e286be447e0ed1eae063a78f" + integrity sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@react-aria/focus@^3.17.1": + version "3.18.4" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" + integrity sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA== + dependencies: + "@react-aria/interactions" "^3.22.4" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.4": + version "3.22.4" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.4.tgz#88ed61ab6a485f869bc1f65ae6688d48ca96064b" + integrity sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww== + dependencies: + "@react-aria/ssr" "^3.9.6" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/ssr@^3.9.6": + version "3.9.6" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.6.tgz#a9e8b351acdc8238f2b5215b0ce904636c6ea690" + integrity sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-aria/utils@^3.25.3": + version "3.25.3" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.25.3.tgz#cad9bffc07b045cdc283df2cb65c18747acbf76d" + integrity sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA== + dependencies: + "@react-aria/ssr" "^3.9.6" + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-stately/utils@^3.10.4": + version "3.10.4" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.4.tgz#310663a834b67048d305e1680ed258130092fe51" + integrity sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-types/shared@^3.25.0": + version "3.25.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.25.0.tgz#7223baf72256e918a3c29081bb1ecc6fad4fbf58" + integrity sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ== + +"@rushstack/eslint-patch@^1.3.3": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf" + integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg== "@selderee/plugin-htmlparser2@^0.11.0": version "0.11.0" @@ -548,121 +821,56 @@ domhandler "^5.0.3" selderee "^0.11.0" -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== +"@swc/counter@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== +"@swc/helpers@0.5.15", "@swc/helpers@^0.5.0": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== + dependencies: + tslib "^2.8.0" -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== +"@tailwindcss/typography@^0.5.12": + version "0.5.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.12.tgz#c0532fd594427b7f4e8e38eff7bf272c63a1dca4" + integrity sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg== + dependencies: + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + postcss-selector-parser "6.0.10" -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@tanstack/react-virtual@^3.8.1": + version "3.10.9" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz#40606b6dd8aba8e977f576d8f7df07f69ca63eea" + integrity sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g== + dependencies: + "@tanstack/virtual-core" "3.10.9" -"@types/better-sqlite3@^7.6.10": - version "7.6.10" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz#1818e56490953404acfd44cdde0464f201be6105" - integrity sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw== +"@tanstack/virtual-core@3.10.9": + version "3.10.9" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" + integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== + +"@types/better-sqlite3@^7.6.12": + version "7.6.12" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.12.tgz#e5712d46d71097dcc2775c0b068072eadc15deb7" + integrity sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg== dependencies: "@types/node" "*" -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/cors@^2.8.17": - version "2.8.17" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" - integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.17.43" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" - integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db" - integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/express@^4.17.21": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - "@types/html-to-text@^9.0.4": version "9.0.4" resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/multer@^1.4.12": - version "1.4.12" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" - integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== - dependencies: - "@types/express" "*" +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node-fetch@^2.6.4": version "2.6.11" @@ -672,24 +880,17 @@ "@types/node" "*" form-data "^4.0.0" -"@types/node@*": - version "20.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" - integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== - dependencies: - undici-types "~5.26.4" - -"@types/node@>=13.7.0": - version "20.12.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.9.tgz#d7234f2e7839b55fcab5048404aef0195684adff" - integrity sha512-o93r47yu04MHumPBCFg0bMPBMNgtMg3jzbhl7e68z50+BMHmRMGDJv13eBlUgOdc9i/uoJXGMGYLtJV4ReTXEg== +"@types/node@*", "@types/node@^20": + version "20.12.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" + integrity sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw== dependencies: undici-types "~5.26.4" "@types/node@^18.11.18": - version "18.19.28" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.28.tgz#c64a2c992c8ebbf61100a4570e4eebc1934ae030" - integrity sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw== + version "18.19.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327" + integrity sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg== dependencies: undici-types "~5.26.4" @@ -698,46 +899,31 @@ resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== -"@types/qs@*": - version "6.9.14" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" - integrity sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA== +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/readable-stream@^4.0.11": - version "4.0.11" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.11.tgz#684f1e947c90cb6a8ad3904523d650bb66cdbb84" - integrity sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ== +"@types/react-dom@^18": + version "18.2.24" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" + integrity sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg== dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" + "@types/react" "*" + +"@types/react@*", "@types/react@^18": + version "18.2.74" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.74.tgz#2d52eb80e4e7c4ea8812c89181d6d590b53f958c" + integrity sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - "@types/triple-beam@^1.3.2": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" @@ -753,33 +939,56 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== -"@types/ws@^8.5.12": - version "8.5.12" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" - integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== dependencies: - "@types/node" "*" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" -"@xenova/transformers@^2.17.1": - version "2.17.1" - resolved "https://registry.yarnpkg.com/@xenova/transformers/-/transformers-2.17.1.tgz#712f7a72c76c8aa2075749382f83dc7dd4e5a9a5" - integrity sha512-zo702tQAFZXhzeD2GCYUNUqeqkoueOdiSbQWa4s0q7ZE4z8WBIwIsMMPGobpgdqjQ2u0Qulo08wuqVEUrBXjkQ== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@huggingface/jinja" "^0.2.2" - onnxruntime-web "1.14.0" - sharp "^0.32.0" - optionalDependencies: - onnxruntime-node "1.14.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@xmldom/xmldom@^0.8.6": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== abort-controller@^3.0.0: version "3.0.0" @@ -788,20 +997,12 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.1.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.4.1: +acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -813,11 +1014,48 @@ agentkeepalive@^4.2.1: dependencies: humanize-ms "^1.2.1" +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + ansi-styles@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -826,95 +1064,187 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -append-field@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" - integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -argparse@~1.0.3: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== +aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: - sprintf-js "~1.0.2" + dequal "^2.0.3" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== +autoprefixer@^10.0.1: + version "10.4.19" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== + dependencies: + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + +axios@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8" + integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" -b4a@^1.6.4: - version "1.6.6" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" - integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bare-events@^2.0.0, bare-events@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" - integrity sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ== - -bare-fs@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.0.tgz#0872f8e33cf291c9fd527d827154f156a298d402" - integrity sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw== - dependencies: - bare-events "^2.0.0" - bare-path "^2.0.0" - bare-stream "^1.0.0" - -bare-os@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.3.0.tgz#718e680b139effff0624a7421c098e7a2c2d63da" - integrity sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg== - -bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.2.tgz#7a0940d34ebe65f7e179fa61ed8d49d9dc151d67" - integrity sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig== - dependencies: - bare-os "^2.1.0" - -bare-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-1.0.0.tgz#25c3e56198d922187320c3f8c52d75c4051178b4" - integrity sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ== - dependencies: - streamx "^2.16.1" - base-64@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" @@ -925,10 +1255,10 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -better-sqlite3@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.0.0.tgz#12083acfe0ded6abdba908ed73520f2003e3ea0e" - integrity sha512-1NnNhmT3EZTsKtofJlMox1jkMxdedILury74PwUbQBjWgo4tL4kf7uTAjU55mgQwjdzqakSTjkf+E1imrFwjnA== +better-sqlite3@^11.9.1: + version "11.9.1" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.9.1.tgz#0540da2f2ce24cbd766bb35db412f4be2c75b8bb" + integrity sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ== dependencies: bindings "^1.5.0" prebuild-install "^7.1.1" @@ -959,29 +1289,6 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@~3.4.0: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== - -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -990,13 +1297,30 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@~3.0.2: +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" +browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1010,19 +1334,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -busboy@^1.0.0: +busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.7: +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -1033,17 +1352,45 @@ call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase@6: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +caniuse-lite@^1.0.30001579: + version "1.0.30001705" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz#dc3510bcdef261444ca944b7be9c8d0bb7fafeef" + integrity sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg== + +caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: + version "1.0.30001606" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" + integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== + +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + charenc@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -chokidar@^3.5.2: +chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -1063,6 +1410,21 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +clsx@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1131,6 +1493,11 @@ commander@^10.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + compute-cosine-similarity@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" @@ -1162,89 +1529,83 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== +console-table-printer@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" + integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" + simple-wcswidth "^1.0.1" -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" crypt@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -debug@^3.1.0: +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4: +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - decamelize@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1262,12 +1623,17 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -1276,30 +1642,34 @@ define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-libc@^2.0.0, detect-libc@^2.0.2: +detect-libc@^2.0.0, detect-libc@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== digest-fetch@^1.3.0: version "1.3.0" @@ -1309,10 +1679,31 @@ digest-fetch@^1.3.0: base-64 "^0.1.0" md5 "^2.3.0" -dingbat-to-unicode@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83" - integrity sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" dom-serializer@^2.0.0: version "2.0.0" @@ -1336,55 +1727,55 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" domhandler "^5.0.3" -dotenv@^16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -drizzle-kit@^0.22.7: - version "0.22.7" - resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.22.7.tgz#4339c3e24c6555ea8cbad605f005b3db3e604a9c" - integrity sha512-9THPCb2l1GPt7wxhws9LvTR0YG565ZlVgTuqGMwjs590Kch1pXu4GyjEArVijSF5m0OBj3qgdeKmuJXhKXgWFw== +drizzle-kit@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.30.5.tgz#fce34a8ca9f82da5212f31c266e407c78523166f" + integrity sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA== dependencies: + "@drizzle-team/brocli" "^0.10.2" "@esbuild-kit/esm-loader" "^2.5.5" esbuild "^0.19.7" esbuild-register "^3.5.0" + gel "^2.0.0" -drizzle-orm@^0.31.2: - version "0.31.2" - resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.31.2.tgz#221a257dd487bab49ddb88a17bd82388600cf655" - integrity sha512-QnenevbnnAzmbNzQwbhklvIYrDE8YER8K7kSrAWQSV1YvFCdSQPzj+jzqRdTSsV2cDqSpQ0NXGyL1G9I43LDLg== +drizzle-orm@^0.40.1: + version "0.40.1" + resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb" + integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew== -duck@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/duck/-/duck-0.1.12.tgz#de7adf758421230b6d7aee799ce42670586b9efa" - integrity sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg== - dependencies: - underscore "^1.13.1" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +electron-to-chromium@^1.4.668: + version "1.4.729" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz#8477d21e2a50993781950885b2731d92ad532c00" + integrity sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== enabled@2.0.x: version "2.0.0" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -1392,11 +1783,76 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +enhanced-resolve@^5.12.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -1404,15 +1860,67 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.3.0: +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + esbuild-register@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.5.0.tgz#449613fb29ab94325c722f560f800dd946dc8ea8" - integrity sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A== + version "3.6.0" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== dependencies: debug "^4.3.4" @@ -1473,15 +1981,223 @@ esbuild@~0.18.20: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@14.1.4: + version "14.1.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" + integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== + dependencies: + "@next/eslint-plugin-next" "14.1.4" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.28.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.33.2: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== event-target-shim@^5.0.0: version "5.0.1" @@ -1503,60 +2219,51 @@ expr-eval@^2.0.2: resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== -express@^4.19.2: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.1.0, fast-fifo@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - -fast-xml-parser@^4.3.5: - version "4.4.0" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" - integrity sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg== +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: - strnum "^1.0.5" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" fecha@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -1569,28 +2276,32 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatbuffers@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-1.12.0.tgz#72e87d1726cb1b216e839ef02658aa87dcef68aa" - integrity sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ== +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== fn.name@1.x.x: version "1.1.0" @@ -1598,9 +2309,24 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" form-data-encoder@1.7.2: version "1.7.2" @@ -1624,21 +2350,21 @@ formdata-node@^4.3.2: node-domexception "1.0.0" web-streams-polyfill "4.0.0-beta.3" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -1649,7 +2375,34 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gel@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gel/-/gel-2.0.1.tgz#587d89db54351c2d436de981d136481e37d06a7a" + integrity sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw== + dependencies: + "@petamoriken/float16" "^3.8.7" + debug "^4.3.4" + env-paths "^3.0.0" + semver "^7.6.2" + shell-quote "^1.8.1" + which "^4.0.0" + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -1660,10 +2413,26 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.5.0: + version "4.7.3" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" + integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + dependencies: + resolve-pkg-maps "^1.0.0" + get-tsconfig@^4.7.0: - version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== dependencies: resolve-pkg-maps "^1.0.0" @@ -1672,13 +2441,80 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== -glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^10.3.10: + version "10.3.12" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" + integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.6" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.10.2" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -1686,34 +2522,51 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -guid-typescript@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" - integrity sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ== +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-property-descriptors@^1.0.2: +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1: +has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -hasown@^2.0.0: +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -1741,17 +2594,6 @@ htmlparser2@^8.0.2: domutils "^3.0.1" entities "^4.4.0" -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -1759,29 +2601,38 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== +ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" -inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1791,21 +2642,47 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" is-any-array@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1813,42 +2690,213 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-glob@^4.0.1, is-glob@~4.0.1: +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.3.5, jackspeak@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.21.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== js-tiktoken@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211" - integrity sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ== + version "1.0.19" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78" + integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g== dependencies: base64-js "^1.5.1" @@ -1859,6 +2907,11 @@ js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: dependencies: base64-js "^1.5.1" +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1866,57 +2919,82 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + jsonpointer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -jszip@^3.7.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" - integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - lie "~3.3.0" - pako "~1.0.2" - readable-stream "~2.3.6" - setimmediate "^1.0.5" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" kuler@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -langchain@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.2.3.tgz#c14bb05cf871b21bd63b84b3ab89580b1d62539f" - integrity sha512-T9xR7zd+Nj0oXy6WoYKmZLy0DlQiDLFPGYWdOXDxy+AvqlujoPdVQgDSpdqiOHvAjezrByAoKxoHCz5XMwTP/Q== +"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0": + version "0.3.19" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b" + integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw== dependencies: - "@langchain/core" "~0.2.0" - "@langchain/openai" "~0.0.28" - "@langchain/textsplitters" "~0.0.0" - binary-extensions "^2.2.0" + "@langchain/openai" ">=0.1.0 <0.5.0" + "@langchain/textsplitters" ">=0.0.0 <0.2.0" js-tiktoken "^1.0.12" js-yaml "^4.1.0" jsonpointer "^5.0.1" - langchainhub "~0.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" + langsmith ">=0.2.8 <0.4.0" openapi-types "^12.1.3" p-retry "4" - uuid "^9.0.0" + uuid "^10.0.0" yaml "^2.2.1" zod "^3.22.4" zod-to-json-schema "^3.22.3" langchain@^0.1.30: - version "0.1.30" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.30.tgz#e1adb3f1849fcd5c596c668300afd5dc8cb37a97" - integrity sha512-5h/vNMmutQ98tbB0sPDlAileZVca6A2McFgGa3+D56Dm8mSSCzTQL2DngPA6h09DlKDpSr7+6PdFw5Hoj0ZDSw== + version "0.1.31" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" + integrity sha512-J2iZZL48Nwdo1XDU5cS5YYm91b2L6sL3a8hH1gBljvDzCY7jbtUOTuIoRVx5iHN3DXuuLnszS4lhqg0u9hQxBQ== dependencies: "@anthropic-ai/sdk" "^0.9.1" "@langchain/community" "~0.0.41" "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.19" + "@langchain/openai" "~0.0.26" binary-extensions "^2.2.0" js-tiktoken "^1.0.7" js-yaml "^4.1.0" @@ -1936,13 +3014,14 @@ langchainhub@~0.0.8: resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== -langsmith@^0.1.56-rc.1: - version "0.1.68" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.68.tgz#848332e822fe5e6734a07f1c36b6530cc1798afb" - integrity sha512-otmiysWtVAqzMx3CJ4PrtUBhWRG5Co8Z4o7hSZENPjlit9/j3/vm3TSvbaxpDYakZxtMjhkcJTqrdYFipISEiQ== +"langsmith@>=0.2.8 <0.4.0": + version "0.3.14" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f" + integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ== dependencies: "@types/uuid" "^10.0.0" - commander "^10.0.1" + chalk "^4.1.2" + console-table-printer "^2.12.1" p-queue "^6.6.2" p-retry "4" semver "^7.6.3" @@ -1959,39 +3038,72 @@ langsmith@~0.1.1, langsmith@~0.1.7: p-retry "4" uuid "^9.0.0" -langsmith@~0.1.30: - version "0.1.34" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.34.tgz#801310495fef258ed9c22bb5575120e2c06d51cf" - integrity sha512-aMv2k8kEaovhTuZnK6/6DMCoM7Jurvm1AzdESn+yN+HramRxp3sK32jFRz3ogkXP6GjAjOIofcnNkzhHXSUXGA== +language-subtag-registry@^0.3.20: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: - "@types/uuid" "^9.0.1" - commander "^10.0.1" - lodash.set "^4.3.2" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" + language-subtag-registry "^0.3.20" leac@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - immediate "~3.0.5" + prelude-ls "^1.2.1" + type-check "~0.4.0" -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== -logform@^2.3.2, logform@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" - integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== dependencies: "@colors/colors" "1.6.0" "@types/triple-beam" "^1.3.2" @@ -2000,19 +3112,17 @@ logform@^2.3.2, logform@^2.4.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -lop@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/lop/-/lop-0.4.2.tgz#c9c2f958a39b9da1c2f36ca9ad66891a9fe84640" - integrity sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw== +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - duck "^0.1.12" - option "~0.2.1" - underscore "^1.13.1" + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== lru-cache@^6.0.0: version "6.0.0" @@ -2021,26 +3131,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +lucide-react@^0.363.0: + version "0.363.0" + resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" + integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== -mammoth@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.8.0.tgz#d8f1b0d3a0355fda129270346e9dc853f223028f" - integrity sha512-pJNfxSk9IEGVpau+tsZFz22ofjUsl2mnA5eT8PjPs2n0BP+rhVte4Nez6FdgEuxv3IGI3afiV46ImKqTGDVlbA== - dependencies: - "@xmldom/xmldom" "^0.8.6" - argparse "~1.0.3" - base64-js "^1.5.1" - bluebird "~3.4.0" - dingbat-to-unicode "^1.0.1" - jszip "^3.7.1" - lop "^0.4.1" - path-is-absolute "^1.0.0" - underscore "^1.13.1" - xmlbuilder "^10.0.0" +markdown-to-jsx@^7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" + integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g== md5@^2.3.0: version "2.3.0" @@ -2051,67 +3150,72 @@ md5@^2.3.0: crypt "0.0.2" is-buffer "~1.1.6" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@^3.1.2: +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.1: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.4: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - ml-array-mean@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" @@ -2148,61 +3252,85 @@ ml-tree-similarity@^1.0.0: binary-search "^1.3.5" num-sort "^2.0.0" -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multer@^1.4.5-lts.1: - version "1.4.5-lts.1" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" - integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== - dependencies: - append-field "^1.0.0" - busboy "^1.0.0" - concat-stream "^1.5.2" - mkdirp "^0.5.4" - object-assign "^4.1.1" - type-is "^1.6.4" - xtend "^4.0.0" - mustache@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +nanoid@^3.3.6: + version "3.3.10" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.10.tgz#7bc882237698ef787d5cbba109e3b0168ba6e7b1" + integrity sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next-themes@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" + integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== + +next@^15.2.2: + version "15.2.2" + resolved "https://registry.yarnpkg.com/next/-/next-15.2.2.tgz#e3941a0e0e76cfe1880b57452807489e0546e3a2" + integrity sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA== + dependencies: + "@next/env" "15.2.2" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.15" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + postcss "8.4.31" + styled-jsx "5.1.6" + optionalDependencies: + "@next/swc-darwin-arm64" "15.2.2" + "@next/swc-darwin-x64" "15.2.2" + "@next/swc-linux-arm64-gnu" "15.2.2" + "@next/swc-linux-arm64-musl" "15.2.2" + "@next/swc-linux-x64-gnu" "15.2.2" + "@next/swc-linux-x64-musl" "15.2.2" + "@next/swc-win32-arm64-msvc" "15.2.2" + "@next/swc-win32-x64-msvc" "15.2.2" + sharp "^0.33.5" node-abi@^3.3.0: - version "3.62.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.62.0.tgz#017958ed120f89a3a14a7253da810f5d724e3f36" - integrity sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g== + version "3.74.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" + integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== dependencies: semver "^7.3.5" -node-addon-api@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" - integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== - node-domexception@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" @@ -2220,57 +3348,103 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -nodemon@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" - integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + num-sort@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== -object-assign@^4, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -once@^1.3.1, once@^1.4.0: +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.hasown@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== + dependencies: + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -2284,56 +3458,10 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onnx-proto@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/onnx-proto/-/onnx-proto-4.0.4.tgz#2431a25bee25148e915906dda0687aafe3b9e044" - integrity sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA== - dependencies: - protobufjs "^6.8.8" - -onnxruntime-common@~1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz#2bb5dac5261269779aa5fb6536ca379657de8bf6" - integrity sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew== - -onnxruntime-node@1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz#c4ae6c355cfae7d83abaf36dd39a905c4a010217" - integrity sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w== - dependencies: - onnxruntime-common "~1.14.0" - -onnxruntime-web@1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz#c8cee538781b1d4c1c6b043934f4a3e6ddf1466e" - integrity sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw== - dependencies: - flatbuffers "^1.12.0" - guid-typescript "^1.0.9" - long "^4.0.0" - onnx-proto "^4.0.4" - onnxruntime-common "~1.14.0" - platform "^1.3.6" - -openai@^4.26.0: - version "4.31.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.31.0.tgz#5d96045c4eb244fa21f0fff0981043a2c9f09e8c" - integrity sha512-JebkRnRGEGLnJt3+bJ5B7au8nBeZvJjs9baVxDmUZ5+BgafAdy6KDxJGSuyaw/IA+ErqY3jmOH5cDC2mCDJF2w== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - digest-fetch "^1.3.0" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" - -openai@^4.41.1, openai@^4.49.1: - version "4.52.2" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.52.2.tgz#5d67271f3df84c0b54676b08990eaa9402151759" - integrity sha512-mMc0XgFuVSkcm0lRIi8zaw++otC82ZlfkCur1qguXYWPETr/+ZwL9A/vvp3YahX+shpaT6j03dwsmUyLAfmEfg== +openai@^4.26.0, openai@^4.32.1: + version "4.33.0" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" + integrity sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -2344,21 +3472,55 @@ openai@^4.41.1, openai@^4.49.1: node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +openai@^4.87.3: + version "4.87.4" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902" + integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + openapi-types@^12.1.3: version "12.1.3" resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== -option@~0.2.1: - version "0.2.4" - resolved "https://registry.yarnpkg.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4" - integrity sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-queue@^6.6.2: version "6.6.2" resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" @@ -2382,10 +3544,12 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" -pako@~1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" parseley@^0.12.0: version "0.12.1" @@ -2395,20 +3559,38 @@ parseley@^0.12.0: leac "^0.6.0" peberminta "^0.9.0" -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1, path-scurry@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pdf-parse@^1.1.1: version "1.1.1" @@ -2423,27 +3605,112 @@ peberminta@^0.9.0: resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== -picomatch@^2.0.4, picomatch@^2.2.1: +picocolors@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -platform@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" - integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@6.0.10: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^6.0.11: + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8, postcss@^8.4.23: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" prebuild-install@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" - integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== dependencies: detect-libc "^2.0.0" expand-template "^2.0.3" github-from-package "0.0.0" minimist "^1.2.3" mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" + napi-build-utils "^2.0.0" node-abi "^3.3.0" pump "^3.0.0" rc "^1.2.7" @@ -2451,87 +3718,47 @@ prebuild-install@^7.1.1: tar-fs "^2.0.0" tunnel-agent "^0.6.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prettier@^3.2.5: version "3.2.5" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -protobufjs@^6.8.8: - version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== rc@^1.2.7: version "1.2.8" @@ -2543,20 +3770,48 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@^2.2.2, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== +react-dom@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" + loose-envify "^1.1.0" + scheduler "^0.23.0" -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-text-to-speech@^0.14.5: + version "0.14.5" + resolved "https://registry.yarnpkg.com/react-text-to-speech/-/react-text-to-speech-0.14.5.tgz#f918786ab283311535682011045bd49777193300" + integrity sha512-3brr/IrK/5YTtOZSTo+Y8b+dnWelzfZiDZvkXnOct1e7O7fgA/h9bYAVrtwSRo/VxKfdw+wh6glkj6M0mlQuQQ== + +react-textarea-autosize@^8.5.3: + version "8.5.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" + integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -2572,35 +3827,121 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== +resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" selderee@^0.11.0: version "0.11.0" @@ -2609,47 +3950,23 @@ selderee@^0.11.0: dependencies: parseley "^0.12.0" -semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.6.2, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" -semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -2662,31 +3979,63 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sharp@^0.32.0: - version "0.32.6" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" - integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== +sharp@^0.33.5: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== dependencies: color "^4.2.3" - detect-libc "^2.0.2" - node-addon-api "^6.1.0" - prebuild-install "^7.1.1" - semver "^7.5.4" - simple-get "^4.0.1" - tar-fs "^3.0.4" - tunnel-agent "^0.6.0" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-darwin-x64" "0.33.5" + "@img/sharp-libvips-darwin-arm64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-arm64" "1.0.4" + "@img/sharp-libvips-linux-s390x" "1.0.4" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" -side-channel@^1.0.4: +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + +side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== @@ -2696,12 +4045,17 @@ side-channel@^1.0.4: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== -simple-get@^4.0.0, simple-get@^4.0.1: +simple-get@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== @@ -2717,12 +4071,30 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" +simple-wcswidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" + integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +sonner@^1.4.41: + version "1.4.41" + resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.4.41.tgz#ff085ae4f4244713daf294959beaa3e90f842d2c" + integrity sha512-uG511ggnnsw6gcn/X+YKkWPo5ep9il9wYi3QJxHsYe7yTZ4+cOd1wuodOUmOpFuXL+/RE3R04LczdNCDygTDgQ== + +source-map-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-support@^0.5.21: version "0.5.21" @@ -2737,35 +4109,88 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -streamx@^2.15.0, streamx@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" - integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - fast-fifo "^1.1.0" - queue-tick "^1.0.1" - optionalDependencies: - bare-events "^2.2.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.1.1: version "1.3.0" @@ -2774,51 +4199,129 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - safe-buffer "~5.1.0" + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strnum@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== - -supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== dependencies: - has-flag "^3.0.0" + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +tailwind-merge@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.2.2.tgz#87341e7604f0e20499939e152cd2841f41f7a3df" + integrity sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw== + dependencies: + "@babel/runtime" "^7.24.0" + +tailwindcss@^3.3.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" + integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" pump "^3.0.0" tar-stream "^2.1.4" -tar-fs@^3.0.4: - version "3.0.6" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" - integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== - dependencies: - pump "^3.0.0" - tar-stream "^3.1.5" - optionalDependencies: - bare-fs "^2.1.1" - bare-path "^2.1.0" - tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -2830,20 +4333,30 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar-stream@^3.1.5: - version "3.1.7" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" - integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2851,18 +4364,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -2873,24 +4374,30 @@ triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.4.0, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tunnel-agent@^0.6.0: version "0.6.0" @@ -2899,54 +4406,119 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -type-is@^1.6.4, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" + prelude-ls "^1.2.1" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typescript@^5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -underscore@^1.13.1: - version "1.13.7" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" - integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@^5: + version "5.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" + integrity sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - uuid@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" @@ -2957,11 +4529,6 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - validate.io-array@^1.0.3, validate.io-array@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" @@ -2972,11 +4539,6 @@ validate.io-function@^1.0.2: resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" @@ -3000,77 +4562,144 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -winston-transport@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" - integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + +winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" triple-beam "^1.3.0" -winston@^3.13.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" - integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== +winston@^3.17.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" + integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== dependencies: "@colors/colors" "^1.6.0" "@dabh/diagnostics" "^2.0.2" async "^3.2.3" is-stream "^2.0.0" - logform "^2.4.0" + logform "^2.7.0" one-time "^1.0.0" readable-stream "^3.4.0" safe-stable-stringify "^2.3.1" stack-trace "0.0.x" triple-beam "^1.3.0" - winston-transport "^4.7.0" + winston-transport "^4.9.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - -xmlbuilder@^10.0.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" - integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.2.1: +yaml@^2.2.1, yaml@^2.3.4: version "2.4.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yet-another-react-lightbox@^3.17.2: + version "3.17.2" + resolved "https://registry.yarnpkg.com/yet-another-react-lightbox/-/yet-another-react-lightbox-3.17.2.tgz#00474b83189ec4d81302792211ca31ffb808554c" + integrity sha512-fM+Br5nR2kt/oBAOHDqVdUmogiHRLCt4iuIJHPS9Q+ME+h+ciME6vEpLt3IPgGU8whib1agEyZBgWJOAKjgadQ== -zod-to-json-schema@^3.22.3: +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5: version "3.22.5" resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== -zod-to-json-schema@^3.22.4, zod-to-json-schema@^3.22.5: - version "3.23.1" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.23.1.tgz#5225925b8ed5fa20096bd99be076c4b29b53d309" - integrity sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw== - zod@^3.22.3, zod@^3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" From 403d13eb50bd17b264ae38c485f75f3f5b4183dd Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:34:55 +0530 Subject: [PATCH 166/282] feat(package): update scripts --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c9314b4..8d5b49b 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,10 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start", + "start": "npm run db:push && next start", "lint": "next lint", "format:write": "prettier . --write", - "db:push": "drizzle-kit push sqlite" + "db:push": "drizzle-kit push" }, "dependencies": { "@headlessui/react": "^2.2.0", From ea638279e5c3a21a31333d18f1158998c39ffb5c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:46:50 +0530 Subject: [PATCH 167/282] feat(docker): use standalone build --- .github/workflows/docker-build.yaml | 25 +++++---------------- app.dockerfile | 35 ++++++++++++++++------------- docker-compose.yaml | 1 + next.config.mjs | 1 + 4 files changed, 28 insertions(+), 34 deletions(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index f658c29..0620afb 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -10,9 +10,6 @@ on: jobs: build-and-push: runs-on: ubuntu-latest - strategy: - matrix: - service: [backend, app] steps: - name: Checkout code uses: actions/checkout@v3 @@ -36,17 +33,12 @@ jobs: id: version run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - name: Build and push Docker image for ${{ matrix.service }} + - name: Build and push Docker image if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | docker buildx create --use - if [[ "${{ matrix.service }}" == "backend" ]]; then \ - DOCKERFILE=backend.dockerfile; \ - IMAGE_NAME=perplexica-backend; \ - else \ - DOCKERFILE=app.dockerfile; \ - IMAGE_NAME=perplexica-frontend; \ - fi + DOCKERFILE=app.dockerfile; \ + IMAGE_NAME=perplexica; \ docker buildx build --platform linux/amd64,linux/arm64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:main \ --cache-to=type=inline \ @@ -54,17 +46,12 @@ jobs: -t itzcrazykns1337/${IMAGE_NAME}:main \ --push . - - name: Build and push release Docker image for ${{ matrix.service }} + - name: Build and push release Docker image if: github.event_name == 'release' run: | docker buildx create --use - if [[ "${{ matrix.service }}" == "backend" ]]; then \ - DOCKERFILE=backend.dockerfile; \ - IMAGE_NAME=perplexica-backend; \ - else \ - DOCKERFILE=app.dockerfile; \ - IMAGE_NAME=perplexica-frontend; \ - fi + DOCKERFILE=app.dockerfile; \ + IMAGE_NAME=perplexica; \ docker buildx build --platform linux/amd64,linux/arm64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ --cache-to=type=inline \ diff --git a/app.dockerfile b/app.dockerfile index 97c6a96..2571305 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,22 +1,27 @@ +FROM node:20.18.0-alpine AS builder + +WORKDIR /home/perplexica + +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile + +COPY tsconfig.json next.config.mjs next-env.d.ts postcss.config.js drizzle.config.ts tailwind.config.ts ./ +COPY src ./src +COPY public ./public + +RUN mkdir -p /home/perplexica/data +RUN yarn build + FROM node:20.18.0-alpine WORKDIR /home/perplexica -COPY src /home/perplexica/src -COPY public /home/perplexica/public -COPY package.json /home/perplexica/package.json -COPY yarn.lock /home/perplexica/yarn.lock -COPY tsconfig.json /home/perplexica/tsconfig.json -COPY next.config.mjs /home/perplexica/next.config.mjs -COPY next-env.d.ts /home/perplexica/next-env.d.ts -COPY postcss.config.js /home/perplexica/postcss.config.js -COPY drizzle.config.ts /home/perplexica/drizzle.config.ts -COPY tailwind.config.ts /home/perplexica/tailwind.config.ts +COPY --from=builder /home/perplexica/public ./public +COPY --from=builder /home/perplexica/.next/static ./public/_next/static + +COPY --from=builder /home/perplexica/.next/standalone ./ +COPY --from=builder /home/perplexica/data ./data -RUN mkdir /home/perplexica/data RUN mkdir /home/perplexica/uploads -RUN yarn install --frozen-lockfile -RUN yarn build - -CMD ["yarn", "start"] \ No newline at end of file +CMD ["node", "server.js"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 631e42b..b702b4e 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -10,6 +10,7 @@ services: restart: unless-stopped app: + image: itzcrazykns1337/perplexica:main build: context: . dockerfile: app.dockerfile diff --git a/next.config.mjs b/next.config.mjs index 74156d1..2300ff4 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,5 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + output: 'standalone', images: { remotePatterns: [ { From 4d1ee79b8daaa1564da774ee838fa0ed0e2af67f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:47:12 +0530 Subject: [PATCH 168/282] feat(package): migrate db when built --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8d5b49b..f73500c 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "author": "ItzCrazyKns", "scripts": { "dev": "next dev", - "build": "next build", - "start": "npm run db:push && next start", + "build": "npm run db:push && next build", + "start": "next start", "lint": "next lint", "format:write": "prettier . --write", "db:push": "drizzle-kit push" From 008c7cbec03253d45b73457bc2d3abab9a0da6b5 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:47:32 +0530 Subject: [PATCH 169/282] feat(chat-window): remove debugging code, --- src/components/ChatWindow.tsx | 54 ++++++++++------------------------- 1 file changed, 15 insertions(+), 39 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 47bbab2..0c956e8 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -343,30 +343,6 @@ const ChatWindow = ({ id }: { id?: string }) => { messageId = messageId ?? crypto.randomBytes(7).toString('hex'); - console.log( - JSON.stringify({ - content: message, - message: { - messageId: messageId, - chatId: chatId!, - content: message, - }, - chatId: chatId!, - files: fileIds, - focusMode: focusMode, - optimizationMode: optimizationMode, - history: chatHistory, - chatModel: { - name: chatModelProvider.name, - provider: chatModelProvider.provider, - }, - embeddingModel: { - name: embeddingModelProvider.name, - provider: embeddingModelProvider.provider, - }, - }), - ); - setMessages((prevMessages) => [ ...prevMessages, { @@ -445,6 +421,21 @@ const ChatWindow = ({ id }: { id?: string }) => { const lastMsg = messagesRef.current[messagesRef.current.length - 1]; + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (autoImageSearch === 'true') { + document + .getElementById(`search-images-${lastMsg.messageId}`) + ?.click(); + } + + if (autoVideoSearch === 'true') { + document + .getElementById(`search-videos-${lastMsg.messageId}`) + ?.click(); + } + if ( lastMsg.role === 'assistant' && lastMsg.sources && @@ -461,21 +452,6 @@ const ChatWindow = ({ id }: { id?: string }) => { }), ); } - - const autoImageSearch = localStorage.getItem('autoImageSearch'); - const autoVideoSearch = localStorage.getItem('autoVideoSearch'); - - if (autoImageSearch === 'true') { - document - .getElementById(`search-images-${lastMsg.messageId}`) - ?.click(); - } - - if (autoVideoSearch === 'true') { - document - .getElementById(`search-videos-${lastMsg.messageId}`) - ?.click(); - } } }; From 584d02b92a2949aeb7927cc44c9a82f769dfb2c9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:56:03 +0530 Subject: [PATCH 170/282] feat(app): add thinking model support --- src/components/MessageBox.tsx | 38 +++++++++++++++++++++++++++---- src/components/ThinkBox.tsx | 43 +++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/components/ThinkBox.tsx diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index 499c3d6..4473c3b 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -12,13 +12,18 @@ import { Layers3, Plus, } from 'lucide-react'; -import Markdown from 'markdown-to-jsx'; +import Markdown, { MarkdownToJSX } from 'markdown-to-jsx'; import Copy from './MessageActions/Copy'; import Rewrite from './MessageActions/Rewrite'; import MessageSources from './MessageSources'; import SearchImages from './SearchImages'; import SearchVideos from './SearchVideos'; import { useSpeech } from 'react-text-to-speech'; +import ThinkBox from './ThinkBox'; + +const ThinkTagProcessor = ({ children }: { children: React.ReactNode }) => { + return <ThinkBox content={children as string} />; +}; const MessageBox = ({ message, @@ -44,27 +49,48 @@ const MessageBox = ({ useEffect(() => { const regex = /\[(\d+)\]/g; + let processedMessage = message.content; + + if (message.role === 'assistant' && message.content.includes('<think>')) { + const openThinkTag = processedMessage.match(/<think>/g)?.length || 0; + const closeThinkTag = processedMessage.match(/<\/think>/g)?.length || 0; + + if (openThinkTag > closeThinkTag) { + processedMessage += '</think> <a> </a>'; // The extra <a> </a> is to prevent the the think component from looking bad + } + } if ( message.role === 'assistant' && message?.sources && message.sources.length > 0 ) { - return setParsedMessage( - message.content.replace( + setParsedMessage( + processedMessage.replace( regex, (_, number) => - `<a href="${message.sources?.[number - 1]?.metadata?.url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${number}</a>`, + `<a href="${ + message.sources?.[number - 1]?.metadata?.url + }" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${number}</a>`, ), ); + return; } setSpeechMessage(message.content.replace(regex, '')); - setParsedMessage(message.content); + setParsedMessage(processedMessage); }, [message.content, message.sources, message.role]); const { speechStatus, start, stop } = useSpeech({ text: speechMessage }); + const markdownOverrides: MarkdownToJSX.Options = { + overrides: { + think: { + component: ThinkTagProcessor, + }, + }, + }; + return ( <div> {message.role === 'user' && ( @@ -111,11 +137,13 @@ const MessageBox = ({ Answer </h3> </div> + <Markdown className={cn( 'prose prose-h1:mb-3 prose-h2:mb-2 prose-h2:mt-6 prose-h2:font-[800] prose-h3:mt-4 prose-h3:mb-1.5 prose-h3:font-[600] dark:prose-invert prose-p:leading-relaxed prose-pre:p-0 font-[400]', 'max-w-none break-words text-black dark:text-white', )} + options={markdownOverrides} > {parsedMessage} </Markdown> diff --git a/src/components/ThinkBox.tsx b/src/components/ThinkBox.tsx new file mode 100644 index 0000000..9c6a576 --- /dev/null +++ b/src/components/ThinkBox.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { useState } from 'react'; +import { cn } from '@/lib/utils'; +import { ChevronDown, ChevronUp, BrainCircuit } from 'lucide-react'; + +interface ThinkBoxProps { + content: string; +} + +const ThinkBox = ({ content }: ThinkBoxProps) => { + const [isExpanded, setIsExpanded] = useState(false); + + return ( + <div className="my-4 bg-light-secondary/50 dark:bg-dark-secondary/50 rounded-xl border border-light-200 dark:border-dark-200 overflow-hidden"> + <button + onClick={() => setIsExpanded(!isExpanded)} + className="w-full flex items-center justify-between px-4 py-1 text-black/90 dark:text-white/90 hover:bg-light-200 dark:hover:bg-dark-200 transition duration-200" + > + <div className="flex items-center space-x-2"> + <BrainCircuit + size={20} + className="text-[#9C27B0] dark:text-[#CE93D8]" + /> + <p className="font-medium text-sm">Thinking Process</p> + </div> + {isExpanded ? ( + <ChevronUp size={18} className="text-black/70 dark:text-white/70" /> + ) : ( + <ChevronDown size={18} className="text-black/70 dark:text-white/70" /> + )} + </button> + + {isExpanded && ( + <div className="px-4 py-3 text-black/80 dark:text-white/80 text-sm border-t border-light-200 dark:border-dark-200 bg-light-100/50 dark:bg-dark-100/50 whitespace-pre-wrap"> + {content} + </div> + )} + </div> + ); +}; + +export default ThinkBox; From ffa793056d69116c1cdaca825ac917e8a5113e52 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:47:54 +0530 Subject: [PATCH 171/282] feat(chains): remove think tags --- src/lib/chains/imageSearchAgent.ts | 2 ++ src/lib/chains/videoSearchAgent.ts | 2 ++ src/lib/search/metaSearchAgent.ts | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts index d194612..4fd684f 100644 --- a/src/lib/chains/imageSearchAgent.ts +++ b/src/lib/chains/imageSearchAgent.ts @@ -58,6 +58,8 @@ const createImageSearchChain = (llm: BaseChatModel) => { llm, strParser, RunnableLambda.from(async (input: string) => { + input = input.replace(/<think>.*?<\/think>/g, ''); + const res = await searchSearxng(input, { engines: ['bing images', 'google images'], }); diff --git a/src/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts index e1051f6..f7cb156 100644 --- a/src/lib/chains/videoSearchAgent.ts +++ b/src/lib/chains/videoSearchAgent.ts @@ -59,6 +59,8 @@ const createVideoSearchChain = (llm: BaseChatModel) => { llm, strParser, RunnableLambda.from(async (input: string) => { + input = input.replace(/<think>.*?<\/think>/g, ''); + const res = await searchSearxng(input, { engines: ['youtube'], }); diff --git a/src/lib/search/metaSearchAgent.ts b/src/lib/search/metaSearchAgent.ts index 38ea2a0..4a3d817 100644 --- a/src/lib/search/metaSearchAgent.ts +++ b/src/lib/search/metaSearchAgent.ts @@ -202,6 +202,8 @@ class MetaSearchAgent implements MetaSearchAgentType { return { query: question, docs: docs }; } else { + question = question.replace(/<think>.*?<\/think>/g, ''); + const res = await searchSearxng(question, { language: 'en', engines: this.config.activeEngines, From cf7144db9661ff57945960e44aeeba7b11b6d346 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:48:26 +0530 Subject: [PATCH 172/282] feat(providers): add HF transformers --- package.json | 1 + src/lib/huggingfaceTransformer.ts | 82 ++++++++++ src/lib/providers/index.ts | 2 + src/lib/providers/transformers.ts | 31 ++++ yarn.lock | 259 +++++++++++++++++++++++++++++- 5 files changed, 373 insertions(+), 2 deletions(-) create mode 100644 src/lib/huggingfaceTransformer.ts create mode 100644 src/lib/providers/transformers.ts diff --git a/package.json b/package.json index f73500c..904e0b2 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@langchain/openai": "^0.0.25", "@langchain/textsplitters": "^0.1.0", "@tailwindcss/typography": "^0.5.12", + "@xenova/transformers": "^2.17.2", "axios": "^1.8.3", "better-sqlite3": "^11.9.1", "clsx": "^2.1.0", diff --git a/src/lib/huggingfaceTransformer.ts b/src/lib/huggingfaceTransformer.ts new file mode 100644 index 0000000..6afc652 --- /dev/null +++ b/src/lib/huggingfaceTransformer.ts @@ -0,0 +1,82 @@ +import { Embeddings, type EmbeddingsParams } from '@langchain/core/embeddings'; +import { chunkArray } from '@langchain/core/utils/chunk_array'; + +export interface HuggingFaceTransformersEmbeddingsParams + extends EmbeddingsParams { + modelName: string; + + model: string; + + timeout?: number; + + batchSize?: number; + + stripNewLines?: boolean; +} + +export class HuggingFaceTransformersEmbeddings + extends Embeddings + implements HuggingFaceTransformersEmbeddingsParams +{ + modelName = 'Xenova/all-MiniLM-L6-v2'; + + model = 'Xenova/all-MiniLM-L6-v2'; + + batchSize = 512; + + stripNewLines = true; + + timeout?: number; + + private pipelinePromise: Promise<any> | undefined; + + constructor(fields?: Partial<HuggingFaceTransformersEmbeddingsParams>) { + super(fields ?? {}); + + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; + this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines; + this.timeout = fields?.timeout; + } + + async embedDocuments(texts: string[]): Promise<number[][]> { + const batches = chunkArray( + this.stripNewLines ? texts.map((t) => t.replace(/\n/g, ' ')) : texts, + this.batchSize, + ); + + const batchRequests = batches.map((batch) => this.runEmbedding(batch)); + const batchResponses = await Promise.all(batchRequests); + const embeddings: number[][] = []; + + for (let i = 0; i < batchResponses.length; i += 1) { + const batchResponse = batchResponses[i]; + for (let j = 0; j < batchResponse.length; j += 1) { + embeddings.push(batchResponse[j]); + } + } + + return embeddings; + } + + async embedQuery(text: string): Promise<number[]> { + const data = await this.runEmbedding([ + this.stripNewLines ? text.replace(/\n/g, ' ') : text, + ]); + return data[0]; + } + + private async runEmbedding(texts: string[]) { + const { pipeline } = await import('@xenova/transformers'); + + const pipe = await (this.pipelinePromise ??= pipeline( + 'feature-extraction', + this.model, + )); + + return this.caller.call(async () => { + const output = await pipe(texts, { pooling: 'mean', normalize: true }); + return output.tolist(); + }); + } +} diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 3b3cf63..c32d0fa 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -11,6 +11,7 @@ import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; import { loadGroqChatModels } from './groq'; import { loadAnthropicChatModels } from './anthropic'; import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; +import { loadTransformersEmbeddingsModels } from './transformers'; export interface ChatModel { displayName: string; @@ -40,6 +41,7 @@ export const embeddingModelProviders: Record< openai: loadOpenAIEmbeddingModels, ollama: loadOllamaEmbeddingModels, gemini: loadGeminiEmbeddingModels, + transformers: loadTransformersEmbeddingsModels, }; export const getAvailableChatModelProviders = async () => { diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts new file mode 100644 index 0000000..a06dd12 --- /dev/null +++ b/src/lib/providers/transformers.ts @@ -0,0 +1,31 @@ +import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; + +export const loadTransformersEmbeddingsModels = async () => { + try { + const embeddingModels = { + 'xenova-bge-small-en-v1.5': { + displayName: 'BGE Small', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/bge-small-en-v1.5', + }), + }, + 'xenova-gte-small': { + displayName: 'GTE Small', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/gte-small', + }), + }, + 'xenova-bert-base-multilingual-uncased': { + displayName: 'Bert Multilingual', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/bert-base-multilingual-uncased', + }), + }, + }; + + return embeddingModels; + } catch (err) { + console.error(`Error loading Transformers embeddings model: ${err}`); + return {}; + } +}; diff --git a/yarn.lock b/yarn.lock index da8c916..a405105 100644 --- a/yarn.lock +++ b/yarn.lock @@ -384,6 +384,11 @@ "@react-aria/interactions" "^3.21.3" "@tanstack/react-virtual" "^3.8.1" +"@huggingface/jinja@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" + integrity sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -757,6 +762,59 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@react-aria/focus@^3.17.1": version "3.18.4" resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" @@ -872,6 +930,11 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + "@types/node-fetch@^2.6.4": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" @@ -887,6 +950,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@>=13.7.0": + version "22.13.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4" + integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw== + dependencies: + undici-types "~6.20.0" + "@types/node@^18.11.18": version "18.19.30" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327" @@ -990,6 +1060,17 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@xenova/transformers@^2.17.2": + version "2.17.2" + resolved "https://registry.yarnpkg.com/@xenova/transformers/-/transformers-2.17.2.tgz#7448d73b90f67bced66f39fe2dd656adc891fde5" + integrity sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ== + dependencies: + "@huggingface/jinja" "^0.2.2" + onnxruntime-web "1.14.0" + sharp "^0.32.0" + optionalDependencies: + onnxruntime-node "1.14.0" + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -1240,11 +1321,49 @@ axobject-query@^3.2.1: dependencies: dequal "^2.0.3" +b4a@^1.6.4: + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.0.0, bare-events@^2.2.0: + version "2.5.4" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== + +bare-fs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.0.1.tgz#85844f34da819c76754d545323a8b23ed3617c76" + integrity sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg== + dependencies: + bare-events "^2.0.0" + bare-path "^3.0.0" + bare-stream "^2.0.0" + +bare-os@^3.0.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.0.tgz#1465dd7e1bebe0dec230097a23ad00f7db51f957" + integrity sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.0.0: + version "2.6.5" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== + dependencies: + streamx "^2.21.0" + base-64@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" @@ -1661,7 +1780,7 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-libc@^2.0.0, detect-libc@^2.0.3: +detect-libc@^2.0.0, detect-libc@^2.0.2, detect-libc@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== @@ -2224,6 +2343,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -2298,6 +2422,11 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +flatbuffers@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-1.12.0.tgz#72e87d1726cb1b216e839ef02658aa87dcef68aa" + integrity sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ== + flatted@^3.2.9: version "3.3.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" @@ -2532,6 +2661,11 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +guid-typescript@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" + integrity sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ== + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -3112,6 +3246,11 @@ logform@^2.7.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3331,6 +3470,11 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + node-domexception@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" @@ -3458,6 +3602,37 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" +onnx-proto@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/onnx-proto/-/onnx-proto-4.0.4.tgz#2431a25bee25148e915906dda0687aafe3b9e044" + integrity sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA== + dependencies: + protobufjs "^6.8.8" + +onnxruntime-common@~1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz#2bb5dac5261269779aa5fb6536ca379657de8bf6" + integrity sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew== + +onnxruntime-node@1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz#c4ae6c355cfae7d83abaf36dd39a905c4a010217" + integrity sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w== + dependencies: + onnxruntime-common "~1.14.0" + +onnxruntime-web@1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz#c8cee538781b1d4c1c6b043934f4a3e6ddf1466e" + integrity sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw== + dependencies: + flatbuffers "^1.12.0" + guid-typescript "^1.0.9" + long "^4.0.0" + onnx-proto "^4.0.4" + onnxruntime-common "~1.14.0" + platform "^1.3.6" + openai@^4.26.0, openai@^4.32.1: version "4.33.0" resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" @@ -3625,6 +3800,11 @@ pirates@^4.0.1: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== +platform@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -3737,6 +3917,25 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +protobufjs@^6.8.8: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -3989,6 +4188,20 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +sharp@^0.32.0: + version "0.32.6" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== + dependencies: + color "^4.2.3" + detect-libc "^2.0.2" + node-addon-api "^6.1.0" + prebuild-install "^7.1.1" + semver "^7.5.4" + simple-get "^4.0.1" + tar-fs "^3.0.4" + tunnel-agent "^0.6.0" + sharp@^0.33.5: version "0.33.5" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" @@ -4055,7 +4268,7 @@ simple-concat@^1.0.0: resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== -simple-get@^4.0.0: +simple-get@^4.0.0, simple-get@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== @@ -4119,6 +4332,16 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +streamx@^2.15.0, streamx@^2.21.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== + dependencies: + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -4322,6 +4545,17 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" +tar-fs@^3.0.4: + version "3.0.8" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7" + integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -4333,6 +4567,22 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" @@ -4482,6 +4732,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" From f628b6e41634d21c2435ef3df893797b8d0aaa40 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:48:44 +0530 Subject: [PATCH 173/282] feat(groq): remove deprecated model --- src/lib/providers/groq.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 6377690..beeba02 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -48,10 +48,6 @@ const groqChatModels: Record<string, string>[] = [ displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', key: 'deepseek-r1-distill-qwen-32b', }, - { - displayName: 'DeepSeek R1 Distill Llama 70B SpecDec (Preview)', - key: 'deepseek-r1-distill-llama-70b-specdec', - }, { displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', key: 'deepseek-r1-distill-llama-70b', From 274e6ca88cff878ccf208aea25ff6f731cc7cc06 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:49:00 +0530 Subject: [PATCH 174/282] feat(sidebar): remove unused state --- src/components/Sidebar.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 81db8ba..5829c60 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -16,8 +16,6 @@ const VerticalIconContainer = ({ children }: { children: ReactNode }) => { const Sidebar = ({ children }: { children: React.ReactNode }) => { const segments = useSelectedLayoutSegments(); - const [isSettingsOpen, setIsSettingsOpen] = useState(false); - const navLinks = [ { icon: Home, From 048de2cb7420c0f87b868a162ffa7cbdaf5dd42f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:29:31 +0530 Subject: [PATCH 175/282] feat(docs): update docs --- CONTRIBUTING.md | 45 ++++++++++++++++++++++++++++----------------- README.md | 8 ++++---- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b16eccf..7bbb280 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,32 +1,43 @@ # How to Contribute to Perplexica -Hey there, thanks for deciding to contribute to Perplexica. Anything you help with will support the development of Perplexica and will make it better. Let's walk you through the key aspects to ensure your contributions are effective and in harmony with the project's setup. +Thanks for your interest in contributing to Perplexica! Your help makes this project better. This guide explains how to contribute effectively. + +Perplexica is a modern AI chat application with advanced search capabilities. ## Project Structure -Perplexica's design consists of two main domains: +Perplexica's codebase is organized as follows: -- **Frontend (`ui` directory)**: This is a Next.js application holding all user interface components. It's a self-contained environment that manages everything the user interacts with. -- **Backend (root and `src` directory)**: The backend logic is situated in the `src` folder, but the root directory holds the main `package.json` for backend dependency management. - - All of the focus modes are created using the Meta Search Agent class present in `src/search/metaSearchAgent.ts`. The main logic behind Perplexica lies there. +- **UI Components and Pages**: + - **Components (`src/components`)**: Reusable UI components. + - **Pages and Routes (`src/app`)**: Next.js app directory structure with page components. + - Main app routes include: home (`/`), chat (`/c`), discover (`/discover`), library (`/library`), and settings (`/settings`). + - **API Routes (`src/app/api`)**: API endpoints implemented with Next.js API routes. + - `/api/chat`: Handles chat interactions. + - `/api/search`: Provides direct access to Perplexica's search capabilities. + - Other endpoints for models, files, and suggestions. +- **Backend Logic (`src/lib`)**: Contains all the backend functionality including search, database, and API logic. + - The search functionality is present inside `src/lib/search` directory. + - All of the focus modes are implemented using the Meta Search Agent class in `src/lib/search/metaSearchAgent.ts`. + - Database functionality is in `src/lib/db`. + - Chat model and embedding model providers are managed in `src/lib/providers`. + - Prompt templates and LLM chain definitions are in `src/lib/prompts` and `src/lib/chains` respectively. + +## API Documentation + +Perplexica exposes several API endpoints for programmatic access, including: + +- **Search API**: Access Perplexica's advanced search capabilities directly via the `/api/search` endpoint. For detailed documentation, see `docs/api/search.md`. ## Setting Up Your Environment Before diving into coding, setting up your local environment is key. Here's what you need to do: -### Backend - 1. In the root directory, locate the `sample.config.toml` file. -2. Rename it to `config.toml` and fill in the necessary configuration fields specific to the backend. -3. Run `npm install` to install dependencies. -4. Run `npm run db:push` to set up the local sqlite. -5. Use `npm run dev` to start the backend in development mode. - -### Frontend - -1. Navigate to the `ui` folder and repeat the process of renaming `.env.example` to `.env`, making sure to provide the frontend-specific variables. -2. Execute `npm install` within the `ui` directory to get the frontend dependencies ready. -3. Launch the frontend development server with `npm run dev`. +2. Rename it to `config.toml` and fill in the necessary configuration fields. +3. Run `npm install` to install all dependencies. +4. Run `npm run db:push` to set up the local sqlite database. +5. Use `npm run dev` to start the application in development mode. **Please note**: Docker configurations are present for setting up production environments, whereas `npm run dev` is used for development purposes. diff --git a/README.md b/README.md index 291ea19..fecb3e8 100644 --- a/README.md +++ b/README.md @@ -109,10 +109,10 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. 1. Install SearXNG and allow `JSON` format in the SearXNG settings. 2. Clone the repository and rename the `sample.config.toml` file to `config.toml` in the root directory. Ensure you complete all required fields in this file. -3. Rename the `.env.example` file to `.env` in the `ui` folder and fill in all necessary fields. -4. After populating the configuration and environment files, run `npm i` in both the `ui` folder and the root directory. -5. Install the dependencies and then execute `npm run build` in both the `ui` folder and the root directory. -6. Finally, start both the frontend and the backend by running `npm run start` in both the `ui` folder and the root directory. +3. Rename the `sample.config.toml` file to `config.toml`. +4. After populating the configuration run `npm i`. +5. Install the dependencies and then execute `npm run build`. +6. Finally, start the app by running `npm rum start` **Note**: Using Docker is recommended as it simplifies the setup process, especially for managing environment variables and dependencies. From 33b895b75eb349856f66528ef05817ff4cb472a5 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:29:52 +0530 Subject: [PATCH 176/282] feat(app): add search API --- docs/API/SEARCH.md | 12 +-- src/app/api/chat/route.ts | 58 +------------ src/app/api/search/route.ts | 164 ++++++++++++++++++++++++++++++++++++ src/lib/search/index.ts | 59 +++++++++++++ 4 files changed, 230 insertions(+), 63 deletions(-) create mode 100644 src/app/api/search/route.ts create mode 100644 src/lib/search/index.ts diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 9405bc5..0169976 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -20,11 +20,11 @@ The API accepts a JSON object in the request body, where you define the focus mo { "chatModel": { "provider": "openai", - "model": "gpt-4o-mini" + "name": "gpt-4o-mini" }, "embeddingModel": { "provider": "openai", - "model": "text-embedding-3-large" + "name": "text-embedding-3-large" }, "optimizationMode": "speed", "focusMode": "webSearch", @@ -38,18 +38,18 @@ The API accepts a JSON object in the request body, where you define the focus mo ### Request Parameters -- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3001/api/models`. Make sure to use the key value (For example "gpt-4o-mini" instead of the display name "GPT 4 omni mini"). +- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3000/api/models`. Make sure to use the key value (For example "gpt-4o-mini" instead of the display name "GPT 4 omni mini"). - `provider`: Specifies the provider for the chat model (e.g., `openai`, `ollama`). - - `model`: The specific model from the chosen provider (e.g., `gpt-4o-mini`). + - `name`: The specific model from the chosen provider (e.g., `gpt-4o-mini`). - Optional fields for custom OpenAI configuration: - `customOpenAIBaseURL`: If you’re using a custom OpenAI instance, provide the base URL. - `customOpenAIKey`: The API key for a custom OpenAI instance. -- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3001/api/models`. Make sure to use the key value (For example "text-embedding-3-large" instead of the display name "Text Embedding 3 Large"). +- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3000/api/models`. Make sure to use the key value (For example "text-embedding-3-large" instead of the display name "Text Embedding 3 Large"). - `provider`: The provider for the embedding model (e.g., `openai`). - - `model`: The specific embedding model (e.g., `text-embedding-3-large`). + - `name`: The specific embedding model (e.g., `text-embedding-3-large`). - **`focusMode`** (string, required): Specifies which focus mode to use. Available modes: diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index 918fd48..d9f9c6b 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -20,67 +20,11 @@ import { getCustomOpenaiApiUrl, getCustomOpenaiModelName, } from '@/lib/config'; +import { searchHandlers } from '@/lib/search'; export const runtime = 'nodejs'; export const dynamic = 'force-dynamic'; -const searchHandlers: Record<string, MetaSearchAgent> = { - webSearch: new MetaSearchAgent({ - activeEngines: [], - queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, - responsePrompt: prompts.webSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: true, - }), - academicSearch: new MetaSearchAgent({ - activeEngines: ['arxiv', 'google scholar', 'pubmed'], - queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, - responsePrompt: prompts.academicSearchResponsePrompt, - rerank: true, - rerankThreshold: 0, - searchWeb: true, - summarizer: false, - }), - writingAssistant: new MetaSearchAgent({ - activeEngines: [], - queryGeneratorPrompt: '', - responsePrompt: prompts.writingAssistantPrompt, - rerank: true, - rerankThreshold: 0, - searchWeb: false, - summarizer: false, - }), - wolframAlphaSearch: new MetaSearchAgent({ - activeEngines: ['wolframalpha'], - queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, - responsePrompt: prompts.wolframAlphaSearchResponsePrompt, - rerank: false, - rerankThreshold: 0, - searchWeb: true, - summarizer: false, - }), - youtubeSearch: new MetaSearchAgent({ - activeEngines: ['youtube'], - queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, - responsePrompt: prompts.youtubeSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: false, - }), - redditSearch: new MetaSearchAgent({ - activeEngines: ['reddit'], - queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, - responsePrompt: prompts.redditSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: false, - }), -}; - type Message = { messageId: string; chatId: string; diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts new file mode 100644 index 0000000..a2c1bd0 --- /dev/null +++ b/src/app/api/search/route.ts @@ -0,0 +1,164 @@ +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import type { Embeddings } from '@langchain/core/embeddings'; +import { ChatOpenAI } from '@langchain/openai'; +import { + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '@/lib/providers'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; +import { MetaSearchAgentType } from '@/lib/search/metaSearchAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; +import { searchHandlers } from '@/lib/search'; + +interface chatModel { + provider: string; + name: string; + customOpenAIKey?: string; + customOpenAIBaseURL?: string; +} + +interface embeddingModel { + provider: string; + name: string; +} + +interface ChatRequestBody { + optimizationMode: 'speed' | 'balanced'; + focusMode: string; + chatModel?: chatModel; + embeddingModel?: embeddingModel; + query: string; + history: Array<[string, string]>; +} + +export const POST = async (req: Request) => { + try { + const body: ChatRequestBody = await req.json(); + + if (!body.focusMode || !body.query) { + return Response.json( + { message: 'Missing focus mode or query' }, + { status: 400 }, + ); + } + + body.history = body.history || []; + body.optimizationMode = body.optimizationMode || 'balanced'; + + const history: BaseMessage[] = body.history.map((msg) => { + return msg[0] === 'human' + ? new HumanMessage({ content: msg[1] }) + : new AIMessage({ content: msg[1] }); + }); + + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); + + const chatModelProvider = + body.chatModel?.provider || Object.keys(chatModelProviders)[0]; + const chatModel = + body.chatModel?.name || + Object.keys(chatModelProviders[chatModelProvider])[0]; + + const embeddingModelProvider = + body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0]; + const embeddingModel = + body.embeddingModel?.name || + Object.keys(embeddingModelProviders[embeddingModelProvider])[0]; + + let llm: BaseChatModel | undefined; + let embeddings: Embeddings | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + modelName: body.chatModel?.name || getCustomOpenaiModelName(), + openAIApiKey: + body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), + temperature: 0.7, + configuration: { + baseURL: + body.chatModel?.customOpenAIBaseURL || getCustomOpenaiApiUrl(), + }, + }) as unknown as BaseChatModel; + } else if ( + chatModelProviders[chatModelProvider] && + chatModelProviders[chatModelProvider][chatModel] + ) { + llm = chatModelProviders[chatModelProvider][chatModel] + .model as unknown as BaseChatModel | undefined; + } + + if ( + embeddingModelProviders[embeddingModelProvider] && + embeddingModelProviders[embeddingModelProvider][embeddingModel] + ) { + embeddings = embeddingModelProviders[embeddingModelProvider][ + embeddingModel + ].model as Embeddings | undefined; + } + + if (!llm || !embeddings) { + return Response.json( + { message: 'Invalid model selected' }, + { status: 400 }, + ); + } + + const searchHandler: MetaSearchAgentType = searchHandlers[body.focusMode]; + + if (!searchHandler) { + return Response.json({ message: 'Invalid focus mode' }, { status: 400 }); + } + + const emitter = await searchHandler.searchAndAnswer( + body.query, + history, + llm, + embeddings, + body.optimizationMode, + [], + ); + + return new Promise((resolve, reject) => { + let message = ''; + let sources: any[] = []; + + emitter.on('data', (data) => { + try { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + message += parsedData.data; + } else if (parsedData.type === 'sources') { + sources = parsedData.data; + } + } catch (error) { + reject( + Response.json({ message: 'Error parsing data' }, { status: 500 }), + ); + } + }); + + emitter.on('end', () => { + resolve(Response.json({ message, sources }, { status: 200 })); + }); + + emitter.on('error', (error) => { + reject( + Response.json({ message: 'Search error', error }, { status: 500 }), + ); + }); + }); + } catch (err: any) { + console.error(`Error in getting search results: ${err.message}`); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; diff --git a/src/lib/search/index.ts b/src/lib/search/index.ts new file mode 100644 index 0000000..01fb87f --- /dev/null +++ b/src/lib/search/index.ts @@ -0,0 +1,59 @@ +import MetaSearchAgent from '@/lib/search/metaSearchAgent'; +import prompts from '../prompts'; + +export const searchHandlers: Record<string, MetaSearchAgent> = { + webSearch: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, + responsePrompt: prompts.webSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: true, + }), + academicSearch: new MetaSearchAgent({ + activeEngines: ['arxiv', 'google scholar', 'pubmed'], + queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, + responsePrompt: prompts.academicSearchResponsePrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + writingAssistant: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: '', + responsePrompt: prompts.writingAssistantPrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: false, + summarizer: false, + }), + wolframAlphaSearch: new MetaSearchAgent({ + activeEngines: ['wolframalpha'], + queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, + responsePrompt: prompts.wolframAlphaSearchResponsePrompt, + rerank: false, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + youtubeSearch: new MetaSearchAgent({ + activeEngines: ['youtube'], + queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, + responsePrompt: prompts.youtubeSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), + redditSearch: new MetaSearchAgent({ + activeEngines: ['reddit'], + queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, + responsePrompt: prompts.redditSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), +}; From 97804e7b4df7031c0dfdf48429e375c6a371ca1f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:30:06 +0530 Subject: [PATCH 177/282] feat(config): remove unused vars --- sample.config.toml | 1 - src/lib/config.ts | 3 --- 2 files changed, 4 deletions(-) diff --git a/sample.config.toml b/sample.config.toml index 0a800a0..691b964 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -1,5 +1,4 @@ [GENERAL] -PORT = 3001 # Port to run the server on SIMILARITY_MEASURE = "cosine" # "cosine" or "dot" KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead of using -1 use "-1m") diff --git a/src/lib/config.ts b/src/lib/config.ts index 9a20ce5..dac1ca5 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -6,7 +6,6 @@ const configFileName = 'config.toml'; interface Config { GENERAL: { - PORT: number; SIMILARITY_MEASURE: string; KEEP_ALIVE: string; }; @@ -46,8 +45,6 @@ const loadConfig = () => fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), ) as any as Config; -export const getPort = () => loadConfig().GENERAL.PORT; - export const getSimilarityMeasure = () => loadConfig().GENERAL.SIMILARITY_MEASURE; From 8b552010f9eabdd2f4ca326f094a7d77c92e8a40 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:33:15 +0530 Subject: [PATCH 178/282] feat(docs): update docs --- README.md | 9 ++- docs/installation/NETWORKING.md | 109 -------------------------------- docs/installation/UPDATING.md | 9 +-- 3 files changed, 7 insertions(+), 120 deletions(-) delete mode 100644 docs/installation/NETWORKING.md diff --git a/README.md b/README.md index fecb3e8..6540c73 100644 --- a/README.md +++ b/README.md @@ -109,14 +109,13 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. 1. Install SearXNG and allow `JSON` format in the SearXNG settings. 2. Clone the repository and rename the `sample.config.toml` file to `config.toml` in the root directory. Ensure you complete all required fields in this file. -3. Rename the `sample.config.toml` file to `config.toml`. -4. After populating the configuration run `npm i`. -5. Install the dependencies and then execute `npm run build`. -6. Finally, start the app by running `npm rum start` +3. After populating the configuration run `npm i`. +4. Install the dependencies and then execute `npm run build`. +5. Finally, start the app by running `npm rum start` **Note**: Using Docker is recommended as it simplifies the setup process, especially for managing environment variables and dependencies. -See the [installation documentation](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/installation) for more information like exposing it your network, etc. +See the [installation documentation](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/installation) for more information like updating, etc. ### Ollama Connection Errors diff --git a/docs/installation/NETWORKING.md b/docs/installation/NETWORKING.md deleted file mode 100644 index ae39e3f..0000000 --- a/docs/installation/NETWORKING.md +++ /dev/null @@ -1,109 +0,0 @@ -# Expose Perplexica to a network - -This guide will show you how to make Perplexica available over a network. Follow these steps to allow computers on the same network to interact with Perplexica. Choose the instructions that match the operating system you are using. - -## Windows - -1. Open PowerShell as Administrator - -2. Navigate to the directory containing the `docker-compose.yaml` file - -3. Stop and remove the existing Perplexica containers and images: - - ```bash - docker compose down --rmi all - ``` - -4. Open the `docker-compose.yaml` file in a text editor like Notepad++ - -5. Replace `127.0.0.1` with the IP address of the server Perplexica is running on in these two lines: - - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` - -6. Save and close the `docker-compose.yaml` file - -7. Rebuild and restart the Perplexica container: - - ```bash - docker compose up -d --build - ``` - -## macOS - -1. Open the Terminal application - -2. Navigate to the directory with the `docker-compose.yaml` file: - - ```bash - cd /path/to/docker-compose.yaml - ``` - -3. Stop and remove existing containers and images: - - ```bash - docker compose down --rmi all - ``` - -4. Open `docker-compose.yaml` in a text editor like Sublime Text: - - ```bash - nano docker-compose.yaml - ``` - -5. Replace `127.0.0.1` with the server IP in these lines: - - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` - -6. Save and exit the editor - -7. Rebuild and restart Perplexica: - - ```bash - docker compose up -d --build - ``` - -## Linux - -1. Open the terminal - -2. Navigate to the `docker-compose.yaml` directory: - - ```bash - cd /path/to/docker-compose.yaml - ``` - -3. Stop and remove containers and images: - - ```bash - docker compose down --rmi all - ``` - -4. Edit `docker-compose.yaml`: - - ```bash - nano docker-compose.yaml - ``` - -5. Replace `127.0.0.1` with the server IP: - - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` - -6. Save and exit the editor - -7. Rebuild and restart Perplexica: - - ```bash - docker compose up -d --build - ``` diff --git a/docs/installation/UPDATING.md b/docs/installation/UPDATING.md index a4651df..972142f 100644 --- a/docs/installation/UPDATING.md +++ b/docs/installation/UPDATING.md @@ -39,11 +39,8 @@ To update Perplexica to the latest version, follow these steps: 2. Navigate to the project directory. 3. Check for changes in the configuration files. If the `sample.config.toml` file contains new fields, delete your existing `config.toml` file, rename `sample.config.toml` to `config.toml`, and update the configuration accordingly. - -4. Execute `npm i` in both the `ui` folder and the root directory. - -5. Once the packages are updated, execute `npm run build` in both the `ui` folder and the root directory. - -6. Finally, start both the frontend and the backend by running `npm run start` in both the `ui` folder and the root directory. +4. After populating the configuration run `npm i`. +5. Install the dependencies and then execute `npm run build`. +6. Finally, start the app by running `npm rum start` --- From 5c016127cb1567fe8bfa294c1568961b8e46bfd1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:41:07 +0530 Subject: [PATCH 179/282] feat(package): bump version --- docs/API/SEARCH.md | 4 ++-- docs/architecture/WORKING.md | 2 +- package.json | 2 +- src/lib/config.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 0169976..3007901 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -6,9 +6,9 @@ Perplexica’s Search API makes it easy to use our AI-powered search engine. You ## Endpoint -### **POST** `http://localhost:3001/api/search` +### **POST** `http://localhost:3000/api/search` -**Note**: Replace `3001` with any other port if you've changed the default PORT +**Note**: Replace `3000` with any other port if you've changed the default PORT ### Request diff --git a/docs/architecture/WORKING.md b/docs/architecture/WORKING.md index 75b20fd..6bad4f9 100644 --- a/docs/architecture/WORKING.md +++ b/docs/architecture/WORKING.md @@ -4,7 +4,7 @@ Curious about how Perplexica works? Don't worry, we'll cover it here. Before we We'll understand how Perplexica works by taking an example of a scenario where a user asks: "How does an A.C. work?". We'll break down the process into steps to make it easier to understand. The steps are as follows: -1. The message is sent via WS to the backend server where it invokes the chain. The chain will depend on your focus mode. For this example, let's assume we use the "webSearch" focus mode. +1. The message is sent to the `/api/chat` route where it invokes the chain. The chain will depend on your focus mode. For this example, let's assume we use the "webSearch" focus mode. 2. The chain is now invoked; first, the message is passed to another chain where it first predicts (using the chat history and the question) whether there is a need for sources and searching the web. If there is, it will generate a query (in accordance with the chat history) for searching the web that we'll take up later. If not, the chain will end there, and then the answer generator chain, also known as the response generator, will be started. 3. The query returned by the first chain is passed to SearXNG to search the web for information. 4. After the information is retrieved, it is based on keyword-based search. We then convert the information into embeddings and the query as well, then we perform a similarity search to find the most relevant sources to answer the query. diff --git a/package.json b/package.json index 904e0b2..e2cf944 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.0-rc3", + "version": "1.10.0", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/src/lib/config.ts b/src/lib/config.ts index dac1ca5..ef99eed 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -59,7 +59,7 @@ export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; export const getSearxngApiEndpoint = () => - loadConfig().API_ENDPOINTS.SEARXNG || process.env.SEARXNG_API_URL; + process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; From 62e6c24840106bfbe982f894da53707bc569ab2b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:47:54 +0530 Subject: [PATCH 180/282] feat(app): fix build errors --- app.dockerfile | 2 +- src/app/api/search/route.ts | 55 ++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/app.dockerfile b/app.dockerfile index 2571305..57a270e 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -3,7 +3,7 @@ FROM node:20.18.0-alpine AS builder WORKDIR /home/perplexica COPY package.json yarn.lock ./ -RUN yarn install --frozen-lockfile +RUN yarn install --frozen-lockfile --network-timeout 600000 COPY tsconfig.json next.config.mjs next-env.d.ts postcss.config.js drizzle.config.ts tailwind.config.ts ./ COPY src ./src diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index a2c1bd0..b980623 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -125,35 +125,40 @@ export const POST = async (req: Request) => { [], ); - return new Promise((resolve, reject) => { - let message = ''; - let sources: any[] = []; + return new Promise( + ( + resolve: (value: Response) => void, + reject: (value: Response) => void, + ) => { + let message = ''; + let sources: any[] = []; - emitter.on('data', (data) => { - try { - const parsedData = JSON.parse(data); - if (parsedData.type === 'response') { - message += parsedData.data; - } else if (parsedData.type === 'sources') { - sources = parsedData.data; + emitter.on('data', (data) => { + try { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + message += parsedData.data; + } else if (parsedData.type === 'sources') { + sources = parsedData.data; + } + } catch (error) { + reject( + Response.json({ message: 'Error parsing data' }, { status: 500 }), + ); } - } catch (error) { + }); + + emitter.on('end', () => { + resolve(Response.json({ message, sources }, { status: 200 })); + }); + + emitter.on('error', (error) => { reject( - Response.json({ message: 'Error parsing data' }, { status: 500 }), + Response.json({ message: 'Search error', error }, { status: 500 }), ); - } - }); - - emitter.on('end', () => { - resolve(Response.json({ message, sources }, { status: 200 })); - }); - - emitter.on('error', (error) => { - reject( - Response.json({ message: 'Search error', error }, { status: 500 }), - ); - }); - }); + }); + }, + ); } catch (err: any) { console.error(`Error in getting search results: ${err.message}`); return Response.json( From dddd944a18842cba33a1047b778a01d7870dabf1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:22:43 +0530 Subject: [PATCH 181/282] feat(workflow): update docker build --- .github/workflows/docker-build.yaml | 105 +++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 18 deletions(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index 0620afb..c5a4331 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -8,15 +8,12 @@ on: types: [published] jobs: - build-and-push: + build-amd64: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 with: @@ -33,28 +30,100 @@ jobs: id: version run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - name: Build and push Docker image + - name: Build and push AMD64 Docker image if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | - docker buildx create --use - DOCKERFILE=app.dockerfile; \ - IMAGE_NAME=perplexica; \ - docker buildx build --platform linux/amd64,linux/arm64 \ - --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:main \ + DOCKERFILE=app.dockerfile + IMAGE_NAME=perplexica + docker buildx build --platform linux/amd64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:amd64 \ --cache-to=type=inline \ -f $DOCKERFILE \ - -t itzcrazykns1337/${IMAGE_NAME}:main \ + -t itzcrazykns1337/${IMAGE_NAME}:amd64 \ --push . - - name: Build and push release Docker image + - name: Build and push AMD64 release Docker image if: github.event_name == 'release' run: | - docker buildx create --use - DOCKERFILE=app.dockerfile; \ - IMAGE_NAME=perplexica; \ - docker buildx build --platform linux/amd64,linux/arm64 \ - --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ + DOCKERFILE=app.dockerfile + IMAGE_NAME=perplexica + docker buildx build --platform linux/amd64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ --cache-to=type=inline \ -f $DOCKERFILE \ - -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ + -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ --push . + + build-arm64: + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + install: true + + - name: Log in to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract version from release tag + if: github.event_name == 'release' + id: version + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + - name: Build and push ARM64 Docker image + if: github.ref == 'refs/heads/master' && github.event_name == 'push' + run: | + DOCKERFILE=app.dockerfile + IMAGE_NAME=perplexica + docker buildx build --platform linux/arm64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:arm64 \ + --cache-to=type=inline \ + -f $DOCKERFILE \ + -t itzcrazykns1337/${IMAGE_NAME}:arm64 \ + --push . + + - name: Build and push ARM64 release Docker image + if: github.event_name == 'release' + run: | + DOCKERFILE=app.dockerfile + IMAGE_NAME=perplexica + docker buildx build --platform linux/arm64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \ + --cache-to=type=inline \ + -f $DOCKERFILE \ + -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \ + --push . + + manifest: + needs: [build-amd64, build-arm64] + runs-on: ubuntu-latest + steps: + - name: Log in to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Create and push multi-arch manifest for main + if: github.ref == 'refs/heads/master' && github.event_name == 'push' + run: | + IMAGE_NAME=perplexica + docker manifest create itzcrazykns1337/${IMAGE_NAME}:main \ + --amend itzcrazykns1337/${IMAGE_NAME}:amd64 \ + --amend itzcrazykns1337/${IMAGE_NAME}:arm64 + docker manifest push itzcrazykns1337/${IMAGE_NAME}:main + + - name: Create and push multi-arch manifest for releases + if: github.event_name == 'release' + run: | + IMAGE_NAME=perplexica + docker manifest create itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ + --amend itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ + --amend itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 + docker manifest push itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} From 74f7eaed6e7c87864307fd1e3c2f944b3f288e49 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:43:29 +0530 Subject: [PATCH 182/282] feat(workflow): fix build errors --- .github/workflows/docker-build.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index c5a4331..ea956ea 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -38,6 +38,7 @@ jobs: docker buildx build --platform linux/amd64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:amd64 \ --cache-to=type=inline \ + --provenance false \ -f $DOCKERFILE \ -t itzcrazykns1337/${IMAGE_NAME}:amd64 \ --push . @@ -50,6 +51,7 @@ jobs: docker buildx build --platform linux/amd64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ --cache-to=type=inline \ + --provenance false \ -f $DOCKERFILE \ -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ --push . @@ -84,6 +86,7 @@ jobs: docker buildx build --platform linux/arm64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:arm64 \ --cache-to=type=inline \ + --provenance false \ -f $DOCKERFILE \ -t itzcrazykns1337/${IMAGE_NAME}:arm64 \ --push . @@ -96,6 +99,7 @@ jobs: docker buildx build --platform linux/arm64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \ --cache-to=type=inline \ + --provenance false \ -f $DOCKERFILE \ -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \ --push . From 06db95d7c0530c5650d9e50ba7023191b9f1d2e9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:25:28 +0530 Subject: [PATCH 183/282] feat(dockerfile): fix onnx issues --- app.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.dockerfile b/app.dockerfile index 57a270e..3433288 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.18.0-alpine AS builder +FROM node:20.18.0-slim AS builder WORKDIR /home/perplexica @@ -12,7 +12,7 @@ COPY public ./public RUN mkdir -p /home/perplexica/data RUN yarn build -FROM node:20.18.0-alpine +FROM node:20.18.0-slim WORKDIR /home/perplexica From 45df9dc5bfe52ef06cf9918e234c5f47eb4d39b1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:27:12 +0530 Subject: [PATCH 184/282] feat(readme): update networking guide --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6540c73..e01f109 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ For more details, check out the full documentation [here](https://github.com/Itz ## Expose Perplexica to network -You can access Perplexica over your home network by following our networking guide [here](https://github.com/ItzCrazyKns/Perplexica/blob/master/docs/installation/NETWORKING.md). +Perplexica runs on Next.js and handles all API requests. It works right away on the same network and stays accessible even with port forwarding. ## One-Click Deployment From defc67793235ea79660922e99bd9e3fd022ddeab Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 25 Mar 2025 22:01:24 +0530 Subject: [PATCH 185/282] feat(providers): update gemini & anthropic provider --- package.json | 2 ++ src/lib/providers/anthropic.ts | 9 ++---- src/lib/providers/gemini.ts | 19 +++++------- yarn.lock | 53 ++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index e2cf944..8ab1823 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,10 @@ "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/anthropic": "^0.3.15", "@langchain/community": "^0.3.36", "@langchain/core": "^0.3.42", + "@langchain/google-genai": "^0.1.12", "@langchain/openai": "^0.0.25", "@langchain/textsplitters": "^0.1.0", "@tailwindcss/typography": "^0.5.12", diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index e44d70d..7ecde4b 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -1,4 +1,4 @@ -import { ChatOpenAI } from '@langchain/openai'; +import { ChatAnthropic } from '@langchain/anthropic'; import { ChatModel } from '.'; import { getAnthropicApiKey } from '../config'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; @@ -45,13 +45,10 @@ export const loadAnthropicChatModels = async () => { anthropicChatModels.forEach((model) => { chatModels[model.key] = { displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: anthropicApiKey, + model: new ChatAnthropic({ + apiKey: anthropicApiKey, modelName: model.key, temperature: 0.7, - configuration: { - baseURL: 'https://api.anthropic.com/v1/', - }, }) as unknown as BaseChatModel, }; }); diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 6806fb6..f355d08 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -1,4 +1,7 @@ -import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { + ChatGoogleGenerativeAI, + GoogleGenerativeAIEmbeddings, +} from '@langchain/google-genai'; import { getGeminiApiKey } from '../config'; import { ChatModel, EmbeddingModel } from '.'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; @@ -49,13 +52,10 @@ export const loadGeminiChatModels = async () => { geminiChatModels.forEach((model) => { chatModels[model.key] = { displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: geminiApiKey, + model: new ChatGoogleGenerativeAI({ + apiKey: geminiApiKey, modelName: model.key, temperature: 0.7, - configuration: { - baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', - }, }) as unknown as BaseChatModel, }; }); @@ -78,12 +78,9 @@ export const loadGeminiEmbeddingModels = async () => { geminiEmbeddingModels.forEach((model) => { embeddingModels[model.key] = { displayName: model.displayName, - model: new OpenAIEmbeddings({ - openAIApiKey: geminiApiKey, + model: new GoogleGenerativeAIEmbeddings({ + apiKey: geminiApiKey, modelName: model.key, - configuration: { - baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', - }, }) as unknown as Embeddings, }; }); diff --git a/yarn.lock b/yarn.lock index a405105..921186b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,19 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== +"@anthropic-ai/sdk@^0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.37.0.tgz#0018127404ecb9b8a12968068e0c4b3e8bbd6386" + integrity sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + "@anthropic-ai/sdk@^0.9.1": version "0.9.1" resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" @@ -374,6 +387,11 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== +"@google/generative-ai@^0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.24.0.tgz#4d27af7d944c924a27a593c17ad1336535d53846" + integrity sha512-fnEITCGEB7NdX0BhoYZ/cq/7WPZ1QS5IzJJfC3Tg/OwkvBetMiVJciyaan297OvE4B9Jg1xvo0zIazX/9sGu1Q== + "@headlessui/react@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.2.0.tgz#a8e32f0899862849a1ce1615fa280e7891431ab7" @@ -575,6 +593,16 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@langchain/anthropic@^0.3.15": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.3.15.tgz#0244cdb345cb492eb40aedd681881ebadfbb73f2" + integrity sha512-Ar2viYcZ64idgV7EtCBCb36tIkNtPAhQRxSaMTWPHGspFgMfvwRoleVri9e90sCpjpS9xhlHsIQ0LlUS/Atsrw== + dependencies: + "@anthropic-ai/sdk" "^0.37.0" + fast-xml-parser "^4.4.1" + zod "^3.22.4" + zod-to-json-schema "^3.22.4" + "@langchain/community@^0.3.36": version "0.3.36" resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" @@ -640,6 +668,14 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/google-genai@^0.1.12": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.1.12.tgz#6727253bda6f0d87cd74cf0bb6b1e0f398f60f32" + integrity sha512-0Ea0E2g63ejCuormVxbuoyJQ5BYN53i2/fb6WP8bMKzyh+y43R13V8JqOtr3e/GmgNyv3ou/VeaZjx7KAvu/0g== + dependencies: + "@google/generative-ai" "^0.24.0" + zod-to-json-schema "^3.22.4" + "@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": version "0.4.5" resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" @@ -2369,6 +2405,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@^4.4.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz#c54d6b35aa0f23dc1ea60b6c884340c006dc6efb" + integrity sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig== + dependencies: + strnum "^1.1.1" + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -4458,6 +4501,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strnum@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4" + integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== + styled-jsx@5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" @@ -4955,6 +5003,11 @@ zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5: resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== +zod-to-json-schema@^3.22.4: + version "3.24.5" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" + integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== + zod@^3.22.3, zod@^3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" From 27286465a36633f9f70012c8e2fb1fe617fe890c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 26 Mar 2025 13:34:09 +0530 Subject: [PATCH 186/282] feat(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ab1823..52ba392 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.0", + "version": "1.10.1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From d3b2f8983dc12ec908f787438e922835dc23c696 Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Wed, 26 Mar 2025 11:28:05 +0100 Subject: [PATCH 187/282] feat(api): add streaming support to search route --- src/app/api/search/route.ts | 122 +++++++++++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 17 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index b980623..e136d54 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -33,6 +33,7 @@ interface ChatRequestBody { embeddingModel?: embeddingModel; query: string; history: Array<[string, string]>; + stream?: boolean; } export const POST = async (req: Request) => { @@ -48,6 +49,7 @@ export const POST = async (req: Request) => { body.history = body.history || []; body.optimizationMode = body.optimizationMode || 'balanced'; + body.stream = body.stream || false; const history: BaseMessage[] = body.history.map((msg) => { return msg[0] === 'human' @@ -125,40 +127,126 @@ export const POST = async (req: Request) => { [], ); - return new Promise( - ( - resolve: (value: Response) => void, - reject: (value: Response) => void, - ) => { - let message = ''; + if (!body.stream) { + return new Promise( + ( + resolve: (value: Response) => void, + reject: (value: Response) => void, + ) => { + let message = ''; + let sources: any[] = []; + + emitter.on('data', (data: string) => { + try { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + message += parsedData.data; + } else if (parsedData.type === 'sources') { + sources = parsedData.data; + } + } catch (error) { + reject( + Response.json({ message: 'Error parsing data' }, { status: 500 }), + ); + } + }); + + emitter.on('end', () => { + resolve(Response.json({ message, sources }, { status: 200 })); + }); + + emitter.on('error', (error: any) => { + reject( + Response.json({ message: 'Search error', error }, { status: 500 }), + ); + }); + }, + ); + } + + const encoder = new TextEncoder(); + + // Create an AbortController to handle cancellation + const abortController = new AbortController(); + const { signal } = abortController; + + const stream = new ReadableStream({ + start(controller) { let sources: any[] = []; - emitter.on('data', (data) => { + // Send an initial message to keep the connection alive + controller.enqueue(encoder.encode("data: " + JSON.stringify({ + type: 'init', + data: 'Stream connected' + }) + "\n\n")); + + // Set up cleanup function for when client disconnects + signal.addEventListener('abort', () => { + // Remove all listeners from emitter to prevent memory leaks + emitter.removeAllListeners(); + + // Close the controller if it's still active + try { + controller.close(); + } catch (error) { + // Controller might already be closed + } + }); + + emitter.on('data', (data: string) => { + // Check if request has been cancelled before processing + if (signal.aborted) return; + try { const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { - message += parsedData.data; + controller.enqueue(encoder.encode("data: " + JSON.stringify({ + type: 'response', + data: parsedData.data + }) + "\n\n")); } else if (parsedData.type === 'sources') { sources = parsedData.data; + controller.enqueue(encoder.encode("data: " + JSON.stringify({ + type: 'sources', + data: sources + }) + "\n\n")); } } catch (error) { - reject( - Response.json({ message: 'Error parsing data' }, { status: 500 }), - ); + controller.error(error); } }); emitter.on('end', () => { - resolve(Response.json({ message, sources }, { status: 200 })); + // Check if request has been cancelled before processing + if (signal.aborted) return; + + controller.enqueue(encoder.encode("data: " + JSON.stringify({ + type: 'done' + }) + "\n\n")); + controller.close(); }); - emitter.on('error', (error) => { - reject( - Response.json({ message: 'Search error', error }, { status: 500 }), - ); + emitter.on('error', (error: any) => { + // Check if request has been cancelled before processing + if (signal.aborted) return; + + controller.error(error); }); }, - ); + + cancel() { + abortController.abort(); + } + }); + + return new Response(stream, { + headers: { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache, no-transform', + 'Connection': 'keep-alive', + }, + }); } catch (err: any) { console.error(`Error in getting search results: ${err.message}`); return Response.json( From 191d1dc25f0936d9e9c5233b07bc59525caa32d7 Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Wed, 26 Mar 2025 11:32:46 +0100 Subject: [PATCH 188/282] refactor(api): clean up comments and improve abort handling in search route --- src/app/api/search/route.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index e136d54..24990ad 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -166,7 +166,6 @@ export const POST = async (req: Request) => { const encoder = new TextEncoder(); - // Create an AbortController to handle cancellation const abortController = new AbortController(); const { signal } = abortController; @@ -174,27 +173,21 @@ export const POST = async (req: Request) => { start(controller) { let sources: any[] = []; - // Send an initial message to keep the connection alive controller.enqueue(encoder.encode("data: " + JSON.stringify({ type: 'init', data: 'Stream connected' }) + "\n\n")); - // Set up cleanup function for when client disconnects signal.addEventListener('abort', () => { - // Remove all listeners from emitter to prevent memory leaks emitter.removeAllListeners(); - // Close the controller if it's still active try { controller.close(); } catch (error) { - // Controller might already be closed } }); emitter.on('data', (data: string) => { - // Check if request has been cancelled before processing if (signal.aborted) return; try { @@ -218,7 +211,6 @@ export const POST = async (req: Request) => { }); emitter.on('end', () => { - // Check if request has been cancelled before processing if (signal.aborted) return; controller.enqueue(encoder.encode("data: " + JSON.stringify({ @@ -228,7 +220,6 @@ export const POST = async (req: Request) => { }); emitter.on('error', (error: any) => { - // Check if request has been cancelled before processing if (signal.aborted) return; controller.error(error); From 310c8a75fd7fbf0a3867f2985ee4e61cefc2997f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:36:58 +0530 Subject: [PATCH 189/282] feat(routes): fix typo, closes #692 --- src/app/api/chat/route.ts | 4 ++-- src/app/api/config/route.ts | 8 ++++---- src/app/api/discover/route.ts | 2 +- src/app/api/images/route.ts | 4 ++-- src/app/api/models/route.ts | 2 +- src/app/api/suggestions/route.ts | 4 ++-- src/app/api/videos/route.ts | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index d9f9c6b..d48fbb6 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -295,9 +295,9 @@ export const POST = async (req: Request) => { }, }); } catch (err) { - console.error('An error ocurred while processing chat request:', err); + console.error('An error occurred while processing chat request:', err); return Response.json( - { message: 'An error ocurred while processing chat request' }, + { message: 'An error occurred while processing chat request' }, { status: 500 }, ); } diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index 46c71f5..871bb21 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -59,9 +59,9 @@ export const GET = async (req: Request) => { return Response.json({ ...config }, { status: 200 }); } catch (err) { - console.error('An error ocurred while getting config:', err); + console.error('An error occurred while getting config:', err); return Response.json( - { message: 'An error ocurred while getting config' }, + { message: 'An error occurred while getting config' }, { status: 500 }, ); } @@ -100,9 +100,9 @@ export const POST = async (req: Request) => { return Response.json({ message: 'Config updated' }, { status: 200 }); } catch (err) { - console.error('An error ocurred while updating config:', err); + console.error('An error occurred while updating config:', err); return Response.json( - { message: 'An error ocurred while updating config' }, + { message: 'An error occurred while updating config' }, { status: 500 }, ); } diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index 0c95498..8c1f470 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -48,7 +48,7 @@ export const GET = async (req: Request) => { }, ); } catch (err) { - console.error(`An error ocurred in discover route: ${err}`); + console.error(`An error occurred in discover route: ${err}`); return Response.json( { message: 'An error has occurred', diff --git a/src/app/api/images/route.ts b/src/app/api/images/route.ts index f0a6773..db39d9f 100644 --- a/src/app/api/images/route.ts +++ b/src/app/api/images/route.ts @@ -74,9 +74,9 @@ export const POST = async (req: Request) => { return Response.json({ images }, { status: 200 }); } catch (err) { - console.error(`An error ocurred while searching images: ${err}`); + console.error(`An error occurred while searching images: ${err}`); return Response.json( - { message: 'An error ocurred while searching images' }, + { message: 'An error occurred while searching images' }, { status: 500 }, ); } diff --git a/src/app/api/models/route.ts b/src/app/api/models/route.ts index a5e5b43..04a6949 100644 --- a/src/app/api/models/route.ts +++ b/src/app/api/models/route.ts @@ -34,7 +34,7 @@ export const GET = async (req: Request) => { }, ); } catch (err) { - console.error('An error ocurred while fetching models', err); + console.error('An error occurred while fetching models', err); return Response.json( { message: 'An error has occurred.', diff --git a/src/app/api/suggestions/route.ts b/src/app/api/suggestions/route.ts index 4a931df..e92e5ec 100644 --- a/src/app/api/suggestions/route.ts +++ b/src/app/api/suggestions/route.ts @@ -72,9 +72,9 @@ export const POST = async (req: Request) => { return Response.json({ suggestions }, { status: 200 }); } catch (err) { - console.error(`An error ocurred while generating suggestions: ${err}`); + console.error(`An error occurred while generating suggestions: ${err}`); return Response.json( - { message: 'An error ocurred while generating suggestions' }, + { message: 'An error occurred while generating suggestions' }, { status: 500 }, ); } diff --git a/src/app/api/videos/route.ts b/src/app/api/videos/route.ts index 6153490..34ae7fd 100644 --- a/src/app/api/videos/route.ts +++ b/src/app/api/videos/route.ts @@ -74,9 +74,9 @@ export const POST = async (req: Request) => { return Response.json({ videos }, { status: 200 }); } catch (err) { - console.error(`An error ocurred while searching videos: ${err}`); + console.error(`An error occurred while searching videos: ${err}`); return Response.json( - { message: 'An error ocurred while searching videos' }, + { message: 'An error occurred while searching videos' }, { status: 500 }, ); } From 5d60ab113942c307e20bb105ca18063dc0784b99 Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Thu, 27 Mar 2025 13:04:09 +0100 Subject: [PATCH 190/282] feat(api): Switch to newline-delimited JSON streaming instead of SSE --- docs/API/SEARCH.md | 29 +++++++++++++++++++++++++++-- src/app/api/search/route.ts | 28 ++++++++++++++++++---------- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 3007901..3a28a78 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -32,7 +32,8 @@ The API accepts a JSON object in the request body, where you define the focus mo "history": [ ["human", "Hi, how are you?"], ["assistant", "I am doing well, how can I help you today?"] - ] + ], + "stream": false } ``` @@ -71,11 +72,13 @@ The API accepts a JSON object in the request body, where you define the focus mo ] ``` +- **`stream`** (boolean, optional): When set to `true`, enables streaming responses. Default is `false`. + ### Response The response from the API includes both the final message and the sources used to generate that message. -#### Example Response +#### Standard Response (stream: false) ```json { @@ -100,6 +103,28 @@ The response from the API includes both the final message and the sources used t } ``` +#### Streaming Response (stream: true) + +When streaming is enabled, the API returns a stream of newline-delimited JSON objects. Each line contains a complete, valid JSON object. The response has Content-Type: application/json. + +Example of streamed response objects: + +``` +{"type":"init","data":"Stream connected"} +{"type":"sources","data":[{"pageContent":"...","metadata":{"title":"...","url":"..."}},...]} +{"type":"response","data":"Perplexica is an "} +{"type":"response","data":"innovative, open-source "} +{"type":"response","data":"AI-powered search engine..."} +{"type":"done"} +``` + +Clients should process each line as a separate JSON object. The different message types include: + +- **`init`**: Initial connection message +- **`sources`**: All sources used for the response +- **`response`**: Chunks of the generated answer text +- **`done`**: Indicates the stream is complete + ### Fields in the Response - **`message`** (string): The search result, generated based on the query and focus mode. diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 24990ad..b2be3f9 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -166,6 +166,7 @@ export const POST = async (req: Request) => { const encoder = new TextEncoder(); + // Create an AbortController to handle cancellation const abortController = new AbortController(); const { signal } = abortController; @@ -173,37 +174,43 @@ export const POST = async (req: Request) => { start(controller) { let sources: any[] = []; - controller.enqueue(encoder.encode("data: " + JSON.stringify({ + // Send an initial message to keep the connection alive + controller.enqueue(encoder.encode(JSON.stringify({ type: 'init', data: 'Stream connected' - }) + "\n\n")); + }) + '\n')); + // Set up cleanup function for when client disconnects signal.addEventListener('abort', () => { + // Remove all listeners from emitter to prevent memory leaks emitter.removeAllListeners(); + // Close the controller if it's still active try { controller.close(); } catch (error) { + // Controller might already be closed } }); emitter.on('data', (data: string) => { + // Check if request has been cancelled before processing if (signal.aborted) return; try { const parsedData = JSON.parse(data); if (parsedData.type === 'response') { - controller.enqueue(encoder.encode("data: " + JSON.stringify({ + controller.enqueue(encoder.encode(JSON.stringify({ type: 'response', data: parsedData.data - }) + "\n\n")); + }) + '\n')); } else if (parsedData.type === 'sources') { sources = parsedData.data; - controller.enqueue(encoder.encode("data: " + JSON.stringify({ + controller.enqueue(encoder.encode(JSON.stringify({ type: 'sources', data: sources - }) + "\n\n")); + }) + '\n')); } } catch (error) { controller.error(error); @@ -211,21 +218,22 @@ export const POST = async (req: Request) => { }); emitter.on('end', () => { + // Check if request has been cancelled before processing if (signal.aborted) return; - controller.enqueue(encoder.encode("data: " + JSON.stringify({ + controller.enqueue(encoder.encode(JSON.stringify({ type: 'done' - }) + "\n\n")); + }) + '\n')); controller.close(); }); emitter.on('error', (error: any) => { + // Check if request has been cancelled before processing if (signal.aborted) return; controller.error(error); }); }, - cancel() { abortController.abort(); } @@ -233,7 +241,7 @@ export const POST = async (req: Request) => { return new Response(stream, { headers: { - 'Content-Type': 'text/event-stream', + 'Content-Type': 'application/json', 'Cache-Control': 'no-cache, no-transform', 'Connection': 'keep-alive', }, From b285cb432335f9c17233713c3379724cc6f642f9 Mon Sep 17 00:00:00 2001 From: ottsch <397865+ottsch@users.noreply.github.com> Date: Fri, 28 Mar 2025 17:07:11 +0100 Subject: [PATCH 191/282] Update Gemini chat models --- src/lib/providers/gemini.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index f355d08..b0fa887 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -8,6 +8,10 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; const geminiChatModels: Record<string, string>[] = [ + { + displayName: 'Gemini 2.5 Pro Experimental', + key: 'gemini-2.5-pro-exp-03-25', + }, { displayName: 'Gemini 2.0 Flash', key: 'gemini-2.0-flash', @@ -17,8 +21,8 @@ const geminiChatModels: Record<string, string>[] = [ key: 'gemini-2.0-flash-lite', }, { - displayName: 'Gemini 2.0 Pro Experimental', - key: 'gemini-2.0-pro-exp-02-05', + displayName: 'Gemini 2.0 Flash Thinking Experimental', + key: 'gemini-2.0-flash-thinking-exp-01-21', }, { displayName: 'Gemini 1.5 Flash', From 90e303f737e9c9efe494fd141f951ed2b94d1b7d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 30 Mar 2025 21:12:04 +0530 Subject: [PATCH 192/282] feat(search): lint & beautify, update content type --- src/app/api/search/route.ts | 88 +++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index b2be3f9..d3e98ca 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -146,7 +146,10 @@ export const POST = async (req: Request) => { } } catch (error) { reject( - Response.json({ message: 'Error parsing data' }, { status: 500 }), + Response.json( + { message: 'Error parsing data' }, + { status: 500 }, + ), ); } }); @@ -157,7 +160,10 @@ export const POST = async (req: Request) => { emitter.on('error', (error: any) => { reject( - Response.json({ message: 'Search error', error }, { status: 500 }), + Response.json( + { message: 'Search error', error }, + { status: 500 }, + ), ); }); }, @@ -165,52 +171,56 @@ export const POST = async (req: Request) => { } const encoder = new TextEncoder(); - - // Create an AbortController to handle cancellation + const abortController = new AbortController(); const { signal } = abortController; - + const stream = new ReadableStream({ start(controller) { let sources: any[] = []; - // Send an initial message to keep the connection alive - controller.enqueue(encoder.encode(JSON.stringify({ - type: 'init', - data: 'Stream connected' - }) + '\n')); + controller.enqueue( + encoder.encode( + JSON.stringify({ + type: 'init', + data: 'Stream connected', + }) + '\n', + ), + ); - // Set up cleanup function for when client disconnects signal.addEventListener('abort', () => { - // Remove all listeners from emitter to prevent memory leaks emitter.removeAllListeners(); - - // Close the controller if it's still active + try { controller.close(); - } catch (error) { - // Controller might already be closed - } + } catch (error) {} }); emitter.on('data', (data: string) => { - // Check if request has been cancelled before processing if (signal.aborted) return; - + try { const parsedData = JSON.parse(data); - + if (parsedData.type === 'response') { - controller.enqueue(encoder.encode(JSON.stringify({ - type: 'response', - data: parsedData.data - }) + '\n')); + controller.enqueue( + encoder.encode( + JSON.stringify({ + type: 'response', + data: parsedData.data, + }) + '\n', + ), + ); } else if (parsedData.type === 'sources') { sources = parsedData.data; - controller.enqueue(encoder.encode(JSON.stringify({ - type: 'sources', - data: sources - }) + '\n')); + controller.enqueue( + encoder.encode( + JSON.stringify({ + type: 'sources', + data: sources, + }) + '\n', + ), + ); } } catch (error) { controller.error(error); @@ -218,32 +228,34 @@ export const POST = async (req: Request) => { }); emitter.on('end', () => { - // Check if request has been cancelled before processing if (signal.aborted) return; - - controller.enqueue(encoder.encode(JSON.stringify({ - type: 'done' - }) + '\n')); + + controller.enqueue( + encoder.encode( + JSON.stringify({ + type: 'done', + }) + '\n', + ), + ); controller.close(); }); emitter.on('error', (error: any) => { - // Check if request has been cancelled before processing if (signal.aborted) return; - + controller.error(error); }); }, cancel() { abortController.abort(); - } + }, }); return new Response(stream, { headers: { - 'Content-Type': 'application/json', + 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache, no-transform', - 'Connection': 'keep-alive', + Connection: 'keep-alive', }, }); } catch (err: any) { From 4b2a7916fde21c8d83e056f614fa995044b96f3d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 30 Mar 2025 22:51:59 +0530 Subject: [PATCH 193/282] feat(docker-build): fix image tag errors --- .github/workflows/docker-build.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index ea956ea..29f7987 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -114,6 +114,11 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + - name: Extract version from release tag + if: github.event_name == 'release' + id: version + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + - name: Create and push multi-arch manifest for main if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | From 5b1055e8c9656dd988c52368df7e27e64de39fde Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:49:36 +0530 Subject: [PATCH 194/282] feat(routes): add system instructions --- src/app/api/chat/route.ts | 2 ++ src/app/api/search/route.ts | 1 + src/lib/prompts/academicSearch.ts | 4 ++++ src/lib/prompts/redditSearch.ts | 4 ++++ src/lib/prompts/webSearch.ts | 4 ++++ src/lib/prompts/wolframAlpha.ts | 4 ++++ src/lib/prompts/writingAssistant.ts | 4 ++++ src/lib/prompts/youtubeSearch.ts | 4 ++++ src/lib/search/metaSearchAgent.ts | 5 +++++ 9 files changed, 32 insertions(+) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index d48fbb6..e566edb 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -49,6 +49,7 @@ type Body = { files: Array<string>; chatModel: ChatModel; embeddingModel: EmbeddingModel; + systemInstructions: string; }; const handleEmitterEvents = async ( @@ -278,6 +279,7 @@ export const POST = async (req: Request) => { embedding, body.optimizationMode, body.files, + body.systemInstructions, ); const responseStream = new TransformStream(); diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index d3e98ca..59d84ff 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -125,6 +125,7 @@ export const POST = async (req: Request) => { embeddings, body.optimizationMode, [], + "", ); if (!body.stream) { diff --git a/src/lib/prompts/academicSearch.ts b/src/lib/prompts/academicSearch.ts index c2946ff..d015910 100644 --- a/src/lib/prompts/academicSearch.ts +++ b/src/lib/prompts/academicSearch.ts @@ -51,6 +51,10 @@ export const academicSearchResponsePrompt = ` - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/prompts/redditSearch.ts b/src/lib/prompts/redditSearch.ts index fc71957..577fa82 100644 --- a/src/lib/prompts/redditSearch.ts +++ b/src/lib/prompts/redditSearch.ts @@ -51,6 +51,10 @@ export const redditSearchResponsePrompt = ` - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/prompts/webSearch.ts b/src/lib/prompts/webSearch.ts index d8269c8..c1b458b 100644 --- a/src/lib/prompts/webSearch.ts +++ b/src/lib/prompts/webSearch.ts @@ -92,6 +92,10 @@ export const webSearchResponsePrompt = ` - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/prompts/wolframAlpha.ts b/src/lib/prompts/wolframAlpha.ts index 40410c1..63145dd 100644 --- a/src/lib/prompts/wolframAlpha.ts +++ b/src/lib/prompts/wolframAlpha.ts @@ -51,6 +51,10 @@ export const wolframAlphaSearchResponsePrompt = ` - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/prompts/writingAssistant.ts b/src/lib/prompts/writingAssistant.ts index f56bf47..565827a 100644 --- a/src/lib/prompts/writingAssistant.ts +++ b/src/lib/prompts/writingAssistant.ts @@ -7,6 +7,10 @@ You have to cite the answer using [number] notation. You must cite the sentences Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. +### User instructions +These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. +{systemInstructions} + <context> {context} </context> diff --git a/src/lib/prompts/youtubeSearch.ts b/src/lib/prompts/youtubeSearch.ts index 5805b54..9898016 100644 --- a/src/lib/prompts/youtubeSearch.ts +++ b/src/lib/prompts/youtubeSearch.ts @@ -51,6 +51,10 @@ export const youtubeSearchResponsePrompt = ` - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcrip + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/search/metaSearchAgent.ts b/src/lib/search/metaSearchAgent.ts index 4a3d817..67b7c58 100644 --- a/src/lib/search/metaSearchAgent.ts +++ b/src/lib/search/metaSearchAgent.ts @@ -33,6 +33,7 @@ export interface MetaSearchAgentType { embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', fileIds: string[], + systemInstructions: string, ) => Promise<eventEmitter>; } @@ -236,9 +237,11 @@ class MetaSearchAgent implements MetaSearchAgentType { fileIds: string[], embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', + systemInstructions: string, ) { return RunnableSequence.from([ RunnableMap.from({ + systemInstructions: () => systemInstructions, query: (input: BasicChainInput) => input.query, chat_history: (input: BasicChainInput) => input.chat_history, date: () => new Date().toISOString(), @@ -468,6 +471,7 @@ class MetaSearchAgent implements MetaSearchAgentType { embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', fileIds: string[], + systemInstructions: string, ) { const emitter = new eventEmitter(); @@ -476,6 +480,7 @@ class MetaSearchAgent implements MetaSearchAgentType { fileIds, embeddings, optimizationMode, + systemInstructions, ); const stream = answeringChain.streamEvents( From 4b8e0ea1aa221b9b8018daf1b650e54c92adb2ce Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:50:05 +0530 Subject: [PATCH 195/282] feat(chat-window): handle system instructions --- src/components/ChatWindow.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 0c956e8..93c8a0c 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -480,6 +480,7 @@ const ChatWindow = ({ id }: { id?: string }) => { name: embeddingModelProvider.name, provider: embeddingModelProvider.provider, }, + systemInstructions: localStorage.getItem('systemInstructions'), }), }); From 7d52fbb368db416639fc3a70952207cc7f1bab1b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:50:24 +0530 Subject: [PATCH 196/282] feat(settings): add system instructions --- src/app/settings/page.tsx | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index efe54d5..8e1c45a 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -54,6 +54,38 @@ const Input = ({ className, isSaving, onSave, ...restProps }: InputProps) => { ); }; +interface TextareaProps extends React.InputHTMLAttributes<HTMLTextAreaElement> { + isSaving?: boolean; + onSave?: (value: string) => void; +} + +const Textarea = ({ + className, + isSaving, + onSave, + ...restProps +}: TextareaProps) => { + return ( + <div className="relative"> + <textarea + placeholder="Any special instructions for the LLM" + className="placeholder:text-sm text-sm w-full flex items-center justify-between p-3 bg-light-secondary dark:bg-dark-secondary rounded-lg hover:bg-light-200 dark:hover:bg-dark-200 transition-colors" + rows={4} + onBlur={(e) => onSave?.(e.target.value)} + {...restProps} + /> + {isSaving && ( + <div className="absolute right-3 top-3"> + <Loader2 + size={16} + className="animate-spin text-black/70 dark:text-white/70" + /> + </div> + )} + </div> + ); +}; + const Select = ({ className, options, @@ -111,6 +143,7 @@ const Page = () => { const [isLoading, setIsLoading] = useState(false); const [automaticImageSearch, setAutomaticImageSearch] = useState(false); const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); + const [systemInstructions, setSystemInstructions] = useState<string>(''); const [savingStates, setSavingStates] = useState<Record<string, boolean>>({}); useEffect(() => { @@ -172,6 +205,8 @@ const Page = () => { localStorage.getItem('autoVideoSearch') === 'true', ); + setSystemInstructions(localStorage.getItem('systemInstructions')!); + setIsLoading(false); }; @@ -328,6 +363,8 @@ const Page = () => { localStorage.setItem('embeddingModelProvider', value); } else if (key === 'embeddingModel') { localStorage.setItem('embeddingModel', value); + } else if (key === 'systemInstructions') { + localStorage.setItem('systemInstructions', value); } } catch (err) { console.error('Failed to save:', err); @@ -473,6 +510,19 @@ const Page = () => { </div> </SettingsSection> + <SettingsSection title="System Instructions"> + <div className="flex flex-col space-y-4"> + <Textarea + value={systemInstructions} + isSaving={savingStates['systemInstructions']} + onChange={(e) => { + setSystemInstructions(e.target.value); + }} + onSave={(value) => saveConfig('systemInstructions', value)} + /> + </div> + </SettingsSection> + <SettingsSection title="Model Settings"> {config.chatModelProviders && ( <div className="flex flex-col space-y-4"> From 09661ae11d485b8e66a8916bcd943d5c613b4543 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Apr 2025 13:02:28 +0530 Subject: [PATCH 197/282] feat(prompts): fix typo, closes #715 --- src/app/api/search/route.ts | 2 +- src/lib/prompts/webSearch.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 59d84ff..563cebe 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -125,7 +125,7 @@ export const POST = async (req: Request) => { embeddings, body.optimizationMode, [], - "", + '', ); if (!body.stream) { diff --git a/src/lib/prompts/webSearch.ts b/src/lib/prompts/webSearch.ts index c1b458b..1a431ea 100644 --- a/src/lib/prompts/webSearch.ts +++ b/src/lib/prompts/webSearch.ts @@ -1,6 +1,6 @@ export const webSearchRetrieverPrompt = ` You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. -If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). +If it is a simple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. From 2e4433a6b3b82cc1944483325589a4c221a2f30c Mon Sep 17 00:00:00 2001 From: singleparadox <glennmatthew_perez@hotmail.com> Date: Sat, 5 Apr 2025 15:24:45 +0000 Subject: [PATCH 198/282] feat(message-box): support [1,2,3,4] citation format instead of just [1][2][3] --- src/components/MessageBox.tsx | 46 ++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index 4473c3b..2b2144a 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -48,6 +48,7 @@ const MessageBox = ({ const [speechMessage, setSpeechMessage] = useState(message.content); useEffect(() => { + const citationRegex = /\[([^\]]+)\]/g; const regex = /\[(\d+)\]/g; let processedMessage = message.content; @@ -67,12 +68,45 @@ const MessageBox = ({ ) { setParsedMessage( processedMessage.replace( - regex, - (_, number) => - `<a href="${ - message.sources?.[number - 1]?.metadata?.url - }" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${number}</a>`, - ), + citationRegex, // Use the updated regex + (match, capturedContent) => { // match is the full "[1,2,3]", capturedContent is "1,2,3" + // Split the captured content by comma, trim whitespace, and filter out non-digits + const numbers = capturedContent + .split(',') + .map(numStr => numStr.trim()) + .filter(numStr => /^\d+$/.test(numStr)); // Ensure it's only digits + + // If no valid numbers found after split/filter (e.g., "[]" or "[abc]"), return original match + if (numbers.length === 0) { + return match; + } + + // Generate an HTML link for each valid number found + const linksHtml = numbers.map(numStr => { + const number = parseInt(numStr, 10); // Convert string to integer for array indexing + + // Basic validation: Ensure it's a positive number + if (isNaN(number) || number <= 0) { + // Return the original number part as text if invalid for lookup + return `[${numStr}]`; + } + + // Get the corresponding source, adjusting for 0-based index + const source = message.sources?.[number - 1]; + const url = source?.metadata?.url; + + // If URL exists, create the link + if (url) { + return `<a href="${url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${numStr}</a>`; + } else { + // If no URL found for this number, return the number styled similarly but red + return `<span className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 text-xs relative font-medium text-red-600 dark:text-red-400">${numStr}</span>`; + } + }).join(''); // Join the generated links (or fallback text) together without separators + + return linksHtml; + } + ) ); return; } From bf705afc216bb7e0193b1771c0f5527c969fad37 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 5 Apr 2025 22:32:56 +0530 Subject: [PATCH 199/282] feat(message-box): change styles, lint & beautify --- src/components/MessageBox.tsx | 51 ++++++++++++++--------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index 2b2144a..4617103 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -68,45 +68,34 @@ const MessageBox = ({ ) { setParsedMessage( processedMessage.replace( - citationRegex, // Use the updated regex - (match, capturedContent) => { // match is the full "[1,2,3]", capturedContent is "1,2,3" - // Split the captured content by comma, trim whitespace, and filter out non-digits + citationRegex, + (_, capturedContent: string) => { const numbers = capturedContent .split(',') - .map(numStr => numStr.trim()) - .filter(numStr => /^\d+$/.test(numStr)); // Ensure it's only digits + .map((numStr) => numStr.trim()) - // If no valid numbers found after split/filter (e.g., "[]" or "[abc]"), return original match - if (numbers.length === 0) { - return match; - } + const linksHtml = numbers + .map((numStr) => { + const number = parseInt(numStr); - // Generate an HTML link for each valid number found - const linksHtml = numbers.map(numStr => { - const number = parseInt(numStr, 10); // Convert string to integer for array indexing + if (isNaN(number) || number <= 0) { + return `[${numStr}]`; + } - // Basic validation: Ensure it's a positive number - if (isNaN(number) || number <= 0) { - // Return the original number part as text if invalid for lookup - return `[${numStr}]`; - } + const source = message.sources?.[number - 1]; + const url = source?.metadata?.url; - // Get the corresponding source, adjusting for 0-based index - const source = message.sources?.[number - 1]; - const url = source?.metadata?.url; - - // If URL exists, create the link - if (url) { - return `<a href="${url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${numStr}</a>`; - } else { - // If no URL found for this number, return the number styled similarly but red - return `<span className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 text-xs relative font-medium text-red-600 dark:text-red-400">${numStr}</span>`; - } - }).join(''); // Join the generated links (or fallback text) together without separators + if (url) { + return `<a href="${url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${numStr}</a>`; + } else { + return `[${numStr}]`; + } + }) + .join(''); return linksHtml; - } - ) + }, + ), ); return; } From 64e2d457cce794b6b34f2c6f53da1c496420434f Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Sat, 5 Apr 2025 19:06:18 +0100 Subject: [PATCH 200/282] feat(search): add optional systemInstructions to API request body --- docs/API/SEARCH.md | 3 +++ src/app/api/search/route.ts | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 3a28a78..b67b62b 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -33,6 +33,7 @@ The API accepts a JSON object in the request body, where you define the focus mo ["human", "Hi, how are you?"], ["assistant", "I am doing well, how can I help you today?"] ], + "systemInstructions": "Focus on providing technical details about Perplexica's architecture.", "stream": false } ``` @@ -63,6 +64,8 @@ The API accepts a JSON object in the request body, where you define the focus mo - **`query`** (string, required): The search query or question. +- **`systemInstructions`** (string, optional): Custom instructions provided by the user to guide the AI's response. These instructions are treated as user preferences and have lower priority than the system's core instructions. For example, you can specify a particular writing style, format, or focus area. + - **`history`** (array, optional): An array of message pairs representing the conversation history. Each pair consists of a role (either 'human' or 'assistant') and the message content. This allows the system to use the context of the conversation to refine results. Example: ```json diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 563cebe..970ec42 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -34,6 +34,7 @@ interface ChatRequestBody { query: string; history: Array<[string, string]>; stream?: boolean; + systemInstructions?: string; } export const POST = async (req: Request) => { @@ -125,7 +126,7 @@ export const POST = async (req: Request) => { embeddings, body.optimizationMode, [], - '', + body.systemInstructions || '', ); if (!body.stream) { From 588e68e93e3dbe77cba477eeef5a9d288a60f323 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 6 Apr 2025 13:37:43 +0530 Subject: [PATCH 201/282] feat(providers): add deepseek provider --- sample.config.toml | 3 +++ src/app/api/config/route.ts | 5 ++++ src/app/settings/page.tsx | 20 ++++++++++++++++ src/lib/config.ts | 5 ++++ src/lib/providers/deepseek.ts | 44 +++++++++++++++++++++++++++++++++++ src/lib/providers/index.ts | 2 ++ 6 files changed, 79 insertions(+) create mode 100644 src/lib/providers/deepseek.ts diff --git a/sample.config.toml b/sample.config.toml index 691b964..980e99d 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -22,5 +22,8 @@ MODEL_NAME = "" [MODELS.OLLAMA] API_URL = "" # Ollama API URL - http://host.docker.internal:11434 +[MODELS.DEEPSEEK] +API_KEY = "" + [API_ENDPOINTS] SEARXNG = "" # SearxNG API URL - http://localhost:32768 \ No newline at end of file diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index 871bb21..39c1f84 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -7,6 +7,7 @@ import { getGroqApiKey, getOllamaApiEndpoint, getOpenaiApiKey, + getDeepseekApiKey, updateConfig, } from '@/lib/config'; import { @@ -53,6 +54,7 @@ export const GET = async (req: Request) => { config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); config['geminiApiKey'] = getGeminiApiKey(); + config['deepseekApiKey'] = getDeepseekApiKey(); config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); config['customOpenaiModelName'] = getCustomOpenaiModelName(); @@ -88,6 +90,9 @@ export const POST = async (req: Request) => { OLLAMA: { API_URL: config.ollamaApiUrl, }, + DEEPSEEK: { + API_KEY: config.deepseekApiKey, + }, CUSTOM_OPENAI: { API_URL: config.customOpenaiApiUrl, API_KEY: config.customOpenaiApiKey, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 8e1c45a..8eee9a4 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -20,6 +20,7 @@ interface SettingsType { anthropicApiKey: string; geminiApiKey: string; ollamaApiUrl: string; + deepseekApiKey: string; customOpenaiApiKey: string; customOpenaiApiUrl: string; customOpenaiModelName: string; @@ -838,6 +839,25 @@ const Page = () => { onSave={(value) => saveConfig('geminiApiKey', value)} /> </div> + + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Deepseek API Key + </p> + <Input + type="text" + placeholder="Deepseek API Key" + value={config.deepseekApiKey} + isSaving={savingStates['deepseekApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + deepseekApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('deepseekApiKey', value)} + /> + </div> </div> </SettingsSection> </div> diff --git a/src/lib/config.ts b/src/lib/config.ts index ef99eed..2831214 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -25,6 +25,9 @@ interface Config { OLLAMA: { API_URL: string; }; + DEEPSEEK: { + API_KEY: string; + }; CUSTOM_OPENAI: { API_URL: string; API_KEY: string; @@ -63,6 +66,8 @@ export const getSearxngApiEndpoint = () => export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; +export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY; + export const getCustomOpenaiApiKey = () => loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts new file mode 100644 index 0000000..88f02ec --- /dev/null +++ b/src/lib/providers/deepseek.ts @@ -0,0 +1,44 @@ +import { ChatOpenAI } from '@langchain/openai'; +import { getDeepseekApiKey } from '../config'; +import { ChatModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const deepseekChatModels: Record<string, string>[] = [ + { + displayName: 'Deepseek Chat (Deepseek V3)', + key: 'deepseek-chat', + }, + { + displayName: 'Deepseek Reasoner (Deepseek R1)', + key: 'deepseek-reasoner', + }, +]; + +export const loadDeepseekChatModels = async () => { + const deepseekApiKey = getDeepseekApiKey(); + + if (!deepseekApiKey) return {}; + + try { + const chatModels: Record<string, ChatModel> = {}; + + deepseekChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: deepseekApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { + baseURL: 'https://api.deepseek.com', + }, + }) as unknown as BaseChatModel, + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Deepseek models: ${err}`); + return {}; + } +}; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index c32d0fa..eef212f 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -12,6 +12,7 @@ import { loadGroqChatModels } from './groq'; import { loadAnthropicChatModels } from './anthropic'; import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; import { loadTransformersEmbeddingsModels } from './transformers'; +import { loadDeepseekChatModels } from './deepseek'; export interface ChatModel { displayName: string; @@ -32,6 +33,7 @@ export const chatModelProviders: Record< groq: loadGroqChatModels, anthropic: loadAnthropicChatModels, gemini: loadGeminiChatModels, + deepseek: loadDeepseekChatModels, }; export const embeddingModelProviders: Record< From e226645bc7620db5a4f276d8f3a3c68e464b7abe Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 6 Apr 2025 13:48:58 +0530 Subject: [PATCH 202/282] feat(app): lint & beautify --- src/components/MessageBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index 4617103..b049185 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -72,7 +72,7 @@ const MessageBox = ({ (_, capturedContent: string) => { const numbers = capturedContent .split(',') - .map((numStr) => numStr.trim()) + .map((numStr) => numStr.trim()); const linksHtml = numbers .map((numStr) => { From 3ddcceda0a96c7d72ed947c791eaffbe671cc2c9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 10:26:29 +0530 Subject: [PATCH 203/282] feat(gemini-provider): update embedding models --- src/lib/providers/gemini.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index b0fa887..2a88015 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -40,8 +40,12 @@ const geminiChatModels: Record<string, string>[] = [ const geminiEmbeddingModels: Record<string, string>[] = [ { - displayName: 'Gemini Embedding', - key: 'gemini-embedding-exp', + displayName: 'Text Embedding 004', + key: 'models/text-embedding-004', + }, + { + displayName: 'Embedding 001', + key: 'models/embedding-001', }, ]; From a85f762c58d901e532b6f9fea24d785ccbc735cf Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 10:27:04 +0530 Subject: [PATCH 204/282] feat(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52ba392..e68410f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.1", + "version": "1.10.2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From 28b9cca413966040a7904d64e0c001606a823b96 Mon Sep 17 00:00:00 2001 From: ClawCloud-Ron <ron@claw.cloud> Date: Mon, 7 Apr 2025 16:49:59 +0800 Subject: [PATCH 205/282] docs: add ClawCloud Run button --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e01f109..18c9f84 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ Perplexica runs on Next.js and handles all API requests. It works right away on [![Deploy to Sealos](https://raw.githubusercontent.com/labring-actions/templates/main/Deploy-on-Sealos.svg)](https://usw.sealos.io/?openapp=system-template%3FtemplateName%3Dperplexica) [![Deploy to RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploylobe.svg)](https://repocloud.io/details/?app_id=267) +[![Run on ClawCloud](https://raw.githubusercontent.com/ClawCloud/Run-Template/refs/heads/main/Run-on-ClawCloud.svg)](https://template.run.claw.cloud/?referralCode=U11MRQ8U9RM4&openapp=system-fastdeploy%3FtemplateName%3Dperplexica) ## Upcoming Features From 245573efcaa1edb91366c91b0c0ad29c4b43cbcb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 23:23:18 +0530 Subject: [PATCH 206/282] feat(groq): update model list --- src/lib/providers/groq.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index beeba02..b2f8bc0 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -72,6 +72,14 @@ const groqChatModels: Record<string, string>[] = [ displayName: 'Llama 3.2 90B Vision Preview (Preview)', key: 'llama-3.2-90b-vision-preview', }, + { + displayName: 'Llama 4 Maverick 17B 128E Instruct (Preview)', + key: 'meta-llama/llama-4-maverick-17b-128e-instruct', + }, + { + displayName: 'Llama 4 Maverick 17B 16E Instruct (Preview)', + key: 'meta-llama/llama-4-scout-17b-16e-instruct', + }, ]; export const loadGroqChatModels = async () => { From 627775c430739bdd820f54cdf97ff905fb0f0d08 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 23:29:51 +0530 Subject: [PATCH 207/282] feat(groq): remove maverick (not being run yet) --- src/lib/providers/groq.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index b2f8bc0..bd55863 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -72,10 +72,10 @@ const groqChatModels: Record<string, string>[] = [ displayName: 'Llama 3.2 90B Vision Preview (Preview)', key: 'llama-3.2-90b-vision-preview', }, - { + /* { displayName: 'Llama 4 Maverick 17B 128E Instruct (Preview)', key: 'meta-llama/llama-4-maverick-17b-128e-instruct', - }, + }, */ { displayName: 'Llama 4 Maverick 17B 16E Instruct (Preview)', key: 'meta-llama/llama-4-scout-17b-16e-instruct', From da1123d84baa8ced8a9427f866b068b4652e7d9c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 23:30:51 +0530 Subject: [PATCH 208/282] feat(groq): update model name --- src/lib/providers/groq.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index bd55863..85c75f4 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -77,7 +77,7 @@ const groqChatModels: Record<string, string>[] = [ key: 'meta-llama/llama-4-maverick-17b-128e-instruct', }, */ { - displayName: 'Llama 4 Maverick 17B 16E Instruct (Preview)', + displayName: 'Llama 4 Scout 17B 16E Instruct (Preview)', key: 'meta-llama/llama-4-scout-17b-16e-instruct', }, ]; From 41b258e4d894972876205cdbcff9d2c05241c2b8 Mon Sep 17 00:00:00 2001 From: sjiampojamarn <18257803+sjiampojamarn@users.noreply.github.com> Date: Tue, 8 Apr 2025 22:16:27 -0700 Subject: [PATCH 209/282] Set speech message before return --- src/components/MessageBox.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index b049185..a7c46ec 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -97,6 +97,7 @@ const MessageBox = ({ }, ), ); + setSpeechMessage(message.content.replace(regex, '')); return; } From aa240009ab615311e62c31314ef8b9258179c01b Mon Sep 17 00:00:00 2001 From: haddadrm <121486289+haddadrm@users.noreply.github.com> Date: Tue, 1 Apr 2025 17:23:28 +0400 Subject: [PATCH 210/282] Feature: Add LM Studio provider integration - Added LM Studio provider to support OpenAI compatible API - Implemented chat and embeddings model loading - Updated config to include LM Studio API endpoint --- sample.config.toml | 5 +- src/lib/config.ts | 5 ++ src/lib/providers/index.ts | 3 + src/lib/providers/lmstudio.ts | 101 ++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/lib/providers/lmstudio.ts diff --git a/sample.config.toml b/sample.config.toml index 980e99d..1db2125 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -25,5 +25,8 @@ API_URL = "" # Ollama API URL - http://host.docker.internal:11434 [MODELS.DEEPSEEK] API_KEY = "" +[MODELS.LM_STUDIO] +API_URL = "" # LM Studio API URL - http://host.docker.internal:1234 + [API_ENDPOINTS] -SEARXNG = "" # SearxNG API URL - http://localhost:32768 \ No newline at end of file +SEARXNG = "" # SearxNG API URL - http://localhost:32768 diff --git a/src/lib/config.ts b/src/lib/config.ts index 2831214..7c6d495 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -28,6 +28,9 @@ interface Config { DEEPSEEK: { API_KEY: string; }; + LM_STUDIO: { + API_URL: string; + }; CUSTOM_OPENAI: { API_URL: string; API_KEY: string; @@ -77,6 +80,8 @@ export const getCustomOpenaiApiUrl = () => export const getCustomOpenaiModelName = () => loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; +export const getLMStudioApiEndpoint = () => loadConfig().MODELS.LM_STUDIO.API_URL; + const mergeConfigs = (current: any, update: any): any => { if (update === null || update === undefined) { return current; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index eef212f..0a4a6db 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -13,6 +13,7 @@ import { loadAnthropicChatModels } from './anthropic'; import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; import { loadTransformersEmbeddingsModels } from './transformers'; import { loadDeepseekChatModels } from './deepseek'; +import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels } from './lmstudio'; export interface ChatModel { displayName: string; @@ -34,6 +35,7 @@ export const chatModelProviders: Record< anthropic: loadAnthropicChatModels, gemini: loadGeminiChatModels, deepseek: loadDeepseekChatModels, + lmstudio: loadLMStudioChatModels, }; export const embeddingModelProviders: Record< @@ -44,6 +46,7 @@ export const embeddingModelProviders: Record< ollama: loadOllamaEmbeddingModels, gemini: loadGeminiEmbeddingModels, transformers: loadTransformersEmbeddingsModels, + lmstudio: loadLMStudioEmbeddingsModels, }; export const getAvailableChatModelProviders = async () => { diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts new file mode 100644 index 0000000..fd8eb75 --- /dev/null +++ b/src/lib/providers/lmstudio.ts @@ -0,0 +1,101 @@ +import { getKeepAlive, getLMStudioApiEndpoint } from '../config'; +import axios from 'axios'; +import { ChatModel, EmbeddingModel } from '.'; +import { ChatOpenAI } from '@langchain/openai'; +import { OpenAIEmbeddings } from '@langchain/openai'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { Embeddings } from '@langchain/core/embeddings'; + +interface LMStudioModel { + id: string; + name?: string; +} + +const ensureV1Endpoint = (endpoint: string): string => + endpoint.endsWith('/v1') ? endpoint : `${endpoint}/v1`; + +const checkServerAvailability = async (endpoint: string): Promise<boolean> => { + try { + const keepAlive = getKeepAlive(); + await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { + timeout: parseInt(keepAlive) * 1000 || 5000, + headers: { 'Content-Type': 'application/json' }, + }); + return true; + } catch { + return false; + } +}; + +export const loadLMStudioChatModels = async () => { + const endpoint = getLMStudioApiEndpoint(); + const keepAlive = getKeepAlive(); + + if (!endpoint) return {}; + if (!await checkServerAvailability(endpoint)) return {}; + + try { + const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { + timeout: parseInt(keepAlive) * 1000 || 5000, + headers: { 'Content-Type': 'application/json' }, + }); + + const chatModels: Record<string, ChatModel> = {}; + + response.data.data.forEach((model: LMStudioModel) => { + chatModels[model.id] = { + displayName: model.name || model.id, + model: new ChatOpenAI({ + openAIApiKey: 'lm-studio', + configuration: { + baseURL: ensureV1Endpoint(endpoint), + }, + modelName: model.id, + temperature: 0.7, + streaming: true, + maxRetries: 3 + }) as unknown as BaseChatModel, + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading LM Studio models: ${err}`); + return {}; + } +}; + +export const loadLMStudioEmbeddingsModels = async () => { + const endpoint = getLMStudioApiEndpoint(); + const keepAlive = getKeepAlive(); + + if (!endpoint) return {}; + if (!await checkServerAvailability(endpoint)) return {}; + + try { + const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { + timeout: parseInt(keepAlive) * 1000 || 5000, + headers: { 'Content-Type': 'application/json' }, + }); + + const embeddingsModels: Record<string, EmbeddingModel> = {}; + + response.data.data.forEach((model: LMStudioModel) => { + embeddingsModels[model.id] = { + displayName: model.name || model.id, + model: new OpenAIEmbeddings({ + openAIApiKey: 'lm-studio', + configuration: { + baseURL: ensureV1Endpoint(endpoint), + }, + modelName: model.id, + }) as unknown as Embeddings, + }; + }); + + return embeddingsModels; + } catch (err) { + console.error(`Error loading LM Studio embeddings model: ${err}`); + return {}; + } +}; From 7e1dc33a081c563991d2fc084b7b7e3dd143e04e Mon Sep 17 00:00:00 2001 From: haddadrm <121486289+haddadrm@users.noreply.github.com> Date: Tue, 1 Apr 2025 19:26:15 +0400 Subject: [PATCH 211/282] Implement provider formatting improvements and fix client-side compatibility - Add PROVIDER_INFO metadata to each provider file with proper display names - Create centralized PROVIDER_METADATA in index.ts for consistent reference - Update settings UI to use provider metadata for display names - Fix client/server compatibility for Node.js modules in config.ts --- src/app/settings/page.tsx | 11 ++++----- src/lib/config.ts | 41 ++++++++++++++++++++++--------- src/lib/providers/anthropic.ts | 5 ++++ src/lib/providers/deepseek.ts | 5 ++++ src/lib/providers/gemini.ts | 5 ++++ src/lib/providers/groq.ts | 5 ++++ src/lib/providers/index.ts | 31 +++++++++++++++++------ src/lib/providers/lmstudio.ts | 5 ++++ src/lib/providers/ollama.ts | 5 ++++ src/lib/providers/openai.ts | 5 ++++ src/lib/providers/transformers.ts | 5 ++++ 11 files changed, 97 insertions(+), 26 deletions(-) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 8eee9a4..919304b 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -7,6 +7,7 @@ import { Switch } from '@headlessui/react'; import ThemeSwitcher from '@/components/theme/Switcher'; import { ImagesIcon, VideoIcon } from 'lucide-react'; import Link from 'next/link'; +import { PROVIDER_METADATA } from '@/lib/providers'; interface SettingsType { chatModelProviders: { @@ -547,9 +548,8 @@ const Page = () => { options={Object.keys(config.chatModelProviders).map( (provider) => ({ value: provider, - label: - provider.charAt(0).toUpperCase() + - provider.slice(1), + label: (PROVIDER_METADATA as any)[provider]?.displayName || + provider.charAt(0).toUpperCase() + provider.slice(1), }), )} /> @@ -689,9 +689,8 @@ const Page = () => { options={Object.keys(config.embeddingModelProviders).map( (provider) => ({ value: provider, - label: - provider.charAt(0).toUpperCase() + - provider.slice(1), + label: (PROVIDER_METADATA as any)[provider]?.displayName || + provider.charAt(0).toUpperCase() + provider.slice(1), }), )} /> diff --git a/src/lib/config.ts b/src/lib/config.ts index 7c6d495..e3f2680 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -1,7 +1,14 @@ -import fs from 'fs'; -import path from 'path'; import toml from '@iarna/toml'; +// Use dynamic imports for Node.js modules to prevent client-side errors +let fs: any; +let path: any; +if (typeof window === 'undefined') { + // We're on the server + fs = require('fs'); + path = require('path'); +} + const configFileName = 'config.toml'; interface Config { @@ -46,10 +53,17 @@ type RecursivePartial<T> = { [P in keyof T]?: RecursivePartial<T[P]>; }; -const loadConfig = () => - toml.parse( - fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), - ) as any as Config; +const loadConfig = () => { + // Server-side only + if (typeof window === 'undefined') { + return toml.parse( + fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), + ) as any as Config; + } + + // Client-side fallback - settings will be loaded via API + return {} as Config; +}; export const getSimilarityMeasure = () => loadConfig().GENERAL.SIMILARITY_MEASURE; @@ -114,10 +128,13 @@ const mergeConfigs = (current: any, update: any): any => { }; export const updateConfig = (config: RecursivePartial<Config>) => { - const currentConfig = loadConfig(); - const mergedConfig = mergeConfigs(currentConfig, config); - fs.writeFileSync( - path.join(path.join(process.cwd(), `${configFileName}`)), - toml.stringify(mergedConfig), - ); + // Server-side only + if (typeof window === 'undefined') { + const currentConfig = loadConfig(); + const mergedConfig = mergeConfigs(currentConfig, config); + fs.writeFileSync( + path.join(path.join(process.cwd(), `${configFileName}`)), + toml.stringify(mergedConfig), + ); + } }; diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index 7ecde4b..e434b32 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -1,6 +1,11 @@ import { ChatAnthropic } from '@langchain/anthropic'; import { ChatModel } from '.'; import { getAnthropicApiKey } from '../config'; + +export const PROVIDER_INFO = { + key: 'anthropic', + displayName: 'Anthropic' +}; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; const anthropicChatModels: Record<string, string>[] = [ diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts index 88f02ec..b272801 100644 --- a/src/lib/providers/deepseek.ts +++ b/src/lib/providers/deepseek.ts @@ -3,6 +3,11 @@ import { getDeepseekApiKey } from '../config'; import { ChatModel } from '.'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +export const PROVIDER_INFO = { + key: 'deepseek', + displayName: 'Deepseek AI' +}; + const deepseekChatModels: Record<string, string>[] = [ { displayName: 'Deepseek Chat (Deepseek V3)', diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 2a88015..6af9fb2 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -4,6 +4,11 @@ import { } from '@langchain/google-genai'; import { getGeminiApiKey } from '../config'; import { ChatModel, EmbeddingModel } from '.'; + +export const PROVIDER_INFO = { + key: 'gemini', + displayName: 'Google Gemini' +}; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 85c75f4..62481d4 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -1,6 +1,11 @@ import { ChatOpenAI } from '@langchain/openai'; import { getGroqApiKey } from '../config'; import { ChatModel } from '.'; + +export const PROVIDER_INFO = { + key: 'groq', + displayName: 'Groq' +}; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; const groqChatModels: Record<string, string>[] = [ diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 0a4a6db..073bd61 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -1,19 +1,34 @@ import { Embeddings } from '@langchain/core/embeddings'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; +import { loadOpenAIChatModels, loadOpenAIEmbeddingModels, PROVIDER_INFO as OpenAIInfo, PROVIDER_INFO } from './openai'; import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, } from '../config'; import { ChatOpenAI } from '@langchain/openai'; -import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; -import { loadGroqChatModels } from './groq'; -import { loadAnthropicChatModels } from './anthropic'; -import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; -import { loadTransformersEmbeddingsModels } from './transformers'; -import { loadDeepseekChatModels } from './deepseek'; -import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels } from './lmstudio'; +import { loadOllamaChatModels, loadOllamaEmbeddingModels, PROVIDER_INFO as OllamaInfo } from './ollama'; +import { loadGroqChatModels, PROVIDER_INFO as GroqInfo } from './groq'; +import { loadAnthropicChatModels, PROVIDER_INFO as AnthropicInfo } from './anthropic'; +import { loadGeminiChatModels, loadGeminiEmbeddingModels, PROVIDER_INFO as GeminiInfo } from './gemini'; +import { loadTransformersEmbeddingsModels, PROVIDER_INFO as TransformersInfo } from './transformers'; +import { loadDeepseekChatModels, PROVIDER_INFO as DeepseekInfo } from './deepseek'; +import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels, PROVIDER_INFO as LMStudioInfo } from './lmstudio'; + +export const PROVIDER_METADATA = { + openai: OpenAIInfo, + ollama: OllamaInfo, + groq: GroqInfo, + anthropic: AnthropicInfo, + gemini: GeminiInfo, + transformers: TransformersInfo, + deepseek: DeepseekInfo, + lmstudio: LMStudioInfo, + custom_openai: { + key: 'custom_openai', + displayName: 'Custom OpenAI' + } +}; export interface ChatModel { displayName: string; diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts index fd8eb75..f7be638 100644 --- a/src/lib/providers/lmstudio.ts +++ b/src/lib/providers/lmstudio.ts @@ -1,6 +1,11 @@ import { getKeepAlive, getLMStudioApiEndpoint } from '../config'; import axios from 'axios'; import { ChatModel, EmbeddingModel } from '.'; + +export const PROVIDER_INFO = { + key: 'lmstudio', + displayName: 'LM Studio' +}; import { ChatOpenAI } from '@langchain/openai'; import { OpenAIEmbeddings } from '@langchain/openai'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index 92e98e4..beab58f 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -1,6 +1,11 @@ import axios from 'axios'; import { getKeepAlive, getOllamaApiEndpoint } from '../config'; import { ChatModel, EmbeddingModel } from '.'; + +export const PROVIDER_INFO = { + key: 'ollama', + displayName: 'Ollama' +}; import { ChatOllama } from '@langchain/community/chat_models/ollama'; import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 01bacc6..36f7e29 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -1,6 +1,11 @@ import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; import { getOpenaiApiKey } from '../config'; import { ChatModel, EmbeddingModel } from '.'; + +export const PROVIDER_INFO = { + key: 'openai', + displayName: 'OpenAI' +}; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts index a06dd12..fd7cb9e 100644 --- a/src/lib/providers/transformers.ts +++ b/src/lib/providers/transformers.ts @@ -1,5 +1,10 @@ import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; +export const PROVIDER_INFO = { + key: 'transformers', + displayName: 'Hugging Face' +}; + export const loadTransformersEmbeddingsModels = async () => { try { const embeddingModels = { From 7e1d6ebd19fb62a4dfbded959efc9a51553ae958 Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Fri, 11 Apr 2025 18:46:03 +0100 Subject: [PATCH 212/282] bug(file upload): fixed an erro in uploading dox files. --- package.json | 129 ++++++++++++++++++++++---------------------- yarn.lock | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 213 insertions(+), 66 deletions(-) diff --git a/package.json b/package.json index e68410f..38f22f9 100644 --- a/package.json +++ b/package.json @@ -1,65 +1,66 @@ { - "name": "perplexica-frontend", - "version": "1.10.2", - "license": "MIT", - "author": "ItzCrazyKns", - "scripts": { - "dev": "next dev", - "build": "npm run db:push && next build", - "start": "next start", - "lint": "next lint", - "format:write": "prettier . --write", - "db:push": "drizzle-kit push" - }, - "dependencies": { - "@headlessui/react": "^2.2.0", - "@iarna/toml": "^2.2.5", - "@icons-pack/react-simple-icons": "^12.3.0", - "@langchain/anthropic": "^0.3.15", - "@langchain/community": "^0.3.36", - "@langchain/core": "^0.3.42", - "@langchain/google-genai": "^0.1.12", - "@langchain/openai": "^0.0.25", - "@langchain/textsplitters": "^0.1.0", - "@tailwindcss/typography": "^0.5.12", - "@xenova/transformers": "^2.17.2", - "axios": "^1.8.3", - "better-sqlite3": "^11.9.1", - "clsx": "^2.1.0", - "compute-cosine-similarity": "^1.1.0", - "compute-dot": "^1.1.0", - "drizzle-orm": "^0.40.1", - "html-to-text": "^9.0.5", - "langchain": "^0.1.30", - "lucide-react": "^0.363.0", - "markdown-to-jsx": "^7.7.2", - "next": "^15.2.2", - "next-themes": "^0.3.0", - "pdf-parse": "^1.1.1", - "react": "^18", - "react-dom": "^18", - "react-text-to-speech": "^0.14.5", - "react-textarea-autosize": "^8.5.3", - "sonner": "^1.4.41", - "tailwind-merge": "^2.2.2", - "winston": "^3.17.0", - "yet-another-react-lightbox": "^3.17.2", - "zod": "^3.22.4" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.12", - "@types/html-to-text": "^9.0.4", - "@types/node": "^20", - "@types/pdf-parse": "^1.1.4", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "drizzle-kit": "^0.30.5", - "eslint": "^8", - "eslint-config-next": "14.1.4", - "postcss": "^8", - "prettier": "^3.2.5", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} + "name": "perplexica-frontend", + "version": "1.10.2", + "license": "MIT", + "author": "ItzCrazyKns", + "scripts": { + "dev": "next dev", + "build": "npm run db:push && next build", + "start": "next start", + "lint": "next lint", + "format:write": "prettier . --write", + "db:push": "drizzle-kit push" + }, + "dependencies": { + "@headlessui/react": "^2.2.0", + "@iarna/toml": "^2.2.5", + "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/anthropic": "^0.3.15", + "@langchain/community": "^0.3.36", + "@langchain/core": "^0.3.42", + "@langchain/google-genai": "^0.1.12", + "@langchain/openai": "^0.0.25", + "@langchain/textsplitters": "^0.1.0", + "@tailwindcss/typography": "^0.5.12", + "@xenova/transformers": "^2.17.2", + "axios": "^1.8.3", + "better-sqlite3": "^11.9.1", + "clsx": "^2.1.0", + "compute-cosine-similarity": "^1.1.0", + "compute-dot": "^1.1.0", + "drizzle-orm": "^0.40.1", + "html-to-text": "^9.0.5", + "langchain": "^0.1.30", + "lucide-react": "^0.363.0", + "mammoth": "^1.7.0", + "markdown-to-jsx": "^7.7.2", + "next": "^15.2.2", + "next-themes": "^0.3.0", + "pdf-parse": "^1.1.1", + "react": "^18", + "react-dom": "^18", + "react-text-to-speech": "^0.14.5", + "react-textarea-autosize": "^8.5.3", + "sonner": "^1.4.41", + "tailwind-merge": "^2.2.2", + "winston": "^3.17.0", + "yet-another-react-lightbox": "^3.17.2", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.12", + "@types/html-to-text": "^9.0.4", + "@types/node": "^20", + "@types/pdf-parse": "^1.1.4", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "drizzle-kit": "^0.30.5", + "eslint": "^8", + "eslint-config-next": "14.1.4", + "postcss": "^8", + "prettier": "^3.2.5", + "tailwindcss": "^3.3.0", + "typescript": "^5" + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 921186b..ffd6648 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1107,6 +1107,11 @@ optionalDependencies: onnxruntime-node "1.14.0" +"@xmldom/xmldom@^0.8.6": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -1191,6 +1196,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +argparse@~1.0.3: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" @@ -1444,6 +1456,11 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" +bluebird@~3.4.0: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1691,6 +1708,11 @@ console-table-printer@^2.12.1: dependencies: simple-wcswidth "^1.0.1" +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1834,6 +1856,11 @@ digest-fetch@^1.3.0: base-64 "^0.1.0" md5 "^2.3.0" +dingbat-to-unicode@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83" + integrity sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1906,6 +1933,13 @@ drizzle-orm@^0.40.1: resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb" integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew== +duck@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/duck/-/duck-0.1.12.tgz#de7adf758421230b6d7aee799ce42670586b9efa" + integrity sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg== + dependencies: + underscore "^1.13.1" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -2788,6 +2822,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -2809,7 +2848,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3035,6 +3074,11 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -3133,6 +3177,16 @@ jsonpointer@^5.0.1: object.assign "^4.1.4" object.values "^1.1.6" +jszip@^3.7.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -3240,6 +3294,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -3301,6 +3362,15 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lop@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/lop/-/lop-0.4.2.tgz#c9c2f958a39b9da1c2f36ca9ad66891a9fe84640" + integrity sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw== + dependencies: + duck "^0.1.12" + option "~0.2.1" + underscore "^1.13.1" + lru-cache@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" @@ -3318,6 +3388,22 @@ lucide-react@^0.363.0: resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== +mammoth@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.9.0.tgz#71e34ca280735275788bfe95e653a058dcab4df2" + integrity sha512-F+0NxzankQV9XSUAuVKvkdQK0GbtGGuqVnND9aVf9VSeUA82LQa29GjLqYU6Eez8LHqSJG3eGiDW3224OKdpZg== + dependencies: + "@xmldom/xmldom" "^0.8.6" + argparse "~1.0.3" + base64-js "^1.5.1" + bluebird "~3.4.0" + dingbat-to-unicode "^1.0.1" + jszip "^3.7.1" + lop "^0.4.2" + path-is-absolute "^1.0.0" + underscore "^1.13.1" + xmlbuilder "^10.0.0" + markdown-to-jsx@^7.7.2: version "7.7.2" resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" @@ -3708,6 +3794,11 @@ openapi-types@^12.1.3: resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== +option@~0.2.1: + version "0.2.4" + resolved "https://registry.yarnpkg.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4" + integrity sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A== + optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -3762,6 +3853,11 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3951,6 +4047,11 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -4062,6 +4163,19 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4164,6 +4278,11 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -4231,6 +4350,11 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + sharp@^0.32.0: version "0.32.6" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" @@ -4365,6 +4489,11 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -4465,6 +4594,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4775,6 +4911,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +underscore@^1.13.1: + version "1.13.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" + integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -4817,7 +4958,7 @@ use-latest@^1.2.1: dependencies: use-isomorphic-layout-effect "^1.1.1" -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -4978,6 +5119,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xmlbuilder@^10.0.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" + integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" From 073b5e897cc5c2081b6963fa4d3b8b4ce1cc6cfc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 12 Apr 2025 11:58:52 +0530 Subject: [PATCH 213/282] feat(app): lint & beautify --- src/app/api/config/route.ts | 5 ++++ src/app/settings/page.tsx | 13 ++++++--- src/lib/config.ts | 5 ++-- src/lib/providers/anthropic.ts | 2 +- src/lib/providers/deepseek.ts | 2 +- src/lib/providers/gemini.ts | 2 +- src/lib/providers/groq.ts | 2 +- src/lib/providers/index.ts | 44 ++++++++++++++++++++++++------- src/lib/providers/lmstudio.ts | 20 +++++--------- src/lib/providers/ollama.ts | 2 +- src/lib/providers/openai.ts | 2 +- src/lib/providers/transformers.ts | 2 +- 12 files changed, 66 insertions(+), 35 deletions(-) diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index 39c1f84..c1e5bbd 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -8,6 +8,7 @@ import { getOllamaApiEndpoint, getOpenaiApiKey, getDeepseekApiKey, + getLMStudioApiEndpoint, updateConfig, } from '@/lib/config'; import { @@ -51,6 +52,7 @@ export const GET = async (req: Request) => { config['openaiApiKey'] = getOpenaiApiKey(); config['ollamaApiUrl'] = getOllamaApiEndpoint(); + config['lmStudioApiUrl'] = getLMStudioApiEndpoint(); config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); config['geminiApiKey'] = getGeminiApiKey(); @@ -93,6 +95,9 @@ export const POST = async (req: Request) => { DEEPSEEK: { API_KEY: config.deepseekApiKey, }, + LM_STUDIO: { + API_URL: config.lmStudioApiUrl, + }, CUSTOM_OPENAI: { API_URL: config.customOpenaiApiUrl, API_KEY: config.customOpenaiApiKey, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 919304b..0385944 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -21,6 +21,7 @@ interface SettingsType { anthropicApiKey: string; geminiApiKey: string; ollamaApiUrl: string; + lmStudioApiUrl: string; deepseekApiKey: string; customOpenaiApiKey: string; customOpenaiApiUrl: string; @@ -548,8 +549,10 @@ const Page = () => { options={Object.keys(config.chatModelProviders).map( (provider) => ({ value: provider, - label: (PROVIDER_METADATA as any)[provider]?.displayName || - provider.charAt(0).toUpperCase() + provider.slice(1), + label: + (PROVIDER_METADATA as any)[provider]?.displayName || + provider.charAt(0).toUpperCase() + + provider.slice(1), }), )} /> @@ -689,8 +692,10 @@ const Page = () => { options={Object.keys(config.embeddingModelProviders).map( (provider) => ({ value: provider, - label: (PROVIDER_METADATA as any)[provider]?.displayName || - provider.charAt(0).toUpperCase() + provider.slice(1), + label: + (PROVIDER_METADATA as any)[provider]?.displayName || + provider.charAt(0).toUpperCase() + + provider.slice(1), }), )} /> diff --git a/src/lib/config.ts b/src/lib/config.ts index e3f2680..78ad09c 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -60,7 +60,7 @@ const loadConfig = () => { fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), ) as any as Config; } - + // Client-side fallback - settings will be loaded via API return {} as Config; }; @@ -94,7 +94,8 @@ export const getCustomOpenaiApiUrl = () => export const getCustomOpenaiModelName = () => loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; -export const getLMStudioApiEndpoint = () => loadConfig().MODELS.LM_STUDIO.API_URL; +export const getLMStudioApiEndpoint = () => + loadConfig().MODELS.LM_STUDIO.API_URL; const mergeConfigs = (current: any, update: any): any => { if (update === null || update === undefined) { diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index e434b32..2b0f2cc 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -4,7 +4,7 @@ import { getAnthropicApiKey } from '../config'; export const PROVIDER_INFO = { key: 'anthropic', - displayName: 'Anthropic' + displayName: 'Anthropic', }; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts index b272801..46f2398 100644 --- a/src/lib/providers/deepseek.ts +++ b/src/lib/providers/deepseek.ts @@ -5,7 +5,7 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; export const PROVIDER_INFO = { key: 'deepseek', - displayName: 'Deepseek AI' + displayName: 'Deepseek AI', }; const deepseekChatModels: Record<string, string>[] = [ diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 6af9fb2..6cf2243 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -7,7 +7,7 @@ import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { key: 'gemini', - displayName: 'Google Gemini' + displayName: 'Google Gemini', }; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 62481d4..4b0ca92 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -4,7 +4,7 @@ import { ChatModel } from '.'; export const PROVIDER_INFO = { key: 'groq', - displayName: 'Groq' + displayName: 'Groq', }; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 073bd61..e536431 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -1,19 +1,45 @@ import { Embeddings } from '@langchain/core/embeddings'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingModels, PROVIDER_INFO as OpenAIInfo, PROVIDER_INFO } from './openai'; +import { + loadOpenAIChatModels, + loadOpenAIEmbeddingModels, + PROVIDER_INFO as OpenAIInfo, + PROVIDER_INFO, +} from './openai'; import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, } from '../config'; import { ChatOpenAI } from '@langchain/openai'; -import { loadOllamaChatModels, loadOllamaEmbeddingModels, PROVIDER_INFO as OllamaInfo } from './ollama'; +import { + loadOllamaChatModels, + loadOllamaEmbeddingModels, + PROVIDER_INFO as OllamaInfo, +} from './ollama'; import { loadGroqChatModels, PROVIDER_INFO as GroqInfo } from './groq'; -import { loadAnthropicChatModels, PROVIDER_INFO as AnthropicInfo } from './anthropic'; -import { loadGeminiChatModels, loadGeminiEmbeddingModels, PROVIDER_INFO as GeminiInfo } from './gemini'; -import { loadTransformersEmbeddingsModels, PROVIDER_INFO as TransformersInfo } from './transformers'; -import { loadDeepseekChatModels, PROVIDER_INFO as DeepseekInfo } from './deepseek'; -import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels, PROVIDER_INFO as LMStudioInfo } from './lmstudio'; +import { + loadAnthropicChatModels, + PROVIDER_INFO as AnthropicInfo, +} from './anthropic'; +import { + loadGeminiChatModels, + loadGeminiEmbeddingModels, + PROVIDER_INFO as GeminiInfo, +} from './gemini'; +import { + loadTransformersEmbeddingsModels, + PROVIDER_INFO as TransformersInfo, +} from './transformers'; +import { + loadDeepseekChatModels, + PROVIDER_INFO as DeepseekInfo, +} from './deepseek'; +import { + loadLMStudioChatModels, + loadLMStudioEmbeddingsModels, + PROVIDER_INFO as LMStudioInfo, +} from './lmstudio'; export const PROVIDER_METADATA = { openai: OpenAIInfo, @@ -26,8 +52,8 @@ export const PROVIDER_METADATA = { lmstudio: LMStudioInfo, custom_openai: { key: 'custom_openai', - displayName: 'Custom OpenAI' - } + displayName: 'Custom OpenAI', + }, }; export interface ChatModel { diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts index f7be638..811208f 100644 --- a/src/lib/providers/lmstudio.ts +++ b/src/lib/providers/lmstudio.ts @@ -4,7 +4,7 @@ import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { key: 'lmstudio', - displayName: 'LM Studio' + displayName: 'LM Studio', }; import { ChatOpenAI } from '@langchain/openai'; import { OpenAIEmbeddings } from '@langchain/openai'; @@ -16,14 +16,12 @@ interface LMStudioModel { name?: string; } -const ensureV1Endpoint = (endpoint: string): string => +const ensureV1Endpoint = (endpoint: string): string => endpoint.endsWith('/v1') ? endpoint : `${endpoint}/v1`; const checkServerAvailability = async (endpoint: string): Promise<boolean> => { try { - const keepAlive = getKeepAlive(); await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { - timeout: parseInt(keepAlive) * 1000 || 5000, headers: { 'Content-Type': 'application/json' }, }); return true; @@ -34,14 +32,12 @@ const checkServerAvailability = async (endpoint: string): Promise<boolean> => { export const loadLMStudioChatModels = async () => { const endpoint = getLMStudioApiEndpoint(); - const keepAlive = getKeepAlive(); - + if (!endpoint) return {}; - if (!await checkServerAvailability(endpoint)) return {}; + if (!(await checkServerAvailability(endpoint))) return {}; try { const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { - timeout: parseInt(keepAlive) * 1000 || 5000, headers: { 'Content-Type': 'application/json' }, }); @@ -58,7 +54,7 @@ export const loadLMStudioChatModels = async () => { modelName: model.id, temperature: 0.7, streaming: true, - maxRetries: 3 + maxRetries: 3, }) as unknown as BaseChatModel, }; }); @@ -72,14 +68,12 @@ export const loadLMStudioChatModels = async () => { export const loadLMStudioEmbeddingsModels = async () => { const endpoint = getLMStudioApiEndpoint(); - const keepAlive = getKeepAlive(); - + if (!endpoint) return {}; - if (!await checkServerAvailability(endpoint)) return {}; + if (!(await checkServerAvailability(endpoint))) return {}; try { const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { - timeout: parseInt(keepAlive) * 1000 || 5000, headers: { 'Content-Type': 'application/json' }, }); diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index beab58f..cca2142 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -4,7 +4,7 @@ import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { key: 'ollama', - displayName: 'Ollama' + displayName: 'Ollama', }; import { ChatOllama } from '@langchain/community/chat_models/ollama'; import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 36f7e29..61621c3 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -4,7 +4,7 @@ import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { key: 'openai', - displayName: 'OpenAI' + displayName: 'OpenAI', }; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts index fd7cb9e..3098d9f 100644 --- a/src/lib/providers/transformers.ts +++ b/src/lib/providers/transformers.ts @@ -2,7 +2,7 @@ import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; export const PROVIDER_INFO = { key: 'transformers', - displayName: 'Hugging Face' + displayName: 'Hugging Face', }; export const loadTransformersEmbeddingsModels = async () => { From 186249149674df5938faecabb3a3b7c48d9bce71 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 12 Apr 2025 11:59:05 +0530 Subject: [PATCH 214/282] feat(settings): add LM Studio API URL --- src/app/settings/page.tsx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 0385944..05338c3 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -862,6 +862,25 @@ const Page = () => { onSave={(value) => saveConfig('deepseekApiKey', value)} /> </div> + + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + LM Studio API URL + </p> + <Input + type="text" + placeholder="LM Studio API URL" + value={config.lmStudioApiUrl} + isSaving={savingStates['lmStudioApiUrl']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + lmStudioApiUrl: e.target.value, + })); + }} + onSave={(value) => saveConfig('lmStudioApiUrl', value)} + /> + </div> </div> </SettingsSection> </div> From 06ff2725417435f7d2f0faaa7cc4f67905d9f4a0 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Apr 2025 13:10:14 +0530 Subject: [PATCH 215/282] feat(openai): add GPT 4.1 models --- src/lib/providers/openai.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 61621c3..e68e574 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -30,6 +30,18 @@ const openaiChatModels: Record<string, string>[] = [ displayName: 'GPT-4 omni mini', key: 'gpt-4o-mini', }, + { + displayName: 'GPT 4.1 nano', + key: 'gpt-4.1-nano', + }, + { + displayName: 'GPT 4.1 mini', + key: 'gpt-4.1-mini', + }, + { + displayName: 'GPT 4.1', + key: 'gpt-4.1', + }, ]; const openaiEmbeddingModels: Record<string, string>[] = [ From 68e151b2bda7490ad9c3f17ee27bf539326143b6 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Apr 2025 17:13:30 +0530 Subject: [PATCH 216/282] Update README.md --- README.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/README.md b/README.md index 18c9f84..9e94028 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,5 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> -<div align="center" markdown="1"> - <sup>Special thanks to:</sup> - <br> - <br> - <a href="https://www.warp.dev/perplexica"> - <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/775dd593-9b5f-40f1-bf48-479faff4c27b"> - </a> - -### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica) - -[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica) - -</div> - -<hr/> - [![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) ![preview](.assets/perplexica-screenshot.png?) From 701819d01834e8aefba42ec37ac0a85188851641 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 13 May 2025 20:14:08 +0530 Subject: [PATCH 217/282] Revert "Update README.md" This reverts commit 68e151b2bda7490ad9c3f17ee27bf539326143b6. --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 9e94028..18c9f84 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,21 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> +<div align="center" markdown="1"> + <sup>Special thanks to:</sup> + <br> + <br> + <a href="https://www.warp.dev/perplexica"> + <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/775dd593-9b5f-40f1-bf48-479faff4c27b"> + </a> + +### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica) + +[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica) + +</div> + +<hr/> + [![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) ![preview](.assets/perplexica-screenshot.png?) From 0c3740fdf2421d3ac9a1601ae133f35bafdb5b2f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 27 May 2025 18:23:40 +0530 Subject: [PATCH 218/282] feat(groq-provider): dynamically fetch models --- src/lib/providers/groq.ts | 98 ++++++--------------------------------- 1 file changed, 14 insertions(+), 84 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 4b0ca92..5435de4 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -6,101 +6,31 @@ export const PROVIDER_INFO = { key: 'groq', displayName: 'Groq', }; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -const groqChatModels: Record<string, string>[] = [ - { - displayName: 'Gemma2 9B IT', - key: 'gemma2-9b-it', - }, - { - displayName: 'Llama 3.3 70B Versatile', - key: 'llama-3.3-70b-versatile', - }, - { - displayName: 'Llama 3.1 8B Instant', - key: 'llama-3.1-8b-instant', - }, - { - displayName: 'Llama3 70B 8192', - key: 'llama3-70b-8192', - }, - { - displayName: 'Llama3 8B 8192', - key: 'llama3-8b-8192', - }, - { - displayName: 'Mixtral 8x7B 32768', - key: 'mixtral-8x7b-32768', - }, - { - displayName: 'Qwen QWQ 32B (Preview)', - key: 'qwen-qwq-32b', - }, - { - displayName: 'Mistral Saba 24B (Preview)', - key: 'mistral-saba-24b', - }, - { - displayName: 'Qwen 2.5 Coder 32B (Preview)', - key: 'qwen-2.5-coder-32b', - }, - { - displayName: 'Qwen 2.5 32B (Preview)', - key: 'qwen-2.5-32b', - }, - { - displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', - key: 'deepseek-r1-distill-qwen-32b', - }, - { - displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', - key: 'deepseek-r1-distill-llama-70b', - }, - { - displayName: 'Llama 3.3 70B SpecDec (Preview)', - key: 'llama-3.3-70b-specdec', - }, - { - displayName: 'Llama 3.2 1B Preview (Preview)', - key: 'llama-3.2-1b-preview', - }, - { - displayName: 'Llama 3.2 3B Preview (Preview)', - key: 'llama-3.2-3b-preview', - }, - { - displayName: 'Llama 3.2 11B Vision Preview (Preview)', - key: 'llama-3.2-11b-vision-preview', - }, - { - displayName: 'Llama 3.2 90B Vision Preview (Preview)', - key: 'llama-3.2-90b-vision-preview', - }, - /* { - displayName: 'Llama 4 Maverick 17B 128E Instruct (Preview)', - key: 'meta-llama/llama-4-maverick-17b-128e-instruct', - }, */ - { - displayName: 'Llama 4 Scout 17B 16E Instruct (Preview)', - key: 'meta-llama/llama-4-scout-17b-16e-instruct', - }, -]; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; export const loadGroqChatModels = async () => { const groqApiKey = getGroqApiKey(); - if (!groqApiKey) return {}; try { + const res = await fetch('https://api.groq.com/openai/v1/models', { + method: 'GET', + headers: { + Authorization: `bearer ${groqApiKey}`, + 'Content-Type': 'application/json', + }, + }); + + const groqChatModels = (await res.json()).data; const chatModels: Record<string, ChatModel> = {}; - groqChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, + groqChatModels.forEach((model: any) => { + chatModels[model.id] = { + displayName: model.id, model: new ChatOpenAI({ openAIApiKey: groqApiKey, - modelName: model.key, + modelName: model.id, temperature: 0.7, configuration: { baseURL: 'https://api.groq.com/openai/v1', From bb21184ea273dea127996040fb23f67d107c6a4d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 27 May 2025 18:32:09 +0530 Subject: [PATCH 219/282] feat(settings): show loading spinner immediately --- src/app/settings/page.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 05338c3..6f20f01 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -143,7 +143,7 @@ const Page = () => { const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState< string | null >(null); - const [isLoading, setIsLoading] = useState(false); + const [isLoading, setIsLoading] = useState(true); const [automaticImageSearch, setAutomaticImageSearch] = useState(false); const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); const [systemInstructions, setSystemInstructions] = useState<string>(''); @@ -151,7 +151,6 @@ const Page = () => { useEffect(() => { const fetchConfig = async () => { - setIsLoading(true); const res = await fetch(`/api/config`, { headers: { 'Content-Type': 'application/json', From c80ac1415dbb6760a076ac4e23faca72e49060a2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 27 May 2025 18:42:02 +0530 Subject: [PATCH 220/282] feat(app): lint & beautify --- package.json | 130 +++++++++++++++++++++++++-------------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 38f22f9..147348c 100644 --- a/package.json +++ b/package.json @@ -1,66 +1,66 @@ { - "name": "perplexica-frontend", - "version": "1.10.2", - "license": "MIT", - "author": "ItzCrazyKns", - "scripts": { - "dev": "next dev", - "build": "npm run db:push && next build", - "start": "next start", - "lint": "next lint", - "format:write": "prettier . --write", - "db:push": "drizzle-kit push" - }, - "dependencies": { - "@headlessui/react": "^2.2.0", - "@iarna/toml": "^2.2.5", - "@icons-pack/react-simple-icons": "^12.3.0", - "@langchain/anthropic": "^0.3.15", - "@langchain/community": "^0.3.36", - "@langchain/core": "^0.3.42", - "@langchain/google-genai": "^0.1.12", - "@langchain/openai": "^0.0.25", - "@langchain/textsplitters": "^0.1.0", - "@tailwindcss/typography": "^0.5.12", - "@xenova/transformers": "^2.17.2", - "axios": "^1.8.3", - "better-sqlite3": "^11.9.1", - "clsx": "^2.1.0", - "compute-cosine-similarity": "^1.1.0", - "compute-dot": "^1.1.0", - "drizzle-orm": "^0.40.1", - "html-to-text": "^9.0.5", - "langchain": "^0.1.30", - "lucide-react": "^0.363.0", - "mammoth": "^1.7.0", - "markdown-to-jsx": "^7.7.2", - "next": "^15.2.2", - "next-themes": "^0.3.0", - "pdf-parse": "^1.1.1", - "react": "^18", - "react-dom": "^18", - "react-text-to-speech": "^0.14.5", - "react-textarea-autosize": "^8.5.3", - "sonner": "^1.4.41", - "tailwind-merge": "^2.2.2", - "winston": "^3.17.0", - "yet-another-react-lightbox": "^3.17.2", - "zod": "^3.22.4" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.12", - "@types/html-to-text": "^9.0.4", - "@types/node": "^20", - "@types/pdf-parse": "^1.1.4", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "drizzle-kit": "^0.30.5", - "eslint": "^8", - "eslint-config-next": "14.1.4", - "postcss": "^8", - "prettier": "^3.2.5", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} \ No newline at end of file + "name": "perplexica-frontend", + "version": "1.10.2", + "license": "MIT", + "author": "ItzCrazyKns", + "scripts": { + "dev": "next dev", + "build": "npm run db:push && next build", + "start": "next start", + "lint": "next lint", + "format:write": "prettier . --write", + "db:push": "drizzle-kit push" + }, + "dependencies": { + "@headlessui/react": "^2.2.0", + "@iarna/toml": "^2.2.5", + "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/anthropic": "^0.3.15", + "@langchain/community": "^0.3.36", + "@langchain/core": "^0.3.42", + "@langchain/google-genai": "^0.1.12", + "@langchain/openai": "^0.0.25", + "@langchain/textsplitters": "^0.1.0", + "@tailwindcss/typography": "^0.5.12", + "@xenova/transformers": "^2.17.2", + "axios": "^1.8.3", + "better-sqlite3": "^11.9.1", + "clsx": "^2.1.0", + "compute-cosine-similarity": "^1.1.0", + "compute-dot": "^1.1.0", + "drizzle-orm": "^0.40.1", + "html-to-text": "^9.0.5", + "langchain": "^0.1.30", + "lucide-react": "^0.363.0", + "mammoth": "^1.7.0", + "markdown-to-jsx": "^7.7.2", + "next": "^15.2.2", + "next-themes": "^0.3.0", + "pdf-parse": "^1.1.1", + "react": "^18", + "react-dom": "^18", + "react-text-to-speech": "^0.14.5", + "react-textarea-autosize": "^8.5.3", + "sonner": "^1.4.41", + "tailwind-merge": "^2.2.2", + "winston": "^3.17.0", + "yet-another-react-lightbox": "^3.17.2", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.12", + "@types/html-to-text": "^9.0.4", + "@types/node": "^20", + "@types/pdf-parse": "^1.1.4", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "drizzle-kit": "^0.30.5", + "eslint": "^8", + "eslint-config-next": "14.1.4", + "postcss": "^8", + "prettier": "^3.2.5", + "tailwindcss": "^3.3.0", + "typescript": "^5" + } +} From 18da75ad9790e790c0672a8648fa2ec68c613d3a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 May 2025 10:35:19 +0530 Subject: [PATCH 221/282] feat(db): create migration files --- drizzle/0000_fuzzy_randall.sql | 16 +++++ drizzle/meta/0000_snapshot.json | 116 ++++++++++++++++++++++++++++++++ drizzle/meta/_journal.json | 13 ++++ 3 files changed, 145 insertions(+) create mode 100644 drizzle/0000_fuzzy_randall.sql create mode 100644 drizzle/meta/0000_snapshot.json create mode 100644 drizzle/meta/_journal.json diff --git a/drizzle/0000_fuzzy_randall.sql b/drizzle/0000_fuzzy_randall.sql new file mode 100644 index 0000000..0a2ff07 --- /dev/null +++ b/drizzle/0000_fuzzy_randall.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS `chats` ( + `id` text PRIMARY KEY NOT NULL, + `title` text NOT NULL, + `createdAt` text NOT NULL, + `focusMode` text NOT NULL, + `files` text DEFAULT '[]' +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS `messages` ( + `id` integer PRIMARY KEY NOT NULL, + `content` text NOT NULL, + `chatId` text NOT NULL, + `messageId` text NOT NULL, + `type` text, + `metadata` text +); diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..850bcd3 --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,116 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "ef3a044b-0f34-40b5-babb-2bb3a909ba27", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "chats": { + "name": "chats", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "focusMode": { + "name": "focusMode", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "files": { + "name": "files", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'[]'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "messages": { + "name": "messages", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "messageId": { + "name": "messageId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 0000000..5db59d1 --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1748405503809, + "tag": "0000_fuzzy_randall", + "breakpoints": true + } + ] +} From 876487ad1185f3aed2e18e73a54a33aea7609f94 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 May 2025 10:41:12 +0530 Subject: [PATCH 222/282] feat(db): add migration script, migrate on each run --- app.dockerfile | 10 +++++++++- docker-compose.yaml | 1 + drizzle.config.ts | 3 ++- entrypoint.sh | 6 ++++++ src/lib/db/index.ts | 3 ++- src/lib/db/migrate.ts | 5 +++++ 6 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 entrypoint.sh create mode 100644 src/lib/db/migrate.ts diff --git a/app.dockerfile b/app.dockerfile index 3433288..c3c0fd0 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -12,6 +12,9 @@ COPY public ./public RUN mkdir -p /home/perplexica/data RUN yarn build +RUN yarn add --dev @vercel/ncc +RUN yarn ncc build ./src/lib/db/migrate.ts -o migrator + FROM node:20.18.0-slim WORKDIR /home/perplexica @@ -21,7 +24,12 @@ COPY --from=builder /home/perplexica/.next/static ./public/_next/static COPY --from=builder /home/perplexica/.next/standalone ./ COPY --from=builder /home/perplexica/data ./data +COPY drizzle ./drizzle +COPY --from=builder /home/perplexica/migrator/build ./build +COPY --from=builder /home/perplexica/migrator/index.js ./migrate.js RUN mkdir /home/perplexica/uploads -CMD ["node", "server.js"] \ No newline at end of file +COPY entrypoint.sh ./entrypoint.sh +RUN chmod +x ./entrypoint.sh +CMD ["./entrypoint.sh"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index b702b4e..b32e0a9 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -16,6 +16,7 @@ services: dockerfile: app.dockerfile environment: - SEARXNG_API_URL=http://searxng:8080 + - DATA_DIR=/home/perplexica ports: - 3000:3000 networks: diff --git a/drizzle.config.ts b/drizzle.config.ts index 58de9e0..a029112 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,10 +1,11 @@ import { defineConfig } from 'drizzle-kit'; +import path from 'path'; export default defineConfig({ dialect: 'sqlite', schema: './src/lib/db/schema.ts', out: './drizzle', dbCredentials: { - url: './data/db.sqlite', + url: path.join(process.cwd(), 'data', 'db.sqlite'), }, }); diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..9f9448a --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh +set -e + +node migrate.js + +exec node server.js \ No newline at end of file diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts index 9b761d4..515cdb3 100644 --- a/src/lib/db/index.ts +++ b/src/lib/db/index.ts @@ -3,7 +3,8 @@ import Database from 'better-sqlite3'; import * as schema from './schema'; import path from 'path'; -const sqlite = new Database(path.join(process.cwd(), 'data/db.sqlite')); +const DATA_DIR = process.env.DATA_DIR || process.cwd(); +const sqlite = new Database(path.join(DATA_DIR, './data/db.sqlite')); const db = drizzle(sqlite, { schema: schema, }); diff --git a/src/lib/db/migrate.ts b/src/lib/db/migrate.ts new file mode 100644 index 0000000..c3ebff6 --- /dev/null +++ b/src/lib/db/migrate.ts @@ -0,0 +1,5 @@ +import db from './'; +import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; +import path from 'path'; + +migrate(db, { migrationsFolder: path.join(process.cwd(), 'drizzle') }); From bcebdb5fd98bc13413596659823b82be00685315 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 May 2025 13:01:05 +0530 Subject: [PATCH 223/282] feat(chat): allow export as pdf or markdown --- package.json | 2 + src/components/Navbar.tsx | 155 ++++++++++++++++++++++++++++++++++++-- yarn.lock | 144 +++++++++++++++++++++++++++++++++++ 3 files changed, 295 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e68410f..5746fd3 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "compute-dot": "^1.1.0", "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", + "jspdf": "^3.0.1", "langchain": "^0.1.30", "lucide-react": "^0.363.0", "markdown-to-jsx": "^7.7.2", @@ -49,6 +50,7 @@ "devDependencies": { "@types/better-sqlite3": "^7.6.12", "@types/html-to-text": "^9.0.4", + "@types/jspdf": "^2.0.0", "@types/node": "^20", "@types/pdf-parse": "^1.1.4", "@types/react": "^18", diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 13f2da3..e406ade 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,8 +1,122 @@ -import { Clock, Edit, Share, Trash } from 'lucide-react'; +import { Clock, Edit, Share, Trash, FileText, FileDown } from 'lucide-react'; import { Message } from './ChatWindow'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, Fragment } from 'react'; import { formatTimeDifference } from '@/lib/utils'; import DeleteChat from './DeleteChat'; +import { + Popover, + PopoverButton, + PopoverPanel, + Transition, +} from '@headlessui/react'; +import jsPDF from 'jspdf'; + +const downloadFile = (filename: string, content: string, type: string) => { + const blob = new Blob([content], { type }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + setTimeout(() => { + document.body.removeChild(a); + URL.revokeObjectURL(url); + }, 0); +}; + +const exportAsMarkdown = (messages: Message[], title: string) => { + const date = new Date(messages[0]?.createdAt || Date.now()).toLocaleString(); + let md = `# 💬 Chat Export: ${title}\n\n`; + md += `*Exported on: ${date}*\n\n---\n`; + messages.forEach((msg, idx) => { + md += `\n---\n`; + md += `**${msg.role === 'user' ? '🧑 User' : '🤖 Assistant'}** +`; + md += `*${new Date(msg.createdAt).toLocaleString()}*\n\n`; + md += `> ${msg.content.replace(/\n/g, '\n> ')}\n`; + if (msg.sources && msg.sources.length > 0) { + md += `\n**Citations:**\n`; + msg.sources.forEach((src: any, i: number) => { + const url = src.metadata?.url || ''; + md += `- [${i + 1}] [${url}](${url})\n`; + }); + } + }); + md += '\n---\n'; + downloadFile(`${title || 'chat'}.md`, md, 'text/markdown'); +}; + +const exportAsPDF = (messages: Message[], title: string) => { + const doc = new jsPDF(); + const date = new Date(messages[0]?.createdAt || Date.now()).toLocaleString(); + let y = 15; + const pageHeight = doc.internal.pageSize.height; + doc.setFontSize(18); + doc.text(`Chat Export: ${title}`, 10, y); + y += 8; + doc.setFontSize(11); + doc.setTextColor(100); + doc.text(`Exported on: ${date}`, 10, y); + y += 8; + doc.setDrawColor(200); + doc.line(10, y, 200, y); + y += 6; + doc.setTextColor(30); + messages.forEach((msg, idx) => { + if (y > pageHeight - 30) { + doc.addPage(); + y = 15; + } + doc.setFont('helvetica', 'bold'); + doc.text(`${msg.role === 'user' ? 'User' : 'Assistant'}`, 10, y); + doc.setFont('helvetica', 'normal'); + doc.setFontSize(10); + doc.setTextColor(120); + doc.text(`${new Date(msg.createdAt).toLocaleString()}`, 40, y); + y += 6; + doc.setTextColor(30); + doc.setFontSize(12); + const lines = doc.splitTextToSize(msg.content, 180); + for (let i = 0; i < lines.length; i++) { + if (y > pageHeight - 20) { + doc.addPage(); + y = 15; + } + doc.text(lines[i], 12, y); + y += 6; + } + if (msg.sources && msg.sources.length > 0) { + doc.setFontSize(11); + doc.setTextColor(80); + if (y > pageHeight - 20) { + doc.addPage(); + y = 15; + } + doc.text('Citations:', 12, y); + y += 5; + msg.sources.forEach((src: any, i: number) => { + const url = src.metadata?.url || ''; + if (y > pageHeight - 15) { + doc.addPage(); + y = 15; + } + doc.text(`- [${i + 1}] ${url}`, 15, y); + y += 5; + }); + doc.setTextColor(30); + } + y += 6; + doc.setDrawColor(230); + if (y > pageHeight - 10) { + doc.addPage(); + y = 15; + } + doc.line(10, y, 200, y); + y += 4; + }); + doc.save(`${title || 'chat'}.pdf`); +}; const Navbar = ({ chatId, @@ -59,10 +173,39 @@ const Navbar = ({ <p className="hidden lg:flex">{title}</p> <div className="flex flex-row items-center space-x-4"> - <Share - size={17} - className="active:scale-95 transition duration-100 cursor-pointer" - /> + <Popover className="relative"> + <PopoverButton className="active:scale-95 transition duration-100 cursor-pointer p-2 rounded-full hover:bg-light-secondary dark:hover:bg-dark-secondary"> + <Share size={17} /> + </PopoverButton> + <Transition + as={Fragment} + enter="transition ease-out duration-100" + enterFrom="opacity-0 translate-y-1" + enterTo="opacity-100 translate-y-0" + leave="transition ease-in duration-75" + leaveFrom="opacity-100 translate-y-0" + leaveTo="opacity-0 translate-y-1" + > + <PopoverPanel className="absolute right-0 mt-2 w-64 rounded-xl shadow-xl bg-light-primary dark:bg-dark-primary border border-light-200 dark:border-dark-200 z-50"> + <div className="flex flex-col py-3 px-3 gap-2"> + <button + className="flex items-center gap-2 px-4 py-2 text-left hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors text-black dark:text-white rounded-lg font-medium" + onClick={() => exportAsMarkdown(messages, title || '')} + > + <FileText size={17} className="text-[#24A0ED]" /> + Export as Markdown + </button> + <button + className="flex items-center gap-2 px-4 py-2 text-left hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors text-black dark:text-white rounded-lg font-medium" + onClick={() => exportAsPDF(messages, title || '')} + > + <FileDown size={17} className="text-[#24A0ED]" /> + Export as PDF + </button> + </div> + </PopoverPanel> + </Transition> + </Popover> <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} /> </div> </div> diff --git a/yarn.lock b/yarn.lock index 921186b..58b53ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,6 +40,11 @@ node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.26.7": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.3.tgz#10491113799fb8d77e1d9273384d5d68deeea8f6" + integrity sha512-7EYtGezsdiDMyY80+65EzwiGmcJqpmcZCojSXaRgdrBaGtWTgDZKq69cPIVped6MkIM78cTQ2GOiEYjwOlG4xw== + "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" @@ -966,6 +971,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jspdf@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/jspdf/-/jspdf-2.0.0.tgz#c64d63e9248a62849902085c1cd4753b33f8ee0c" + integrity sha512-oonYDXI4GegGaG7FFVtriJ+Yqlh4YR3L3NVDiwCEBVG7sbya19SoGx4MW4kg1MCMRPgkbbFTck8YKJL8PrkDfA== + dependencies: + jspdf "*" + "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" @@ -1010,6 +1022,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== +"@types/raf@^3.4.0": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04" + integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw== + "@types/react-dom@^18": version "18.2.24" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" @@ -1035,6 +1052,11 @@ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/uuid@^10.0.0": version "10.0.0" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" @@ -1317,6 +1339,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + autoprefixer@^10.0.1: version "10.4.19" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" @@ -1405,6 +1432,11 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1476,6 +1508,11 @@ browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1532,6 +1569,20 @@ caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== +canvg@^3.0.11: + version "3.0.11" + resolved "https://registry.yarnpkg.com/canvg/-/canvg-3.0.11.tgz#4b4290a6c7fa36871fac2b14e432eff33b33cf2b" + integrity sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA== + dependencies: + "@babel/runtime" "^7.12.5" + "@types/raf" "^3.4.0" + core-js "^3.8.3" + raf "^3.4.1" + regenerator-runtime "^0.13.7" + rgbcolor "^1.0.1" + stackblur-canvas "^2.0.0" + svg-pathdata "^6.0.3" + chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -1691,6 +1742,11 @@ console-table-printer@^2.12.1: dependencies: simple-wcswidth "^1.0.1" +core-js@^3.6.0, core-js@^3.8.3: + version "3.42.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37" + integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g== + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1705,6 +1761,13 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== +css-line-break@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== + dependencies: + utrie "^1.0.2" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -1881,6 +1944,13 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^3.2.4: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" + integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^3.0.1: version "3.2.2" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" @@ -2424,6 +2494,11 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +fflate@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2761,6 +2836,14 @@ html-to-text@^9.0.5: htmlparser2 "^8.0.2" selderee "^0.11.0" +html2canvas@^1.0.0-rc.5: + version "1.4.1" + resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== + dependencies: + css-line-break "^2.1.0" + text-segmentation "^1.0.3" + htmlparser2@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" @@ -3123,6 +3206,21 @@ jsonpointer@^5.0.1: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== +jspdf@*, jspdf@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-3.0.1.tgz#d81e1964f354f60412516eb2449ea2cccd4d2a3b" + integrity sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg== + dependencies: + "@babel/runtime" "^7.26.7" + atob "^2.1.2" + btoa "^1.2.1" + fflate "^0.8.1" + optionalDependencies: + canvg "^3.0.11" + core-js "^3.6.0" + dompurify "^3.2.4" + html2canvas "^1.0.0-rc.5" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -3823,6 +3921,11 @@ peberminta@^0.9.0: resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -4002,6 +4105,13 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -4082,6 +4192,11 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +regenerator-runtime@^0.13.7: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" @@ -4135,6 +4250,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rgbcolor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" + integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -4370,6 +4490,11 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +stackblur-canvas@^2.0.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz#af931277d0b5096df55e1f91c530043e066989b6" + integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -4538,6 +4663,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-pathdata@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac" + integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw== + tabbable@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" @@ -4636,6 +4766,13 @@ text-hex@1.0.x: resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== +text-segmentation@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== + dependencies: + utrie "^1.0.2" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -4822,6 +4959,13 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utrie@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== + dependencies: + base64-arraybuffer "^1.0.2" + uuid@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" From 41fc5274ffc2fa6563db18c8aad94cccd0e0a627 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 29 May 2025 19:13:20 +0530 Subject: [PATCH 224/282] feat(package): update package files --- package.json | 4 +- yarn.lock | 152 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 151 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 147348c..a8fd416 100644 --- a/package.json +++ b/package.json @@ -30,9 +30,10 @@ "compute-dot": "^1.1.0", "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", + "jspdf": "^3.0.1", "langchain": "^0.1.30", "lucide-react": "^0.363.0", - "mammoth": "^1.7.0", + "mammoth": "^1.9.1", "markdown-to-jsx": "^7.7.2", "next": "^15.2.2", "next-themes": "^0.3.0", @@ -50,6 +51,7 @@ "devDependencies": { "@types/better-sqlite3": "^7.6.12", "@types/html-to-text": "^9.0.4", + "@types/jspdf": "^2.0.0", "@types/node": "^20", "@types/pdf-parse": "^1.1.4", "@types/react": "^18", diff --git a/yarn.lock b/yarn.lock index ffd6648..f2b847c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,6 +40,11 @@ node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.26.7": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.3.tgz#10491113799fb8d77e1d9273384d5d68deeea8f6" + integrity sha512-7EYtGezsdiDMyY80+65EzwiGmcJqpmcZCojSXaRgdrBaGtWTgDZKq69cPIVped6MkIM78cTQ2GOiEYjwOlG4xw== + "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" @@ -966,6 +971,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jspdf@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/jspdf/-/jspdf-2.0.0.tgz#c64d63e9248a62849902085c1cd4753b33f8ee0c" + integrity sha512-oonYDXI4GegGaG7FFVtriJ+Yqlh4YR3L3NVDiwCEBVG7sbya19SoGx4MW4kg1MCMRPgkbbFTck8YKJL8PrkDfA== + dependencies: + jspdf "*" + "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" @@ -1010,6 +1022,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== +"@types/raf@^3.4.0": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04" + integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw== + "@types/react-dom@^18": version "18.2.24" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" @@ -1035,6 +1052,11 @@ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/uuid@^10.0.0": version "10.0.0" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" @@ -1329,6 +1351,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + autoprefixer@^10.0.1: version "10.4.19" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" @@ -1417,6 +1444,11 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1493,6 +1525,11 @@ browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1549,6 +1586,20 @@ caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== +canvg@^3.0.11: + version "3.0.11" + resolved "https://registry.yarnpkg.com/canvg/-/canvg-3.0.11.tgz#4b4290a6c7fa36871fac2b14e432eff33b33cf2b" + integrity sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA== + dependencies: + "@babel/runtime" "^7.12.5" + "@types/raf" "^3.4.0" + core-js "^3.8.3" + raf "^3.4.1" + regenerator-runtime "^0.13.7" + rgbcolor "^1.0.1" + stackblur-canvas "^2.0.0" + svg-pathdata "^6.0.3" + chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -1708,6 +1759,11 @@ console-table-printer@^2.12.1: dependencies: simple-wcswidth "^1.0.1" +core-js@^3.6.0, core-js@^3.8.3: + version "3.42.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37" + integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -1727,6 +1783,13 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== +css-line-break@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== + dependencies: + utrie "^1.0.2" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -1908,6 +1971,13 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^3.2.4: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" + integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^3.0.1: version "3.2.2" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" @@ -2458,6 +2528,11 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +fflate@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2795,6 +2870,14 @@ html-to-text@^9.0.5: htmlparser2 "^8.0.2" selderee "^0.11.0" +html2canvas@^1.0.0-rc.5: + version "1.4.1" + resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== + dependencies: + css-line-break "^2.1.0" + text-segmentation "^1.0.3" + htmlparser2@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" @@ -3167,6 +3250,21 @@ jsonpointer@^5.0.1: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== +jspdf@*, jspdf@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-3.0.1.tgz#d81e1964f354f60412516eb2449ea2cccd4d2a3b" + integrity sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg== + dependencies: + "@babel/runtime" "^7.26.7" + atob "^2.1.2" + btoa "^1.2.1" + fflate "^0.8.1" + optionalDependencies: + canvg "^3.0.11" + core-js "^3.6.0" + dompurify "^3.2.4" + html2canvas "^1.0.0-rc.5" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -3388,10 +3486,10 @@ lucide-react@^0.363.0: resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== -mammoth@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.9.0.tgz#71e34ca280735275788bfe95e653a058dcab4df2" - integrity sha512-F+0NxzankQV9XSUAuVKvkdQK0GbtGGuqVnND9aVf9VSeUA82LQa29GjLqYU6Eez8LHqSJG3eGiDW3224OKdpZg== +mammoth@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.9.1.tgz#b544c26747a412b5b00a11aa80477c6796860eaf" + integrity sha512-4S2v1eP4Yo4so0zGNicJKcP93su3wDPcUk+xvkjSG75nlNjSkDJu8BhWQ+e54BROM0HfA6nPzJn12S6bq2Ko6w== dependencies: "@xmldom/xmldom" "^0.8.6" argparse "~1.0.3" @@ -3919,6 +4017,11 @@ peberminta@^0.9.0: resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -4103,6 +4206,13 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -4196,6 +4306,11 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +regenerator-runtime@^0.13.7: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" @@ -4249,6 +4364,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rgbcolor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" + integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -4499,6 +4619,11 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +stackblur-canvas@^2.0.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz#af931277d0b5096df55e1f91c530043e066989b6" + integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -4674,6 +4799,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-pathdata@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac" + integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw== + tabbable@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" @@ -4772,6 +4902,13 @@ text-hex@1.0.x: resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== +text-segmentation@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== + dependencies: + utrie "^1.0.2" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -4963,6 +5100,13 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utrie@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== + dependencies: + base64-arraybuffer "^1.0.2" + uuid@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" From 91306dc0c7b49c50f0af573855a7fdc898a1df17 Mon Sep 17 00:00:00 2001 From: alckasoc <tuvincent0106@gmail.com> Date: Thu, 29 May 2025 18:26:36 -0700 Subject: [PATCH 225/282] update gemini 2.5 pro key --- src/lib/providers/gemini.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 6cf2243..29b33b5 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -15,7 +15,7 @@ import { Embeddings } from '@langchain/core/embeddings'; const geminiChatModels: Record<string, string>[] = [ { displayName: 'Gemini 2.5 Pro Experimental', - key: 'gemini-2.5-pro-exp-03-25', + key: 'gemini-2.5-pro-preview-05-06', }, { displayName: 'Gemini 2.0 Flash', From 117a683d9a0cf7726aec24d5a0f688a7de00afa8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 08:34:47 +0530 Subject: [PATCH 226/282] feat(assets): add weather icons --- public/weather/clear-day.svg | 131 ++++++ public/weather/clear-night.svg | 159 ++++++++ public/weather/cloudy-1-day.svg | 178 +++++++++ public/weather/cloudy-1-night.svg | 206 ++++++++++ public/weather/fog-day.svg | 244 ++++++++++++ public/weather/fog-night.svg | 309 +++++++++++++++ public/weather/frost-day.svg | 204 ++++++++++ public/weather/frost-night.svg | 269 +++++++++++++ public/weather/rain-and-sleet-mix.svg | 141 +++++++ public/weather/rainy-1-day.svg | 179 +++++++++ public/weather/rainy-1-night.svg | 243 ++++++++++++ public/weather/rainy-2-day.svg | 204 ++++++++++ public/weather/rainy-2-night.svg | 256 ++++++++++++ public/weather/rainy-3-day.svg | 206 ++++++++++ public/weather/rainy-3-night.svg | 270 +++++++++++++ .../weather/scattered-thunderstorms-day.svg | 374 ++++++++++++++++++ .../weather/scattered-thunderstorms-night.svg | 283 +++++++++++++ public/weather/severe-thunderstorm.svg | 307 ++++++++++++++ public/weather/snowy-1-day.svg | 241 +++++++++++ public/weather/snowy-1-night.svg | 269 +++++++++++++ public/weather/snowy-2-day.svg | 273 +++++++++++++ public/weather/snowy-2-night.svg | 301 ++++++++++++++ public/weather/snowy-3-day.svg | 334 ++++++++++++++++ public/weather/snowy-3-night.svg | 361 +++++++++++++++++ 24 files changed, 5942 insertions(+) create mode 100644 public/weather/clear-day.svg create mode 100644 public/weather/clear-night.svg create mode 100644 public/weather/cloudy-1-day.svg create mode 100644 public/weather/cloudy-1-night.svg create mode 100644 public/weather/fog-day.svg create mode 100644 public/weather/fog-night.svg create mode 100644 public/weather/frost-day.svg create mode 100644 public/weather/frost-night.svg create mode 100644 public/weather/rain-and-sleet-mix.svg create mode 100644 public/weather/rainy-1-day.svg create mode 100644 public/weather/rainy-1-night.svg create mode 100644 public/weather/rainy-2-day.svg create mode 100644 public/weather/rainy-2-night.svg create mode 100644 public/weather/rainy-3-day.svg create mode 100644 public/weather/rainy-3-night.svg create mode 100644 public/weather/scattered-thunderstorms-day.svg create mode 100644 public/weather/scattered-thunderstorms-night.svg create mode 100644 public/weather/severe-thunderstorm.svg create mode 100644 public/weather/snowy-1-day.svg create mode 100644 public/weather/snowy-1-night.svg create mode 100644 public/weather/snowy-2-day.svg create mode 100644 public/weather/snowy-2-night.svg create mode 100644 public/weather/snowy-3-day.svg create mode 100644 public/weather/snowy-3-night.svg diff --git a/public/weather/clear-day.svg b/public/weather/clear-day.svg new file mode 100644 index 0000000..d97d28b --- /dev/null +++ b/public/weather/clear-day.svg @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.34167" y="-.34167" width="1.6833" height="1.85"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/clear-night.svg b/public/weather/clear-night.svg new file mode 100644 index 0000000..005ac63 --- /dev/null +++ b/public/weather/clear-night.svg @@ -0,0 +1,159 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.3038" y="-.3318" width="1.6076" height="1.894"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + ]]> + </style> + </defs> + <g id="night" transform="translate(-4,-18)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .78534 36 20.022)" stroke-width="1.2616"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5" fill="#ffa500" stroke-miterlimit="10" + stroke-width="1.4105" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5" + fill="#ffa500" stroke-miterlimit="10" stroke-width="1.4105" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2.5232" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/cloudy-1-day.svg b/public/weather/cloudy-1-day.svg new file mode 100644 index 0000000..823fea1 --- /dev/null +++ b/public/weather/cloudy-1-day.svg @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.28472" width="1.403" height="1.6944"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-2" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#c6deff" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/cloudy-1-night.svg b/public/weather/cloudy-1-night.svg new file mode 100644 index 0000000..3fe1541 --- /dev/null +++ b/public/weather/cloudy-1-night.svg @@ -0,0 +1,206 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.19471" y="-.26087" width="1.3744" height="1.6884"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-2" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#c6deff" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/fog-day.svg b/public/weather/fog-day.svg new file mode 100644 index 0000000..ed834cf --- /dev/null +++ b/public/weather/fog-day.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** FOG +*/ + @keyframes am-weather-fog-1 { + 0% { + transform: translate(0px, 0px) + } + + 50% { + transform: translate(7px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-1 { + -webkit-animation-name: am-weather-fog-1; + -moz-animation-name: am-weather-fog-1; + -ms-animation-name: am-weather-fog-1; + animation-name: am-weather-fog-1; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-2 { + 0% { + transform: translate(0px, 0px) + } + + 21.05% { + transform: translate(-6px, 0px) + } + + 78.95% { + transform: translate(9px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-2 { + -webkit-animation-name: am-weather-fog-2; + -moz-animation-name: am-weather-fog-2; + -ms-animation-name: am-weather-fog-2; + animation-name: am-weather-fog-2; + -webkit-animation-duration: 20s; + -moz-animation-duration: 20s; + -ms-animation-duration: 20s; + animation-duration: 20s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-3 { + 0% { + transform: translate(0px, 0px) + } + + 25% { + transform: translate(4px, 0px) + } + + 75% { + transform: translate(-4px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-3 { + -webkit-animation-name: am-weather-fog-3; + -moz-animation-name: am-weather-fog-3; + -ms-animation-name: am-weather-fog-3; + animation-name: am-weather-fog-3; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-4 { + 0% { + transform: translate(0px, 0px) + } + + 50% { + transform: translate(-4px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-4 { + -webkit-animation-name: am-weather-fog-4; + -moz-animation-name: am-weather-fog-4; + -ms-animation-name: am-weather-fog-4; + animation-name: am-weather-fog-4; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" transform="translate(0,16)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" />F + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffc04a" stroke="#ffc04a" stroke-width="2" /> + </g> + </g> + <g class="am-weather-fog" transform="translate(-10,20)" fill="none" stroke="#c6deff" stroke-linecap="round" + stroke-width="2"> + <line class="am-weather-fog-1" y1="0" y2="0" x1="1" x2="37" stroke-dasharray="3, 5, 17, 5, 7" /> + <line class="am-weather-fog-2" y1="5" y2="5" x1="9" x2="33" stroke-dasharray="11, 7, 15" /> + <line class="am-weather-fog-3" y1="10" y2="10" x1="5" x2="40" stroke-dasharray="11, 7, 3, 5, 9" /> + <line class="am-weather-fog-4" y1="15" y2="15" x1="7" x2="42" stroke-dasharray="13, 5, 9, 5, 3" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/fog-night.svg b/public/weather/fog-night.svg new file mode 100644 index 0000000..d59f98f --- /dev/null +++ b/public/weather/fog-night.svg @@ -0,0 +1,309 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** FOG +*/ + @keyframes am-weather-fog-1 { + 0% { + transform: translate(0px, 0px) + } + + 50% { + transform: translate(7px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-1 { + -webkit-animation-name: am-weather-fog-1; + -moz-animation-name: am-weather-fog-1; + -ms-animation-name: am-weather-fog-1; + animation-name: am-weather-fog-1; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-2 { + 0% { + transform: translate(0px, 0px) + } + + 21.05% { + transform: translate(-6px, 0px) + } + + 78.95% { + transform: translate(9px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-2 { + -webkit-animation-name: am-weather-fog-2; + -moz-animation-name: am-weather-fog-2; + -ms-animation-name: am-weather-fog-2; + animation-name: am-weather-fog-2; + -webkit-animation-duration: 20s; + -moz-animation-duration: 20s; + -ms-animation-duration: 20s; + animation-duration: 20s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-3 { + 0% { + transform: translate(0px, 0px) + } + + 25% { + transform: translate(4px, 0px) + } + + 75% { + transform: translate(-4px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-3 { + -webkit-animation-name: am-weather-fog-3; + -moz-animation-name: am-weather-fog-3; + -ms-animation-name: am-weather-fog-3; + animation-name: am-weather-fog-3; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-4 { + 0% { + transform: translate(0px, 0px) + } + + 50% { + transform: translate(-4px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-4 { + -webkit-animation-name: am-weather-fog-4; + -moz-animation-name: am-weather-fog-4; + -ms-animation-name: am-weather-fog-4; + animation-name: am-weather-fog-4; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffc04a" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffc04a" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffc04a" stroke="#ffc04a" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-fog" transform="translate(-10,20)" fill="none" stroke="#c6deff" stroke-linecap="round" + stroke-width="2"> + <line class="am-weather-fog-1" y1="0" y2="0" x1="1" x2="37" stroke-dasharray="3, 5, 17, 5, 7" /> + <line class="am-weather-fog-2" y1="5" y2="5" x1="9" x2="33" stroke-dasharray="11, 7, 15" /> + <line class="am-weather-fog-3" y1="10" y2="10" x1="5" x2="40" stroke-dasharray="11, 7, 3, 5, 9" /> + <line class="am-weather-fog-4" y1="15" y2="15" x1="7" x2="42" stroke-dasharray="13, 5, 9, 5, 3" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/frost-day.svg b/public/weather/frost-day.svg new file mode 100644 index 0000000..16d591c --- /dev/null +++ b/public/weather/frost-day.svg @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** FROST +*/ + @keyframes am-weather-frost { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 1% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 3% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 5% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 7% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 9% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 11% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 13% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 15% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-frost { + -webkit-animation-name: am-weather-frost; + -moz-animation-name: am-weather-frost; + animation-name: am-weather-frost; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" transform="translate(0,16)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" />F + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffc04a" stroke="#ffc04a" stroke-width="2" /> + </g> + </g> + <g transform="translate(-16,4)"> + <g class="am-weather-frost" stroke="#57a0ee" transform="translate(0,2)" fill="none" stroke-width="2" + stroke-linecap="round" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-frost;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-frost;-webkit-animation-timing-function:linear"> + <path d="M11,32H45" /> + <path d="M15.5,37H40.5" /> + <path d="M22.5,42H33.5" /> + </g> + <g> + <path stroke="#57a0ee" transform="translate(0,0)" fill="none" stroke-width="2" stroke-linecap="round" + d="M28,31V9M28,22l11,-3.67M34,20l2,-4M34,20l4,2M28,22l-11,-3.67M22,20l-2,-4M22,20l-4,2M28,14.27l3.01,-3.02M28,14.27l-3.01,-3.02" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/frost-night.svg b/public/weather/frost-night.svg new file mode 100644 index 0000000..ff2c8dc --- /dev/null +++ b/public/weather/frost-night.svg @@ -0,0 +1,269 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** FROST +*/ + @keyframes am-weather-frost { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 1% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 3% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 5% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 7% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 9% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 11% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 13% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 15% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-frost { + -webkit-animation-name: am-weather-frost; + -moz-animation-name: am-weather-frost; + animation-name: am-weather-frost; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffc04a" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffc04a" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffc04a" stroke="#ffc04a" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g transform="translate(-16,4)"> + <g class="am-weather-frost" stroke="#57a0ee" transform="translate(0,2)" fill="none" stroke-width="2" + stroke-linecap="round" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-frost;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-frost;-webkit-animation-timing-function:linear"> + <path d="M11,32H45" /> + <path d="M15.5,37H40.5" /> + <path d="M22.5,42H33.5" /> + </g> + <g> + <path stroke="#57a0ee" transform="translate(0,0)" fill="none" stroke-width="2" stroke-linecap="round" + d="M28,31V9M28,22l11,-3.67M34,20l2,-4M34,20l4,2M28,22l-11,-3.67M22,20l-2,-4M22,20l-4,2M28,14.27l3.01,-3.02M28,14.27l-3.01,-3.02" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rain-and-sleet-mix.svg b/public/weather/rain-and-sleet-mix.svg new file mode 100644 index 0000000..172010d --- /dev/null +++ b/public/weather/rain-and-sleet-mix.svg @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<!-- Mix of Rain and Sleet | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.22776" width="1.4937" height="1.5756"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-3 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-3 { + -webkit-animation-name: am-weather-cloud-3; + -moz-animation-name: am-weather-cloud-3; + animation-name: am-weather-cloud-3; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-3;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-3;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-sleet-2" transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8" + stroke-linecap="round"> + <line class="am-weather-rain-1" transform="translate(-5,1)" y2="8" stroke-dasharray="0.1, 7" stroke-width="2" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-1" transform="translate(5)" y2="8" stroke-dasharray="0.1, 7" stroke-width="2" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + <g class="am-weather-rain-3" transform="translate(-20,-10) rotate(10,-245.89,217.31)" fill="none" stroke="#91c0f8" + stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-13,1)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-1" transform="translate(-3,2)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(7,-1)" y2="8" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-1-day.svg b/public/weather/rainy-1-day.svg new file mode 100644 index 0000000..2faf06e --- /dev/null +++ b/public/weather/rainy-1-day.svg @@ -0,0 +1,179 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-rain-1" transform="translate(-20,-10) rotate(10,-238.68,233.96)"> + <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8" fill="none" stroke="#91c0f8" + stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-1-night.svg b/public/weather/rainy-1-night.svg new file mode 100644 index 0000000..ee8ffd8 --- /dev/null +++ b/public/weather/rainy-1-night.svg @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weaher-rain-1" transform="translate(-20,-10) rotate(10,-238.68,233.96)"> + <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8" fill="none" stroke="#91c0f8" + stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-2-day.svg b/public/weather/rainy-2-day.svg new file mode 100644 index 0000000..affdfff --- /dev/null +++ b/public/weather/rainy-2-day.svg @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.20592" width="1.403" height="1.4872"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" stroke="#ffa500" stroke-linecap="round" stroke-width="2" fifll="none" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g transform="translate(-20,-10) rotate(10,-245.89,217.31)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 7" stroke-linecap="round" + stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-2-night.svg b/public/weather/rainy-2-night.svg new file mode 100644 index 0000000..9c3ae20 --- /dev/null +++ b/public/weather/rainy-2-night.svg @@ -0,0 +1,256 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g class="layer" transform="translate(16,-2)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-rain-2" transform="translate(-20,-10) rotate(10,34,46)" fill="none" stroke="#91c0f8" + stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-6,1)" x1="34" x2="34" y1="46" y2="54" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(0,-1)" x1="34" x2="34" y1="46" y2="54" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-3-day.svg b/public/weather/rainy-3-day.svg new file mode 100644 index 0000000..b0b5754 --- /dev/null +++ b/public/weather/rainy-3-day.svg @@ -0,0 +1,206 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.22892" width="1.4937" height="1.5576"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" stroke="#ffa500" stroke-linecap="round" stroke-width="2" fifll="none" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 4" + stroke-linecap="round" stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-4,1)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-1" transform="translate(4)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-3-night.svg b/public/weather/rainy-3-night.svg new file mode 100644 index 0000000..4078e7d --- /dev/null +++ b/public/weather/rainy-3-night.svg @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.22892" width="1.4937" height="1.5576"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 4" + stroke-linecap="round" stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-4,1)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-1" transform="translate(4)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/scattered-thunderstorms-day.svg b/public/weather/scattered-thunderstorms-day.svg new file mode 100644 index 0000000..0cfbccc --- /dev/null +++ b/public/weather/scattered-thunderstorms-day.svg @@ -0,0 +1,374 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<!-- Scattered Thunderstorms | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.1975" width="1.403" height="1.4766"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-3 { + 0% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + + 50% { + -webkit-transform: translate(10px, 0px); + -moz-transform: translate(10px, 0px); + -ms-transform: translate(10px, 0px); + transform: translate(10px, 0px); + } + + 100% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + } + + .am-weather-cloud-3 { + -webkit-animation-name: am-weather-cloud-3; + -moz-animation-name: am-weather-cloud-3; + animation-name: am-weather-cloud-3; + -webkit-animation-duration: 7s; + -moz-animation-duration: 7s; + animation-duration: 7s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** STROKE +*/ + @keyframes am-weather-stroke { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 2% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 4% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 6% { + -webkit-transform: translate(0.5px, 0.4px); + -moz-transform: translate(0.5px, 0.4px); + -ms-transform: translate(0.5px, 0.4px); + transform: translate(0.5px, 0.4px); + } + + 8% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 10% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 12% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 14% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 18% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 20% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 22% { + -webkit-transform: translate(1px, 0.0px); + -moz-transform: translate(1px, 0.0px); + -ms-transform: translate(1px, 0.0px); + transform: translate(1px, 0.0px); + } + + 24% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 26% { + -webkit-transform: translate(-1px, 0.0px); + -moz-transform: translate(-1px, 0.0px); + -ms-transform: translate(-1px, 0.0px); + transform: translate(-1px, 0.0px); + + } + + 28% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 40% { + fill: orange; + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 65% { + fill: white; + -webkit-transform: translate(-1px, 5.0px); + -moz-transform: translate(-1px, 5.0px); + -ms-transform: translate(-1px, 5.0px); + transform: translate(-1px, 5.0px); + } + + 61% { + fill: orange; + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-stroke { + -webkit-animation-name: am-weather-stroke; + -moz-animation-name: am-weather-stroke; + animation-name: am-weather-stroke; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g id="thunder" transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-lightning" transform="matrix(1.2,0,0,1.2,-4,28)"> + <polygon class="am-weather-stroke" points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9" + fill="#ffa500" stroke="#fff" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/scattered-thunderstorms-night.svg b/public/weather/scattered-thunderstorms-night.svg new file mode 100644 index 0000000..72cf7a6 --- /dev/null +++ b/public/weather/scattered-thunderstorms-night.svg @@ -0,0 +1,283 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<!-- Scattered Thunderstorms | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.1975" width="1.403" height="1.4766"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-3 { + 0% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + + 50% { + -webkit-transform: translate(10px, 0px); + -moz-transform: translate(10px, 0px); + -ms-transform: translate(10px, 0px); + transform: translate(10px, 0px); + } + + 100% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + } + + .am-weather-cloud-3 { + -webkit-animation-name: am-weather-cloud-3; + -moz-animation-name: am-weather-cloud-3; + animation-name: am-weather-cloud-3; + -webkit-animation-duration: 7s; + -moz-animation-duration: 7s; + animation-duration: 7s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** STROKE +*/ + @keyframes am-weather-stroke { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 2% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 4% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 6% { + -webkit-transform: translate(0.5px, 0.4px); + -moz-transform: translate(0.5px, 0.4px); + -ms-transform: translate(0.5px, 0.4px); + transform: translate(0.5px, 0.4px); + } + + 8% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 10% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 12% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 14% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 18% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 20% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 22% { + -webkit-transform: translate(1px, 0.0px); + -moz-transform: translate(1px, 0.0px); + -ms-transform: translate(1px, 0.0px); + transform: translate(1px, 0.0px); + } + + 24% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 26% { + -webkit-transform: translate(-1px, 0.0px); + -moz-transform: translate(-1px, 0.0px); + -ms-transform: translate(-1px, 0.0px); + transform: translate(-1px, 0.0px); + + } + + 28% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 40% { + fill: orange; + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 65% { + fill: white; + -webkit-transform: translate(-1px, 5.0px); + -moz-transform: translate(-1px, 5.0px); + -ms-transform: translate(-1px, 5.0px); + transform: translate(-1px, 5.0px); + } + + 61% { + fill: orange; + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-stroke { + -webkit-animation-name: am-weather-stroke; + -moz-animation-name: am-weather-stroke; + animation-name: am-weather-stroke; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g id="thunder" transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-lightning" transform="matrix(1.2,0,0,1.2,-4,28)"> + <polygon class="am-weather-stroke" points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9" + fill="#ffa500" stroke="#fff" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/severe-thunderstorm.svg b/public/weather/severe-thunderstorm.svg new file mode 100644 index 0000000..223198b --- /dev/null +++ b/public/weather/severe-thunderstorm.svg @@ -0,0 +1,307 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<!-- Severe Thunderstorm | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.17571" y="-.19575" width="1.3379" height="1.4959"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-3 { + 0% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + + 50% { + -webkit-transform: translate(10px, 0px); + -moz-transform: translate(10px, 0px); + -ms-transform: translate(10px, 0px); + transform: translate(10px, 0px); + } + + 100% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + } + + .am-weather-cloud-3 { + -webkit-animation-name: am-weather-cloud-3; + -moz-animation-name: am-weather-cloud-3; + animation-name: am-weather-cloud-3; + -webkit-animation-duration: 7s; + -moz-animation-duration: 7s; + animation-duration: 7s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-cloud-1 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-1 { + -webkit-animation-name: am-weather-cloud-1; + -moz-animation-name: am-weather-cloud-1; + animation-name: am-weather-cloud-1; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** STROKE +*/ + + @keyframes am-weather-stroke { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 2% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 4% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 6% { + -webkit-transform: translate(0.5px, 0.4px); + -moz-transform: translate(0.5px, 0.4px); + -ms-transform: translate(0.5px, 0.4px); + transform: translate(0.5px, 0.4px); + } + + 8% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 10% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 12% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 14% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 18% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 20% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 22% { + -webkit-transform: translate(1px, 0.0px); + -moz-transform: translate(1px, 0.0px); + -ms-transform: translate(1px, 0.0px); + transform: translate(1px, 0.0px); + } + + 24% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 26% { + -webkit-transform: translate(-1px, 0.0px); + -moz-transform: translate(-1px, 0.0px); + -ms-transform: translate(-1px, 0.0px); + transform: translate(-1px, 0.0px); + } + + 28% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 40% { + fill: orange; + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 65% { + fill: white; + -webkit-transform: translate(-1px, 5.0px); + -moz-transform: translate(-1px, 5.0px); + -ms-transform: translate(-1px, 5.0px); + transform: translate(-1px, 5.0px); + } + + 61% { + fill: orange; + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-stroke { + -webkit-animation-name: am-weather-stroke; + -moz-animation-name: am-weather-stroke; + animation-name: am-weather-stroke; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes error { + 0% { + fill: #cc0000; + } + + 50% { + fill: #ff0000; + } + + 100% { + fill: #cc0000; + } + } + + #Shape { + -webkit-animation-name: error; + -moz-animation-name: error; + animation-name: error; + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g class="am-weather-cloud-1" + style="-moz-animation-duration:7s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-1;-moz-animation-timing-function:linear;-webkit-animation-duration:7s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-1;-webkit-animation-timing-function:linear"> + <path transform="matrix(.6 0 0 .6 -10 -6)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#666" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-cloud-3"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#333" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g transform="matrix(1.2,0,0,1.2,-4,28)"> + <polygon class="am-weather-stroke" + points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9" fill="#ffa500" stroke="#fff" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" /> + </g> + <g class="warning" transform="translate(20,30)"> + <path + d="m7.7791 2.906-5.9912 10.117c-0.56283 0.95042-0.24862 2.1772 0.7018 2.74 0.30853 0.18271 0.66051 0.27911 1.0191 0.27911h11.982c1.1046 0 2-0.89543 2-2 0-0.35857-0.0964-0.71056-0.27911-1.0191l-5.9912-10.117c-0.56283-0.95042-1.7896-1.2646-2.74-0.7018-0.28918 0.17125-0.53055 0.41262-0.7018 0.7018z" + fill="#c00" /> + <path d="m9.5 10.5v-5" stroke="#fff" stroke-linecap="round" stroke-width="1.5" /> + <circle cx="9.5" cy="13" r="1" fill="#fff" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-1-day.svg b/public/weather/snowy-1-day.svg new file mode 100644 index 0000000..fb73943 --- /dev/null +++ b/public/weather/snowy-1-day.svg @@ -0,0 +1,241 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" transform="translate(0,16)" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(12,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-1-night.svg b/public/weather/snowy-1-night.svg new file mode 100644 index 0000000..039ea2e --- /dev/null +++ b/public/weather/snowy-1-night.svg @@ -0,0 +1,269 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(12,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-2-day.svg b/public/weather/snowy-2-day.svg new file mode 100644 index 0000000..323a616 --- /dev/null +++ b/public/weather/snowy-2-day.svg @@ -0,0 +1,273 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-2 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-delay: 1.2s; + -moz-animation-delay: 1.2s; + -ms-animation-delay: 1.2s; + animation-delay: 1.2s; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(7,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-2" + style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(16,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-2-night.svg b/public/weather/snowy-2-night.svg new file mode 100644 index 0000000..10dcbfa --- /dev/null +++ b/public/weather/snowy-2-night.svg @@ -0,0 +1,301 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-2 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-delay: 1.2s; + -moz-animation-delay: 1.2s; + -ms-animation-delay: 1.2s; + animation-delay: 1.2s; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(7,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-2" + style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(16,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-3-day.svg b/public/weather/snowy-3-day.svg new file mode 100644 index 0000000..846c17a --- /dev/null +++ b/public/weather/snowy-3-day.svg @@ -0,0 +1,334 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.26897" width="1.4937" height="1.6759"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + @keyframes am-weather-snow-reverse { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(1.2px) translateY(2px); + -moz-transform: translateX(1.2px) translateY(2px); + -ms-transform: translateX(1.2px) translateY(2px); + transform: translateX(1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(-1.4px) translateY(4px); + -moz-transform: translateX(-1.4px) translateY(4px); + -ms-transform: translateX(-1.4px) translateY(4px); + transform: translateX(-1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(1.6px) translateY(6px); + -moz-transform: translateX(1.6px) translateY(6px); + -ms-transform: translateX(1.6px) translateY(6px); + transform: translateX(1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-2 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-delay: 1.2s; + -moz-animation-delay: 1.2s; + -ms-animation-delay: 1.2s; + animation-delay: 1.2s; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-3 { + -webkit-animation-name: am-weather-snow-reverse; + -moz-animation-name: am-weather-snow-reverse; + -ms-animation-name: am-weather-snow-reverse; + animation-name: am-weather-snow-reverse; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + <g class="am-weather-cloud-2" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(3,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-2" + style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(11,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-3" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow-reverse;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow-reverse;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow-reverse;-webkit-animation-timing-function:linear"> + <g transform="translate(20,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-3-night.svg b/public/weather/snowy-3-night.svg new file mode 100644 index 0000000..b3c8c24 --- /dev/null +++ b/public/weather/snowy-3-night.svg @@ -0,0 +1,361 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.26897" width="1.4937" height="1.6759"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + @keyframes am-weather-snow-reverse { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(1.2px) translateY(2px); + -moz-transform: translateX(1.2px) translateY(2px); + -ms-transform: translateX(1.2px) translateY(2px); + transform: translateX(1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(-1.4px) translateY(4px); + -moz-transform: translateX(-1.4px) translateY(4px); + -ms-transform: translateX(-1.4px) translateY(4px); + transform: translateX(-1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(1.6px) translateY(6px); + -moz-transform: translateX(1.6px) translateY(6px); + -ms-transform: translateX(1.6px) translateY(6px); + transform: translateX(1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-2 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-delay: 1.2s; + -moz-animation-delay: 1.2s; + -ms-animation-delay: 1.2s; + animation-delay: 1.2s; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-3 { + -webkit-animation-name: am-weather-snow-reverse; + -moz-animation-name: am-weather-snow-reverse; + -ms-animation-name: am-weather-snow-reverse; + animation-name: am-weather-snow-reverse; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-2" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(3,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-2" + style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(11,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-3" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow-reverse;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow-reverse;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow-reverse;-webkit-animation-timing-function:linear"> + <g transform="translate(20,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file From 740ff941a57351d6200700b3e45aee112e720a3a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 08:35:15 +0530 Subject: [PATCH 227/282] feat(discover): add preview mode --- src/app/api/discover/route.ts | 59 ++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index 8c1f470..b1c761d 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -16,28 +16,43 @@ const topics = ['AI', 'tech']; /* TODO: Add UI to customize this */ export const GET = async (req: Request) => { try { - const data = ( - await Promise.all([ - ...new Array(articleWebsites.length * topics.length) - .fill(0) - .map(async (_, i) => { - return ( - await searchSearxng( - `site:${articleWebsites[i % articleWebsites.length]} ${ - topics[i % topics.length] - }`, - { - engines: ['bing news'], - pageno: 1, - }, - ) - ).results; - }), - ]) - ) - .map((result) => result) - .flat() - .sort(() => Math.random() - 0.5); + const params = new URL(req.url).searchParams; + const mode: 'normal' | 'preview' = + (params.get('mode') as 'normal' | 'preview') || 'normal'; + + let data = []; + + if (mode === 'normal') { + data = ( + await Promise.all([ + ...new Array(articleWebsites.length * topics.length) + .fill(0) + .map(async (_, i) => { + return ( + await searchSearxng( + `site:${articleWebsites[i % articleWebsites.length]} ${ + topics[i % topics.length] + }`, + { + engines: ['bing news'], + pageno: 1, + }, + ) + ).results; + }), + ]) + ) + .map((result) => result) + .flat() + .sort(() => Math.random() - 0.5); + } else { + data = ( + await searchSearxng( + `site:${articleWebsites[Math.floor(Math.random() * articleWebsites.length)]} ${topics[Math.floor(Math.random() * topics.length)]}`, + { engines: ['bing news'], pageno: 1 }, + ) + ).results; + } return Response.json( { From ccb72c8970691d1980692751bfc7ad2784b457cb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 08:36:08 +0530 Subject: [PATCH 228/282] feat(app): add weather widget --- src/app/api/weather/route.ts | 164 +++++++++++++++++++++++++++++++ src/components/EmptyChat.tsx | 10 +- src/components/WeatherWidget.tsx | 145 +++++++++++++++++++++++++++ 3 files changed, 316 insertions(+), 3 deletions(-) create mode 100644 src/app/api/weather/route.ts create mode 100644 src/components/WeatherWidget.tsx diff --git a/src/app/api/weather/route.ts b/src/app/api/weather/route.ts new file mode 100644 index 0000000..7594aa9 --- /dev/null +++ b/src/app/api/weather/route.ts @@ -0,0 +1,164 @@ +export const POST = async (req: Request) => { + try { + const body: { lat: number; lng: number } = await req.json(); + + if (!body.lat || !body.lng) { + return Response.json( + { + message: 'Invalid request.', + }, + { status: 400 }, + ); + } + + const res = await fetch( + `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto`, + ); + + const data = await res.json(); + + if (data.error) { + console.error(`Error fetching weather data: ${data.reason}`); + return Response.json( + { + message: 'An error has occurred.', + }, + { status: 500 }, + ); + } + + const weather: { + temperature: number; + condition: string; + humidity: number; + windSpeed: number; + icon: string; + } = { + temperature: data.current.temperature_2m, + condition: '', + humidity: data.current.relative_humidity_2m, + windSpeed: data.current.wind_speed_10m, + icon: '', + }; + + const code = data.current.weather_code; + const isDay = data.current.is_day === 1; + const dayOrNight = isDay ? 'day' : 'night'; + + switch (code) { + case 0: + weather.icon = `clear-${dayOrNight}`; + weather.condition = 'Clear'; + break; + + case 1: + weather.condition = 'Mainly Clear'; + case 2: + weather.condition = 'Partly Cloudy'; + case 3: + weather.icon = `cloudy-1-${dayOrNight}`; + weather.condition = 'Cloudy'; + break; + + case 45: + weather.condition = 'Fog'; + case 48: + weather.icon = `fog-${dayOrNight}`; + weather.condition = 'Fog'; + break; + + case 51: + weather.condition = 'Light Drizzle'; + case 53: + weather.condition = 'Moderate Drizzle'; + case 55: + weather.icon = `rainy-1-${dayOrNight}`; + weather.condition = 'Dense Drizzle'; + break; + + case 56: + weather.condition = 'Light Freezing Drizzle'; + case 57: + weather.icon = `frost-${dayOrNight}`; + weather.condition = 'Dense Freezing Drizzle'; + break; + + case 61: + weather.condition = 'Slight Rain'; + case 63: + weather.condition = 'Moderate Rain'; + case 65: + weather.condition = 'Heavy Rain'; + weather.icon = `rainy-2-${dayOrNight}`; + break; + + case 66: + weather.condition = 'Light Freezing Rain'; + case 67: + weather.condition = 'Heavy Freezing Rain'; + weather.icon = 'rain-and-sleet-mix'; + break; + + case 71: + weather.condition = 'Slight Snow Fall'; + case 73: + weather.condition = 'Moderate Snow Fall'; + case 75: + weather.condition = 'Heavy Snow Fall'; + weather.icon = `snowy-2-${dayOrNight}`; + break; + + case 77: + weather.condition = 'Snow'; + weather.icon = `snowy-1-${dayOrNight}`; + break; + + case 80: + weather.condition = 'Slight Rain Showers'; + case 81: + weather.condition = 'Moderate Rain Showers'; + case 82: + weather.condition = 'Heavy Rain Showers'; + weather.icon = `rainy-3-${dayOrNight}`; + break; + + case 85: + weather.condition = 'Slight Snow Showers'; + case 86: + weather.condition = 'Moderate Snow Showers'; + case 87: + weather.condition = 'Heavy Snow Showers'; + weather.icon = `snowy-3-${dayOrNight}`; + break; + + case 95: + weather.condition = 'Thunderstorm'; + weather.icon = `scattered-thunderstorms-${dayOrNight}`; + break; + + case 96: + weather.condition = 'Thunderstorm with Slight Hail'; + case 99: + weather.condition = 'Thunderstorm with Heavy Hail'; + weather.icon = 'severe-thunderstorm'; + break; + + default: + weather.icon = `clear-${dayOrNight}`; + weather.condition = 'Clear'; + break; + } + + return Response.json(weather); + } catch (err) { + console.error('An error occurred while getting home widgets', err); + return Response.json( + { + message: 'An error has occurred.', + }, + { + status: 500, + }, + ); + } +}; diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 838849f..8c6bdab 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -1,8 +1,9 @@ import { Settings } from 'lucide-react'; import EmptyChatMessageInput from './EmptyChatMessageInput'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { File } from './ChatWindow'; import Link from 'next/link'; +import WeatherWidget from './WeatherWidget'; const EmptyChat = ({ sendMessage, @@ -25,8 +26,6 @@ const EmptyChat = ({ files: File[]; setFiles: (files: File[]) => void; }) => { - const [isSettingsOpen, setIsSettingsOpen] = useState(false); - return ( <div className="relative"> <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5"> @@ -49,6 +48,11 @@ const EmptyChat = ({ files={files} setFiles={setFiles} /> + <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center"> + <div className="flex-1 max-w-xs"> + <WeatherWidget /> + </div> + </div> </div> </div> ); diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx new file mode 100644 index 0000000..afbc94e --- /dev/null +++ b/src/components/WeatherWidget.tsx @@ -0,0 +1,145 @@ +import { Cloud, Sun, CloudRain, CloudSnow, Wind } from 'lucide-react'; +import { useEffect, useState } from 'react'; + +const WeatherWidget = () => { + const [data, setData] = useState({ + temperature: 0, + condition: '', + location: '', + humidity: 0, + windSpeed: 0, + icon: '', + }); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const getApproxLocation = async () => { + const res = await fetch('https://ipwhois.app/json/'); + const data = await res.json(); + + return { + latitude: data.latitude, + longitude: data.longitude, + city: data.city, + }; + }; + + const getLocation = async ( + callback: (location: { + latitude: number; + longitude: number; + city: string; + }) => void, + ) => { + /* + // Geolocation doesn't give city so we'll country using ipapi for now + if (navigator.geolocation) { + const result = await navigator.permissions.query({ + name: 'geolocation', + }) + + if (result.state === 'granted') { + navigator.geolocation.getCurrentPosition(position => { + callback({ + latitude: position.coords.latitude, + longitude: position.coords.longitude, + }) + }) + } else if (result.state === 'prompt') { + callback(await getApproxLocation()) + navigator.geolocation.getCurrentPosition(position => {}) + } else if (result.state === 'denied') { + callback(await getApproxLocation()) + } + } else { + callback(await getApproxLocation()) + } */ + callback(await getApproxLocation()); + }; + + getLocation(async (location) => { + const res = await fetch(`/api/weather`, { + method: 'POST', + body: JSON.stringify({ + lat: location.latitude, + lng: location.longitude, + }), + }); + + const data = await res.json(); + + if (res.status !== 200) { + console.error('Error fetching weather data'); + setLoading(false); + return; + } + + setData({ + temperature: data.temperature, + condition: data.condition, + location: location.city, + humidity: data.humidity, + windSpeed: data.windSpeed, + icon: data.icon, + }); + setLoading(false); + }); + }, []); + + return ( + <div className="bg-light-secondary dark:bg-dark-secondary rounded-xl border border-light-200 dark:border-dark-200 shadow-sm flex flex-row items-center w-full h-24 min-h-[96px] max-h-[96px] px-3 py-2 gap-3"> + {loading ? ( + <> + <div className="flex flex-col items-center justify-center w-16 min-w-16 max-w-16 h-full animate-pulse"> + <div className="h-10 w-10 rounded-full bg-light-200 dark:bg-dark-200 mb-2" /> + <div className="h-4 w-10 rounded bg-light-200 dark:bg-dark-200" /> + </div> + <div className="flex flex-col justify-between flex-1 h-full py-1 animate-pulse"> + <div className="flex flex-row items-center justify-between"> + <div className="h-3 w-20 rounded bg-light-200 dark:bg-dark-200" /> + <div className="h-3 w-12 rounded bg-light-200 dark:bg-dark-200" /> + </div> + <div className="h-3 w-16 rounded bg-light-200 dark:bg-dark-200 mt-1" /> + <div className="flex flex-row justify-between w-full mt-auto pt-1 border-t border-light-200 dark:border-dark-200"> + <div className="h-3 w-16 rounded bg-light-200 dark:bg-dark-200" /> + <div className="h-3 w-8 rounded bg-light-200 dark:bg-dark-200" /> + </div> + </div> + </> + ) : ( + <> + <div className="flex flex-col items-center justify-center w-16 min-w-16 max-w-16 h-full"> + <img + src={`/weather/${data.icon}.svg`} + alt={data.condition} + className="h-10 w-auto" + /> + <span className="text-base font-semibold text-black dark:text-white"> + {data.temperature}°C + </span> + </div> + <div className="flex flex-col justify-between flex-1 h-full py-1"> + <div className="flex flex-row items-center justify-between"> + <span className="text-xs font-medium text-black dark:text-white"> + {data.location} + </span> + <span className="flex items-center text-xs text-black/60 dark:text-white/60"> + <Wind className="w-3 h-3 mr-1" /> + {data.windSpeed} km/h + </span> + </div> + <span className="text-xs text-black/60 dark:text-white/60 mt-1"> + {data.condition} + </span> + <div className="flex flex-row justify-between w-full mt-auto pt-1 border-t border-light-200 dark:border-dark-200 text-xs text-black/60 dark:text-white/60"> + <span>Humidity: {data.humidity}%</span> + <span>Now</span> + </div> + </div> + </> + )} + </div> + ); +}; + +export default WeatherWidget; From 2257e1df0cfd0a0dc4c3f296a57ab3db6d5c1b47 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 08:36:40 +0530 Subject: [PATCH 229/282] feat(empty-chat): add article widget --- src/components/EmptyChat.tsx | 4 ++ src/components/NewsArticleWidget.tsx | 71 ++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/components/NewsArticleWidget.tsx diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 8c6bdab..2a06d1d 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from 'react'; import { File } from './ChatWindow'; import Link from 'next/link'; import WeatherWidget from './WeatherWidget'; +import NewsArticleWidget from './NewsArticleWidget'; const EmptyChat = ({ sendMessage, @@ -52,6 +53,9 @@ const EmptyChat = ({ <div className="flex-1 max-w-xs"> <WeatherWidget /> </div> + <div className="flex-1 max-w-xs"> + <NewsArticleWidget /> + </div> </div> </div> </div> diff --git a/src/components/NewsArticleWidget.tsx b/src/components/NewsArticleWidget.tsx new file mode 100644 index 0000000..eca6940 --- /dev/null +++ b/src/components/NewsArticleWidget.tsx @@ -0,0 +1,71 @@ +import { useEffect, useState } from 'react'; + +interface Article { + title: string; + content: string; + url: string; + thumbnail: string; +} + +const NewsArticleWidget = () => { + const [article, setArticle] = useState<Article | null>(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + + useEffect(() => { + fetch('/api/discover?mode=preview') + .then((res) => res.json()) + .then((data) => { + const articles = (data.blogs || []).filter((a: Article) => a.thumbnail); + setArticle(articles[Math.floor(Math.random() * articles.length)]); + setLoading(false); + }) + .catch(() => { + setError(true); + setLoading(false); + }); + }, []); + + return ( + <div className="bg-light-secondary dark:bg-dark-secondary rounded-xl border border-light-200 dark:border-dark-200 shadow-sm flex flex-row items-center w-full h-24 min-h-[96px] max-h-[96px] px-3 py-2 gap-3 overflow-hidden"> + {loading ? ( + <> + <div className="animate-pulse flex flex-row items-center w-full h-full"> + <div className="rounded-lg w-16 min-w-16 max-w-16 h-16 min-h-16 max-h-16 bg-light-200 dark:bg-dark-200 mr-3" /> + <div className="flex flex-col justify-center flex-1 h-full w-0 gap-2"> + <div className="h-4 w-3/4 rounded bg-light-200 dark:bg-dark-200" /> + <div className="h-3 w-1/2 rounded bg-light-200 dark:bg-dark-200" /> + </div> + </div> + </> + ) : error ? ( + <div className="w-full text-xs text-red-400">Could not load news.</div> + ) : article ? ( + <a + href={`/?q=Summary: ${article.url}`} + className="flex flex-row items-center w-full h-full group" + > + <img + className="object-cover rounded-lg w-16 min-w-16 max-w-16 h-16 min-h-16 max-h-16 border border-light-200 dark:border-dark-200 bg-light-200 dark:bg-dark-200 group-hover:opacity-90 transition" + src={ + new URL(article.thumbnail).origin + + new URL(article.thumbnail).pathname + + `?id=${new URL(article.thumbnail).searchParams.get('id')}` + } + alt={article.title} + /> + <div className="flex flex-col justify-center flex-1 h-full pl-3 w-0"> + <div className="font-bold text-xs text-black dark:text-white leading-tight truncate overflow-hidden whitespace-nowrap"> + {article.title} + </div> + <p className="text-black/70 dark:text-white/70 text-xs leading-snug truncate overflow-hidden whitespace-nowrap"> + {article.content} + </p> + </div> + </a> + ) : null} + </div> + ); +}; + +export default NewsArticleWidget; From a86a1a461cabf9ca249f6863a2a8b52fa9cf7896 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 09:24:54 +0530 Subject: [PATCH 230/282] feat(weather-icons): rename `weather` to `weather-ico` --- public/{weather => weather-ico}/clear-day.svg | 0 public/{weather => weather-ico}/clear-night.svg | 0 public/{weather => weather-ico}/cloudy-1-day.svg | 0 public/{weather => weather-ico}/cloudy-1-night.svg | 0 public/{weather => weather-ico}/fog-day.svg | 0 public/{weather => weather-ico}/fog-night.svg | 0 public/{weather => weather-ico}/frost-day.svg | 0 public/{weather => weather-ico}/frost-night.svg | 0 public/{weather => weather-ico}/rain-and-sleet-mix.svg | 0 public/{weather => weather-ico}/rainy-1-day.svg | 0 public/{weather => weather-ico}/rainy-1-night.svg | 0 public/{weather => weather-ico}/rainy-2-day.svg | 0 public/{weather => weather-ico}/rainy-2-night.svg | 0 public/{weather => weather-ico}/rainy-3-day.svg | 0 public/{weather => weather-ico}/rainy-3-night.svg | 0 public/{weather => weather-ico}/scattered-thunderstorms-day.svg | 0 .../{weather => weather-ico}/scattered-thunderstorms-night.svg | 0 public/{weather => weather-ico}/severe-thunderstorm.svg | 0 public/{weather => weather-ico}/snowy-1-day.svg | 0 public/{weather => weather-ico}/snowy-1-night.svg | 0 public/{weather => weather-ico}/snowy-2-day.svg | 0 public/{weather => weather-ico}/snowy-2-night.svg | 0 public/{weather => weather-ico}/snowy-3-day.svg | 0 public/{weather => weather-ico}/snowy-3-night.svg | 0 src/components/WeatherWidget.tsx | 2 +- 25 files changed, 1 insertion(+), 1 deletion(-) rename public/{weather => weather-ico}/clear-day.svg (100%) rename public/{weather => weather-ico}/clear-night.svg (100%) rename public/{weather => weather-ico}/cloudy-1-day.svg (100%) rename public/{weather => weather-ico}/cloudy-1-night.svg (100%) rename public/{weather => weather-ico}/fog-day.svg (100%) rename public/{weather => weather-ico}/fog-night.svg (100%) rename public/{weather => weather-ico}/frost-day.svg (100%) rename public/{weather => weather-ico}/frost-night.svg (100%) rename public/{weather => weather-ico}/rain-and-sleet-mix.svg (100%) rename public/{weather => weather-ico}/rainy-1-day.svg (100%) rename public/{weather => weather-ico}/rainy-1-night.svg (100%) rename public/{weather => weather-ico}/rainy-2-day.svg (100%) rename public/{weather => weather-ico}/rainy-2-night.svg (100%) rename public/{weather => weather-ico}/rainy-3-day.svg (100%) rename public/{weather => weather-ico}/rainy-3-night.svg (100%) rename public/{weather => weather-ico}/scattered-thunderstorms-day.svg (100%) rename public/{weather => weather-ico}/scattered-thunderstorms-night.svg (100%) rename public/{weather => weather-ico}/severe-thunderstorm.svg (100%) rename public/{weather => weather-ico}/snowy-1-day.svg (100%) rename public/{weather => weather-ico}/snowy-1-night.svg (100%) rename public/{weather => weather-ico}/snowy-2-day.svg (100%) rename public/{weather => weather-ico}/snowy-2-night.svg (100%) rename public/{weather => weather-ico}/snowy-3-day.svg (100%) rename public/{weather => weather-ico}/snowy-3-night.svg (100%) diff --git a/public/weather/clear-day.svg b/public/weather-ico/clear-day.svg similarity index 100% rename from public/weather/clear-day.svg rename to public/weather-ico/clear-day.svg diff --git a/public/weather/clear-night.svg b/public/weather-ico/clear-night.svg similarity index 100% rename from public/weather/clear-night.svg rename to public/weather-ico/clear-night.svg diff --git a/public/weather/cloudy-1-day.svg b/public/weather-ico/cloudy-1-day.svg similarity index 100% rename from public/weather/cloudy-1-day.svg rename to public/weather-ico/cloudy-1-day.svg diff --git a/public/weather/cloudy-1-night.svg b/public/weather-ico/cloudy-1-night.svg similarity index 100% rename from public/weather/cloudy-1-night.svg rename to public/weather-ico/cloudy-1-night.svg diff --git a/public/weather/fog-day.svg b/public/weather-ico/fog-day.svg similarity index 100% rename from public/weather/fog-day.svg rename to public/weather-ico/fog-day.svg diff --git a/public/weather/fog-night.svg b/public/weather-ico/fog-night.svg similarity index 100% rename from public/weather/fog-night.svg rename to public/weather-ico/fog-night.svg diff --git a/public/weather/frost-day.svg b/public/weather-ico/frost-day.svg similarity index 100% rename from public/weather/frost-day.svg rename to public/weather-ico/frost-day.svg diff --git a/public/weather/frost-night.svg b/public/weather-ico/frost-night.svg similarity index 100% rename from public/weather/frost-night.svg rename to public/weather-ico/frost-night.svg diff --git a/public/weather/rain-and-sleet-mix.svg b/public/weather-ico/rain-and-sleet-mix.svg similarity index 100% rename from public/weather/rain-and-sleet-mix.svg rename to public/weather-ico/rain-and-sleet-mix.svg diff --git a/public/weather/rainy-1-day.svg b/public/weather-ico/rainy-1-day.svg similarity index 100% rename from public/weather/rainy-1-day.svg rename to public/weather-ico/rainy-1-day.svg diff --git a/public/weather/rainy-1-night.svg b/public/weather-ico/rainy-1-night.svg similarity index 100% rename from public/weather/rainy-1-night.svg rename to public/weather-ico/rainy-1-night.svg diff --git a/public/weather/rainy-2-day.svg b/public/weather-ico/rainy-2-day.svg similarity index 100% rename from public/weather/rainy-2-day.svg rename to public/weather-ico/rainy-2-day.svg diff --git a/public/weather/rainy-2-night.svg b/public/weather-ico/rainy-2-night.svg similarity index 100% rename from public/weather/rainy-2-night.svg rename to public/weather-ico/rainy-2-night.svg diff --git a/public/weather/rainy-3-day.svg b/public/weather-ico/rainy-3-day.svg similarity index 100% rename from public/weather/rainy-3-day.svg rename to public/weather-ico/rainy-3-day.svg diff --git a/public/weather/rainy-3-night.svg b/public/weather-ico/rainy-3-night.svg similarity index 100% rename from public/weather/rainy-3-night.svg rename to public/weather-ico/rainy-3-night.svg diff --git a/public/weather/scattered-thunderstorms-day.svg b/public/weather-ico/scattered-thunderstorms-day.svg similarity index 100% rename from public/weather/scattered-thunderstorms-day.svg rename to public/weather-ico/scattered-thunderstorms-day.svg diff --git a/public/weather/scattered-thunderstorms-night.svg b/public/weather-ico/scattered-thunderstorms-night.svg similarity index 100% rename from public/weather/scattered-thunderstorms-night.svg rename to public/weather-ico/scattered-thunderstorms-night.svg diff --git a/public/weather/severe-thunderstorm.svg b/public/weather-ico/severe-thunderstorm.svg similarity index 100% rename from public/weather/severe-thunderstorm.svg rename to public/weather-ico/severe-thunderstorm.svg diff --git a/public/weather/snowy-1-day.svg b/public/weather-ico/snowy-1-day.svg similarity index 100% rename from public/weather/snowy-1-day.svg rename to public/weather-ico/snowy-1-day.svg diff --git a/public/weather/snowy-1-night.svg b/public/weather-ico/snowy-1-night.svg similarity index 100% rename from public/weather/snowy-1-night.svg rename to public/weather-ico/snowy-1-night.svg diff --git a/public/weather/snowy-2-day.svg b/public/weather-ico/snowy-2-day.svg similarity index 100% rename from public/weather/snowy-2-day.svg rename to public/weather-ico/snowy-2-day.svg diff --git a/public/weather/snowy-2-night.svg b/public/weather-ico/snowy-2-night.svg similarity index 100% rename from public/weather/snowy-2-night.svg rename to public/weather-ico/snowy-2-night.svg diff --git a/public/weather/snowy-3-day.svg b/public/weather-ico/snowy-3-day.svg similarity index 100% rename from public/weather/snowy-3-day.svg rename to public/weather-ico/snowy-3-day.svg diff --git a/public/weather/snowy-3-night.svg b/public/weather-ico/snowy-3-night.svg similarity index 100% rename from public/weather/snowy-3-night.svg rename to public/weather-ico/snowy-3-night.svg diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index afbc94e..e6a631e 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -110,7 +110,7 @@ const WeatherWidget = () => { <> <div className="flex flex-col items-center justify-center w-16 min-w-16 max-w-16 h-full"> <img - src={`/weather/${data.icon}.svg`} + src={`/weather-ico/${data.icon}.svg`} alt={data.condition} className="h-10 w-auto" /> From 3a57261590a548d7edcc16f6420762d020fc8460 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 09:33:15 +0530 Subject: [PATCH 231/282] feat(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a8fd416..f62543b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.2", + "version": "1.11.0-rc1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From 8cfcc3e39c7323723c715d2e11a75f2544a2ccac Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 09:52:36 +0530 Subject: [PATCH 232/282] feat(chat): update margins and spacing --- src/components/EmptyChat.tsx | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 2a06d1d..b28b659 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -34,21 +34,23 @@ const EmptyChat = ({ <Settings className="cursor-pointer lg:hidden" /> </Link> </div> - <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-8"> - <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> - Research begins here. - </h2> - <EmptyChatMessageInput - sendMessage={sendMessage} - focusMode={focusMode} - setFocusMode={setFocusMode} - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-4"> + <div className="flex flex-col items-center justify-center w-full space-y-8"> + <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> + Research begins here. + </h2> + <EmptyChatMessageInput + sendMessage={sendMessage} + focusMode={focusMode} + setFocusMode={setFocusMode} + optimizationMode={optimizationMode} + setOptimizationMode={setOptimizationMode} + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} + /> + </div> <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center"> <div className="flex-1 max-w-xs"> <WeatherWidget /> From 0b7989c3d3f3a5c21354c623f7bd98c70b6d7137 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 09:55:06 +0530 Subject: [PATCH 233/282] feat(empty-chat): remove unused imports --- src/components/EmptyChat.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index b28b659..42e5a09 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -1,6 +1,5 @@ import { Settings } from 'lucide-react'; import EmptyChatMessageInput from './EmptyChatMessageInput'; -import { useEffect, useState } from 'react'; import { File } from './ChatWindow'; import Link from 'next/link'; import WeatherWidget from './WeatherWidget'; From 5c6018a0f9c498da28df3b08889b7c9ccf7a1f40 Mon Sep 17 00:00:00 2001 From: Dave <davixk83@gmail.com> Date: Sun, 1 Jun 2025 06:35:16 +0200 Subject: [PATCH 234/282] docs: correct typo in npm start command --- docs/installation/UPDATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/UPDATING.md b/docs/installation/UPDATING.md index 972142f..66edf5c 100644 --- a/docs/installation/UPDATING.md +++ b/docs/installation/UPDATING.md @@ -41,6 +41,6 @@ To update Perplexica to the latest version, follow these steps: 3. Check for changes in the configuration files. If the `sample.config.toml` file contains new fields, delete your existing `config.toml` file, rename `sample.config.toml` to `config.toml`, and update the configuration accordingly. 4. After populating the configuration run `npm i`. 5. Install the dependencies and then execute `npm run build`. -6. Finally, start the app by running `npm rum start` +6. Finally, start the app by running `npm run start` --- From 772e461c0887f72d35d9ebef9fa500908b702dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=93=E3=82=84=E3=81=97?= <168693811+koyasi777@users.noreply.github.com> Date: Mon, 2 Jun 2025 00:30:18 +0900 Subject: [PATCH 235/282] feat(gemini): add Gemini 2.5 Flash & Pro preview models (May 2025) --- src/lib/providers/gemini.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 6cf2243..2dcdc88 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -13,6 +13,14 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; const geminiChatModels: Record<string, string>[] = [ + { + displayName: 'Gemini 2.5 Flash Preview 05-20', + key: 'gemini-2.5-flash-preview-05-20', + }, + { + displayName: 'Gemini 2.5 Pro Preview', + key: 'gemini-2.5-pro-preview-05-06', + }, { displayName: 'Gemini 2.5 Pro Experimental', key: 'gemini-2.5-pro-exp-03-25', From 3b46baca4f3ef35c7fa3c0605d2738b58976b2dd Mon Sep 17 00:00:00 2001 From: Dave <davixk83@gmail.com> Date: Mon, 2 Jun 2025 05:52:31 +0200 Subject: [PATCH 236/282] docs(readme): fix typo in npm start command --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 18c9f84..8a0c78e 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. 2. Clone the repository and rename the `sample.config.toml` file to `config.toml` in the root directory. Ensure you complete all required fields in this file. 3. After populating the configuration run `npm i`. 4. Install the dependencies and then execute `npm run build`. -5. Finally, start the app by running `npm rum start` +5. Finally, start the app by running `npm run start` **Note**: Using Docker is recommended as it simplifies the setup process, especially for managing environment variables and dependencies. From 68c43ea372202d09ed3d78feddbe6f3334051044 Mon Sep 17 00:00:00 2001 From: Chris Scott <chris@getfit.us> Date: Mon, 2 Jun 2025 21:52:41 -0400 Subject: [PATCH 237/282] Fix: IOS Input Zoom config for theme consistency and iOS standalone mode - Modified manifest.ts to ensure proper metadata - Added display: standalone for iOS PWA behavior --- .assets/manifest.json | 0 public/icons8-search-100.png | Bin 0 -> 1531 bytes public/icons8-search-50.png | Bin 0 -> 750 bytes src/app/globals.css | 9 +++++++++ src/app/manifest.ts | 26 ++++++++++++++++++++++++++ 5 files changed, 35 insertions(+) create mode 100644 .assets/manifest.json create mode 100644 public/icons8-search-100.png create mode 100644 public/icons8-search-50.png create mode 100644 src/app/manifest.ts diff --git a/.assets/manifest.json b/.assets/manifest.json new file mode 100644 index 0000000..e69de29 diff --git a/public/icons8-search-100.png b/public/icons8-search-100.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb6582310a28a061710535069cf40b620c932d9 GIT binary patch literal 1531 zcmV<X1qAwuP)<h;3K|Lk000e1NJLTq003kF003kN1^@s6aN?Cz00009a7bBm000XU z000XU0RWnu7ytkTtw}^dRCt{2o!g6*RTRK~HhJtNL+i1zR7`@hoQOINngl(hL_-<T z#V$lew}<GZmoAht6=g(V5>!|bO$9!vnPvJCp_Sx6&~3)1pysB{sMO4f4QuFQvA^Rv zp4-~{+dtSZGiRS~t-Zc)uWzrt_BxPABoc{4B9TZW62)a1umRWvd;%N>egsB=lhQ`z zZ-?bG?z4AE-$a9)1*`|Q0YgBg!8R!0bqg>rS*Lb-fUR=3S6b9Yfj5Db$uRl!0y}`2 z78;`BX<q}^CByvBQsA>12JRTJTl~V^z*WE!U;$8)wm|;o{&$aj*7f<jhVS1geG7{l zz-NKuRR(DoctxI`xeZ)vu6)O<@|}6tn*yE@*$Rcb6Tho6Fkb;T09`G(b{DW#u90{B zZ-K=Wgqwl!oPpRQ(@nc517GIIG6wV!IgbI;9_4=%ztAae1b+3%<z6tJBtqthgZ15s z9{^`}T0mev@L`UO8%2j`*p%Zy@5dew=DcV)qeQ_YIrH->>~b~mmq+d=h`@nspYc1e z0{g5GS+lZFhwSJt07jHT?(OPw!r>B62xlzBSK^XqoiSy6n#$u^k54%m+T!s!&-`oA zf!E4I9(|rBpxBhYqdp>h-uFE5LBzgvpm4~@I-?oulp{(v7o9du+4E?-4WU@L&7+?S zTAF3ICpHxudzFs6Fuc>J?;f|nij8YL@h+1)k6V?X?oNu8{Yuv@7)(ge3n;gr5i4tz zt|QhGCvH^&4!3A?$qHwB!YVFIWQO;Ya4!=-o0ZP*U<jQz<s4t^tWrAvf)OtAWQR18 zkPr$bPd1B-QgoaRN+`D$DGGa(?ssBvH!zx=wHoMGx<8KrK2<`wC#ERet8^d006!?9 z>Ph427K0v@wjEd=Q2(;h{SXHDSqXJv9fP5F6f3g8><*wmvU8a2`x6Gx$pGh`=2Vw$ z9|zFiah~e;Ck8mFgsOFG^JtX;nFydi5-!R1J3*ud84sYp&me9rf}OIqR~e9j0Q&o; zEa#Jgb?VD=PDwcfpC3SfpHp}F!RB6j>)Dj*76&>ZZJ>_9u+U#`R(+2F^xH}&v)J3s zeHOE8HY%Z9D5WU8Xi;|^T>PBk@P*R-4h*nN2{jp7nq?Ei?~5?PU`V-2O=7ju*^Pl2 zwkhG<$=TR>P3inLhFD*~B!@qg&Mp(h4D&pTEK>qDnRT8sBPHvJa_$^>Q4;0ez#uC< zbxPa@PHgll9cSv?)avL_1a~MuHui;*Y>mXRbg<54HO9j2o~PpqjI&b-eMAnsgw8oq zal%~e>QpR|<6c?8U4?|u8Sq3Tf;iHKlsM8;*8_yh!=V=uC`pN<tOCa++z=XTWUoA{ z%Qqn|d>47rY$mLpHp<~r&w_U(#KHly^aWg6<1)_~kbi;e37p40^Y57P>1$0+k+oxO zF0j_NUBy|S;z}V|bl@jE^3JyL7>qI}$0)O}#Pf};GX|;{B08fu9?dE7H*BE9-(Zc# z$QmVzW8Zz^Lwri^ZS!%sUQcYQUZX_uq%4*aM|q0wll_#g7HuxA^Muf|?Ld{vsnHsx zBqfe?m_@%LZ<Yg=r3SCHTDD#FPG7c7$qM`o8RWtl1&Igks6pvTIn&oK32J5OyD(E~ ze4+fUET8F@RGrCFeD{pJT(~NDSqf_u#CPm!b20vDNxHtWid=;@3KCk`l5@JL(xm1R zs$T~#u2H7K8)Y_e!j-FdR}SS@8f>n(!CSyhr|FN9Q4~w%9QX^efIB2VZ!{tYW&V*s z;E+U`-A^99Bt^%XwQrG(Vze&UNYNIL*6B$`u}4obianB143dmukYp5tB%>H48O0#U zC<aMJF-S6sL6T7nl8j=IWE6wc6S{w@)4~>oo*Dv@?iaKZMvRh-VaO=S7>10JjA6*p hCkLKLBoYbQ!GHdQ*7*!5-&Ozs002ovPDHLkV1np5&N=`9 literal 0 HcmV?d00001 diff --git a/public/icons8-search-50.png b/public/icons8-search-50.png new file mode 100644 index 0000000000000000000000000000000000000000..7d83950a048d2e2ca2ae07bcd59fe2b86f64491d GIT binary patch literal 750 zcmV<K0ulX*P)<h;3K|Lk000e1NJLTq001%o001%w1^@s69zTe&00009a7bBm000XU z000XU0RWnu7ytkQph-kQRCt{2nagSvK@^6+Sr~V&G%ds|CaztI8ZT?3D`9jJB8c$; z1TPqbs5|um1a}$~3BgS=lC?%RUh)QRG;Y*vG?*ACX5_%%P=*$qOjS)!(jPQ5Q$7Ew z(^Ylq)M+RvC<w`JU<4Qk=70s@m#(kCJGGq$5^~5fpa#@|#(!S+>@;wc9IzLdaXPmO zyZ|l%2Y_y1n=ZRQ2wVnc^=$gTXFy-OoEQcc)sY{-ZD3au|2N0(087&N4h#{Q8_wID z0D4-`+5=2FdSgW5mJF`xzT`>wBJewwGs7}u1}g#dPdm;G5^!OsYvNicBfzM$X38N9 z%s6WzBqe9f)I#hN4Mmt<!qcNj*Z_|B6s}3sLToH7G@H#SpJ_*38(1^@M61|7v#RvQ z?px-9-pq62^HR3Y`4AhIn57-Dxgy&Se2C3S%yOsL^vm`eA7Tp<%UT~Nflt6ZFc6?U zk?k)Y{9r|5T^VijPLA|3K>K#J{oE{$EQX$11L}-*;&_1eM7H1iT<mrzip^o!wlKUY z!tZ?_Vj~i><7sSO$@VE9Vu_QYcu5sDkfQAHB|5D)V~JcW?#kv9pQ48(x*R!;Ujz2} z7Ee?8Nss6BEKK{UW6L{b9X}g7j)vm8Y<vz`jT~}{4^}Af%^7LilsZ9R#vErxJx#Nc zMk1}CShT7Vfz+9F9$S%Zqx3p!VtsA6N(2U-HM6A9+{`}Htq{8`jc*x6@Oms~%1$&( zr^KvMi+(NEE?tR!yQ<vDEn+`bZJ^ptXHdyzs>#m^cE)%F?B{RV?o2vetWfX}c&m>) zE85&X0Iz|2>eNpDO)i}Ah1HhVJ7d%FEFDOta3-fzijm1Fm11OaN;P9->;o;GKFw~@ g;Z!?$B-m2?0UfV5Z^;J0ga7~l07*qoM6N<$g6)P#ZvX%Q literal 0 HcmV?d00001 diff --git a/src/app/globals.css b/src/app/globals.css index f75daca..a8e6ae1 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -11,3 +11,12 @@ display: none; } } + +/* Add Fix for IOS to allow PWA and stop zooming on the page */ +@media screen and (-webkit-min-device-pixel-ratio: 0) { + select, + textarea, + input { + font-size: 16px !important; + } +} diff --git a/src/app/manifest.ts b/src/app/manifest.ts new file mode 100644 index 0000000..204e58f --- /dev/null +++ b/src/app/manifest.ts @@ -0,0 +1,26 @@ +import type { MetadataRoute } from 'next'; + +export default function manifest(): MetadataRoute.Manifest { + return { + name: 'Perplexica - Chat with the internet', + short_name: 'Perplexica', + description: + 'Perplexica is an AI powered chatbot that is connected to the internet.', + start_url: '/', + display: 'standalone', + background_color: '#0a0a0a', + theme_color: '#0a0a0a', + icons: [ + { + src: '/icons8-search-50.png', + sizes: '50x50', + type: 'image/png' as const, + }, + { + src: '/icons8-search-100.png', + sizes: '100x100', + type: 'image/png', + }, + ], + }; +} From e2b9ffc072bbb1826719ec480338247d470173c9 Mon Sep 17 00:00:00 2001 From: Siddhesh Mhatre <157303637+glitchySid@users.noreply.github.com> Date: Wed, 11 Jun 2025 22:52:13 +0530 Subject: [PATCH 238/282] Update README.md Mentioned that Gemini api key can be used in perplexica. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 18c9f84..07d5c2d 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. - `OLLAMA`: Your Ollama API URL. You should enter it as `http://host.docker.internal:PORT_NUMBER`. If you installed Ollama on port 11434, use `http://host.docker.internal:11434`. For other ports, adjust accordingly. **You need to fill this if you wish to use Ollama's models instead of OpenAI's**. - `GROQ`: Your Groq API key. **You only need to fill this if you wish to use Groq's hosted models**. - `ANTHROPIC`: Your Anthropic API key. **You only need to fill this if you wish to use Anthropic models**. + - `Gemini`: Your Gemini API key. **You only need to fill this if you wish to use Google's models**. **Note**: You can change these after starting Perplexica from the settings dialog. From c6d084f5dc960c271c2c01464b13f93a769e1d88 Mon Sep 17 00:00:00 2001 From: D1m7asis <tumaskow@yandex.ru> Date: Fri, 27 Jun 2025 13:43:20 +0200 Subject: [PATCH 239/282] feat: add AIML API provider Introduces support for the AI/ML API provider, including configuration options, chat and embedding model loading, and UI integration. Updates documentation and sample config to reflect the new provider. --- README.md | 4 +- sample.config.toml | 3 ++ src/app/api/config/route.ts | 5 ++ src/app/settings/page.tsx | 20 ++++++++ src/lib/config.ts | 5 ++ src/lib/providers/aimlapi.ts | 94 ++++++++++++++++++++++++++++++++++++ src/lib/providers/index.ts | 8 +++ 7 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 src/lib/providers/aimlapi.ts diff --git a/README.md b/README.md index 14a6193..9551250 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,9 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. - `OLLAMA`: Your Ollama API URL. You should enter it as `http://host.docker.internal:PORT_NUMBER`. If you installed Ollama on port 11434, use `http://host.docker.internal:11434`. For other ports, adjust accordingly. **You need to fill this if you wish to use Ollama's models instead of OpenAI's**. - `GROQ`: Your Groq API key. **You only need to fill this if you wish to use Groq's hosted models**. - `ANTHROPIC`: Your Anthropic API key. **You only need to fill this if you wish to use Anthropic models**. - - `Gemini`: Your Gemini API key. **You only need to fill this if you wish to use Google's models**. + - `Gemini`: Your Gemini API key. **You only need to fill this if you wish to use Google's models**. + - `DEEPSEEK`: Your Deepseek API key. **Only needed if you want Deepseek models.** + - `AIMLAPI`: Your AI/ML API key. **Only needed if you want to use AI/ML API models and embeddings.** **Note**: You can change these after starting Perplexica from the settings dialog. diff --git a/sample.config.toml b/sample.config.toml index 1db2125..ba3e98e 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -25,6 +25,9 @@ API_URL = "" # Ollama API URL - http://host.docker.internal:11434 [MODELS.DEEPSEEK] API_KEY = "" +[MODELS.AIMLAPI] +API_KEY = "" # Required to use AI/ML API chat and embedding models + [MODELS.LM_STUDIO] API_URL = "" # LM Studio API URL - http://host.docker.internal:1234 diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index c1e5bbd..0c11b23 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -8,6 +8,7 @@ import { getOllamaApiEndpoint, getOpenaiApiKey, getDeepseekApiKey, + getAimlApiKey, getLMStudioApiEndpoint, updateConfig, } from '@/lib/config'; @@ -57,6 +58,7 @@ export const GET = async (req: Request) => { config['groqApiKey'] = getGroqApiKey(); config['geminiApiKey'] = getGeminiApiKey(); config['deepseekApiKey'] = getDeepseekApiKey(); + config['aimlApiKey'] = getAimlApiKey(); config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); config['customOpenaiModelName'] = getCustomOpenaiModelName(); @@ -95,6 +97,9 @@ export const POST = async (req: Request) => { DEEPSEEK: { API_KEY: config.deepseekApiKey, }, + AIMLAPI: { + API_KEY: config.aimlApiKey, + }, LM_STUDIO: { API_URL: config.lmStudioApiUrl, }, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 6f20f01..b91519e 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -23,6 +23,7 @@ interface SettingsType { ollamaApiUrl: string; lmStudioApiUrl: string; deepseekApiKey: string; + aimlApiKey: string; customOpenaiApiKey: string; customOpenaiApiUrl: string; customOpenaiModelName: string; @@ -862,6 +863,25 @@ const Page = () => { /> </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + AI/ML API Key + </p> + <Input + type="text" + placeholder="AI/ML API Key" + value={config.aimlApiKey} + isSaving={savingStates['aimlApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + aimlApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('aimlApiKey', value)} + /> + </div> + <div className="flex flex-col space-y-1"> <p className="text-black/70 dark:text-white/70 text-sm"> LM Studio API URL diff --git a/src/lib/config.ts b/src/lib/config.ts index 78ad09c..d885e13 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -35,6 +35,9 @@ interface Config { DEEPSEEK: { API_KEY: string; }; + AIMLAPI: { + API_KEY: string; + }; LM_STUDIO: { API_URL: string; }; @@ -85,6 +88,8 @@ export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY; +export const getAimlApiKey = () => loadConfig().MODELS.AIMLAPI.API_KEY; + export const getCustomOpenaiApiKey = () => loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; diff --git a/src/lib/providers/aimlapi.ts b/src/lib/providers/aimlapi.ts new file mode 100644 index 0000000..e934362 --- /dev/null +++ b/src/lib/providers/aimlapi.ts @@ -0,0 +1,94 @@ +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { getAimlApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { Embeddings } from '@langchain/core/embeddings'; +import axios from 'axios'; + +export const PROVIDER_INFO = { + key: 'aimlapi', + displayName: 'AI/ML API', +}; + +interface AimlApiModel { + id: string; + name?: string; + type?: string; +} + +const API_URL = 'https://api.aimlapi.com'; + +export const loadAimlApiChatModels = async () => { + const apiKey = getAimlApiKey(); + + if (!apiKey) return {}; + + try { + const response = await axios.get(`${API_URL}/models`, { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + }); + + const chatModels: Record<string, ChatModel> = {}; + + response.data.data.forEach((model: AimlApiModel) => { + if (model.type === 'chat-completion') { + chatModels[model.id] = { + displayName: model.name || model.id, + model: new ChatOpenAI({ + openAIApiKey: apiKey, + modelName: model.id, + temperature: 0.7, + configuration: { + baseURL: API_URL, + }, + }) as unknown as BaseChatModel, + }; + } + }); + + return chatModels; + } catch (err) { + console.error(`Error loading AI/ML API models: ${err}`); + return {}; + } +}; + +export const loadAimlApiEmbeddingModels = async () => { + const apiKey = getAimlApiKey(); + + if (!apiKey) return {}; + + try { + const response = await axios.get(`${API_URL}/models`, { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + }); + + const embeddingModels: Record<string, EmbeddingModel> = {}; + + response.data.data.forEach((model: AimlApiModel) => { + if (model.type === 'embedding') { + embeddingModels[model.id] = { + displayName: model.name || model.id, + model: new OpenAIEmbeddings({ + openAIApiKey: apiKey, + modelName: model.id, + configuration: { + baseURL: API_URL, + }, + }) as unknown as Embeddings, + }; + } + }); + + return embeddingModels; + } catch (err) { + console.error(`Error loading AI/ML API embeddings models: ${err}`); + return {}; + } +}; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index e536431..4b8a090 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -35,6 +35,11 @@ import { loadDeepseekChatModels, PROVIDER_INFO as DeepseekInfo, } from './deepseek'; +import { + loadAimlApiChatModels, + loadAimlApiEmbeddingModels, + PROVIDER_INFO as AimlApiInfo, +} from './aimlapi'; import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels, @@ -49,6 +54,7 @@ export const PROVIDER_METADATA = { gemini: GeminiInfo, transformers: TransformersInfo, deepseek: DeepseekInfo, + aimlapi: AimlApiInfo, lmstudio: LMStudioInfo, custom_openai: { key: 'custom_openai', @@ -76,6 +82,7 @@ export const chatModelProviders: Record< anthropic: loadAnthropicChatModels, gemini: loadGeminiChatModels, deepseek: loadDeepseekChatModels, + aimlapi: loadAimlApiChatModels, lmstudio: loadLMStudioChatModels, }; @@ -87,6 +94,7 @@ export const embeddingModelProviders: Record< ollama: loadOllamaEmbeddingModels, gemini: loadGeminiEmbeddingModels, transformers: loadTransformersEmbeddingsModels, + aimlapi: loadAimlApiEmbeddingModels, lmstudio: loadLMStudioEmbeddingsModels, }; From 0bb8b7ec5c22f8cc6f1c6ef943dbbacacdb28ba3 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 28 Jun 2025 13:49:17 +0530 Subject: [PATCH 240/282] feat(weather-widget): enable geolocation for weather data Replaces the previous commented-out geolocation logic with an implementation that uses the browser's geolocation API and reverse geocoding to determine the user's city. Falls back to approximate location if permission is denied or unavailable. --- src/components/WeatherWidget.tsx | 58 +++++++++++++++++++------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index e6a631e..d308bb4 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -31,30 +31,40 @@ const WeatherWidget = () => { city: string; }) => void, ) => { - /* - // Geolocation doesn't give city so we'll country using ipapi for now - if (navigator.geolocation) { - const result = await navigator.permissions.query({ - name: 'geolocation', - }) - - if (result.state === 'granted') { - navigator.geolocation.getCurrentPosition(position => { - callback({ - latitude: position.coords.latitude, - longitude: position.coords.longitude, - }) - }) - } else if (result.state === 'prompt') { - callback(await getApproxLocation()) - navigator.geolocation.getCurrentPosition(position => {}) - } else if (result.state === 'denied') { - callback(await getApproxLocation()) - } - } else { - callback(await getApproxLocation()) - } */ - callback(await getApproxLocation()); + if (navigator.geolocation) { + const result = await navigator.permissions.query({ + name: 'geolocation', + }); + + if (result.state === 'granted') { + navigator.geolocation.getCurrentPosition(async (position) => { + const res = await fetch( + `https://api-bdc.io/data/reverse-geocode-client?latitude=${position.coords.latitude}&longitude=${position.coords.longitude}&localityLanguage=en`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + + const data = await res.json(); + + callback({ + latitude: position.coords.latitude, + longitude: position.coords.longitude, + city: data.locality, + }); + }); + } else if (result.state === 'prompt') { + callback(await getApproxLocation()); + navigator.geolocation.getCurrentPosition((position) => {}); + } else if (result.state === 'denied') { + callback(await getApproxLocation()); + } + } else { + callback(await getApproxLocation()); + } }; getLocation(async (location) => { From 809b625a34cd8fbf3b380b08650897bd0b48a0cf Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:42:41 +0530 Subject: [PATCH 241/282] feat(widgets): fix size on smaller screens, closes #791 --- src/components/EmptyChat.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 42e5a09..0eb76ac 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -51,10 +51,10 @@ const EmptyChat = ({ /> </div> <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center"> - <div className="flex-1 max-w-xs"> + <div className="flex-1 w-full"> <WeatherWidget /> </div> - <div className="flex-1 max-w-xs"> + <div className="flex-1 w-full"> <NewsArticleWidget /> </div> </div> From 87d788ddef0d6d2435c2ca59b5fc260fc6979e40 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 30 Jun 2025 19:55:23 +0530 Subject: [PATCH 242/282] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9551250..6744cd1 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ <hr/> -[![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) +[![Discord](https://dcbadge.limes.pink/api/server/26aArMy8tT?style=flat)](https://discord.gg/26aArMy8tT) ![preview](.assets/perplexica-screenshot.png?) From ccd89d48d9b06c5cfef860ebf4ebc9412e1e69b6 Mon Sep 17 00:00:00 2001 From: kittrydge <rydberg136@proton.me> Date: Tue, 1 Jul 2025 18:00:26 -0600 Subject: [PATCH 243/282] Update Linux ollama instructions in README.md When setting the OLLAMA_HOST environment variable, the port number must be specified ( see https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux ) Also, 'systemctl daemon-reload' needs to be called after changing a systemd unit file, and before the relevant systemd service is reloaded. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6744cd1..5eb0713 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ If you're encountering an Ollama connection error, it is likely due to the backe 3. **Linux Users - Expose Ollama to Network:** - - Inside `/etc/systemd/system/ollama.service`, you need to add `Environment="OLLAMA_HOST=0.0.0.0"`. Then restart Ollama by `systemctl restart ollama`. For more information see [Ollama docs](https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux) + - Inside `/etc/systemd/system/ollama.service`, you need to add `Environment="OLLAMA_HOST=0.0.0.0:11434"`. (Change the port number if you are using a different one.) Then reload the systemd manager configuration with `systemctl daemon-reload`, and restart Ollama by `systemctl restart ollama`. For more information see [Ollama docs](https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux) - Ensure that the port (default is 11434) is not blocked by your firewall. From 2ccbd9a44c5d3723222f20561deb14310337f9a0 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 5 Jul 2025 22:00:06 +0530 Subject: [PATCH 244/282] Update ChatWindow.tsx --- src/components/ChatWindow.tsx | 37 ++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 93c8a0c..ad75d1b 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -83,13 +83,35 @@ const checkConfig = async ( if (!chatModel || !chatModelProvider) { const chatModelProviders = providers.chatModelProviders; + if ( + !chatModelProviders || + Object.keys(chatModelProviders).length === 0 + ) { + setHasError(true); + return toast.error('No chat model providers found'); + } else if ( + chatModelProviders.length === 1 && + Object.keys(chatModelProviders['custom_openai']).length === 0 + ) { + setHasError(true); + return toast.error( + "Seems like you're trying to use the custom OpenAI provider. Please configure it using the settings page or the config file to use it.", + ); + } + chatModelProvider = - chatModelProvider || Object.keys(chatModelProviders)[0]; + chatModelProvider || + Object.keys(chatModelProviders).find( + (v) => Object.keys(chatModelProviders[v]).length > 0, + ) || + null; + + if (!chatModelProvider) { + setHasError(true); + return toast.error('No chat models found.'); + } chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - - if (!chatModelProviders || Object.keys(chatModelProviders).length === 0) - return toast.error('No chat models available'); } if (!embeddingModel || !embeddingModelProvider) { @@ -123,7 +145,12 @@ const checkConfig = async ( chatModelProvider = chatModelProvidersKeys.find( (key) => Object.keys(chatModelProviders[key]).length > 0, - ) || chatModelProvidersKeys[0]; + ) || null; + + if (!chatModelProvider) { + setHasError(true); + return toast.error('No chat models found.'); + } localStorage.setItem('chatModelProvider', chatModelProvider); } From d5c012d7486fc46e0125a4404fe7a6e04e2ca8e7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Jul 2025 15:52:39 +0530 Subject: [PATCH 245/282] Revert "Update ChatWindow.tsx" This reverts commit 2ccbd9a44c5d3723222f20561deb14310337f9a0. --- src/components/ChatWindow.tsx | 37 +++++------------------------------ 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index ad75d1b..93c8a0c 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -83,35 +83,13 @@ const checkConfig = async ( if (!chatModel || !chatModelProvider) { const chatModelProviders = providers.chatModelProviders; - if ( - !chatModelProviders || - Object.keys(chatModelProviders).length === 0 - ) { - setHasError(true); - return toast.error('No chat model providers found'); - } else if ( - chatModelProviders.length === 1 && - Object.keys(chatModelProviders['custom_openai']).length === 0 - ) { - setHasError(true); - return toast.error( - "Seems like you're trying to use the custom OpenAI provider. Please configure it using the settings page or the config file to use it.", - ); - } - chatModelProvider = - chatModelProvider || - Object.keys(chatModelProviders).find( - (v) => Object.keys(chatModelProviders[v]).length > 0, - ) || - null; - - if (!chatModelProvider) { - setHasError(true); - return toast.error('No chat models found.'); - } + chatModelProvider || Object.keys(chatModelProviders)[0]; chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + + if (!chatModelProviders || Object.keys(chatModelProviders).length === 0) + return toast.error('No chat models available'); } if (!embeddingModel || !embeddingModelProvider) { @@ -145,12 +123,7 @@ const checkConfig = async ( chatModelProvider = chatModelProvidersKeys.find( (key) => Object.keys(chatModelProviders[key]).length > 0, - ) || null; - - if (!chatModelProvider) { - setHasError(true); - return toast.error('No chat models found.'); - } + ) || chatModelProvidersKeys[0]; localStorage.setItem('chatModelProvider', chatModelProvider); } From cf8dec53ca246bb24a73b54aefebbb31e0f171d4 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:09:36 +0530 Subject: [PATCH 246/282] feat(chat-window): select provider if model's present, closes #803 --- src/components/ChatWindow.tsx | 39 +++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 93c8a0c..67a5d0c 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -82,14 +82,29 @@ const checkConfig = async ( ) { if (!chatModel || !chatModelProvider) { const chatModelProviders = providers.chatModelProviders; + const chatModelProvidersKeys = Object.keys(chatModelProviders); - chatModelProvider = - chatModelProvider || Object.keys(chatModelProviders)[0]; + if (!chatModelProviders || chatModelProvidersKeys.length === 0) { + return toast.error('No chat models available'); + } else { + chatModelProvider = + chatModelProvidersKeys.find( + (provider) => + Object.keys(chatModelProviders[provider]).length > 0, + ) || chatModelProvidersKeys[0]; + } + + if ( + chatModelProvider === 'custom_openai' && + Object.keys(chatModelProviders[chatModelProvider]).length === 0 + ) { + toast.error( + "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", + ); + return setHasError(true); + } chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - - if (!chatModelProviders || Object.keys(chatModelProviders).length === 0) - return toast.error('No chat models available'); } if (!embeddingModel || !embeddingModelProvider) { @@ -117,7 +132,8 @@ const checkConfig = async ( if ( Object.keys(chatModelProviders).length > 0 && - !chatModelProviders[chatModelProvider] + (!chatModelProviders[chatModelProvider] || + Object.keys(chatModelProviders[chatModelProvider]).length === 0) ) { const chatModelProvidersKeys = Object.keys(chatModelProviders); chatModelProvider = @@ -132,6 +148,16 @@ const checkConfig = async ( chatModelProvider && !chatModelProviders[chatModelProvider][chatModel] ) { + if ( + chatModelProvider === 'custom_openai' && + Object.keys(chatModelProviders[chatModelProvider]).length === 0 + ) { + toast.error( + "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", + ); + return setHasError(true); + } + chatModel = Object.keys( chatModelProviders[ Object.keys(chatModelProviders[chatModelProvider]).length > 0 @@ -139,6 +165,7 @@ const checkConfig = async ( : Object.keys(chatModelProviders)[0] ], )[0]; + localStorage.setItem('chatModel', chatModel); } From 01e04a209f4724a05f5a4c5d28b29722beab9192 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:45:24 +0530 Subject: [PATCH 247/282] feat(public): add screenshots & update icons --- public/icon-100.png | Bin 0 -> 916 bytes public/icon-50.png | Bin 0 -> 515 bytes public/icon.png | Bin 0 -> 30498 bytes public/icons8-search-100.png | Bin 1531 -> 0 bytes public/icons8-search-50.png | Bin 750 -> 0 bytes public/screenshots/p1.png | Bin 0 -> 187470 bytes public/screenshots/p1_small.png | Bin 0 -> 133129 bytes public/screenshots/p2.png | Bin 0 -> 642123 bytes public/screenshots/p2_small.png | Bin 0 -> 206329 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/icon-100.png create mode 100644 public/icon-50.png create mode 100644 public/icon.png delete mode 100644 public/icons8-search-100.png delete mode 100644 public/icons8-search-50.png create mode 100644 public/screenshots/p1.png create mode 100644 public/screenshots/p1_small.png create mode 100644 public/screenshots/p2.png create mode 100644 public/screenshots/p2_small.png diff --git a/public/icon-100.png b/public/icon-100.png new file mode 100644 index 0000000000000000000000000000000000000000..98fa2426346528e44e11295ce77400ff5096b2b0 GIT binary patch literal 916 zcmV;F18e+=P)<h;3K|Lk000e1NJLTq003kF003kN0{{R3M?7U_0000#P)t-s|Ns90 z0092}{`dFyEG#TUL`3T9>KqGj(P@$u#5<vBSymzS5?+S*c5Qpw55wY9ZlV`HVI zrGtZmd3kw*)woCi00R(7L_t(&-tAf0lBFOF#Q-A6Ci4H^I@p5Rqu7n&t(qzGDso83 zazYS#<&{@n`4T8w4TZY{=0Se{7fj1>DazRQJ=I<s{-d(oNUv#FFH1EUnpqf??deJ( zDT{0URgk9XsL5Iz!1l|+X1op(w6R$b$(l+a4Kq1Cwix9go-x)fztiLESF5c$Mwl#( z5H5r=k|rE?xN1xYS{fw;zY<q~+A*SNe6XsGiZID9#O?;o$9>d6gxL86orIg2MUcF` zqO~-?o4t}M2cDBWP~Ojx(I&(G6Q;AZOzEE7IA_1*5i^H^-rJqe_fACNv5gK}cD>u| zC}t44cdvH7uD<X}OuS|0b~m2~p}Z^rb&6l2c3b5^aG4@&CUVb#tjS6~2BH>CI{O$1 zUh+E?kAWZ+Z=M+R90(F)&lnjDdJ-i3sgwZpFvyOgJp%IktsVf`*Vg(VeVYrbiXaE| zHztT0AhBv}azGM!!Z8Y+4aWfWkohpceNB+hut?XXTzVe`Qf}_;)-KqRELpl@uceC^ zocUsjSQw{MS@1Qi1+ZbfjOdV`9oevCfvN}?x-$1b8@9cRRtV~#pmy!1f-iBJh&**| z%`Q0bG2g|yJV!e7F7%TC^-vI2c4RRoXHLnaRk*4iPP5fv<<j@);MKKMQH#G$Om5rh zb%Us+hgzMh3sJ#`ZKJ2FT>To1p=q<>;J6jau8rPU#a@Y5k|nK7F2x<&G1?n4F3tS6 zGeb&{u7>mGGJ4Ha|B0gYnezKdBGK<Dk$8aIeSmlUM>O>Xc|rbBkjf7@8IamfQAZ^{ z=GuMLfQyf6DF0-7Q2!!bW#&G}n4Ksj0(QU1rw8V<CtG~4$^*!gkwAKUc5sV#^EA3R z^wab(P3*N$nPyt8vI_~8XFY3Z^sJg@TBT;1W?C!d?T_75k#(|BKGQ;f4QcFghXAr` zYE6Qe%ozfYT_q6W^1g#5sQ}WEQJpy`D8In?(mU~t5JL56#ZSip;k@p{YEnGR<U)w{ qS3|044d$&Vo@u@E$}6wDg8l#-%^wQGi)fkv0000<MNUMnLSTZ=PP*0r literal 0 HcmV?d00001 diff --git a/public/icon-50.png b/public/icon-50.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb7a0ef00b12f1d0c51de08319440adedb007ab GIT binary patch literal 515 zcmV+e0{s1nP)<h;3K|Lk000e1NJLTq001%o001%w0{{R3DdBj70000{P)t-s|Ns90 z001yBFz)W|ii(Q<{{H&<`UwdMB_$<CM@Q@H>-6;W;^N}V%gbkHXAlq&8X6jPb#+)+ zSUo*G+1c5tsi}W|f55=Nw6wIBmzSWRpeNoOBLDyaZAnByR7l6|Rb7*VAPf``ga9fi zRQvyb=!Jfr&I!`K-AwalWM`9QNt)&xkI(@6AT1a$o`EcsPJP&;xQ&X+USuGFV07MW z8P+i+RSvSqvBUp<!xIKf3}co>n>kSASzZ}7A;4J!ydZ(aLi*R&1xZ}?`27bL9xH!U zc104K0YK~Hz3oT{WzTd=h%}ile3Ator*;qu$B;Qm*<B7H?6?m=p@^K{fS@$fNCSTh z(y$p0P8A`|VaL^wUtL`lWPM7Pv{!^o`V^8pqV6<$MVI#c{GIivH|<w#qC$kU6>k%q zL?WuuU)`uKRqvTwHxSRUbrqlr0g)n0D^z0fHFe#3k-gQcn<{&;NwN7RlWx1x3)|hx z^4`6CaQmNm>=P&d56HP^YUkKy)K^c-+)PHt#FAqKm<30D7xt4s&ZR9T(|%DKjjky% zo@_C+@s_w9PPUk&{<;@cSU1Vi7Bfuz-8&k}TkIQW@dN(o4_J86mcIZ1002ovPDHLk FV1nvw>VW_N literal 0 HcmV?d00001 diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fe3c7728b8aa93e8c462a411755a9a6b33eb67 GIT binary patch literal 30498 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 Jt70GZe*n1=%RK-9 literal 0 HcmV?d00001 diff --git a/public/icons8-search-100.png b/public/icons8-search-100.png deleted file mode 100644 index 6bb6582310a28a061710535069cf40b620c932d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1531 zcmV<X1qAwuP)<h;3K|Lk000e1NJLTq003kF003kN1^@s6aN?Cz00009a7bBm000XU z000XU0RWnu7ytkTtw}^dRCt{2o!g6*RTRK~HhJtNL+i1zR7`@hoQOINngl(hL_-<T z#V$lew}<GZmoAht6=g(V5>!|bO$9!vnPvJCp_Sx6&~3)1pysB{sMO4f4QuFQvA^Rv zp4-~{+dtSZGiRS~t-Zc)uWzrt_BxPABoc{4B9TZW62)a1umRWvd;%N>egsB=lhQ`z zZ-?bG?z4AE-$a9)1*`|Q0YgBg!8R!0bqg>rS*Lb-fUR=3S6b9Yfj5Db$uRl!0y}`2 z78;`BX<q}^CByvBQsA>12JRTJTl~V^z*WE!U;$8)wm|;o{&$aj*7f<jhVS1geG7{l zz-NKuRR(DoctxI`xeZ)vu6)O<@|}6tn*yE@*$Rcb6Tho6Fkb;T09`G(b{DW#u90{B zZ-K=Wgqwl!oPpRQ(@nc517GIIG6wV!IgbI;9_4=%ztAae1b+3%<z6tJBtqthgZ15s z9{^`}T0mev@L`UO8%2j`*p%Zy@5dew=DcV)qeQ_YIrH->>~b~mmq+d=h`@nspYc1e z0{g5GS+lZFhwSJt07jHT?(OPw!r>B62xlzBSK^XqoiSy6n#$u^k54%m+T!s!&-`oA zf!E4I9(|rBpxBhYqdp>h-uFE5LBzgvpm4~@I-?oulp{(v7o9du+4E?-4WU@L&7+?S zTAF3ICpHxudzFs6Fuc>J?;f|nij8YL@h+1)k6V?X?oNu8{Yuv@7)(ge3n;gr5i4tz zt|QhGCvH^&4!3A?$qHwB!YVFIWQO;Ya4!=-o0ZP*U<jQz<s4t^tWrAvf)OtAWQR18 zkPr$bPd1B-QgoaRN+`D$DGGa(?ssBvH!zx=wHoMGx<8KrK2<`wC#ERet8^d006!?9 z>Ph427K0v@wjEd=Q2(;h{SXHDSqXJv9fP5F6f3g8><*wmvU8a2`x6Gx$pGh`=2Vw$ z9|zFiah~e;Ck8mFgsOFG^JtX;nFydi5-!R1J3*ud84sYp&me9rf}OIqR~e9j0Q&o; zEa#Jgb?VD=PDwcfpC3SfpHp}F!RB6j>)Dj*76&>ZZJ>_9u+U#`R(+2F^xH}&v)J3s zeHOE8HY%Z9D5WU8Xi;|^T>PBk@P*R-4h*nN2{jp7nq?Ei?~5?PU`V-2O=7ju*^Pl2 zwkhG<$=TR>P3inLhFD*~B!@qg&Mp(h4D&pTEK>qDnRT8sBPHvJa_$^>Q4;0ez#uC< zbxPa@PHgll9cSv?)avL_1a~MuHui;*Y>mXRbg<54HO9j2o~PpqjI&b-eMAnsgw8oq zal%~e>QpR|<6c?8U4?|u8Sq3Tf;iHKlsM8;*8_yh!=V=uC`pN<tOCa++z=XTWUoA{ z%Qqn|d>47rY$mLpHp<~r&w_U(#KHly^aWg6<1)_~kbi;e37p40^Y57P>1$0+k+oxO zF0j_NUBy|S;z}V|bl@jE^3JyL7>qI}$0)O}#Pf};GX|;{B08fu9?dE7H*BE9-(Zc# z$QmVzW8Zz^Lwri^ZS!%sUQcYQUZX_uq%4*aM|q0wll_#g7HuxA^Muf|?Ld{vsnHsx zBqfe?m_@%LZ<Yg=r3SCHTDD#FPG7c7$qM`o8RWtl1&Igks6pvTIn&oK32J5OyD(E~ ze4+fUET8F@RGrCFeD{pJT(~NDSqf_u#CPm!b20vDNxHtWid=;@3KCk`l5@JL(xm1R zs$T~#u2H7K8)Y_e!j-FdR}SS@8f>n(!CSyhr|FN9Q4~w%9QX^efIB2VZ!{tYW&V*s z;E+U`-A^99Bt^%XwQrG(Vze&UNYNIL*6B$`u}4obianB143dmukYp5tB%>H48O0#U zC<aMJF-S6sL6T7nl8j=IWE6wc6S{w@)4~>oo*Dv@?iaKZMvRh-VaO=S7>10JjA6*p hCkLKLBoYbQ!GHdQ*7*!5-&Ozs002ovPDHLkV1np5&N=`9 diff --git a/public/icons8-search-50.png b/public/icons8-search-50.png deleted file mode 100644 index 7d83950a048d2e2ca2ae07bcd59fe2b86f64491d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 750 zcmV<K0ulX*P)<h;3K|Lk000e1NJLTq001%o001%w1^@s69zTe&00009a7bBm000XU z000XU0RWnu7ytkQph-kQRCt{2nagSvK@^6+Sr~V&G%ds|CaztI8ZT?3D`9jJB8c$; z1TPqbs5|um1a}$~3BgS=lC?%RUh)QRG;Y*vG?*ACX5_%%P=*$qOjS)!(jPQ5Q$7Ew z(^Ylq)M+RvC<w`JU<4Qk=70s@m#(kCJGGq$5^~5fpa#@|#(!S+>@;wc9IzLdaXPmO zyZ|l%2Y_y1n=ZRQ2wVnc^=$gTXFy-OoEQcc)sY{-ZD3au|2N0(087&N4h#{Q8_wID z0D4-`+5=2FdSgW5mJF`xzT`>wBJewwGs7}u1}g#dPdm;G5^!OsYvNicBfzM$X38N9 z%s6WzBqe9f)I#hN4Mmt<!qcNj*Z_|B6s}3sLToH7G@H#SpJ_*38(1^@M61|7v#RvQ z?px-9-pq62^HR3Y`4AhIn57-Dxgy&Se2C3S%yOsL^vm`eA7Tp<%UT~Nflt6ZFc6?U zk?k)Y{9r|5T^VijPLA|3K>K#J{oE{$EQX$11L}-*;&_1eM7H1iT<mrzip^o!wlKUY z!tZ?_Vj~i><7sSO$@VE9Vu_QYcu5sDkfQAHB|5D)V~JcW?#kv9pQ48(x*R!;Ujz2} z7Ee?8Nss6BEKK{UW6L{b9X}g7j)vm8Y<vz`jT~}{4^}Af%^7LilsZ9R#vErxJx#Nc zMk1}CShT7Vfz+9F9$S%Zqx3p!VtsA6N(2U-HM6A9+{`}Htq{8`jc*x6@Oms~%1$&( zr^KvMi+(NEE?tR!yQ<vDEn+`bZJ^ptXHdyzs>#m^cE)%F?B{RV?o2vetWfX}c&m>) zE85&X0Iz|2>eNpDO)i}Ah1HhVJ7d%FEFDOta3-fzijm1Fm11OaN;P9->;o;GKFw~@ g;Z!?$B-m2?0UfV5Z^;J0ga7~l07*qoM6N<$g6)P#ZvX%Q diff --git a/public/screenshots/p1.png b/public/screenshots/p1.png new file mode 100644 index 0000000000000000000000000000000000000000..02f01e5037305d60b3232e622fc1bee1931a634a GIT binary patch literal 187470 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≥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%0DG4(UYYm}E(>IC;KU{_A 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 GUiu$c2I7kV literal 0 HcmV?d00001 diff --git a/public/screenshots/p1_small.png b/public/screenshots/p1_small.png new file mode 100644 index 0000000000000000000000000000000000000000..13d9a4265d5660f684d8914402763e81961e396d GIT binary patch literal 133129 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%0DUN^OGpHE4UC+neFyzZMSe$G9V%GefT!0Sf^LR zk70=Gp;{#VwyG5Cgp3g()#JxGn}oEV1(UgWvR^T8M$ag>A9~!3=aqXS7BSt#h$J_= zqWW3kV{s}}j`Bly`a#psCq5g|M0Vj-X|^C;*H-wcO?dbK<^+No6NfYc;*WG4Bvazb zoaTVQD-r>}CP8zPtz?zFbjK&vn%VS!ACx)xIwO}&mTzSv`i<B(7sLT+X03k$%a<?L z<t123WNp3kAWW^^th&hS&kTcxrX!|h-w#7T@4w(x${gH_x1`{K4G9Gt(du8RrBLe! zd%dBYM`7dEf=XEjIcdkYa`|F>fD?m*L<5D0Akl~Waf=osFByKf8okK0eYmxv8#ztW zJJwLDrH^eXnu85n@LaTy&>}~b^@eH>2r&oR0!C|Ho7g6I56izadqS=Ya{3LnHjvKW z*b-ci?FV-47GTn}n5+3P8TEO{^Zw@v>H^+oVfw8%ptcNq!s*a+hb<EivxV2+t6~U1 z0!VqWAdRl*Ax0wjjKxctt|-9+ycDUf$ym{zeF-{Qity+((6|V_;m4*pEz`mYOOwHv zqs0pH(Mahr=Dd2z5c3hw9iDjZY97}%B!VCe4GoK{r!A!+(*XIAMi31&G=OQgOmX^s z>Iz77eDdohJwZ5qdITIfYiZ=un64l#rzqL*H+r{-+Ds==Ma>Jqt;?)tW>ZxeR(eHZ z8m&4B=Q1`f9{D%;G#Rb!wc)2jdxmy_vXmNj)goitsT;=e6=s<euXb1BChZWfYQjw) z-6KR=4!f9OA4FQza5XfYOYq-#D5_kj>?H(jc1dqY7@j@MuVM!@ZjnKK3NlK3ho70; z4I}6Q&J4C-^$Pz>_0u2zxGfWmE?oC5^A?Vjk<aFDwE`)6k%L8)%xGTc@mb1>K3X*- zko)xYi5zt)10i#qL)XE)gHpvz*-sQwsmv=NBS4wtRn%AAuzz{%rV##4>Ko2rQG8ld z$hUh_Z+oj#q*NA|OUt%xiM3D-MyDyN6ZW_I#CYxeeY-u5`n}5X00I)4$}$6v3Z9(4 zupkI%9Fk1qfhh^otHHoU7>*GqBU_41tI4dEC+}b=0HHYCzIt<yI{ZcZHx{FUuKUp+ zH$f&i(a3J={WE*ZAB*(6&!z>*?aC(gu1&a$vS4hSRqWMgM1VVPi-0d`<Wj|RIox5U zoWmsaN&dPJL+a1L7{>kJ<+NT#XTD~x&0kSx8raaMP&oeb?9l~F_k~^B48es?UT8dA zv-jLjJs9A**KYl@h|dAcFRuKRhoFURo%RbU-PBXByPHCtFV-!sG>m2JcRPRZJ{y;E zHhz95pR=SPpK+t@m>I;}9Yc6cllv}5?anLHs@F|Zz3kk$$ik8I*M_;Bp-}X91oZYA zOgSocp6Kt!6-Iw7uznZP>02>873)c^4pKW|Fy&7OCosatB$gW)g*CInonjY?=LLfk zL9FeGN56QXXyA$);DQ2D3NuG>YxDCVbA6r}&`9}%q2cd$`a_WGG;{HPVb$VWSy`dX zB>W+Uc2gw<#1a2&B^K<1bWWs~7G`m!UKXyfu^NQ<r6A2sV7%>7<a!DLO+)9}nf`eQ zlZ|W914Qx)LM_Lm;y0tF;t;_7*Xbgms7XitD<)clvSrvKAC7Bb!CwiYS<XM&-9x)7 zE<p|}Y3TWu?K{xnuaAG&+7XkyiQYv|Bo11<$%GkS7>Xx{%ZJd@39`(W9TX78b&#yR zdM8Q^il)U4yjNv9Nd)Ffv8uOPM<Xm5TXxxV6_#eqP^zPZlG$%|F0OCvg(C<IWtm8= zP?y0;GbPqXlV)QCx1B9?HRs|U6-B?3gL3}i*8U1wYoG5~L(-IIXW{a{q{~2|gV}QF zcdNllN%{0Oc(AG4XI`KHuH*~fb*nL0=QX*<KL((F%k9CUN)7u8oJ<YXfW~N7AktEx znaZvjoU;2;xBr8ghTpSO2-CFYA|glNTM|b(5VJ23f;u=~dYte+rnG`pHkDjYj|f|x z_j|;6&}!X#HkUSbqmw36*d-oR&f>(8p*kyO1{ax5FWj-Crpb-~EJ0<gqiXHk8HdB3 z0QEE*fH;;3#e{uvL)jk-^{&UrKhG@UKXE-EdIF(zv!rBsswO-y`d2IEamd1E##q>j zjVj_2F;q-H(p2FS$|-2rQp8qE^`X)b$)+(H;q3Q2rvJZPfJzhNrfvo9B%(|4mDPxH zQr+;^oTpKZ#52aLv^*chyF_xzO%+eE!G{0D_HB2@<ju$VI8P<v2HPfIYRih_FPKd$ zx+H9Su=B@VZ|K;e=v#;aui72YZTpqZtK)+O?@#x_noptrTWLj^q2`S@0IgCE%9I%j zB=GApMLb0iW_GMuss!7-9$4(oN`HJedwXN(l*7rx#2O|JtamWFH?`-|x98S3yDRME z#0ZT_+xXqgD;kb-eu+JF#E7#YV?xHfP46e3b8=4Vu-=27B3-PH2MU?rE2iMnE_RlX zAHbE13niF9Ub3h}8B3k?iw#@)mK%Rxf^9ar|B`c=yN5CNH92Lp-Yzc|o__$l?ihnP zHBDwhMo!=a4wN)pQL&E0u^COpRCdskbx7%0ta>8=F9<EW@ms!qoOe-)wh?zcL}2F7 z=NtfkMq3xYv>A{k=dXC#N4t#R*H^~DzQ-GhUZ7nl<Usm4sLb<?lCMWo(!C0&{9E=% zpZ+l{#n(T|u|@mW935{CCBfz3BYD`Xatq0&CE1!YyY-bdlPA4UUJY)!O#*~cI@uit zcxT!>Co1B?wy!Eb0hUC$8U1$-N#NfGU5zF&5zY^{$tzg2q^%d?oh(RtPvdW?X}e+g z4tW(sU+S(7hJ5>i*Szpe?zXQ+<4ArpyNVX4;_k;-{8Y}0JyxFap&b9<MV4U1C%>a_ z4jM6qgtC@k?I^W_P_pH~OrJ}gkb2}c;U$=xG+wfzCWdJxy8j_k73qeFy1)+(GOx|m z-j3tsXFB7fh&F569miKo<)_3@z84tgDggX!>SjjSoLyg)A-CWv`IkeiffHI`$G&NG z-$V9xq!DCgp#jTiqyFGJA)yqKE`O^%aCp|ziuE75X-@q~H%EL7f@p?9YkQtiSvuFk zSNQQ4{cg!#H|p{qK?gtM$%)3;d#{hNTt>&uJ?z92rOZ6FCt|miHX9)}Bg}MU>4_X% zu;myb<H&aDuct=up1cRI!#BgvDZpX@FY{bb0$(}AFvQ}esTrkEVo!~v_7JF#_+lYB zBDpDPxSR$|QQ|(EC|-wv{ZP8QAXzMB%6b?^Dce5>h9pvZ5rxb3rr(Zj@s%wa`&8_I z)Hn+!UZ+x*2|%GE`8e@rYImCWF~lVRFxDoDW7`;~;vqj*FdPM4<P}8CB^f7DInz;q zBnsS@o@8Bt$P088v+7##jex_fgn%y{Zjz;nEJd{6^B$hl*8-N#LZ{ZlC317)gf?d# zY$}2K!Zo>D%CNzeYfD*SXxp|I-jAe&>h{H=1UXbGb=JF%s5)US-P+z#42v&9wx-}h z#cdg^KO?wr)@TEB{bW6_vmETMw+?F{JC;95T!UDar?L+zmSIp_#Cdn7gx7Vy8^-cc zlup?p`cn4SftYHgZwNew?p*w(VT5TL=J}tKDRbGoMctvxV3^0RBEf0#?;Vux>Z7`< z$F&4>cbj#@vyC?VjlGK+^=>fFLICzte#!4gEs($r_&fw>Swk*+LCQCxK~Oqsr{XHZ z0CqoZ5-KP4J?@0b&7zXMEpLqj4{{=NoRPhZwIIDYecvSvgQhiPPCt!Toe0G=YIFB$ z<d)S|51HHW0Q>IjR8J04Rl5>H1@>9!{fEzgcphIQ&nBVs0Mg}t((=O*GJ(*!;OWbO zV^_B^U8tZ7{^F}Iw2LQn-p*C&q^?nAWmuoED9jZ!(D#nVN%Q7+%vh3yzf>gpbthOR zLQsaj4_z6d4o2?+VH3e1PUt-x98K0Fb3J8pPQvOOu)~)F$>4|04?ap!oZpp^v_*rY zRsDX0=#T{Dh9AaBI0KQ!+p-VLYNK~{V;bi2hZW*VIqvUjmGS$a8EW~4+$gv@@RQCY zVZgvp)6n#t!?_fRA5b|WfX|#b+HE6U|2%a`fBm(I4V)qDVrs>x7bGml*%-(dQ{{Hz zcMDc>_?kLuU<lti87f=gvrRNWHKh@r+ji|Sm$#rrru>z^551Hhq^I9nvf(>_&}j!5 zrxVC0PA!5OzLLC!$gvzq8BN9ww<8x?SZc_k+lMC(4YV#f-<8C9AgomFM7BR{F#>Vg zlot89$MqLUjnMDf(rEF|!I6AO2p^L33TInK`HoKcm?PiQZ&z2us*`t138zzNJ}tiH z@36lHT%~i$Q{c0-<4PFh%)Ts}gqEf_ube(<`?5o#W2m7_=Y2i(ut)KHE}l$z>iSPv zn-nLF%Fn;V-*&4QT7hlFwt9n!)0Io6@y=a%v54O;{AihhnXT`w3m+<}{|r9=7-<%Z zaSEx`)!hb_-+Lxcz4u?7T&xC(Bq|E|SnTXjK$J8@F)al_CPy7{{S$xsM!CLU<+`WB ziW?nrDUFHBGmiT2>}qxuO{7q_f6NMarA^OF5aU;)+dcg!jEcE*RkS|Y#v!p*Vc!#l zV)i?g<T?)$aqBzu>c^AeC4>3A7tG@=@DIng%{$yLM=<EuF(&e`*<gkPWJJ_MM3{(3 z+g)PGpC$#uB6T)IkZ>i(B}R@ei5<GUNg>Ym*uUkh5fh1i^>Sq+xS4?mcI#=HM15S< zu2uFir4Ut$dm4iC3c?{f5iaY<DaK)`hv4etWQ_XY$yifwFvzby4={lyl$s?a!hUm* zfXLGPi(BehX0V(I;;jJUBBCGx!(zmCqzhn}v0eIV@+9Q<-r!#~!=1`nrLCw)Bz3La zu<9Pbfui4}-W`GE4JdszD~*S}+}_0TaJ`4ehb-*f8AA~skwzK`Ly#3({Fl{s=Kf;@ zo-{|Lpf&?7Q2dRNQuq%qFrH}TTO>?rU4DVLpe!v+BL5%V!vn*d5Mrgt0gPUfN~eWp z=1oLj8=a6CbUi9YN*S%$iZ^;K`T|(Gf6>*f33@C0zHN{^xrTALtkYVsca=e!nUEmm z;05?`_SZ--uWfGi$g51`U@1=H?OJ8}LM_(KIYGdW$j68l2%zcuN|4Oarw5=($V$e1 zwvjt3;-wybm9|!MIl&UJ2*CvX`!^l<>6w9?4JaMN=Z@*2RH3!##$H3rqRqi`mEIrS z^Zx%gB-=*);VBsHxKDKjiRX%g2jnRneI0VrHlcemJXBz+-KV7l(YEs><&`fl(mK$< z9-efcGY5E%MJS0RI^&;Kb*d!E6DG)uaYV^#XzAHsEVdB+zUs3zH%l~<i9ff5&3rfx zabQ68WR<NnLp9P)<K3(&oBS>2(5Q%?#AFViEcyIyu9v#)_M`OrdvfF!GA=*9eStq( z2_M4|LA7@ydB2VaCy7cUo>m==Mad2Eh7fQ!l=}@9cky?3HhrzB5<83ZN+Ts~f#E-( z;f-7T6n0Ja7X{Ki#r$XO$XM)-1*(u<#;Fj?cMIy;SYMCgUth8+03k>}w!U~NzbkM4 zh_!pM)$^GCn)f1a`*bqzKVEc0o{FlxQiTh@kGGxy0c7UX)7`+c2j74nw6@h3R0)Ey zH~(;49r%1mww`YcC46X#Zt^;qb4adzLvoKLLCnn&!<uGq|M9)a9|DDR{zqsq7?$)> zKt57OVN98ieV-OW5yx+djTW28a*76$bdPyLVUljYn4;VUi|rDr2#JnyQpLhdSiGC! zQW*b)a6o-Ghi>}|SG<##>!l346cBd2jD@g{{R+C=UNGW^v8>~tVv7p50{yph=j149 zxJ1g}z>ytsS=p~qVw827HqHGDyWn=`1Lg1EBRDLkjW*VO<byxKB^8xGcKfPIc3?MR z_BW#M-#+KM6dnq@31Kol1Zd<|9q5qQ9}XnW@a2J=^czUU+lb@nJK}rrjqE0CNE*Vn zw&YYTWJAg_rirfWEl=dOY!olgqB!@;cg@U%fCUNzlvE*jI{DF~9OA4|6|3nodmhNL zUkp}6dq9eDZ?a?R+G;r9?LfO&ewifUq*9LQc@&|(b3%5F196gHo*1>eUD@MrZjvfU zdHoxe$G4mcf-h%0XItyBp%vkfBL9c1w~T75i@HW}ifhplXwg#KC0Nm7DN@{_g`&j? zF2!AnYq8=Q+$rwv?gR<$aMS1g-f!G-@4x)XIAfi&*Isk3J?CCViL=?qEX*b8;tseD z%?0Q?KPQnMa+dU2?D}>0CuJfbPRhDm)C4!@TD|1QpLIg2S9Wqf8Fud&On%117IYiB zvsPqCr@wQ{=K&|5@x0i$8?8XBpQOlK`vDf+ZS?eH=Z@r;KgYTyAIv}7vi7){n!EAP z6+*1#hnJd7$JLIX$Qk+~T|^-qM1*Yo<cb{NYvbn~Nf_Y@MK|D&0rlwAL#4AOeY%|N zm@Z~)#bEz303ljPg6ns2MPTvU>Q>9OgzRYqGcHOZoP`3DwtcKYZ62f{_3woHfc6e$ z$59s>Ej~oI#qs2_BKR5I9(wqX%XvcVR$llO8jobFPeZuN9xtG(JCKjx%E3=b{K^x& z)7*(2|4wVa6hgau#OQu&lpdHA0`T2Df$7)naKtQ*cc@$l7KtMH>0*N(QW`QSKrXBv zqIk){@2W@9{i+Aan-otOX7$o@{M0SmvxURoyY+VDu%m8?s9Nw53Gz|D7<zvT^^M4K z#$=VXv~p5e!cKpMq-II`-B!g*IfC_^;7^=MVgIkFp7#V;Jr|0xQTJ=p(<lKGC?zwP z?v*3Ebkp%&lvzKE=x?fBHu2mLl&*3(5E!QW^lPnuv{B?k-p5>uC^n18XNw+p|98j~ z!KVN$CZDI^4b3DPl_65Bw$i3V$}FOO(>I)E8Zxd)eQk1E#TdQ^V(;@%3(LOO$MaHr zAOG}I;#rRy-ca>2T#9Cu|Fl?18K5f9=dLP^WQCYb(hHHBdeO%!1@#1NajTGp-|-Ty zTjDU2(2T=d_g(*5_fm@^rsU?>!K#DJSJ#9QO&Y?sgKNlx7hH}%4VSxK?#8)}wDav@ z1xUs>AFdk0K3|X3bM$6Cd~jOsH2P@ZTBaoi?{{t#OOve$FK#;iw!8phgJ}dbzbu^8 zfAsrZy~KPu^`;|$%qG?2)FFYL>NTdj`mS2LVyL%FNG%@I`N-dDbQub)2YctPPn_|p zg=`}07$XpfodhYiHgS)oWnF^Voe%D?dl^&5<G5XQLKe$>38L?t<^ttTg!OE(c7sc} zF^`_mch5u%g6iB$30t1BBUJXf;sbmD<NG{X;AwclNX?u^1CKwl3IrhHM*C(ozeK5h z`7(Zn_T$J6#32nd8%j#uI12;V6^G+qZFXkj?!8@;F?M{{SU=G5@x38c%rHYxU%;qf zhRU;npv%cTM(6RjDpo3C7pZ#Nm2rrbrstmU%0#0hX<lBQ?`}>`4j}THK|mjn*c|K| zvSJ&&p!i8;<p=(d35R5#Jxg1#-cv1G<C=F}-ySaEw`>nNJzutb!VJA6rfU3#SGP=M zP$H@8kimhQW(%Zk1&1-B79rplt}rk6_wa<8V7j86q&yjK$l~CFU@mPZC2ZUU2XFO$ z2w2NgBY>-P>&o>a1m)LEURrI2V3n5L4gT2$NKn$2$fJcY@hv_SAPqJ2z?9?h8jjg> zdvnH2C1-MMw17$*VKPsVJADRqnw@S5BK&~vhb!!F5y?3=f9C6u!n4xYoBqmaS|Q@0 zIz;;zGxTCZgG*{8_ecSZ)_txfBVFXltc)37ZT3tbt%f)+3|^;6eggT3QQNs@gf@En zl8Gk1+aB>ruFq?{8T~sP9F!|J#5YZ)`x@8QAVM{8DF1qNqh9aFXZMgwq+eE4>#=iI z7rV9j7X-GoHYjddSKCMs{Hc=<*j{KBUMD&MJs<@(U5b^rbM>0$(Xtz_JIA6gwq=H) z+$2NqK*_hP^mSgw6usE0WzD_JZ<cGxpk1ZSvt?O&5$?NSMGF0p$MT$xJ{Jf0<qYmZ z@<|G8dJ<dxeYct<#+xf%0bdh8{n#0oVOfodObK&q_=X5bjn%SYUOL_#Zw<VLWt_71 zVh5HOu&BLF#AwGm@-Sry8eS&90FZgJ2v=<$#51{@W4p^!HE;XMj;t4-hX&SXE#gF( zbf5H4Ka~GnmWZp-olzc6)K6k8?R^$ho%|Aw<DK^Vl|0AsqcskI;xmQgk@?XDrN;ou zdgzJ<Da5P=5w!88zSG^CTLwP)yJXg;bHfq0!I|NeExPIJkeSAES5faq3j*eL(ZC_0 zy~=s~LE&5!8q1EY+~i;Q3aIc!;{#%miF`9gJA)sz@%Gzxl<<jopK`{!OCwqQ$Gc#Z z3eC78k{4w`m;Rj*Gp?NLE>x1!scEg~4{Ys7^()@OwyirPdNW(hy~We~^W=qFP9D-Q z(x9Tam1#3dFbaANRpayk=_!$fQp{!D<yVf5w`fdcu+MV%$nH*JMFSH8a`!r6f`py; zJxpMZr`U)2y(ARaU#<ZgEe4-IM~om&5uHZu#mcIXFFUz%gZQ>3TG2KR*B1i3)Ro9T zR2JEpx|rTOKS>vfMPxYG0ixRCF1Z_jSx3CBh+HG7!z^7Zb>0t$UA(OBF*WO7TSoI@ zfsIZ&O@`QZgsgl0tvb`|%tTWsay5u?h9yd&f7i$`OfKnX=R=FVD03N4ai$c&E4<BK zwcnn$f5T4N`U~>ZqL_~!vdIVRcJAy>ysCy(9jy-ygUf2#n{>+-(ESfBN3~3<M)>ov zJ!XaHd1ezD406td`>dmOPn$`*=`cDRIZGG)g|=|qynjgJne7O~q^@GLgUx9vu(fGi zXnN?HoK-%zy{E?^Jv=<yEAx>s&A@p-K;lCPV!#%kMth2t!cO+}%Q~S+Vo$Ld54Y!x zTSj=&O!%7Erb$QnB_Ll*e=T{`m)cSVi2XkO;K%u2d&M+hAR?7tUWp*UAd8G$64S~F zZwJarsf3^0fKY__xrqvK;G5uyT(C?tRk{IQVRzuss36(RRF+Bqc#eSM$s0w6@MMlJ zj7@puk!TGWxMYzsvr+w)v1L+VD?%!xMGWF8DI|j5#mFTAh-3pnop-@ZbFm*em8<E! z7{a;7lTkyegh~PJd3B_q=k3fF@{TG0K6ZPBE~Gfr-t0$1wb-+IUbijkU;R(dbc(;z z<*U6?i#{iDSal&`V9~L}REj@Tio@wwG}x$I-AVt5A9nt8ZCMZ_zouXV!arv+RPNJ# zsDx%$+hJbs$L~Nh#)Ri~D?nTRWGm_|=mTJzp3b(aw;e7E$GsK`$o#~?UC;KuAlRNX zfibwJF@`Xe3@RBT3noCo_@oFIE?6jme7|6NDtH+kT4KxXYgelbCSBZ6HN&8qNtHfC z!?1m(YiSk*UvV_!?Q+H%`ggGGu)n8Iwr-+S0#rRi4I2&%Iq<Q`wFe*zhga)hTsD6C zw>z=1u|d)G)^M)o>6<GX&H2d^iHAXfu)OJz8Jm(1J1{VCILKB$nVB9dZe_}e&WiO$ zkuU9|h%x|Th%JF8k9~!@jHB&E+?R)(>1H9NH>)WOPA6QE)5?}6d4+L~Q!GtRJN^5R zh@bx7+xqv~^xk37A&k*;wKOd>AZJ=57mWA-91Zlse2&DhNwaVZr*N>wBnnB_&%hh! zhi~`Yww+qB6@~_5GBbOZI}Q(_+Be)nX5wQC)zgHgIVeEU0tbej(+LEiPPrv#V?|M1 z0$0QivZIoz4|*~-4`L>3n&@A<HLcE$2y8b`Bt#0%942I-C<lh6woqD8K6v1}(qpE0 zfL0YQLjVS`!#05)J_;V6-9khV8tG7e_gTk4JR_&`pjn;{i=vdT-u7d;&6`iA;o|TC zzm4NhC$2kxN=i(9G?4+S#cJzRp&J;x9a@i3W(a%$yAFM2G%5el;7Rn;|F!%~7_f4@ zDG}3;+|Y;I?@9IO{3^BcppyA*_<vSY7t&i2Ik-KjnrRcq?WBpBXss3U>cYT-5=RMs z714IvSEEo?FJiq4bd**CBsaaJwO~%50|21CFkC{KpYhAm2IY-ekZkr(9{iLys&7o! zKR#F7M&m<ek$`U_Vm57sj<5*TK6V5{O7|*#*4km`T|E-mc&HCk^h1(r+NySNg{hGe z)BB>IjtSUdntj_1S8pJDowH@S_MMCU=X)*Ji>gNp7p}>QG6HFT-QG5e3J$!Vk&B2; z|IlyEw^_Gj+ie;x64cv^CXm4fli|dbeGkhf=J<@s^G7=qKPb3^vaowAH<%FtBn+M< zTCwOO$(91gQ~&*Qx|hq{Bi@0yH1J{sJrp!XYFj$fBGgyVqA~XSXM=+2(!lZcfJq4d zI`|<a_-wG5vJxuy+S)migF<n=A7@1N&Ix!_3Gyv8Rn`OwIt!II-XDr@s*pFtC__Yn z>u21+ggkY47bbk<J61<`2yWQM1XRVRGi(w=%yhk1I#k5VKaW)QE05mdqpkh+Cdubd z7syzCz99fxxZVGc*TeOO9^~~e;txDtm?)hi%a7}?S0=S6RiEE31V)MSlSQy3_8Cpn z^76i(({sdOP)zPP;Y^hdq@nM?irOPE_4;EFS4d*&kvFE!W)s0XiA+RI2Dcj=Z)<~` zX#Xcdx&H}u)5;HCIxAYc>)-^|aealK^Jykfs~IdNEI`SG790wS4@*u8CBSdK2#}~Z z?yad=x2{G<h)%!@dW$YJtWd70=ogVp7#5tv9=c(42PQ7pjzi^HS=j!WRjOFokN6;^ z)~1u_%)rl$#1u!FN+%i<n;Nzu))L=X)`)@#sGvb2?1jngyhjV|frZ%G(kXZRMQu@i zr;0@Kn;EIaKN>MJkB-RHjL&-B_h@uwyu!}#mWJcCu)L8xIM}Swf}~pt>;iO9jLC$I zAVfyzRe*OV>ugtqW-A!X<1OgF{+^}jVDh6JME#2ZTE~;jj+;x%(w{^W^H?AKcR(}d z{+sgu=E1)o_=fPE0_1tTVv8^qws67WvJ3jWx4&)v-Au+0<rPrWgd)!V>zEbiO%nUZ z(~F-7fQ4Tp?7SnmFcd0cdl5RdvY29x-2x0mkzrJ2QK*6sp3r4*>KOIJJJhS8L9=%T zupG5QY;5Kh)Rs*2@1KZ_&SF1g=9w`dp=nd3dNDVpR|(J%z%2ApKHD~IpebgF;_&j4 zepXfO3ge7LU?1QOX>#)B<wN-CYG#j49&syu>?wMAyoBetI~=sKz_dl>Go^DE?rES> zoca_U$`Qi+gJoAPt~7Bg8ldpc0hsrn1MvSAk}jmPI(RAhyR>P%7|!3#{n$%cc~X%! zzCZ8^5ojBYRgh=4FF<SC26?qboq<3EvKM$a^bsA**<lDY3PuLfsgxBqkRbuX+{n26 zxXKxg2sLV`Bl-)UIlv<M6+7p2dNf=--dDULF>xlntjKoK#q_8K(b0$iLOWbk;9qqD zxwmIXDm_YAF#JlRDnZyrB>$?>iG>;isB@vl{Hf8241qvO&{7+a$|-g4OI%L@i}6V7 zG3i`{oOTqF`Xx?A!vFfYC5q(>>xb$I&+%LGxAfd%u#Jg_QzK^s>(?DF=K}QqERX-M zfHAOcS>Xn`V>3>;XJYyJ2@2bb#?2o6R2%S7(O3GA2&;?Jxvq~9Bzr3Qf?lzd6SDC( zh6w+yQLuGlQg8=81`wUD5JT#A-{ZCAL|h_6CG8&c45UCDBrE78?@QA=dK;5&-Ia_E zkjjAIisJdb?Kr-;m54p}Hc?<=V;rv^CoaCEsuG6G>O4NIy~x<uu%5JBD8q?R$Et<- z%!K63{5V3*!f;$hSg3?_hh*IsO#GM&YWjCd3Lr^KdCWu>ZKMii6yTsksy~iu3vQKw z2}?9ucXvlLUbN`Hu(nnHf9Y-gFTHCzyLn0NI;QBC!n?DY)^mZs2-n||_|b3EeYafo zrM&l|p2|!?4PFYTqa{UhOE|QC)&rurIT6Npp2wka1J7?E(pVo6qxm>6A-`WS`%9xC zumk;xd=_utuIgW~J;fse3fCtQfI<x-wgn8N2+BFW!JP1cvhN4pYt^{mEVJ>;M7<e^ zi-<Gh*Z(^$z@+kij2l6gQzXHv&xnij423>sgMM8uV$!hACZMbwR}=##rJs73E}W;# zcx6aFCwcs9`9)Gg-+v?2az^UE?fL&~UW6pKiQ4~d)IZ@|R$!%2#SV%>#g0kbPdMz9 zZH{RoBx2jthz}Y`MGo%nQ4JZap5Atr5toUOCD?K{(_}|;*(L*^u48c4?2{JWC$IaZ zJE`5v$F)WYDY1P2j*uOK?u}&U-jHs)%)JSKn;h5A4x|#LU9wHR_WDI4bO?6JdVoL& z>*zlrGN?>dOq?oWJ|}{3eyjPGmKK@zq>U2k*UjDfb;wbKAJN6eXVGjneW7k0U92R{ z?FyhOx#egFw8Ift-rtJUem^tB;u;+#MXTNzlyLNGjYRbQUKBA4oq}OWe(}MDtT&Jc z(d{?e@BeT7d^-QdUkZ<ZTC41be{ih-oi;8dXL;Z<1cB)C(>LOkJIP0<$8L_e4<v{v zXg~gn{r$;A4nRWLG=JAj^k$A0DKuNMW&5yzM{H$ipP}cqa+{FT;;RI?DnSEktYyX@ zk^*#vj^>xoC$6#Saa|4<pWom$#@(TiQYO(4_#aYGW_n#~m+C+;N!g}3#``u+=#naj zaZ?1IuIBpt<-VFeTJ$NWi#p=U<YJU)!e>J(rIE!DkiSv&-y#?1IrRJWVNJ^5<h7f3 zr-}7yOUgp<Je|YWp?*cvD)GN$g6X&f0@b%nGx-Glf0wtV(52eB()PJXv7hDSHVeg? zSpU`N8t;MT2`>%?5g;LI($@|X6g`&@$}bOIkB4)*Dqf*N{I<`Q*oQ6@OFrk=8v4IQ zA3=O++z7coT!i%oX{g}?uac&s4#z~h7D?-WFI_H>Eqov^d?vK%mHS^U!2O3|@B{26 z5A56NW;tM?7yM#!yv1%}#iG$*$~Aa$9I#!pROPhGd=$Nt$p;?{g5@pzN*`p?H=hz( zSfr$s_UDMw2A+lA8K>YmsHQuIP``>$F@zI8@e@A(L0wa`3b}30O1zIPgL5aP5VrET zil6QzK)U6bJVe?V$Kfjr+*e?>srKZ>>LA5o?R&Q9yRtw4L~iFTs>%4unwZhWd_?!j zh%(<qG?j^#DVrJe^`k)q&{hO2SoqFZcKhJ^gmD*^B){ssv1`Kk^o=_{mci&_xkDou zECAj_iDUidG&m@+Q2q5s6Uw*v6L6AghY~W`dXAVa|IQ|XK0;(V?p>?LR(=nbv5gZ~ zFC#DONLI+q>NG-dcc*WG)Vr$ZBK9&e0C`?9ammw1GzTitEZi-b6$<JO$1fNp!xX;d zI4?a-pV&>*685bAmd<gUGt)A^-1F?VQ0+8isQII^<BHF5H*=n*><AD-YaXUhwe;tC zXD3w!DW4yjRa+VwQ|ci%n}XdORwovh@~B69pqxbFaaQeq;EO20+qRn?>NTKnx|vvB z2s?Y4s(g&Q+Vm;gKuT!2q_aJ+{5j-~Idg>&#}!L|)YrxMfy3cWpiUV!)7RkB`*K){ z-CfErn@fsodfa{S`^3D~A5H9mq4%l|p+Ozmh!Vcmin^lg6Y)^^Trs-zvRIQ&X2<dm zE^Cz%2Xn!NOT4o(lNmunwzAOx&CYK%ot6;)J@9@b-LfaN%*}F?Wj^g_{XK3lr}(Bs z`e1+3@OeK?$kzTk8yC<4zx5lJ3V}qGCDIyEO-`q+#k^RpGLrDSb&S9LpED_9Ll>(| z(Y;%($t|sH-i7a6by;uPZ#;tEh}_dhd0)LosUStm>|6EnsDcFs{@{yS_hmv6&yGo^ z>^$zs;<tm_EHUst={@)+&=H|wH(<a$6pCh1CSbQ!gedhxPb4*urN=!y<1#BF@jeT# zDm_s^J-Ywg$USXSPG}uIO=I!<-m<Tfto-%9QjkB>GNezg%YWQBf!a*qBJ6r6$QEn~ z&vZ377LZBc_FUhyF9Fs7SxX;qm%QV`){bVCS?I9+vnqm@uaI`uEBI!8Ba$PoNT03Y zBgbw%5v-rD7I2Hh(9)ovn$BXjqn>-O_lB>DL+Kw!t9+uWf$avg8mWkQXbWop5!H<J zp8##Nosxe(YX)mw4bbl!Hd|ER`J%7L8l88GiSHJbY5g`)^1z`E)@4IiKGF$P3TB%{ zAoAV&t>t3G$#6CJ@oFQVY0X|mM^4>6_FwfUUFfLNpoXK}@&ZJm)ez!v4E|L&+UMt+ zc5WAcM6y<L$<rn*v9w2&)Hh1Q$B`y(W*xa^l+(V!dyyu;RkRzGOgyHga6Wx0F?Fle zTdX}|40`$VbxmvcjmGkrXQkQigp%Iya(%~`q#LTd{DPY2lt`HdeWlyuLH^jxOx%ir zju1i<T_!ejqYZH<xr6>*P*yw>B4Vo$6xFlEixIw~KKb@#lS<4=;)(RnzYDu~TPV2M z<z#?|4MgwU>K&?R8MIbXr0}C6<du`>;?gL}$&oOdLqSxcIPj@Oh)x#Zy^TYR4pGXd zD>YbWyy*?yK%}8AJ`SGS+yD~@WO`)w9a3K*9DJ*+&jBfSpH~K-7$jc~vS9ZY^`00e zntZ2xLlQLNPL%7R{ll{FDf!yH6m-bnoG$R~FM`aLFdR3-*@CuJG;41&a`O|Y>}6NC z5!ILRBkdXZ87@J+yLi)06}m@{MhiK8_fM#@%ed-WSg?wkG=!W5>bN<-uz$R@=Y0OT z3HAh{t$I_+7b+Pa`7Rit^uYp|ab=MJ*voRZw!{w~?YR((EOCmy7l&cdF<x=MW_d2m z#|9z5`myn#L~aesY}0cy8&`8a0nzn#vT=eKd{(RlpfvxS0Q8zuFNTS$NO5X<!sD}y zlFvLpDyf07HvLp~V{5LtvzC(aL#TKIdTQy>eLZ=9sM)>V6oN8LIC=bKjT+rN4fv6T zskpdRG!27;f@GWyrwKBIUB9g#?oVJk9gX{~i0yWw+dmxFON<lj5O{uXtR2`yAB^+v z=+1jB^;zzT++&RO=+s{2`_TK&O-)+~eh)MLn9ar#&P`@YTu-FSMp3LnmjshVsPXcm zJLuy=4RVaLE&r}aBk{<(YnSN8zjwwbh5+x3VeG!M_YLpd$LJsmh<)Y{qsvUPdj$UD zvMF6|$eG+%E@Y@wC|Q6{Bv`_)C?jNCr0Sdwf0B~2e>AYoToZ{P17vK|(pQT+AgNA# zRU~1hnf(}b8Y^~zUKmsMWH0i!?PvO7iizI%YX-b%>^P)hbgHW_5y8=Vi*g+ueI3}m z$%%<Utq;$kly*nKa8)l44<AQN{#<C>G78HpxzE_6L+#AnCo9ddnTexP_-t^g+QX@x zQFf16oOtMHpIOVns&a;qaevI)Qry*CNhKv5xAx{#ymSetFIxhcjeQd$dAkglv~I@r z{Ki9xBjZGpbQpyFb>rXMq+)|;I%w%B^PkbApiXC~z>uD@GP1E37Zi6bSJTzBj$D*) z@J)HLXoz=Z(OrqTyA)A-@x)rNmE)*9mTa7sa$#ZM$ISHarbCYBI@{NE0IV0^K1??m zMePV`C(*$65jS$mN1LxS-C#1JZ$lEDV6w}t&W5wp%>KjVP?m748D0%7(3_6FcJ@A7 zrCmz|`Ao{t%s(9uW2}8AaQRr<4aw!ekhn~rVh6>Lz@HW4TZvPkS)Td3q4^L?D_W}? zJ7LkT>uwa9d>0m9&RoiBChxuF_tQ;gOLC?cX<>(NLUk)ngG!^cITlM)oKH}2J=LSm z+pUl%=dFpo+58bf05o`V;kkc>gGj7_(f#9^)bF-IxH4IpE5vn`zwcpdpWEC&DF6H} zS~AChO*xC#D)fy;O-C&9YDS>N=Y#08k<a`?ZOPEbij8iLqZjwLCGkAeGhYPk_wC># z4vq;PI2^VSE{BK3zoC8pP?phd!`A0A!n=G9p&k82);v>|OHiJw_J>3*1hF#LWa|yf z8Y;HiHaOx4@umG~tF;kj4DS@<4Vc<-bw0AiuZIk*VCV#WrT+3gRqTY-ObMGR$h)<A z{-SgCy2$I+LK1fS==|Qsb=@?fVu?!nbMBp$1|Zt!xuyoGPOO^p^u?YCH_HlfU1g#0 zZp`pf5@X@}{D@afQhX!}k;sKc`u#R-%h;?IHa6%+f(c;%;ogO0&eQY@YbkGVmFpCP zwTXw!&l36vRu8_OJM*#H5(<cma50{be_1o1k<U*rq4D^{3h<SM#i*&*s)?7uJ4&V1 zfEkan`*MQh78v^ew<K>O|F)>F6?n(eLs>=pP*|GAyMLfEqK6WuJ|mn%isD(=$1C7` z&ja^q3DXdvkzaOGZ<0FhRnzz&u{(W71hoI~qkaq#w0wsMSXfcw)(B2mn)YSn@it87 z#2~%%^OaB3$<!#&VxZq~YSQZ;Jp8F<=o2_RtT^5t+V~ds_ux~a4vH*_=>A$tN=Bvm z7{GeDfnZMGgY~58!B!wOU9~0hx2X{4DC7J0p}fL&C%~h73y;q%M93C#tkOxs1Wc+- zMEaLcllcm8d9&&F<aPfbo-~tIG`$-n>PeAd-Y5jP&*#$3Vq5&WqJaZg)c_G`Ksa5E zWke*CJF(nYUNm#98$Z1`0b{D2oCL6(hsT@RJIRoxWTj)xc+8rdlq?>aRv`gij6GFQ z-9_!OnnFe0e2IzmINV8kaZc#3{dAn=<+`Y8)gxQ2b~kry4g-E}azHvGJ9E{yVophq z1gdP_XKI&Cdb~sQ-;>GJM7y(ZT94CzyYtYm@}uvKqQ{fG%J(p&ao(*&q(cjB{>bix zV07AOlk(Tj6iS=xrH0mB=X<k3Od#nRm0BCVA1}swf+{m@K0r2gpK4r3QX5q&?;4I< zb5PE0fo<iuFlwZCw>wJOYH|RiSS!K5k7R4WZzWkb-)FTy@Cya|Azp5a8NejYvB8@s z)5na=ecaQc4EX`WTK_tN8Bl<bYaZFXZlL|!s<0&}cSJ;|%|%KYxagm^N5>Szir-8! z`y?Os)VTq1Tk~L)xk*HeSZ@#kE4#7_`nAZShm1u|C$6=zeZVcv3Lxb-2(rImH2&eL z<2I>xn`PQ@HPh$zwbwzZrzWvnn+A_IGu1!VOTF%9DKK-XOzzqKLJBLpGJ1dV!~51A z*rT+Eatt@Zmb}kly;{G!G4#=jSP_p=C)-`4_F8eoT=7Ud{CWwhP^q=b|I13Lsu!=q zgX}^ygzrAF;!b>I#OJ@|eq(UhOrIJPh@vsGO2Bz~h54R(MhD|gAG3y0CN0qJ{N_I? zDf_<)-HBW=7uX!M7Jw)A$c<H7xDIwyCA4ii=2J}L4De#;+mBJ8%ozD)9ffU>kTtN= z?ZwdCrV<hU&IUIPwX6YvgmGRawti1?%fjJ>!Zf`fvWS0*i-ayT*qLkE=*WZ{)Ry}w z_E$OfT^b9GxIcQj!Pxv;LZ0mH9EWAa7$aY0C!2UgOo-e^)UDn~N&SqG(}Kba2khaP zH@py~Ga;E80*$oS+*ug|^KTRTWIymR{=_Ach`Wz-g#97UM3?<b3Zn_rUD`)IHPJGl z0Wkii@jDtVF!8Mp8tcNsyY%nz#%$&<{dm{g{T%RPRw?&vA30#6gqG^wu(Nhfvd1_L z-R-DyPS<E-+UBeAd?_i%{h-d#O5G>-Zssw002(O8f5I!2e!}52-Wx?w_(%xrb`kj& z*7^&RgdQ&d04By;O-08lu5wj*Z*WaLU&G<vX@Wh3Tzpg3Q{nx3*r>AJJ-{Qo*cvd) zJf9!JiE`eFqVeYW&l@X^4`di|)!wCK$ZYk#CN-Ivq}W1#yKMw0rPs^?PDqv4xA43J zcGA8oGhnrPU#clm%%YRakVZWkQ|y+i`S&3yy6=3t++nWruo7I=EJYTgiORfG!)_kz zLO5(G8bUsaLC)&3ioTMNc_OgBKPD{wQmuK!>cV-SBHERnU)>=2)BYCEnN6K~HSC;! z7EMc}7`kdt26p7vDn+lf^k=bK#>(9Tbyl8`G>lUB&bs>K?jv(bo5J@0c=vNP@y!0P znvLR#Vqz1TK)^G!LstdQ<JrmH3733KX0lh-{~;JD-fe7cSdUiX((hR8#;3>l;}%-J zKa(+gF7)_~mGgrMHS$;$!L_8-8I1i4ryr|9&7|Yf5YqT_mF@e)`#H)O{vU6=@3%Vl zjjOs(YC7KiEuSR8bVGs`ICBCqzqHChd%g#Y%pipa$uCvDuh@|F;x>xl*~PXH-C|v` zL*FQx14w6K3rBf25Gt%{a5>lZ%KpB6iMZWw%nx}^fVhm*?}DvthIOqFKnmCH;4*~S zm_2U103SY#o?7Y|>fXhLi^>B+%vq@yXN%^4s%w`z>n}=h+E-W%-ME;y*FUBF@py}& z;;lU>>^MZ_YH~hZbc6uvypIU|i~ykj6Z-<_?<VRWBRb%Q3&i(T42ZFaQ>O71teP67 z(SV3Md~lGOOr6*%W8x#%lyZ(u@G9Q%_7x!ZEcW#t*&n}5uY$|Isdx)NB-m$C!PaE7 z84C_0Xq}B#qXYe@_m`gKHK_wjJa?~p(x7Edl$$jlF~^Erm-iUoOMPXnItMs`)-B$^ zyzb;?EbTKmcMI8`O@ucm3@9R6F2da2kkfqsyWf9e-N`9BiTBC}le%39X9%L6XNK|3 zz2th6heZ>EiU$vd@B`2pRJfb1_p}ug9}G<Iz!;&9WQoxI9MlPR`b-@z2u-MAczJ~+ zP)~`KrB{51*1R6dHN2nIgZmbd;MD+qr64*d!UmpR>*w=H78U)|j6zPk+(g~*N7_RS z0ug+?dID?WudbJCpbnV!G4*;WwMcZ&&84r(&{dTO;5;hh)fN{6byIQGO;Wy_whnr0 zCR2Cmv-Y3WFJY60^$f@=>+lQt^rm1~y~@45Q&yGgCim3<J>MSJZBCl&L3NvJq;tPa zwTg||(hRu5`frc=sdmVuCWL!LDr<^`cuYTnKr{5nc)rO!$>>b2K09si72l&7?%<PE z(Q7LWjX&W|>uPchwDLfc@pD{bw?#DArMorfH=H9hO%`aNVlf)f+n0JH21;F{^R*`M z!RB;;$)k=syp_ev;roXRPl)YE{Ry}^0ZxlNT3a+~4U`8;RKC@VO#BVhajv#8<o^%M zN4p^dbaP3Sb1>4Q5OB~7hcIdeA`+(6TiV=thX+Vp#*-Wm@z;$HEmY4{IQ?bKJl}Bw ziK%H52^?>3^%u1!Q;eJ>U-BM-ok>h{EcNso8NQ&j_8;5`(I69Nx*I_>le}bdG?)G| zC3zkBZentpPhUn017u;hsEA|@8&~hRiBVSn-cqQV=IXxR?K6=xW}#5?fFCj5x$F6d zd&#f`UK*m619J|oau7ij^3JM+sz~;hLFSkG{C(sw1Z`8&Y-@|m!)(AUkgTKMUd-}! z9mk2am^+~4^Z?N#ro~~uJDt}Zkpyojz-A1X&_==HJg(QFR;D7WxFkEze{hc1fF(N{ z*^@5zvxwE4aL|C<xAek;^Yko<KIo(O5*R5h)14utCv>{7(pOeASt=gA-J8oGZ51z( zo!{u_sAED+bh&O?=J|nEK5EERgW5B9%zw6_##<w(I<3ZNr5>NidnW8Mruw)P9hQc{ z-U};8z5h^Q^#Qj<6p>vfrtueI`&E2?a-~H*&pdpU@F4*&k!W7|qKru@ItqD`tkNZF z2>6w$Wpx&F*rh6vw1w-k)o;NLgE>K?kuzbuA218Z>`ffu7>5e+Xiz>b=?(0%Yn#4i zyh7~=DvjeN1FWa$(d0KBX5`y=HlGcPUz~i>SZ%hvHrdEa(oOjZ;k9amj4kD(07q7! z`H(pByA&i$4)6i?rNZ}TZwjwIn=H6q>wlb`Ajk}xKVA$MCC#l9hi;tx+zRd4-^+tP zc62Fb+F?5A$cUuK!3>=^24jBPIF|+?oWgO~yeV<>xCON`J_2#(1$-?mXmV_f%u%Rj z<pIm<d3WOub0$XONF;~1Bn1-%ND4yK66BR0+u?&?Pm_r7QaV}R!6ApkTVg>^De<?> zAp^Fy2z`1JW-_vZE?={{8`C&_^GNlV{zR0vkr-vylIAHRqYT_wLWXYXG5l0ka!<qf zyCo&I3FEian*#bHWG#SE*fIX+M?dY&iQ*p+gV(@h7ko1AA@o@mk=vmo$iS-Y*M!J> z4_Cv!5)1jzaLyvJqVb}g3R7ptaolvk^-&s`5(e&Z;Saa5HP~4@p3x2C#>a~u+(1-d zG)r%Dy-T>?F<FFmLJVPWRk2y7*hR}x9Er$H+_hehiw_Ayt7;IUpvvQVGpUg{KPQP) z+c{diZkl{lT5`a5;`kl^t9eB0H3((a$r{wPFzl{SqFSGWCe)?AmaPoE(y1#v#yDbE z|GZOlKhg_2i)&T*i_J!dO>OYGkEih5PXH4+yU|v+<y$_lwV<DpX{Mi39v-*xh)=V( zz22fuvw;r(ZsKWu>*wkpXts^%aZ8yUepJ+^H#tx9luBe0j(j>bySi5G`(p~*jH0t` zR(&uYyNaa45Wg=MV<qR(A8X5?l#l=UHwMD_*9CRe*o#B$x1;EhGPkFBmIWW#6mJ)D z<rF}s19FivL_h$))B41=OMn7br}UYq0ab)5k}49~@au3y0JW)~r%+fZCnx^z!T=Fk zIXb=&PU%kUz;of^LVDlej$h{{5yZ$q#2?ZugouD^a%3J8f8|bEE@Am~0$kW<N_FKG z^RG)fPd9zHa^muXJcG7V%oU{|_Md8Yui7+A049IfFxLIBZHbK}&?F4M(^33tFTvp; zuU?APsn$XJz$w<I^L)g)yFq|wJ2U@e_CC?F&5x~Pzffjt7TVPL4vWIViG^i7G_^-0 zT{VH&*Fz~WS^O6p=6wCqXRuRyfxNy}2Q8JiX<gxAq^lF9bh)60_F?6Y1DdJofgJJn zw~#K>R81y}5$4pNh2A^}D@@sXZF(+RV^n<`UR8erAeS`60da}&p@zW_t(oq330Cy$ zZzufaz;z~RQ}ajv^9@ZQR7&EGgYrZ!Dte11HSzPvWz{3(!RoWb2tUgf?G6^wnR{RE z*gH|1AryTt&FubR`S)+5oUwIwbd1EVhC(z3RO@kJ_>|p$mEfJ8{Horzl=|itYfjhJ z6jUPL!W6V-tseH*>l5(_+&d#1ZsRFJg^rr(B|@m39~j=!7w!1_BV9g@&M-ApQL_yV zNyjZj;1(Tl*aK5jQ`a5T%E<>0B!e9gKP8%xMKH`~*m5EkCh2u~vV6`m@h7_zr}>mH z8TLm;#*4<NcX{ylpTq$+2M594`*E+hus3S#rU##T=HDE?QnNSZ6clQwOg@_JRSlM} z61+4dWP^dfl8UI{C=E<X9cT4!hN3xb>k8no^RsHmm57FsH}Uu~PM0Z>Fpj&>$0EkP zv3lEV|Fc@+9C5$D;McqZS5RT~nfj}T31AT8n-ZEnJ2K-JOZGbNT2e#);(MaVjqjZ6 zv5Rjtiq@O=9i8#?7Fa141holan2~*<Xl}(fEYgh{z=XxWwjY?UQKa6P2rma^6>6Q% zu`%}THyAyc@Yg-^j<YvPD+S3;WVArhvq7gwdR|`v@$o0KDymrF#O!a^*r|S|l421* z=+4hl8MQybYp)gGY=EOM3Xrn}Vz=Tx0dUkks;Ak7xKb1AIntlYApvFG1vkR*gUM^Z z{uQz#Kmdgw&rOn2o+Ho&u|fiwZ5((xkFU;Gt4S4n+WCX1W%)~Avl`Wz{%LG|{Rw`q z&P5A{gnMi}Ax6js`vSN^PcNpY%In+3hb=Gg2@1!pj0Y%$iIsFL#+tME;!<YclI<l> z&|UkemSs?7FH_Jpe-KlnOUFnPNU8Hl!_LT2QBg5oF-b_cyo$-cDQ`U~dwFrS{o=|< zN2gcmNF=)Rq2jOdTCv)x+RQY6yQ4Sbj{l&2Usm>qiq=KeFExkC5LNq?q4T0V1CM2> zQ&$>DRnxo>7kuYeob+LE$KeEjB*S&}lkibx?(W!{20E2f3|C`|P?N`u#qHp?$rJnP zh4jO#RA!C0gS*`^JGhs6FUGmYd_%{0=T<(aQvH?wBRWd>%c{Kf)}_t}<|W5YF|Ptf z?~$TQE^8@>YD+|~n=`UZsq*zpY)d8^uE*ksCZ99?%=KSqj=Y7HHkKX(N1hJ(FT(_( zhPuG2(vj<-$NT*s-B2OEB9N1FcvHnU6R@Un0ON?*UhvtqL+(sHv{Y@jM#f9h!_B~A zUAu3r@~%QmKTB{`XufPg-!dShes(dfrb-OJ&sSM``pkEI@9b@8<>Lovk)eJWehpnF zdunMm9nmh07rO(nW~PBpknN8#Ap9M67B5p2Aa94z3CCl7`y@rMcl<+vL4R=jtT^8d zCTK|Hs>QJ8_{pDg6)*St!6W{3Bc-&-`Uu*S>d|trHkRc!6Znvw+2@#9Z4T?X1wS0! zc(;@ItgE-0541S*zXQ*rvTyUgd|b0*=YiGYX?mCcLW)aFFLo5GjCRlJgB~x4L32-? zm*=x?(x5j4ZYErgQ&esmxUajvYFA^*$%m@T_dRY^30;)FOiBb(mzxQd$*eH*7#CKZ zeHq(-et7vUn`Lm4Se<b{;WI~zC$h=6-pn`bVo|tPr1So8MwYq^l<tyhc_m(Ctzqyk z=gWu82}aSoPptD`KP<V2Hcy|CWL^bfcCGbAk^0HGns41F_2WWoz0b>)PuwR*Zysg~ zu)eW1XeU85h<>^VVBTEKJ2b&O^xUfC)tZHMt*9f1_-3a|oh|mHtoAfe`^q7+(;qa; zoy;#99%|6A%1*PI)Q|7l(q|{M-7{RP%0+-_((5TrrN_n1JP%jlGcW1X*r3TIHW7`B zVB0w`-bwaNQ!6|5WM6yhZ0}~#L%{6RjFqJ0*>83D-AH%x4`<N=S9-0kS*us48+XDe znV~pE+;fklJy$+3yDy)bG!9%1A7Vxql9|Vd*CTOQe3Ck9I`bKzS~`t6q`^;5pA08& zqB1IQTsbW@llfrA4rR&?$8$X}>anSZ_Ug8RmRW~~cpaemaW4t`cJ~?yp&RiNukgg# z(FFAJ45VL|d19=lt7&&%H+`I?NqOTAc1fzc7Gs#<I~S~|N;;Rm1vj76FMqm+KV{~z zxA(TKa_$k!qrDZ@QNtO@#gK?A8r@M-o^^G+*L1jBbD3k;>KnvDdEw~5eGfnaDKc0! zA&-T1s@x2#6-8hn3^-|2h+b=DoCUI54j3z_*LM@?KG>FeEZxrg+BV+RQ&3Z@u_euI zMT->R`P{~1c6~Er!`DL4I=kF*KQChB;S(yC$vwF4rBnL^A0&TR*%Qoc1HbAJdYHzm z#=r7t^*a1@J<I5EaMj3T*;gwU!`Y4DVo9pI7F?0b&-zXq(u<B`E9%S|>LrO^YBUxH z3b1%Fz~?PTf2;W^qmLPj`I&9Wb!xsp{Ng%EPy5z|cXOzS@&?N~-otG6m5kL-8U-cF zDSi(Ts_9v0Tjk2<!`bPiZw)ARBTG%iqEMlT=}c%^l*qI`(95QXu}|oXdQtUL%14Q4 zgBJ#`!w0C(R-pN1f;#hS_5Sj9ifP+9J<0}MO`l^${hI6VD<{~A{Lt~kv8x5hXk?YF zj|vi~xv0xs$Vn+(e*+g$A2j7J=ePGN<1s7Paz9CJ%r?cOX>H)Xw~wU6Co+g&Y$j1B z)#AY#-OS*YS08w#N8viRvGAU8xLI?rbVddokCy4eSayYSFwiYMx7<DTk~npRG{OG< zf3*Nr<x9@1^|QckCiV2k%I49I*4ZJ~02ddggNLY@>zO6zh4<#cBY@rXZ0=FdG7__6 zqlNHGNO(b}ipg4Kh4TIKzzOzSVYiD?kg}kpMea?ab*I9jb>d>#VAhQl{EK@(f6|%$ zG6h@Fgbs68XqV)J+oPUg=1!9mBC4#p!|;-B*UFT+MJ=)DK}hS2mTpm9l{2Rx&nuQY z4Cf-ilYlcHA64|>#c{_I&E7@l_PvW#_d}Juta?Y~$ph-csbkX2T*LCGi-p|^uf)YB zoe?pp7y&yAtflg1DM23EJ$JB`Wnd`h9fg;0oTcV+GFLxm|LXjc`Tn*kX+LX$J}pe@ zR=d43i*@qRRJ1snN(^-4?I_YGRC=a<?|dn|Rx16>rT^4Akd^e%_H0H~bsUrU1mk*g z*gPsFa_V}1(t%uty*D51*$UwEV+34eE4_A$8%TiQsO7$Ig|?o~Q7QvfWT~H+udc3& zRI37HcNV`Sg?Bd{*R5Io`0;tcS_WRY0<Kpt5Ekxujn_XlT7tM#<{)CNiy4~nig_z> z6^aaHPR#j|r0g2zZP}fE5>Hp1=)7D8=@xxQ*N5{JE>=}iT^X8FD+@V8Y^~~sf>4(F z;NBDSnc`oEhs=KpD?m#lSry$;0v{hveSBS(ocTvmrb^^{sw2KcT9fN^Wq_x!37JWT z$^)HfD=}3XT+KH%OZvA-ni}bC{QRY~8ZpOqQ<kAMoa`yitaiGtdv#YQl?GeJv#-tg zk~+BI1uwI>oggE2^_*Vcb}xSZSg=Im;%adUG=mZDzVhv9<8}1GM6kwS-MG`R!Jk0k zn`WG&?xFJWlq|ys<dJY<w*pU&I@|BAFV`e1=P>5)y&tLEI}jJW`V4+$YLySyUGQ9* zpk>abmt%qSwx74OD0TA-0X|Yg=+G$Z^TxT_$2s$Zt+f>EzNck{<^mSZs+ZkzZ}n(k zgI>4udlAz%k`o}PRa^M#*;VMJWKR)L`h6)+-!vGf3}pBsY;Ia%cyps95_4v!bKk7% zG<W`6X!p1T`Fc$=e7B(XF_d6rsm^q8cNx`vOmpnj818x5r_S@xxv0t3)OI7k-H~BA z=<Ry_iFsAs%Gzaz;SnTR<Mc65hofGT{B!|5<eJ){TG{K=WMoJVvaxf&WJsNHX}|$$ zy}t5mzS<hgXq?^fWruZViG+@LebW7qtjrSbo>`%Ne1q$C5Fl&S)*4#et@FH&>^{9J zsb2&6v4M0&nztclSn!n_G`YDNStM>P0Q>WVN5}kqrrP7G!$_a%g5<lw+1~y5VsLT! zR^aT*Sm9v=|2$$#T(8D~9iB+`FVnJ{LXXyYtD_`})fX*R3Ik!7+~OHT=!uB2-`lLX zR^G>hrp5cvF)^^u&Rd>TtYq-v(Px#-ZO!K(qI<8=T$Mtrd<O)i5M8A>4UatXy?gib zasQN`^1{lw*A+DGU+V1K0vbvr?am5c!P`&geTH97FSb{pj{Ov;A#xo8&=xIqpR*oW zbMd&jD5yPhbvFy{DaYFVdTNO}8X^WQ6xH-711>(>{hiLTgY4X|fXxrn&7Zbrb;dT5 zr<^yIx?WZlp96Nx9Dhz`vClTQS-eElXccC9R9{!k&B+ALN8a&VZF=GP?e)}nO5E@~ z`Smr`E)+ce^f&v+{p||6jK!vYI;?%aFDq6oOAY>;!EgF2&XcWTBj>gIerNl^L1C7Q z!b){xItleT=2tFoz8-InT25|uAGOD4kl5AFOzkT96m?}Bu^3+CRrivzT4;GQvmw)d zqONUKhGg-q*Ni1eah!a<nmh_lKH-J|Ib|AZW>l0i)zzS8BexZcr#kaj-Sz?pNM2r2 zT+-+upi_Y%K?%(KOJM_VPIci+RNbOwlzdN|ZR_#P;NHcFXqjNZQ=1GapRlX>px^Jr zt<v+EHYFR|%C^wec{CKY3Ol|zYPW(_Lt&WW)1o69z|~fjOy)S1==lu)W=~0FqsoUB z4{t5Ok`l7oHiOAmf|C_*>>O;WJnIp?qIsc9IkMCSL9_~R&tQ8xTYPZ<c=v^?ZrI;U z3pL(%K$>cQX?$N$(%f(H)7&4j)4tq<KLGOy!~H^xDo3R5z)QomVX`B)3EFfqD<I+x z#||@@;4;$M4BMB{t*Ge}N6h$@wIh$-M5~2K!^6o_VDr1`D!;E@rx}s0-cS0AB+xw9 ztZZ6W9LbZvRz}v1i3ZM5qbWYsY+@~TWwufm&X>(=rMWkT*<gJu$Xv;<+Q&9S=;5hB zolND@INsgWLYbZD@{>0G`EiAZOH%tDZ1wiUSl1=6P=s2=poX%#{b9GndE&;Wa85hf zrwS?hsn+eO=zhNaDEHag>e5@O<fPeP&+9B~mRy(8?boqet+MxAjWFTjSabe~NPDny zJ1ox`Ju@^*^K=Gkz-QR1)?BX{e6^otJL#OHf0kZxxA$=2^2~WUk!I+eO;Y-F@mB~^ z)&Od6JAbENmxH&w0Xl+#rHeyAoROE_SQV#Y+f?`SOVP8B@Aat^K+Atlea;^vfj%XM zvOepk(7N^~ORr;H@>W->G0wrU`#n#u2YS{QDD~wKb$a{g;8Kl&AJI%t(U1#cNgf<s z*u&99-BF7nqt`~e(@_-3YWaAxsLx1{x0y0@jmWLwm&X$x--_Q}il0jT3;j<13i?Ct z%SP7a04S?m6;f>YazEF!9jBnq{A;<_vt)U@=9AY&+S+GV*JxoH$I)~_q1){4UvhbR zWK~|QBs!&pmvaxNQ-?DF^7Pyr25B;qc0N#Dh{F~0(*@L^<fiS#>u`7{p|<A7vP8iK zXF++YiH9i?mPjTReWRxY``U|mWOOtXQUQ(}6@9Sg^>6aztz8?!RcBi(6R(SAiZP_p zbOl9UFS#1(`*dH~9_WkC<>-|CE-8Nwb$1u~C2vm5V-vbm^8u)q6dCxm%b=U9gpvuN zpjFJ6z(LKd6uC~VCl!V@Aj=-}?d0%zt*5l{r#LUA7Mi=7rPUEMIJ$A^fG_l|SYz)z zqK(?F^|?R?o#^i}?W<1CuGoddv6{oIoXj3P#NtUkUuJPEU5>%g3nFvm&a6JMyQ3?H zE<0#rGCEs#i%@g)gV^^}FoViIg(KW|?cWL?TCFOkR&(}l?zKGFXxnBPPkX&>FTXQw zT0MhbT5K}ZGz_1GS0GXJwo}ilk@w#4!bkxcKQb@5ZV}Fte$+la5?1$Ijh>^pOqbS~ zu2LMDO|HMwsr~ckt5tf*bcJ-dP_6ZXV-^Pgv7=21wUE$q_o96M$Xy~6F(y>(j~Tby zH#pJiWj3Zfkk2m&N_D@`T`S;kf6Ay101GuYIc<N4a*|+t<@r^A%P;78BUux=9S?HZ zJ0DILR0w7hojlH{^5U$U9&T%2C_UI+Tg_7~`YqL^#+Eh*8~ozlZC|0;s4-)sV5i9n z`&FvR(_F9Mx@;f(PtbpZv~0hpe_3G%P7@NsJbw~DaFSnZ-d24&01Y{vG``3NNV<?& zW;Yqm^xsxSd32{uzp_64EMvg+S!iKAj$Xm3m)!i%XQus9?)Kl|?9Z8#DS6Ki?d|2Q zH>=&w=~m1l6Nm1Hadp>O`UYAhT}00-j;9+7;~P0pTQ1n9h8qJVpCSNwuZjsw>(tG7 z`_2~u=@pG{2M-p$TLHPJ7asqLpLy-_kD+#dvtCI4^WX1<hrcR>29I?YY)|Uk@4VSv zJ)BDqH|XOB^V0^uPTmjv(k!m2Q46N3lL{O)DAVIzADummBd>>(`o}j;<9_!?=Ax{q zI3owAbFsm!iEDqLuI=q#wsyiwsvnP<piYa0qWMvy%C3=XuwNgX{+#e944F9%+1aW7 zKCrqwf1S$fQI4e#(V#^wQCztX&KJ6>1vR$HI$K4=C^Baxh`J1VT=i}lRyY_%V#iTv zx5~>>IVXrd#zyZ;7N-B+h$Wy`C9hvDp~5X4G@GHD>s`EAF?c(N+dPxi0m;Hex^Wh+ z>9;NK&L~k1+&fcDf8ws1>%-N|@Wggi;Rb>%^y^(bY&`%_Y~@IE!#V6ss>D=`r3&Jx z8LAdbb9_`Ksuw(k<!;+ldK*q~JSR2^zBmFR3clMXOnf+%KmJGMu_GJ96dOq__Vit6 z=GwgL&Z$smC~&TvZw@OZ@zmO4T&cHhqN7;9e<0~|8e6&9hkw)A#yxL^1w9E`TGLcs ztGeDkc{bR*O;1>%^NZoBqlfGBmRjM#^TTs#t^qht^l`$+^}+V}iKy^kRBSaz9`YML z;BlY7{VtMuCk$8YoXNFqWPIIM1K7F@sb<qGKBqK(IB?13vhsPlvh!3Ed$_w|PAoY; zW=WS)y^AQkXuoqlu7iG@N%-8l@!_=G>QMjXnoZwxqUYod4K)1Qmpq-a0*Cx}Yj(`P z>eqk$c!=-nF#VEQX(7Pt%R}`3h8K&8XeLL4Uzk#Iez^me$)>4eivm!K6u+0>z094z zwYa!ZK=uEy_nmP~E#13{AOcbpu~QTQ=}MK}6r~9Qp@$+(2u0}~QOdCZN|hEs3=l$S z2_*?lIEsJ}1p*`xiu4jdN)ST1oAaKd=l*{0|Kt5|@AZqwCfR%Tnpw|0Yt1uj@}L`4 zVbG{H6>Y?co4xGEl&=TpO8;ZMHxY;F@atLSYbT17R!T4O1cJYcfb4`CDV`y1xDjE2 z<kcSNYDT^4k3II;_Nh+r!t{zsNUP^@%yJ_QJ>-SMNQ#58rb=G8oEnmg(n9Yv^_vB# z*y7@V7W)W-%MjV~y8MQwp?IV*yV`o52TNznXv57jk(;4aVjT3WyMO?cT}zW=meG9Y z<{9v6IH*%#Bf$S^E`IKLr=+>Lc{+=bga4I$KS4xo(}GIK_MEHCHRX9L%OVrEt?DYT zohg5jNmPkdcw1Uuunq_Ua_%_?lXe4jICsr2d^K-e<)T#2KuMv?4YIz}i@V#?LujY= zOI8@4W)(xkRgmsP$8?p~zLB9}V!>G+-oS}-+}!?`I$O*yrv`Ang~z=mZEiP)ccl$8 zcs+xrqXnLrg@2#Il*i@&38nRwc>zof{W?nM^*R|U0@<nXnPMLB^mZ9N&K>^A)~maC z<<Ci0{I&m#QFVI~u$QS<dv};!h8$J&O=y^LopW@REqo=#WPO%1u~V<eW>!Z?nf$O- z(r=vMjJ_%V`3Q2%IdcX#nRTRhxXFuvQLt+y#e@8CSMn5nO_-<$qbDKxLgcQfILSXs zk(mMb=EnTo9HDeC!n3yZF5t<cX9PQ7_rx2*;Vi5Hb#pPJIDG&K!NE+zaP^4-e(ZjE zr>RH+j^n<=dl8{6&7#wk4Jj@~#VL7CiIpp<rkERVLzlOo?r4i2SJp9vE{mpj&V9V# z-RD-6Qz(=hX1q4t?VmqZI6C}JuQBkMME#HZ{(hTt8LrTNeB_?5XEmW;H@N>!{<tDe zW&O+3?X}$f#S#r^*NufQTIqFsrV^>-J(!iW!dE8;pR}P)VoQUJLEtAhpUcDO^lZ!2 zF6E*T+dE@AAyMwtScDM>BHQro5B|Ph0<tVx79t4PmeT#xw&xiD+y1d@!!8R@i66-$ zg^Wv0c6MqrLm}Vhic-)=8BU8_;gSj-$fvwZzMC|<ea$N_lw`|In{A}X4bAs-N`M~u znZoYh6N3IIucC-Y@dl`NPD#x#%|Fba9y`L`H>0|*V4k6{VUpYL8CeI8cWJ4{83Y@M zEBHM_R4t-=?_$?)o6l2~mhZuDOjGy!5FoPefH6aaXMBScH2v#R=;BQG_;>M}b<Tlq ztjGv$_Pr^?5|Ez6ibZeqc&exk|5Kn843;^OvI%DlkTV3EgTqr3B3r*N8TDCJm$<{; z<^+uBjPCDklGpZHW>gDA%j#M{I;B`s#6arZnPC}{ZQfHhWur6T9Wd+5^psWOviLxn zoF#?nDGU<DJs44dMaY3fxN4g|W@^^K9v&UUHoR(f<l;fRv9$ia*|5BOo}2rtsNJJ? zdsXY&Kx%Ac;rI~%SP#&((EM?;bi>F(IC_pvS?$M%eNd&%qwzl}3YF9Jwsnj`Ir_L( zZM*RG>qrTY#!0r*8^DlqpYyDRTZs!Fo1b4^9ym<neVdYQ!f_>a;c8viYJ7;nhf0Ut z?+Hq#$TYB0a|~{=(9*ZYxPV}kM_iG$6~l@cwWc8~VM4jdT$%GAYoD2gT6yw2bUGXR z5mvf0r!#fkHdUyEml@KajfJu!C|R+yyf&~Vl^=N@KYkqcQMqtOB#WRDxs4iG+hhM! zD}9r*2KC9r-%nksd(_NOB2qg?MOwBl#Awb`Gjy>L)kq_=tiMlI%Nt6QFi{;6mJQ2! z_zkl0nmy7;)QoNJ3xA?nS;1|U90p{V3npzO0-+0gD~;;W#n|+`)U<+f*JTRNngi`) zk*GIn!cjK2dvlk*YO$-nTf?i_87hB|4tP`Butyo)>*AiYLYje##fCIAkXfL}(j&Ig z#qCy(Ll-f+>1%hcuCz`woz4_9CF~Z4gogT!X)wZ31tv4Okx-ZJOqhJ*w$Xp>nMx+* zQOv5yfI8otCBtQp+x=|HMAQDe<9(vG-*x>1H?R%z#ISCVP`BEqO;?uEZTL-1Ov1{f z42!agiZo$8*}ZOM(wbdncXpNcK~}Iej{Vy%iiRE-p>@jb4*38%&BB6&u$aaG>VVCL zlb@5RA<_cY1`RWAYT6Q1+54e|-Gt(7lB3-*B7u!BWe+_dRWpez>|BLOji1w`G@D2! z%qIqtr_Qrm@Ey}KH3pNxB)4&|c}mutrXg|(AuZnEv8=NGIx*5XGIa7$4z+#%%a>+d z@*~=^Y-m6(mFQ~c%-o<Wg6J81Q`Wfc<JmwEgY__U4FxcEksn0?u5q#}_T;Mn40m8% zNj&H^G-Tcl{OH4!S9y|-pI?AzYIn&EtY+vErU=nkhkB8uBfC)Z{F<`wY`=BnGL{gZ z*3xR?sk*3IOL7<89km<IW8?{Hj>)|hx|sjr#TkSZ9HXK@Im#ShAUB#nkr3MO@naiV z>V59sqU(8{^L;~hk;kKi1eg6|qyFM`hv<4m)yFbymj~&gEM-_ywZ&anOMeFy(QsTe z^$r|SVB#IVFjW0513)on0}8q~L2=W1=1v5e;XGp6;?@LfTTb!U*Gco$>coU>DK|qE zG8ntsW?p;`fn{Ik=FU<4@k$HCE|zC;tHr#)s;^6a-z-DFA0%!}tQXmcHP#WPSWY}p zitdx!p^a-~BE22}b8g+pYC<3mW_>!y!|hFx`r5YZY@6EFqdMi!F$INB-lcR+S5G{N z$-IuTV^w?DIl9^&dv|v;advRvq7WVwmFBib9V)>U<oSufpR%jooB&<WyKA;ddejz- zUF=!Lq8_tZgw;uLlb5b@YG}C`Zto&%-JP7AE<0tfQPx24eo(EK7ZXbww1gjDr)5o{ z)ev1S)OuXYsdx?=yz;(8*>0~VJ>^cE>v_u=EF>}nDe<G5p$r*l=bek7v$Uvc;yuSr z$gtb1+8gKHzgNJ|UxsNh!Iyps9a$S$ISwmS8A#c~F7i-N_SXNCcbu^ek5`IpD^c>= z7)WX6x9f2A#g09Bu@0c9pT>g+Qzjvk&)T?T+{-c^bHyw+_m~PIvb-A&?DoEyn<8cU zh(r0nX*)eY-oF%tSLVkn7Q;~U3k!rOM#*~^cfBu*V>y|zW-3VB5_YJ%Ng`dh<J9UZ z*C!IgJBmK<K#Rh0#Q;5+iF@CL?Z|!KWYx7M)pDl}6O|S4Y?Xj#95=eDTXCWE8Om$X znB^wX<}OPB_}vl@!i@N&E}9vx?i&7`g#;N*hnqsKrgmYRADUrw1(Fq4iwjadJ5{@X zcs2cbe&8v<w3<{N=GL3qvYe(MyP@ZF<vdGk7=^wJH0}9QYDXJIPV3E6D1<#mp5j<* z&2-bt89w<QejCzO4Xf8#kAwV1YMTI(v0&XXqa;MKwzkJ?j)cm}C|`S&)_oySZN#}j zyE@<63-iGtJ7T-YpHe+gQdFdea>e(T;V6ZM;qx-iC<RL8z)0p-`BrW=rAOUHMkaA3 z^w2l;1Luw&L_C0d=$9Xgat<P4H%q!yL&Tb~W+Kd#Ia_|dsVyleZ<HpAWyE`%SA z(&S6V53{{_C!3#kzCF5X>&fDw&#ml{Fy<{U&;{pRAS-6%9cXR=*9q1QJ_j>a;12tA zUx3V$9gR~h2ALvFH^!cB!YxWW4f{dtCA#gtaXBR0w^ju_Y(~a{S&v5dQ_HiFh{%wq zQkYVajZB34R1b7yEunTcXE~?{@whH)N@Qp>x!wJ%Z76QZt1Q!bH21-5T)ORBg|(V{ zU05yaS~OO&Jj3+Mu@v2+ji<c(cLsKWD&?D`fjMq(wf8xaeZ5M0)}FY6?OLe(i6CR> zdgEq;p?AcZj+Yx0WL`!iRx9p5VUbamDl5z}beds7TEUz*#e2t^AG_c)3eqW?QqDdM zwJ*C+O7}DaM}mvYkYOFwjWtu=F<~PNP-wU6?!0-Ek7qS9_z7ied#ruAms>9#yG(02 z)0C&#n71@?&Z_<ghpRn-4<`$`<qvBqJcfoPv|oTa{M8LW^oeEyqR;qk4DSPM)@hsd z-rVXEMSR)Hm7PNCOhWGv0&w&@aTlvBa%sbnST;|I+i1CV>zEJS*tw<I{=<?=>KOeI z3Sn!UUD9`SV1(0Yz~9dgvVa+K!)>vo-f^0w`3n~##s_3>pmo#1R26QYmHW>1FYBE& zCknK%(<O-YkDP{nvb>Pno)@+egy*(vvGQ~6sjU*HF!Q$y^1~G2``ay%^A)Y>#rd&_ zQvx2zk*~g#yg$LcYq&2afMOO4lYwQIY)8u5AR5o1Od&tYN+#Kkc^)kRK{`mmH{r1* z@#+J%feqbFWA|0oKk-YHPWd$G7Wx1sCi7ykEZp18v{8h7{Zh3^`g7eP6(G)4n@8ib z^NnHoXoLuZmt>b#;vNXWXpSgAn1?Q-nyR*J8Txm{Q;k%!zIFkT9`t;OHp+zx*(7h8 zy1Ldv^o{O>mZa!zH#ODSDp;>h3&>b)`gbeL%uZ){f1OgRA7;pgW=L;H?(awfDkO0R zv|Yx#6h!>Vp!=(~u4n(_9emds=;)zy8@9^@27zOkAFcz{il}OYa&l-;l7_{1V#orr z+Wvia$ZUR`tW15#<(0Yw`_m!HhPIdCVP$zwZ6jWFz@GC2PaXz|!1`lDhngJ4)3Z9J zSQIz<_P=yBHG$(}{V$-NKi_Q-m4VxqyKj^bBwl{b{E7&v{)WwUmQo0wdnub?hA}n^ z46LmgayY}a?P9p7QuX}#c@Q{oYAO@grF<rc4svEpK2<jeySAjZKweh6)pgU#jHV-C z;{K9-7OLb0Qp_@`Uc$-s)!2Pn>g+BTp7gb<nlwUMG+3dwT@j{mHyow5cc9UykPW<} z+m)?i-t|trXpOvzlWy9%#U1eJJ!jNRq*wi|-2GK^kk~*jSJ2VeqgGKfho)9ln9n;* z96>0P!v}Ig{627Iszo+VdsXKs;XZ9<bqJnZt&fgnJlaRd7?3r$gSiMIY*fqHb9|ly zsk{Y;S`|rHVB=a&$UMAAFzeh8S$}!a{|--FK_1skHdn6LKpZiz>_h!L_;+V#-?(&V z!$S&Adci8SG_1v6rFvk)CAT~@a%p(!_3eR+MZ2~&<zZ?zE-n|Q#cvRALDK_h;is3d zxNTSb*TJB6fG&p%Qn_m~MpY{YM4YF5ErF;lU!q|$w1gnI+}ZMJ>`UHh-iVa*?b$3s z0pUt3JKspW5UQDP-vg^Dfzp-1)w*2UeU|VgJy$qS9k;xMGU&G1+&FE&)SY~uMJDxO zTwyF%sh?m0vIdGcXWa#o;7zEsML>vEIGbvxrD2ASK<XVG2$QGAt?jQ|=@4A7F9?~E zq7%IRHC3&bI1^^=uLe(%Wq+`J{v1!wC=bT4mA`dqJDf_i+tSPpTM#+Zm-^r+cBTxs zKH1z0oH*YP4P8X;?J0Qinlu<!v$4&8as^2wAk2`TI%kG8;BtmbE5-}@>38NM!>K6j zM7L5ahpVh`)7`OW?X>KlK(v041{)2_NvsnVQFaKdX;)FEczK?agyoInRHUJ@><>K= zPoFiYa^|<8z*`3XlS=FBtFGvUCuA8pRnol7HOxCC(IW=xXQiP@+JC%D=#}r3RVX$s zov<Kn*I=4^i_?LGa_GKaZDxF|HP*S4xOil@BURMDg-NLR^&Ldt9W1kU=x5<A#RcD7 zf@q?mas17Nr;YyZ2wA_6Gfkz4a-8j)O_96V#&=^8R#jvh?;b*T>iLdK3j+_1SXIMm zsC+L`buaql)?M=$<FSPTUd3Ag(l?2uce>Lkf&Ni2H_r<v&2*UkT3OWwUM_hN+?{K^ z=e{k2%a+5Ir3e>{MUG8Y)8UV>OZI-6tytw&A-UQiRxHNgaAK(_(PMr|ZSNlbWvOYw ziP=Wy%>^Kat`|wo)P+5Nq78;SX;%BRGxXS)zvq6l{W>x1rgzxH1yH%XjIjs?6<CH_ zQgn3*fQI>RJ0Kv`{~;N1s;Jpf4{eOhn@EGop6_s~f7aZ~c5XGyxmTDW!lWy<4>Zdx z$_j)lo{KJeRi!5AbZW{S0r19DZS9T*z!;PWz0$1=xh}6vk!C%C-D>7~Y$`Xc@$-E_ za6vrxADMo76J_<Qy1Se5d)AJrvGdQ&L>J6bg^E*Uz0DFM0?390eak?!db^9}Tyznz z1g!hi@m6~$_K2yt4HqM{$B}*4`Em|<T=O3-z={RA&1);{E|7T2smW9_Bovw=Qcm?D zwtHswYuVI1o+*aVsyih@;RT_wJ9&almL{l?FY)qw9o6U>SP<OQcm^6-8R1934=2^Y zqh=Zz_uk!i)5knvfbOPtZQP~jvF>r<g0`892kPw|Wz=4eVh?MUjbAbDzf}f*IU}5< z<L2jd$5s)pFNYu?%pr3<u(IA9aU$)5WJJDqF3mI0D`|+9lCrvS{lC)D|Af($LI&#i za9Xw{tcdKymwGI{#ImBY+;Xtu=-~jA8ZIQh+PkLXCB&X1?b)!bLClMfRs%!JT~3;1 zpEy;Ml1|%a>I`UhEvebaxy0ne&a)x{WQ0ggLMKn7mBTj>b_Cf0n}YoJ8id{GCoX2( zIow_f>7MhFY1*=Ka>Yu^Kc3b=RffdHQEfat=X>+@Z1ZjM&7V1GH&S?YJ7sUxEp!j1 z_`8;386Ga#T$aos01R&_lVR}3`GEdJJHqgu#O}8u^Nvoc+jI>}AC4fmbesoY-dUc4 z_L~#$fN_e%oA=$D?T?J4g@FTzsU>}-%%|$6ygz^t>jRAYr9RcAVfofLNz(1DZi!$6 zeDx4DiFJ3pf7Ja!kUr7otW!-!ZG88QiQ~KLt^*he-zj&4uIMv7CG%;lq~R-Q!eRz? zUP$fhLub>?;k7e4d%XMbO#g~CNXO28=*!iOOaImCl`P5*y@&9id!#5q=TKj<%qyIn zw1;9V`q5_x;NoyU5oNoN;p7-T7Aa&!(u2|5n4EUN3#8|qK7x1`)0K{V0zEqEE{8m! zE*eHmLN{AkyPAq|fv)=18G#V8lLE$7bUm{Vhzw7ambVL*c6xdJH^Gs8scPH#J{d2~ z%6X0{H90Fy!F<OL=P}_yE<PA^05P~xqH!fmpdos`G3KP9tw;g+G$mj2c5Rp%qJ+2j zYq2n*1j_<t-eOZ}^tsb+Qv~s`r+I~}S>}Xw;QYURFE=T0`6`Sw44YT;8{%F1Y5{*+ zxY!sTUv4u;T{#|q99~;)hg-y^GlRiN40W-f&Ue;cTd5_W(Q0Vp_m3Ag*xN2nWL{nO z3z*v#%6*Gl-b!A$XfBqT+Br2mftbTNdqvh!%+3ULINNzEen&2e@#uM;4yqy?{;%e} z&aUiGRHGl{@e*=(?8%+Wr7M6WvFvWLesok@O9D)gMUkq4WKLv}G&|wL1)X$?X<Hgh zg9{kz(w}}PcqFm<f!-jujOSFwjEKCMWYr7GqeYK%p~r{XlBga`HeK-p<Ty~4R84)^ zr7hOlozC+DS5l2(Rs%tpZ`7&MAeWfE)dA-aphB|WW=`O&mQbX6c?bcK(mB;C0um{L z1&+XL8!0)u&f6(>X2?O5VV)*MLAByy8-!@ia+2}6GoO;GlTNm0u38$N0iYqkvhL39 z#%)4L3e31#qG?WaeCvF;ON<9Q-r|uym@JK6SPDfHp!76Ujz{Pa{MNkp+x(N)c4L<s z0y9STYHH_R-{$=~JC=7+$1sQ7u)Vmis%38To!@zt+kKlAM2XtLE@5aA$g^Oiwo3lM z&e|g{Hl$~OYN{C)*bO<@%9&iN)cV(=hWeo>w^Mv8`utR1mA*o&9+y;ZbB9Wp8`9lC zkW0ca>w#L%9g!(wPgTEhwOLGCIMP2J!A6wziqj8@tkLiCcSC(Vf^5|qI$HBm)XkyL zzbtXrOAmE2KtEw&IPDeh4`hWScp}MbE`t_fZoq8wG>Y0qZepk?%pq}_*)FP{d{&Cf z>nX;lPiU%-;b!=o;MuY+Mw&3=dm7UDmByBGf4qP1&@j#_<UY0XMhgCNexe}cLq6jI z&D^GhAZk8e!JlX<O@=p98B(>U7;jOq_P4>*-Okj`fCu<p+d>!VQW02H8ee$rJIZ+5 z(!khCo==Q~ILT4Xe4NQWswNYax)(C4f}Nh{bswSx`r%i{<9Pdlpx=w@g#dYfCR9dQ zQBX3qe>O-bT-w!bbeG*&A~~SzxOVJOzqTH=;w6Up#W(q_Y4ye$_FWgwm%%mT@Cv}P z2jbVVhYPUmA@j6+d0egtaCU79o0r73Y7rGED9Fka0e)D?F(IOiG*A{l#G>TIYpC?T zPR&B-2I7alM6R!BjhK3M+9%AiPwESovyZLF1QOvAK1RaM%uctCW{BzktWh;5B2Epj z`BUtxe(|erge?NoaZfM<y~8hH!t5cOb1SCf4Ko>KirAj-ECPv|%Z%uMg7lNCu#%Az zO519q%7!Q$3wGtLx7)Hx0LZmbuRN4|!Jh^W6n=fR_zR&RZ%)+wjvg$@t8rt%Yq&Gl z7REWcZYDrEen~AKy2OLD#n`m*?n^38Y4Q5T{lUg|yspeIVC0@-*iG}DA3`J-+E$5t z*wiYw;$pF*>BS58`mI7}{<~CpdAACgQvE`c@{lRD4n3kn3G2X*OLn{gEq-n<{)Y(i z2tH;2yiBFM3qyDh`iKZ;)#yGKXF$2%tt<LS-5gx@XSv*8-<)}NFsgux6DL%`ypiR& zqYOv^cN48w8@E^jxAdX@oYT20ka7Rh0WDr0kP)$+(k<Cqi!u-;<HtzF;+ohbm8fX4 z|CanDWR+ByiIlt>775umqJ@@{ob(n2)4muer@^jVxMva{0*;D#VKV}RSkCS-HY3hb z3vcAENde0Nk?Jp~7Vp@@XIrtry4CupRzpRUCCUY(B5ziW-5kLUUqTcV6et2q3@LYA zQ<z(%<2t6264dtMfhCo%3ZoeHoSYm$>vEt)Xjw`3!alvPwo_?%mC`*^sheIjBBDpS zziRd?mg@pyIk%&Bqpb(A+*l?A{N+xOZ`r&<*U?gPB_+Nx!F^n+w%<pd<qDF`^R!=! zx)Uh<;eOXm`C7Bu8tQ;xiR$S<L6PhE&3(<ia!l+R@pfZw=1F1?(MP~aXNhYo)*4rB z?w`pV99Y~Rvb|_tS@qO6DWd`hRzzAMORTC3^$YX#1q*yIr3nd7Xd_YYxyme~{Vhc& zSrlmtb_2Ee-LmQKtfKFg*8`jSKZqymKt4R@+Mbqgf*)a5yhG5vH5aD4AJSvJ{v+8? zw;hczgFStx=zb6{5q_m}P(V5-^Zmq0po;A7hL;<NoR&t6dpPh~e7u{$Bq}j}N2tXB zanf;g0aiL>SyxmTu6>tABfY<R{3fz_GA-S}%-3en%|9S({n+Mior)S{xW&D<Z^+L) zNX#A`#}%7d0j}i^b8lLdv&^WH>!)rs$MB2Zj|qKtvZOXs(gMZ6q7dM6uYkv_Ppm$r z!`b{6Ady|7Q9?^wTrP<uFZd#hmoYS+U3~do8+kK7?qXgmo05KOYpWO2aC7rxuf{Dw zu+JRqyksh&B40qo+1*%Uar{}kb<WS=<Uecl$`Vno6=o)pkxkQGqxV<<89#2RN*zb3 zG8*!(jmIkDh8g{7550N2J>h8-*~+|R-C$1SJ5T%zao<iCDNe&q@fCMa9O+UX8H40@ zA*B{jZ<TF-b$?h9FvhgGHW;@D|N0;#4J~VZ$#cG{u3ZE_86-B0_8uQ)TpeQNDm1Ox ziJs9f0<=@th#ORY7Ukrwb1g6*s=wMXgx%=`5BzI#X+h5D3fV_t$S}2PSG_B?idgR+ zuZ~Gz10nncN({JBPIiH;p+K%7_Sg9IJQ$w^5lf7j-2$G}b76TmmQ=$+ZOx$R54n33 zt4`a{ZC)Z#=ic?YZC=765PH_YyV^!H?~x$o4d{pCnqAonCQNuX9)l8_vbt{902KSA zS9@yCEK%fzzNeG@C<=HxwfZ<*7%3H2V^$Y;wOR+z3|Gm>eu)N;v^Ya3)-(*R)r1mR zlTb=9aHvYQ(PWJgM;FCrw?l-I@3p47ltOZ5S`x#X29CG*z7RXbaN6g*JIUuyGp=?| zNY!nmdCH1$S)~SlMK{rM3s|nc=zHV8CgL|#Nq!7a&G*!2SJ3yvj5IDAc?%+K<PiEb zdE=GW{R5~Ef(RA$(ejm7I#q+@OR@Hy<kGJiAAPfSRMhfAVDs20m^4#YR&6zP$W=|8 z6wXd*z>iqf+2>cCep`>;aS2LDP}v(CtW%~L*_Pv2H@%p0KsSd+^7|P#^X5u)9Jqw1 z=-$xAybV~b9QYSQIiL%@2`mzSpiPp89Q*tZBe<14B=1$7Fta3u#yc6D>wD<yXqUSv zbtX150Q7OMn+{BaP}*(G9i!m`XoMzZbSRP2_RL5w4ac{rZ0;@VWMS^?7Eg1R4SlmM z+f>=_BCLam(_UYi*!!TO4L5z>F8VX;2dqu-18WmJGpwo|fJtm5W>nFM#}g4>E9#9> z(si*<m0nDh4234OTi*Jhd$eoi&=)=<#XIeHyT4bt1*#^5U&RxpMDQj^vwMPBNzSjW zUK#V>DYn-T%<!X`8fUzWjg7Twu5251P6zvay2Lm)rp4ADL8BDyS)x*W-wVN;y|F67 z+&MW*_PtgO<JA0U*R|-{fS3pO-O?e?$g1+6miS9w)h+wS71tQ2(4OxS6^n_$P6lZH zyHhd{$me?&1{tN_&|0^Kj~Mob1eE*Z9Ot;VhlNz<=^SCk#4*Tg@4so&VfvaY2Rzlq z7fY8YE{k$@XTY0#dYB@#pI32Ttzi~*o2eO$%0){1+weW$J~S^NwWOSFMK%{49q)!$ zy1&R-yPyA2<eFDOcn7vlfE)*5kuSUdjaXG%WjvRH``DPKD`0b{>Y6h$+cWo7W{uj1 zvQ9{MHj(5uljFal!RYq>2^ife!9pMtkYSgWnQx58?p63WZl>QY8g{HvdRLvE5|b}j zN{`WIq1sSNxz!$s7of_A&LF%LtSmgMbYFmMTF%_YJ&>^+uXJ`EuaY%4v<&5jBA8=B zgIn_YO2*LG`k3_S&R*L^=EN9GwYM5}krBJT<BbWf0*)^ITWxSCDn02C;1DPk@Bs&p zfkHL4d~q*yLseFdEuC3%MEv}UjXjG^J&G;FAb<}0{Dli9l@=!a6Y%@wHadK@Ia>-) zL%r13qDRk~BD84RU)m0-M#xz~I)~RwpG?Mt8q<w}-ej(V`6{e&ty$IysmJi;l@(5% zxRXm^(3LP=nzJjR4>I0!!<tRrdqkPiNLwOB?(fP*?uB*bD47G*Q(re!kX7HAehmLq zOM6Ht^s{P=H|*z8oLcJq_-4JO;}43pyQCzGs4~UACn8@z!Fm2<b+w(gNjkcEzpUY= z=ln@DAf?ks>Q?h^vgGcey_%+KyWbzLyYwH0)gd}bfxkvUC@>0Cz*&Bh!jx)9%^~V! z3f05=E{WldPjwmE+_$rD6*=W?7I!s$K{vz<)ZU&R^CTtq1s9i|fBegraMM!vhYxSw z8XD+DKfD*HM-r3zG52zQi4Xq}o&i#``Q!#l6ufW<jj#9)p86OgJtRNLw&77X<xhF4 zCXOa1$<eS%d<0EX`&1~JX5{VAvDQ=Om?3L13#=dUgf7Ct0pPsgwdn^yQgi^Qt6Z?O z#ADu4$>tu=AReDJY{=PoV@LSXdnykSV%SZR<VVO=<CiUI%fRNYBJMm=V(>CKaPFmH zgl4L41{)xWD*wf9Z4X2}A?2H23#C`k>D65#rs#>!nJi3HjZw{5&|yWKD;$Blol#n( zT~L}wG$I*ZJ$J`olug*+>VqH5J**5&cEqr|{l3jDfACJG>T=njo&=;8II*(SqmLf_ zC?jLj$JuFKVzDYKV+<sI0=t-64owPY-09SF1;GhiGU9*q^`(Fuk~$`FAOwT4k-4I! zxnPd5NQP;HnSbcBdQ&UicPZ|&4i)pS#6iAM?d7%DZlXi>xmvtXGIbKO=B4aEnN;TP zM94?hj#!0DyUb28a_8j)k}QENvT$<u)vQjqRk{*KUw@S)AB4U!OmdtmYx$}2h?e-9 zRMGf{89Cw@mPL=8SY^oxQrOT*H5>*NJny(f``p1GYt5WKdrS)id6vTxTwM{YNmHaX z^ti`SL>!Q)h<>lUha&^~dTLGcZDOu3{%f-GMov_ls``*mg}z8WxmL%0q%@nh;^~SW z9PRpCG&N9CV%E7-nyw2gj_s+kJrqGUZ;{)P=bX>FZX&(yQk<a=L7P5uZIa1s^f1v6 zWy%O|W_O=hT>!Or7MFY1?6??fD2l2%T;ebH6P!?;bww!<3u)iKSMgXk+5m!tS-9&_ zS=*G=n3PN%Yv{D-01=j14Gyrj2euLJTHRu>PIH;*lgTWznktc%co5yiRmwaG6D$4! zsJO7$5L1L%s)6&Vlq2y8v2ngu59j8WjIpl*qCT@Ra9`jJ%x`03q%6+*MLEqdu%PYV z(@`pyM?whq%6sZPr!h2CN1A_+M4IlwBE|-)yeRoxAh^NSm-T$96wGNRC0uJ9bGysw zY*-5{(qW+5N&5ILlTDWDAu;q*BiuG2B5HR$uy*!>YlKGY)2CkS1g95^Z|Y}%5=y>n ztOu+_edJBto9<@EiAsZgGvb{19i^`CDH|S47D2_%=9duNni@G^?hfZQ5%UfSdJBfj z#RMlLYfpQ$3x3hpkn&w9*SONy1Y_)f>77+=xSUygg^G+Dmz0h`W+OIa+vY~Q6OuW_ zk9Q>b+0DU15}VA%5dwtOa=fKPnP~Gqhd=qw)Np>$X)i^^P#HP7`6q21@2`u8j-40? z${%Oc4b_23D+rimm<7r&$hk763xcKTt-qzMo@CDCB8X=*B=O1+$V6m{<i`4XF$&eY z8{#s>%yq%p{CicNedG*v^9SpI{d+O7Y>PS_*B*&Hiw{M{$U6HzBVu?Hc|dOHb1#4j z`A0UD)I%3Ballf!^^8jwhi+>0Lbi*>r|EYNhlL#sPFT$>UEM*YAKyGp%x%rN#f;x@ ztL|c>Nky|>T8vCoTdipH?UwhOq10j&sw;i84kVHXbEEBZz`SohZ~HOwgpw$y3FHjy zG`{0g$QvT#)@?>@St+wL|7$glt{&}{x2xdYn%dzi;Q6cXQoG*u4P<>a^K~h?C+_xP zRY(R=ZcS{_cdp9eWPF8P^Uc%=WHXdX?XiFtYe4R)C<=lgBB`a~HI!bRt2yf_or4+b z!OlLxwaVh-Te>Cr+8hs@!iL2!L9ArkRt*dDu*&|_b>X3}1z+!jVLl&XBv|Y;fUT2H zwa)X3LY(S~waL(2AWmMDQUE=T#)i7O`+1lG*|EB%M>Q|;Y?R}DpIus2w2-Yg!EaVt z=0O&o*FO{*SGgPX$Z8y8*EP60`Z{OUXkcJyM$-{~gGa&<(g#A2RN<NP5yTAqQZAA^ zU|8co9}<w+l%+K0zqdmnU$lH++9Tr8i2EpOcL!!l4c`o;)}8(=c4Nvn7!ZihWw}Ng z?EAKEpx-96)3SaB427J0D;|n8S)O1MdLG&<FWzE`R?uDNDcLd`#r&JM6Wt?BHZsL4 zS3$@=@Q=!)hokIXbGepseAU;%y!89*K!fK!S4{SY;S|ZnvPxQQX?_?1i>Tp<tmqkG z^H0LB{6ksTe;mitn9^UzY`m$MH%8Kc=mm5^5`Isj#0FVBJ&@Y&JjKWaEQtf_OSQa$ zS?yOB1X2ux%c@K^vvgg3OXR`@eEWaoX{A<``@qZGVbdZqj;Ywpx$JuVIB3}Rxy`W7 z)aM`DKDNxqkD6A#HkL^D*Xt=|dgA}K%<?vtx}|~)zac!-G}$OeJc%7~f9?74^v&Uu zP3Yw`3dT3S$88fKIWX1eLg1$HAUJ|c;Kp#QJ)rXg6N*gXxFh$GnP}S5i@x4oBzSY! zI+W6ojyMY_lFWe=b;$a7oc~;46JntZLt>B!^+>DwFlq2h;Fo-iBS?;khT`=DOnV_l z+z};sl<J_AwMxigF|9DzNYk<zs9IV1;-a#cm$u?z(vZ>(OEEk;|GAJ*Y)&XP14L<V zA74hqCvuTFkK<sLGw63dTcxX8Plhh^62ImzE!hSdxpDMOG5Qncoom^Ja@*_rzh;>6 ztr(vp?5;EpLoX`vx0Q%84H=r67?ry{v`+<=8f{u1-v>hNe3NJTr0RD|pK9sAax*Qj zWrbHDvIF|fnrSM4?xy}Fi(S7)H@1DNtI&)szMUsB4E<KS0IrJ>#4q%B<lo~$G-`MF z$ETN+T<NV^@~pYtPGYW`$@XEq03R13pxGYw*WeTuHEmlmgN88bE?G>X+Fi{emJTLQ zoXDRSkm0I2^0#Xe0kqNM=4OBy&#jQO!7$_YoO7lkY1xsA$$sxYeY6Mhh9>-r8&>_r z4V&O}iL}Q#`dDVII*eL=_shN<J-Bo_kkoQV7Mivw<`I{2VoNqkPD1;VD;w0zC~&x~ zu;{}J>qv-ID>;|KUD@2{K^n;76o(<J#%TrwcL&-mU$I*{_)LkJ2o@~N&(EJp9xVsf zVH3*k`fvE*njLexJ77sPzU3!YKo~|csWvvdln#32VH4%==^IyM^+2!KN(8&B+Mh=3 zK3w(GkTYsIEgI8s9d5eN=u`IX{^3t8PZ%ys=9<7Q?%mGUi;t~tr%uZ2cKG`t=A6;) z5C3G~;X;(12ULWj8Qpc^w~u_tG-GFjc+}6Q6$sD4PxP7AQb}HFch6qU+Iqqw&_CS# z@pMfC8~Y<!wNNOf0aSx;_X>DW;{P563mg}JNGS6om9Ze4%Pemq5Z3y(-+sy>IR>u) zXll^1x5!9Ni7Hab4B&ryjb5NHW5Z^4uERCO7mQyl@Yf=0-tCGmH?0;UAjY-#GClh@ zZQ`np;fo?Sy`DBG4Sb~2HlFkQD4vg!aL(}4fSxfkKYH|N%AG+5R!UVbn-#`A6>`Bd zm8FSjB&ZfljfY%5SbYzjUt0Xqt+bSfRjHZ5==OdYtV`;j<xBQIT;$-;C3m^{f~>_C zxHU`==0n6569>f}GnAMjrNIR8R@8nfgiGFbD4i1uPBD@om<r~a=cBCo9dDV(v|CqS zttc>6k$17)PV1OXsS4MuZjOO|t$f6q=HB6gJfZbo9EZ|o*1Bbvs6vhYsK+HsK8#@6 zvPEn?&S`azA5LoTC*B%go_2M;V(ELtTI9iaTO-~}=IS5q7c&0=Np%lE27Nu_`3-vL zwONa6IymNIwOzNHLCy32C5l=2l<UTSi~8RP9^_{=yk{N0oeU~W=+#VA;y_oA{uwb- zGsi%pz{x#0Gu(=Snuzv4g#Xx|CXbsrlY^f*jy+>y{U?ilF!}KvjCU#Wi_lBJmb;C~ zk$-|D;BVIsf&^PeU}Ds#|JPRr-~QFiyTBg>pZwEyK*Qv5?_dtq7Xm^n&iDVwkAb<h z=IX(H3X_57KePWw(E&8fI_1FAdUb$h@0-{DQQQNmeR17`rp{ei`P1q0*?$C5fHLQ_ zfI9F|KR_8Gb>i1pQ@4L{k`MT(B5fO3#kgWBcG^+u@=wX(!G4lyN&BcGqKEr~2M<sY zQqMH=zYJ&RY5=l!WxNT-#*BkLYt6)A@o%Ncfx-UN<jc?($;EeWh68cVpZE3eF;)^8 zp-W3%Fk@jrDlC8LCtMs@a4d$&LgP|;Cy=aq;ODm<LnaC~hM?G$V>I6zXd}%`8f-`Z z%vM(ZTj_P6Gs<dGSIjXJOn!7L#u$#aRLk#DT^YRT7Z8A5w?vxBFSOgQ{JS|Cd|6#s zkm<z4L|H|J!l)dr*>Qm-G&Gca@k^b(Z-lT^z~AEnFkam;v=W+?o!y&Co0JDWD9KFy z{^u0({f%G!Di;_f?zW%M_2Kl1pwg$&yZ0@JruV4#cYZxG%POxSy9>)VRNl2)bBmrw zDXy)1qVfU-F29+6W#aZfq={qDl#UY6NBt47mypwn!i?7Z(d?M~WvO2~)zvprM=Ii1 zvkU~jlr4EMk%^>OYyGhdQvGA;U^#+ybla_8H?v_Ng$8=;SZku5hy%M!INg`0n4Z|b zu<)+KG+LgO|7pMGX(9Vu81jz_*dm#D`ADJ)JfKZ3t;RFLTT1)o-%`_Kd=+l=Bt7Dy z^!n`VY~i^-N9XR<z7g>B<W=Hp*GwcYzIqqZuow7t!t2D()CkAm4nxlzS}NmZ=;hM^ zV(T6{wFm8(9E|o42sjy1^UhoZ&+s>21bY3}nK$PHKDM=i-`nfqJYPq(3Bnt4+xGNf zu6m)w)v#aowk>Y%t3bghLmBR<4@aTZTI``AwzJkx7Jfat=2R3F${ng|?K4<8Q+o>_ zp-)WGYb`hB5Y!)yO|W{iV4h#SbIb$%xEfl6Z|jfm^0J<ns!7+6DcZe>e4W$Eaq%B5 zKoqyWd(%)?iAw+HW;zb}pFIJ%qu*hc8#U3M^E2bX;QJtZ)nY)|>pK?|ZWuD(2n|@N zT+#aAsu%fUZRej?h)OSf4Du73L_bXs_L$Qf?1#>!n~qfqdC$qEcVg^JyibRfesgTf z>=Gp8rcdMPp|bz<RRxiGaAx@C<#E+zQaSum8`KnL{HV#+9g%J86IHa!Tyy4W3=|G) z=%Nz3ntz#t!y-;SR5Xr(n|6CQ{ToH#LQvt|0HwpVo#7NGk0#%rtQ|nFB{~Y1E)^G( zO)XEil63{I-5h&HL!^KInd$)SrtSm)kdvas&7WiKz)=8s%{Nu8m+U`#6!`09;Ns=p zN0<I-|6gbT2H<G(-2JeB^#C7-C2%n#f#qLqK4=R)v<}ZP@vrtBiuwdx{N!iz$IpQY z-1E^H0I|Yj&+`8JIX6%9t=ue}(EL|dar}V;AaY6i&maGE#X)2LgV@|>{@yS5*NxSO zfn6StaxZ<1`}cER0~cS<)p7j$6~9RUC`vniUG;x^ju>!Jzb)o}d&NM&YQwI7{5ItQ zWdAnhFP!{6D*p{6za9K<=`?^mfBweGU-<ib+WFTM^LyI)g`dA?@Lx{yn+*NtmA@(a zZ;F1vsDAUx{}*}X%6@gAnti`1!)`OXneJ+l?TM4mIE49x{}6+7JdIZGMQe8adF|yV z^{*WKS9IuZetjH$OvgC?T3?6SCHiBlMJ-ZKq7P}QUw*0f`k1>_&sxrmJPj8*N^aQf z9wDpX)-q<sgU89CF5O$%4Xt6W-3nTd4;`kXS7bS+oHKXoiuzx_9pm6r&kHylRYc`6 zR->ao`1SXvep}-AnE34-zj5L>7XF?Ue$S7;nZj?*^qUv{U(JxCxY(5wRkt5dwC8Wz zcQJXOziLCu49?&Do8-LFQy=>ts*x8*M`y^c1Wsl;hyv6N8O&r>O08?l!oG3lULEpo z3OC%6&1zm{84eiobRGZ)g7=OnT?QhGgTZ0XKo5NSUBhzNj8f-&M&5clgTOm<yQgk! z4*PZ@>~`lP<ZKat-S<$`2vcd$7!lYL(lIo;N3EJjP@=NgJ!KNBZ5FQ`Hns(dx26N7 z%I;&>DM5b+BvD)^EWS4<n>DSbmWz3Z4h?n0Uht~Be2h&ukDU&<xq0V>k(JohrNAZ} zdly0b?>I)C-{{tu&MmeZV~>5tq8QU=R5vl$*h5jmEH)8aQ&T%@c*!%iLE|Z#9)bTn z2g^{xr0fvVVFEP<ib&-qIe6ig8$*fi2xQ063m!(bd88A?Mq`z2JfgsR8Dgj;NY*$c z-8RH+tL03ik%Ix~*+GZ}7^DJC2V#K2JWCol|7H=u#V_(epyjPn*6{b^fRBb;;adSj zpR%cce-E(xC_O#2aiflU^5++4Uq5c{E$Hqy{S}~vb8-Z2_fL@Ye(}`XK<_0gTATdG z$_LF@H&7p&vrdFa{@qEB4@L1X9aC1B_b?Fn8UFqM)+iq9sQG`i06^^f|Af_=eU5ol z6U=~JGy%c~j(Sk{rPC$L(@c)^pkVro-QFs2rZ>B?(Gsws!e_{{HWl!m{9#|bO6NWC zHo$q$(Fc&+ihP<6Gp6h)v<K|(Zl=?gaOJ~(y#`%sTbn!NupwyZl4Z@{{TI`@7a?n1 z^0|`_yRJ*rue3}X4w24q1ocPoLM{QrEbSKG89tzJW+3rV8@G_+$bm;o;1;WVrc%xC zns&!AaTFVlm7=;cZ-jj&Jg0vx-F?Hc;Y+f;?~m~~!;8h!N*{smne)CqZvY0i9Vxo0 z1q2<qu495iq1)otOs?Hs#kqG8GB%=292SQ5wd4TE(ySM%OYTJv2B=q_sZ<8w68SB) z08nU&3az|nk9b(ZXgI6$qrDfJ?YfGWsoe!mU(Cdz%5@p&p}I<i)9wPZ_21*Yvq2vY z%5u!YF};29%_o^I0wr^tbHk|_^COZC>peaI8W{TL253KSUOlF-wDPVWb0W!;<RC;l z6_hr!c^{T|d8O2kz4YzG%#x>sCUwv;Q2~;JL*aqV$GUsy6MPjl4E;!J^91G9Pr-5J z<e-W8sqKYw@9DW=z*tkSZ}YgR%Z&t0R86H>%dLe5ko^a$*1DDOOsNiD%Ry~Q9l#0m z=$cE_3C-s@&$1~`9DRNq)ESoDKqVoZf)>Z9Kibq9xA5iR6bNchwbfp2Ed&2q`SAI; zD#-3fVlBQ;ly9YPNFGEGyEOCdg(Qz<QFP96@6K!T7Y@@wO!ypTfcED29vc!!w=tH$ z&c3ZYbNLe;BT$fYtrHkAI3BZZA))MtPrjh!BID8S@yz=CMouT5eC~AvKF69Qq&&_v z)o<<Xsc9HnTdhSFbk5e^6;vt2m)AdTMy-Y$g|kkdZ%NawHS~#Xqs%OKEx;SCL9f(Z zqoQAp$1r&{?NWV~Ff(#zu7GQ}0|xUihONAJ#!+grK+1+8C(8isUnyIZ8^iNxC{QrB zt4k!&FqG7r`EfLOCT9wmYQ!ub<Sop*_m+&#&$3o~FwpZfv8*wR$wX7;5#<uV@$YuN zahuMPp~Mj1kg8s)^dG>`QKIwhA|AkZCs3Ev43N)P-jelu$|`sDz=WMkxMfv{+Vr~E zbC3gFr^vM~_16kYw=X`r89Z;2OG00AnDGQAq0iY+3Dzu^UF=1>jMNhxL1rHtwhIJ5 zh3!o6=K6l>uwgkRwtnhUJ#-#t&A{|h;1yvoL2<s=GS^^GVWZEaO+;-e&UO<!fIJg& zS7GWDqBfpo)|cMQ$UZabvSF}9-Pn_=cEKze@$H`UMpIkh-+%~ga=1P!LiE$(7f$A5 z%A8L&#wRR&Ldv+3q)f#F1J@>9$~+riIsIYH8v#LAveQ}Kw10RE5?jd~zW((^M3uBh zx{wM`f_1fY+*2XZ=`}sj`Ti{WN=Czg%c0KKQ)-4JnC(d$)~3#<Y~>C|xe|-b+oDc~ z7_Yr_Rd#gZ7Yvt@@rhFfW+*N?OIhLMKNxGp3`hODyNk7*?;1h{*}XE}El#~FnB2*3 z?qGh&e9AJ0G9?)qOaxHG6$D7Nc_n6Y0&Owho{PHd?iM#o&+Tawyqz~LhQomw50(UW zrhy+c-aXCtDLLm+ZOrtB1vbRyRxZC$dh?1VgJnD=+qc`YN0-Ov(<PLdH|p{GB%dLL zDEP61Ck;E@SVS}4oo)Xn@O0>(TZ<eEFwS}0YywUfi;OvK<)f%kv~aSQMMb>IZ)0^6 z#eZ^E<Q1&IP;GbJ@`Lp29{|G5VLK~3kbRHZO0wBc@LelvE>^$prhX!5=dFPj07tRk zL`K>)^PTdy6er|}_0UJKumtr6x?scZG4MdW>H3d}M7uQRra1%e%nhF&8?h-BH90!^ z`BP`Pf&{sr$ce1zW1H@6AWT5W(||*YnLSKR<8^JHbCd1rA@nApdFe#?U%}qy?k>9G zFYYufhkI`UW$UnFslnqcb{1@kvw0bgVBap;u9Jg*-S$mD-oc$gZvp^sYs8no1iVdZ zNi?J{)ykr|hagI#u-(l=HLuKj=wU40KNN^NBUxc(J>zBis<{dPF{5M3ojsnAJw7^o z=JGcpYqob|cd<ZG(FgPw4*9i^LYRjdeWB<pA;k-x=&zseO4o}gzesoNoSZ)H2&uiz z6a23J8&|nSf|k<J!*tw053)UYE`|Y`F!`rH_ZU#a%y!xNEtArOn1Tv2P3%-i8j7da zJ#m-AVu6nLM>C`DNPMqXFl|e|@q4_p8+C$bv(C~R6uDU0)}d#+n&hld^OS?{8gM^p zOvXt)Nx)nUk3hGB*1z6%CAjtg%_O|pn%+1*atqpDxfpjS>H|P*UaXm9s^`*cGeC9D zoI5M~&a-DXzQitfyTs6wD`>lK2$nM5jOsaDP_w<hIH2JRIOPg-v%biq{`*JiTyXm( zPX*WG68Eo}9SQs6P?R(0S+1*MdJP`narGkrwZcbmyR)3FCKS0gv1RJniyeM(`sIg7 zE&5|A#sK0Rl?6OfmfCT$A71nLo^^QItC2FMQmezA#^t0klSg!&64!w4SETQHRpY$e zA{(q8<!TVHuoIstWA6m271PL46CwhYO6PsPJrhdX!F-W(3m1ex#h>K6#(h|lCnuqx zfn)Y*GcdB@@BbR!h2SQg#N{<ne!i8`m$c{H{ymSc50rRKn5jCr0(i<9^pRmrfi9K# zfEG-x_ZsGcaQq23-X6^PdR7yuic3jy9o<Z&kD}ZdnWJ3e_glnF*65+mPs*mQ0S7CM z;|)m(_g-Aqx5_<u3jHzt+hft3cdsff)lGcvmcUFV`2dCL^j&Ax7N=fmu?Yin#PVlD zZ_HGh572=UbJr=^KYJv^?ZCSqAp^>jj~<UIB9)n52Qal_1{#{y%B~jHe_eWb1DHI( zNg<0Bt!!NtgYPLXrMs`1+Xhc1UBusI;&_t)3<B=kp&4bsPcVLdvu3banj$2Z++P%8 z&vm6DmLb+0g4?AIb$-3g3tpA_;^r0HKG!akYXfYK#AT4D8QOu-Iw`~MXh(lcED9K* z^u+;~2LQl*jYdEilaIb6sWxHJgtTVT$wALra>u>f+_H#!1Gb@_2S8m!`V!c%02XKq z0f@-KJlwZPOEI}Cd_Xiz6CGUv<JbY%&<IzNuvH(ktRF8SX?Y%Y>Dew7@kkY@ILZJV z)%B$cuSzQgfL@7$zNI$To}7citA_UPE!VGguL8x)o3=s$Fx~(%t{a>8cp+C;)=LM3 zSkG36H@cEx82XY^XKkDLQa`WM)N3>>WJ5m_6@H98%}V8#C;Rng1gNck;-8W&4>mY} z))KUlFde-MaH|M@_fs4}?u)4cr6zwhNbFKPn3L~XVKdf$A(PMpY!u7d&~@6Vc_D#) zuqc2)t^19v^_G213s(b<IRIqRspVm?Fe)ln{NOx|PM}1$@cK)lnyR+F07L8%{5yZl z{vNF}e3NYMg`F#$R@#RfhP(GmKsQQVQ|s&fUWnIR1zy*L7`E0Wr1EDeez|FX?}bSD z$~*@!SKd}LK&Jg=dNtW&N|)8`@6j;{9!yy9`S;ua5&DZBNdo-N`k<(&9<<MC2)Nh@ z97bbVGa5mw0?1xk4p8T^A;bfCkEwRxbil3Q8P$R4oB+;{(*$Q`PK(n~fTnm{R~6tw z*&F7$d+S9-B(^Bml5E0~{usOll2&-Xn&FMk0!l`Ns{2^oJPI?t?ngGaUh2`4^nB9e z0GyUEQWg#UFfU?g@5XRYZ}pa%|GCm}<D*bz1E5%tZ8e&YY8wMgFt_Bz>;wc4`YU4V z-Nk2zq8>3+y(JxHym)PfqxR9}YrON^9E)WALl@ba<JKoa1W&A6(uqpGa&QTD9k?Ht zSuJi^(wuzBS7CJWCz-~(JN(sW>!moE^yZS2pE`8_J1hssVY&w105w%%HUUIu-$ql@ zSxZn8ors>j2py9F=2?>346`zmaPWyoHOjEc6K4hZR$iX8a#YKevG1d9$@X(+YS|kw zJ6(DLRM~=M6rljmlV5uT{qd)eoM)H9Uu-IHG(1q+g8~HDXEDuDUr>UP1~Si^??fpJ zpN|+{p^a=d`T&F>UTonA{ZW8JLw8mCPTLD24e?k#UnY(pk#w4gb_{g8oS!(MiQ$Wm zsPlVI&eS(wL+|a1h+#j_;omZu53v2mSpIGZ@xyezr`|}e1E)}EbS3j2@KM9D1f``n zgkr!I11Pe_FVbuPxAOUhWizsVoPk#LcPn8%OxG!X&3yJmP#W&c#l+@SCZ|CNP3l`5 zZ$#ZW2?+l+IDi!JL6QBPcL3Pq%Y7mULhAO+bWii!qzER5s#)l`Sn6kQNs6@bMutgm zE(7=|$-B1_Ct8LqA&3A}nIx@eS`L)+4esx$JRp#m?RmtE3JK_W73yGtP1yGjsDy^E z+84y{byCs}MO9z<0u?>(Y^~Q&A`XQ17UuzMakD{?A#~bLv~f9+ds_ngpU;G(iL7`4 zp~}=E3U6C35&SGa{%6qNj0Ql`O{Xkr_aYGQ7<?&yq&KMZqw2)Z6u_G_;FZMNLFnA^ zB4t@q6~i}D_1(ZGmcJu=`%F4u-;1nyd*k%^yERFmGXZACqm}<;0wC6a1&4NV_6rFL z({EO@XOvz0l{2Tl)d61AF{8G><wF3OrzYQ3bi=SM-1wQCPyuobA^qc-|H?5K0uy0w zh_&@UcLs6{`aq7sG7ci~E61P;OvT~zo}T~8F-QZ64_EFo%+Gt%ZyzK+;I-BNN_^k} z8$kW*rvH`rNCpxgMI-%YzY-t+XBzc@A!2DJqHL$naM$zza5^nrb3g~>*IC(s_Yyq) zqj8zmxY}XfSf%{^nW0!D)iu&g75Lxh#R>C>Df5oR{U3?xh7qgDQ;B=CiGm}wbo7On zfI3`SUsVs1LC5JvX$_;+wi_kpss0Q7U7_fMIK$xa)=cEyj1SQ{J(ZC+?BNK0kLtY- z_;otCqaab0Wb=nj_y(c#f3<g}aY?4#A1|{hQ`;;Zm$IgkG8NMl8F48qB~vQ59QVY1 zhfGb>F_)$>t=te%Y$nSr({c@WGes28$|V&Alcih<Qp5GRc$UxqdHsL=@PZe-;J)v3 zpX*$|^F7z+oW31*0H<(FTvQXiWG%nsN`xVqmmk#md`hB}gjHrMRa|0=m`D^c0JAc& z)8Us%P#0I&0}Tr;`?S3*8SHs`r!tU$|Ll|^r!D6XH9nO=Y^<?1+$5>b!lLjE#iSgu z{_Q?gHTcyT1vJKK;kK;KaSw5~)8NX?t_{I1yi&`L4jc1ZOARa&zTdC*c6+3x9ZSt) zGmvaJzX03q;N)iDXl*zeT!ra7vn|I4Hdc*eZ&5!EcBrgY{oI0G+IVmit{*bMA%w*9 zJMP7vs{CkcoFj2Q2};yv3AI@t5VLR*O<xH&Qq}eRgzfLGD!YGPQqxD;nM@GQ_4wg0 z0x#BdUIA{^n!Qz{>E{>*mSpD+*akjqV=)X08;|xDkFnOqP7HO;fmLWNl|}OI3}|T8 z&&cf6ssWepe``0sF~2rGpM!6j@u7S3?hy{uaP>h>gb_=!tes$FAqKRm&d~hKm)>r# z*~h)kfg}haMC=99cl0x=$7+WMtvZwyx1??MO~LF6Fmf+l1zWTW$B&Bliy0S@oSONu z%_ZnJ-5aaD8`;qKZ)seQjRg;)3{{Mc?$ONy^M4v<fGqI=2qmmj!~(&VuJF`ahm0PF zT#ET6r#`r8VbI2CrD9{bLO8#%K2MLCtDi0>!fDX84^RVaMrF%VBi}@J@x%JcJgfgm zQ5<V!93~pBo=$<{ygru8$<xT+fEd&HCzC8mST0#u{HIO0N(tYTh%Fl*&DK5&lOYJN zr{xlY8M89Va{n5Z7Pu$R^-&L8!%}&jBu7$D-GXYy!%>KZQdEc{TtZ;FK{R$W1s>8% z4(}GkX!>CFA?<v<d4Yxc^5u_xGf_)pQBaqV8i$w<StR@BRW1~N=isept8~_?4H?YK z;k^SCc1u16-i!PGSUse9R6H*aW4>YnP~}4msXcKYA+!=tnypXr3Qn_fOTH4?v%Nt= zM&^Q_%rq!Y*O6eaImRtqXKb){tv^zR!~&pX_~K;xh$J=61-|qWu_|akcJc`t(UQI? zao|MX!gY?IeOH(xvK~N{i;9~5bwwNEBB+^2-^^~E>#_c%QA`gbiC2<~3ycki(OH@2 zcdsucY}ARJc|XN{gvHs3qSVD*mfb60ga$#6yb1a0qS10Etoc1o1AA{oPv(@2T+$2J zu|o$yLdvy_=UC?V)=;`n30d&avsMf*LQ*y5VC?CWXSgh^h+hS=x`G1)*;25u>v5xX zaV~Hm{_>Ii!yldk=~^K{^7@oOKH>?3{DoRP)h4!m8PmN1+}RELS8lzJb)L!%m%<i@ zKpXak><tr&Ts$g%V=18p$I~w&3<s!23&(n+gxliT+w$S5?fgHa(^^)0T7uV=nIj^5 zh6fxn1Ei*nn3+tKFHk!<bRH<<Sz5e^3}!&ban+W}qnd)6%m)Uwhc3v##E=yR{7{<V z(M`w9;{-|SS|CUzn9f&p@3B;SpZt<p44=HGzk1Q(_#uJ)rxUUcNVc=jfv5G-PmfD% zPKlqP<a>Tws7Pp%bH7L1A1&leMpneSiHf;@o-98OCR40m+GJ%;-P#I_y#(_rkyo3w zD`xJeqq$m{ed}5%dyLY8bMGxjY@Gq6x5KhFIa7VLO+9$-k%qav`xlN8**o93Mn<uu z0CUmqzFd#>0W540wa!8D`fbRF2{N#zpOpJsTha{r^_`aG7cGJ70ZBF_jL+RUL{9gC zNl8Cv{gn_p7V@joS((t%Akwwr?PUgu<@~$|DHQ2J@aqmmdOE%>MIMuN)FKQ!c?5P) zIL3e%j{!?ISHQQ)<9o@UmEtFq@*y>1_g$v@8BxZpwSwNgfvN3Qs?iubqZKggYhwj7 zk)p(qe$0GFjXA=vY9pRcS|f?xhpl#oorayQ+?cLtiGR8FTiM;k?T8m;s#{48gI>?A zJ^z$)gI*B6o6Pgh2$(D1S>AZsiA~k5T}7GpI71%LYU)QlvoH_CfdtDb0Xls;C8e#` z$LKdHl#XvDmwGjo>1#Et4#plZVje#5`lV$tsAaI<I0_?*zi&uG8x0f3zdv1=!Y`|V zxKAG&Un~!v&Ykd=K_;vXB{aELR8ubctKu~Kb8Q6Ofj1?+{hKQM|7`hq(*bWjgr$LQ zStuOV;xNpFH==jryClB!NSq_r4rLO_dy0%Db!V|!)<#=GNOL>Gl&`{ubVqUJCVuD^ zNa2kSWq$>Pu&E#amMiVCE1b~HQZ-jL#f#p$!hRjO3|bw-vg;bT+L4jZMrhlCNoMd~ zC!~78=pfhl1*e1>_<PRV<1TaWIH6VtH}l_KkM0@!j5y0Eyyw)iJix^#i19?(JlF5& zH(ekv8(?k)zTQNy1+^tZ>nYz8Ou(TlmFtMcP0l;(4q)^=qKZS|7v_pN@3NGR`bJZY z$G>I3r|Y`w9U=i00B(HLxOeNjtfEy8nA8+?ZkOo~HV=7$w~>BJIY9NnUROmGUqfaq zqLd0hjP=8i^1_0k8m1fKUOcRELZ0sSY4W~V{J56}d6d}Dp=?nkvS9egxF|~%Ohm}K zJt!VKQG~T_tgPY5xRGNKM(X}$wxYvQFRTu=O>`Z(uSM3$Lpx7JNc93%-NJ_dy%y@H z!(uBi4F%}<OXZ2+<*s}E@;+i}Q4;f;bo&n;9kN`RsX~b<39FO^hWe~v*cH$Dt+Roq zF_rJL_Nuk2jG1Qksd@|Q;FcD^x`XFZc~>y8Fc^fyw4t7FpI>Fnmo1rz5hL^?OwdfX zYz9PLxSc8Ys%aF~6y$<<34JEFXL@F5oy~ZtN6yMe(#7-4Z`AWNLGJ6Sm~#bbuV!G7 z#u=ExD{P&ik`LiD)4f2;{nNqi{U`ej1e}#TL1xLm$0PwKfh`X8(~6z@!}o1iGbPDe zxGhDv#%RoSP3C;17`eEI{umi*u2q)GT;}{N3Nia`VP+pMaZTk4)=r9xe;ze#Z7|G0 zR#nbjmy63u*<-pov8z`_Qy)j8?df)<Fz->%vpm^^?@dQ1jef`_s%+)e!}Xq%CX@dx zu)vtS?lT+`7t14J-sYERKd$uyxgqEjd(%3)$H1yQf=BeI?!z@A*64_?;C72ao{FjQ z^Z58?J)o_--$a>Co!)}#tl@nN)wzvv`XzDFu4vibu8tW)*Uf3{IRb^!`W`mkZ5kVC z&H5%F`-?wOOb2I9dIwc;zoJY<*(Hc4F*~Y3J3(4<)?#SrTiRU+>6-iZzm*KmXeenW zMWL{n-H60XwT!!ZQNE)7<1X>J3Vw4O4TStqh5oDC(wd52RH8@v9z2yFKU^60{&sQ_ zu1@&QP$8kpXB`!)%P9>`jjzVusMmrw^mV+~O;{Oba{Sw`82g$YMhnUV9i6(j+A*w? zP(+MQPvhf=I@(r$XxYf5-?}Yt5gikznpmUt%03a2rk$SOXEp>62!DTDEM><V=G;0a zN*uushO2XbV&D?}?8h()Un~>8TlRpC(RQ|go)X;n$OTXnt{dNx7bITtuBo*FJA%p3 zPb960yoU1GT&U1hflFGfE-{F@ddDfi+OzAt^<1*AD=zgJy@o4w1VWT1Fdagm7+^Zc zX#y_quS4xFbKN{nwy}0hcHu;Dh^O*uaOz!-%$3ej$Z`2Q&#Mg*SgECLmBR@nH6M)7 zbIsAY?zv9lYw3D075tfFYQFEaYYlXz=#e77XluuF-STO27W4;inCvc_2RC&tsYYLL z)0Hy}&)j{=!>C&~3*jvJYU&;=&(1zvnbgkN8!fc|D$&om`3GvA#LbE$Gs6u7TjFg! z4Yq4Ju&HYJEAvu8cZzr#ek;RQ_@y^ZJwxMt+ip(~_f8@vsN};ZPc!Q1HD}SrI71YP zmydd*vRsdf+!yWW9L6vAc}vAb>GFbXJ74e8u`WzYDY&#Zd#}a_#JHV{g%~7ioYdw9 zTr$2<CXXOb5{;i@ZKN1T4OE7Nd|<wHD8XJF0(PS^0H_+cWJJ4YJDaO;Ik$qARVW^h zeCUn-a&gXzpPWVQHIxc+cx261F8E>ASULPm_O2J@rt()mvz1{wldP5eKpaVCciBBe zu9p;v4P>r7&W#P>Z|Az|8%;z<=OKAJ7<E^#hBnXC47t<$$jCb_I}kw&V9K;eMq&f_ zFZ_Ecif5?{=8mDX&zokSWdcLE5;-S&T+?<Ir%%e&sqT-iESlK=3tz=_y6(9<$N|Tj z301x!eO+S|IquIj^rd8og?{CBbN9}iW8O+5m4V3IXnGMjylZgq2vmy}JuI#*_`R|p zJ^uI<YejP;YO4?CMngrJUy)Lr&$zABIJ?0(^?pvR1VsD0pUW#Tkvy>Hht@1rMQ5&- zC<0?~nAO&nmVQNPFBb0m>DuD3PDJ5^w~Pv*-)!~z$2K83Ak*7#p)Pp#92-%1pxntt zXY({HK?EbJs<c}mg@nb=$7R*gxcFQOBWn)Sszw^BO0lF&RAq2kYn5Y*%}5P15i&nU z{UCB)j49W~Mv9UlqwLEAz!FzBzg%1A{}9Oss6qtQs2iBaM)Ui6YLKauF64+v9A26< z@E)aK6P$Em&R&Pt@p!iHP1|mL_46ykawb9T@82v~5gNA~MLp%kW}5&B&{)VE3vfzT zEg^OW^cbytQ<kdPaZfdR?><a?SKgx5zRbf)F)K@glyz67y)n144nHN}@ecIVx|?4= z%~UnH5KG?0?9JK``~5K^`0z63L;z3vm;n9BinsaLreic5B?@Ory^Kc`hO}SKAQ-CM z{N$xSKTl0hpGZ;AE7o42?}!){zKd$k$s9TL!}*V6{68DRyu+=HXdRAcudFbNR$bYp z3!{(Rt&izyn$seg5v0G5hI4*GhTh}&PP20dTtrtVXl=^ww{F?9o&7r~1%7(!6>iBs zrxN|bQ@WTlboh}o0e?AY;Gf^0iNXMUf~nfCeJZri|KxD$-3d4%<PWORDl@>%pLkL& z-Q_+2dtjA?*EY6z_ZuQA0{Z!D1+9S!{!q=m*D({MoSxLWOLM*FEgVnL@)jGnpZ4-A z=RV=rKj;cPN1k{vuv^sB0II7*xWVrFJ)1Ud+k!lI#@?7vUBtbP-TbiRL{e1X=wG2R zdc<CzyF-9^KNh>XXtaml@t7KR=b%F`pS5mohdc7te2&j(5Q9I^%xFC*erz`}t&rAB z%{^qm>e=j_xhbbZ_H$-y?vrxSyz*~LZmb12`f736;0+$ZkC6;b^s9-p?vHvcC4&&# z(xNhynF%}^=Pn&cELfnvdiYp<B$jkUxUn)Z?~!4kDUfUaVI;a&bt^cux!6{DIbWOK zUGPy+A^NB3OmUCL>Sv`U{~NDcf_tvHvz;%@1gHfvADz+^REvBocbnTP&Ng6p&%Nh7 z(K#j3McF-up(Y?uGE3=4zqlsn5%tqqYAe@drIMg+1r;Xb-+PzfQHS(n5(F<N+kJQq z54su)XfagHG?~k@xp5F9ZmfyZChCK1g!9GY-5u7o$s`1sYFCt8JfVH&sB8wB8GqYW z%C1(r2qC66KEC-nn>@nQktG(T=kLnyZT!&z4IQu1f0J*glU%tkQp(vq{8ytH6x&&r zr52KR?htr>&CcPGj*Fc#2y$*0`~*~up*z6LrsmFj@V<a4ZTqL=Hh!|W5b95Zoi^o@ zaCKNlAm50O%Ta|o&l;fq!p1uXvjbQSS>{G8>&uh~5rGR1DCDwmS1i?F{?*$E^D-#K zZC$T2=rC5J@;piA9X3SyaX$As5Rw&)-wHgLw{FNIO09F_X;W9p+o_l9Q_c?meR;oz zxu<(#GQP3oB<dV5HcRZ9g58`go8LBY)bbQ08J%Y(#b66+uW;+v8w>S~kOvwLTEitI z9=*Q{F-A{MPf^s%>(^#Y%M}vm$Go!U!UUq(%S=Sv;@|H(taK8b6aB<=rO0;?NuAGH zvx*>J(8yt?GgTAfeEU{-k2MlyG?84{q3Ckjx{p^i3*I1j`9hsXv~67-j&pK8&uko1 zRhXC|9!R|6#C>;6PYY9g({4NE{R<I(sWCV9I0f_JshW-kJ^E7>DzIn5u?``?OKjQH zSFaK0sXKy)^%`eE;SS8HRql<xAQHZpgHm@`i8FVZdMVc(Op`&BQe@o)w|#e_4p#VS zB~0Nh`;~pOqPBB8{vd28-0ib91*+XS@}F?f{E3uv@G%R{hyz!TuUoP7DZE|22UP5b z<a(=K9t10V;k$#~NAR#lpxwo#x0f_TzIt97pM82h4KdrgUe(=;IWXS&l5%|uDx+b* z(Z!&BY7v}l@%=h_^IpPjTMZ+P8Q1W(tuM+T4)}jP;j=4;+JnF$w=bDavFJB$ynUu$ zk*L7u`Cf~D1rZn02OLYbN`pe(!7Ay>U+rootj?kP=qj2peW}ZEuDM(1Dkz&sSl!fC zy&~PTS7;v!Q?6N3;Q(mM!BqJ0e%W&E!fVj^K|R)u_+R|<9N?cw%OKEr=-+TN(G-*d z<7Og5H2&|5l>*rNAO~I&{)>Nt?D_lap&G(}5H2`yC*hwrs(t^9e?A8Mlj1()`=9^b zEM)>t8r=HuJ|Dome_!#@eE?<ucT@kfl=Sld+oyh*oz}Sn-NU*NxCwla=WWlGpY^=` E4+#G)TmS$7 literal 0 HcmV?d00001 diff --git a/public/screenshots/p2.png b/public/screenshots/p2.png new file mode 100644 index 0000000000000000000000000000000000000000..117167569fdf383847b95041147e3813c2a78ed7 GIT binary patch literal 642123 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Ξ(;7A17kKm@XL5ap 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%0D^E56B@?Lsz_-c)Xh^ylw3O4O2P4lOYyuT;cQc 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 JS@-LvI0OT0K+KN-~#+$)1e+SY}JH<7E$ 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,-RJvG)Y};H-t0g%$2G%UbZg?)1Ke8fB)9Nz}2fQ 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�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 OpX(|bS8^_!1^qvpz@Fg% literal 0 HcmV?d00001 diff --git a/public/screenshots/p2_small.png b/public/screenshots/p2_small.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8d6730cd99ef0f2bcf014c870847e13b384dfa GIT binary patch literal 206329 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 IY8do?0C2_uN&o-= literal 0 HcmV?d00001 From 722f4f760e33eb66830626bdff1d6797da397777 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:45:37 +0530 Subject: [PATCH 248/282] feat(manifest): update icons & screenshots --- src/app/manifest.ts | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/app/manifest.ts b/src/app/manifest.ts index 204e58f..792e752 100644 --- a/src/app/manifest.ts +++ b/src/app/manifest.ts @@ -10,17 +10,45 @@ export default function manifest(): MetadataRoute.Manifest { display: 'standalone', background_color: '#0a0a0a', theme_color: '#0a0a0a', + screenshots: [ + { + src: '/screenshots/p1.png', + form_factor: 'wide', + sizes: '2560x1600', + }, + { + src: '/screenshots/p2.png', + form_factor: 'wide', + sizes: '2560x1600', + }, + { + src: '/screenshots/p1_small.png', + form_factor: 'narrow', + sizes: '828x1792', + }, + { + src: '/screenshots/p2_small.png', + form_factor: 'narrow', + sizes: '828x1792', + }, + ], icons: [ { - src: '/icons8-search-50.png', + src: '/icon-50.png', sizes: '50x50', type: 'image/png' as const, }, { - src: '/icons8-search-100.png', + src: '/icon-100.png', sizes: '100x100', type: 'image/png', }, + { + src: '/icon.png', + sizes: '440x440', + type: 'image/png', + purpose: 'any', + }, ], }; } From b7546410586908b5187bed18e4a8797dc037046e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:45:44 +0530 Subject: [PATCH 249/282] feat(gitignore): add certificates --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c95173d..9fb5e4c 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ Thumbs.db # Db db.sqlite /searxng + +certificates \ No newline at end of file From e6ebf892c54d6614a0e1e074c593192f3cb8626b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:47:20 +0530 Subject: [PATCH 250/282] feat(styles): update globals.css --- src/app/globals.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/globals.css b/src/app/globals.css index a8e6ae1..6bdc1a8 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -12,7 +12,6 @@ } } -/* Add Fix for IOS to allow PWA and stop zooming on the page */ @media screen and (-webkit-min-device-pixel-ratio: 0) { select, textarea, From 57407112fbc16425bf89dc7b60c9e70eded3de78 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 16 Jul 2025 10:39:50 +0530 Subject: [PATCH 251/282] feat(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f62543b..999740d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.11.0-rc1", + "version": "1.11.0-rc2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From f7b4e322182cac1cb123755cdb750978af6ad88e Mon Sep 17 00:00:00 2001 From: amoshydra <8733840+amoshydra@users.noreply.github.com> Date: Thu, 17 Jul 2025 02:01:45 +0800 Subject: [PATCH 252/282] fix(discover): provide language when fetching some engines provide empty response when no language is provided. fix #618 --- src/app/api/discover/route.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index b1c761d..3bf79f0 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -36,6 +36,7 @@ export const GET = async (req: Request) => { { engines: ['bing news'], pageno: 1, + language: "en", }, ) ).results; @@ -49,7 +50,11 @@ export const GET = async (req: Request) => { data = ( await searchSearxng( `site:${articleWebsites[Math.floor(Math.random() * articleWebsites.length)]} ${topics[Math.floor(Math.random() * topics.length)]}`, - { engines: ['bing news'], pageno: 1 }, + { + engines: ['bing news'], + pageno: 1, + language: "en" + }, ) ).results; } From 26e1d5fec3d126092d56c771276896453dbf2549 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:23:11 +0530 Subject: [PATCH 253/282] feat(routes): lint & beautify --- src/app/api/discover/route.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index 3bf79f0..d0e56a6 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -36,7 +36,7 @@ export const GET = async (req: Request) => { { engines: ['bing news'], pageno: 1, - language: "en", + language: 'en', }, ) ).results; @@ -53,7 +53,7 @@ export const GET = async (req: Request) => { { engines: ['bing news'], pageno: 1, - language: "en" + language: 'en', }, ) ).results; From 94e6db10bbb577184cc443cdf371cf6cfc1e6c4a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:09:32 +0530 Subject: [PATCH 254/282] feat(weather): add other measurement units, closes #821 #790 --- src/app/api/weather/route.ts | 7 +++++-- src/app/settings/page.tsx | 31 +++++++++++++++++++++++++++++-- src/components/WeatherWidget.tsx | 6 +++++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/app/api/weather/route.ts b/src/app/api/weather/route.ts index 7594aa9..1f9867f 100644 --- a/src/app/api/weather/route.ts +++ b/src/app/api/weather/route.ts @@ -1,6 +1,7 @@ export const POST = async (req: Request) => { try { - const body: { lat: number; lng: number } = await req.json(); + const body: { lat: number; lng: number; temperatureUnit: 'C' | 'F' } = + await req.json(); if (!body.lat || !body.lng) { return Response.json( @@ -12,7 +13,7 @@ export const POST = async (req: Request) => { } const res = await fetch( - `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto`, + `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto${body.temperatureUnit === 'C' ? '' : '&temperature_unit=fahrenheit'}`, ); const data = await res.json(); @@ -33,12 +34,14 @@ export const POST = async (req: Request) => { humidity: number; windSpeed: number; icon: string; + temperatureUnit: 'C' | 'F'; } = { temperature: data.current.temperature_2m, condition: '', humidity: data.current.relative_humidity_2m, windSpeed: data.current.wind_speed_10m, icon: '', + temperatureUnit: body.temperatureUnit, }; const code = data.current.weather_code; diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index b91519e..045226c 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -148,6 +148,7 @@ const Page = () => { const [automaticImageSearch, setAutomaticImageSearch] = useState(false); const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); const [systemInstructions, setSystemInstructions] = useState<string>(''); + const [temperatureUnit, setTemperatureUnit] = useState<'C' | 'F'>('C'); const [savingStates, setSavingStates] = useState<Record<string, boolean>>({}); useEffect(() => { @@ -210,6 +211,8 @@ const Page = () => { setSystemInstructions(localStorage.getItem('systemInstructions')!); + setTemperatureUnit(localStorage.getItem('temperatureUnit')! as 'C' | 'F'); + setIsLoading(false); }; @@ -368,6 +371,8 @@ const Page = () => { localStorage.setItem('embeddingModel', value); } else if (key === 'systemInstructions') { localStorage.setItem('systemInstructions', value); + } else if (key === 'temperatureUnit') { + localStorage.setItem('temperatureUnit', value.toString()); } } catch (err) { console.error('Failed to save:', err); @@ -416,13 +421,35 @@ const Page = () => { ) : ( config && ( <div className="flex flex-col space-y-6 pb-28 lg:pb-8"> - <SettingsSection title="Appearance"> + <SettingsSection title="Preferences"> <div className="flex flex-col space-y-1"> <p className="text-black/70 dark:text-white/70 text-sm"> Theme </p> <ThemeSwitcher /> </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Temperature Unit + </p> + <Select + value={temperatureUnit ?? undefined} + onChange={(e) => { + setTemperatureUnit(e.target.value as 'C' | 'F'); + saveConfig('temperatureUnit', e.target.value); + }} + options={[ + { + label: 'Celsius', + value: 'C', + }, + { + label: 'Fahrenheit', + value: 'F', + }, + ]} + /> + </div> </SettingsSection> <SettingsSection title="Automatic Search"> @@ -516,7 +543,7 @@ const Page = () => { <SettingsSection title="System Instructions"> <div className="flex flex-col space-y-4"> <Textarea - value={systemInstructions} + value={systemInstructions ?? undefined} isSaving={savingStates['systemInstructions']} onChange={(e) => { setSystemInstructions(e.target.value); diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index d308bb4..669b9ff 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -9,7 +9,9 @@ const WeatherWidget = () => { humidity: 0, windSpeed: 0, icon: '', + temperatureUnit: 'C', }); + const [loading, setLoading] = useState(true); useEffect(() => { @@ -73,6 +75,7 @@ const WeatherWidget = () => { body: JSON.stringify({ lat: location.latitude, lng: location.longitude, + temperatureUnit: localStorage.getItem('temperatureUnit') ?? 'C', }), }); @@ -91,6 +94,7 @@ const WeatherWidget = () => { humidity: data.humidity, windSpeed: data.windSpeed, icon: data.icon, + temperatureUnit: data.temperatureUnit, }); setLoading(false); }); @@ -125,7 +129,7 @@ const WeatherWidget = () => { className="h-10 w-auto" /> <span className="text-base font-semibold text-black dark:text-white"> - {data.temperature}°C + {data.temperature}°{data.temperatureUnit} </span> </div> <div className="flex flex-col justify-between flex-1 h-full py-1"> From cddc7939150f7d577bccb6a75f03e6743da61bb8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 17:52:14 +0530 Subject: [PATCH 255/282] feat(videoSearch): use XML parsing, use few shot prompting --- src/lib/chains/videoSearchAgent.ts | 72 +++++++++++++++++++----------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/src/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts index f7cb156..8e158f5 100644 --- a/src/lib/chains/videoSearchAgent.ts +++ b/src/lib/chains/videoSearchAgent.ts @@ -3,33 +3,19 @@ import { RunnableMap, RunnableLambda, } from '@langchain/core/runnables'; -import { PromptTemplate } from '@langchain/core/prompts'; +import { ChatPromptTemplate, PromptTemplate } from '@langchain/core/prompts'; import formatChatHistoryAsString from '../utils/formatHistory'; import { BaseMessage } from '@langchain/core/messages'; import { StringOutputParser } from '@langchain/core/output_parsers'; import { searchSearxng } from '../searxng'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import LineOutputParser from '../outputParsers/lineOutputParser'; -const VideoSearchChainPrompt = ` - You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos. - You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. - - Example: - 1. Follow up question: How does a car work? - Rephrased: How does a car work? - - 2. Follow up question: What is the theory of relativity? - Rephrased: What is theory of relativity - - 3. Follow up question: How does an AC work? - Rephrased: How does an AC work - - Conversation: - {chat_history} - - Follow up question: {query} - Rephrased question: - `; +const videoSearchChainPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos. +You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. +Output only the rephrased query wrapped in an XML <query> element. Do not include any explanation or additional text. +`; type VideoSearchChainInput = { chat_history: BaseMessage[]; @@ -55,12 +41,46 @@ const createVideoSearchChain = (llm: BaseChatModel) => { return input.query; }, }), - PromptTemplate.fromTemplate(VideoSearchChainPrompt), + ChatPromptTemplate.fromMessages([ + ['system', videoSearchChainPrompt], + [ + 'user', + '<conversation>\n</conversation>\n<follow_up>\nHow does a car work?\n</follow_up>' + ], + [ + 'assistant', + '<query>How does a car work?</query>' + ], + [ + 'user', + '<conversation>\n</conversation>\n<follow_up>\nWhat is the theory of relativity?\n</follow_up>' + ], + [ + 'assistant', + '<query>Theory of relativity</query>' + ], + [ + 'user', + '<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>' + ], + [ + 'assistant', + '<query>AC working</query>' + ], + [ + 'user', + '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>' + ] + ]), llm, strParser, RunnableLambda.from(async (input: string) => { - input = input.replace(/<think>.*?<\/think>/g, ''); - + const queryParser = new LineOutputParser({ + key: 'query' + }); + return (await queryParser.parse(input)); + }), + RunnableLambda.from(async (input: string) => { const res = await searchSearxng(input, { engines: ['youtube'], }); @@ -92,8 +112,8 @@ const handleVideoSearch = ( input: VideoSearchChainInput, llm: BaseChatModel, ) => { - const VideoSearchChain = createVideoSearchChain(llm); - return VideoSearchChain.invoke(input); + const videoSearchChain = createVideoSearchChain(llm); + return videoSearchChain.invoke(input); }; export default handleVideoSearch; From b48b0eeb0e5cfea3a8de9f7d2f1052119f8af9ec Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 17:52:30 +0530 Subject: [PATCH 256/282] feat(imageSearch): use XML parsing, implement few shot prompting --- src/lib/chains/imageSearchAgent.ts | 60 ++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/src/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts index 4fd684f..993cba9 100644 --- a/src/lib/chains/imageSearchAgent.ts +++ b/src/lib/chains/imageSearchAgent.ts @@ -3,32 +3,18 @@ import { RunnableMap, RunnableLambda, } from '@langchain/core/runnables'; -import { PromptTemplate } from '@langchain/core/prompts'; +import { ChatPromptTemplate, PromptTemplate } from '@langchain/core/prompts'; import formatChatHistoryAsString from '../utils/formatHistory'; import { BaseMessage } from '@langchain/core/messages'; import { StringOutputParser } from '@langchain/core/output_parsers'; import { searchSearxng } from '../searxng'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import LineOutputParser from '../outputParsers/lineOutputParser'; const imageSearchChainPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search the web for images. You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. - -Example: -1. Follow up question: What is a cat? -Rephrased: A cat - -2. Follow up question: What is a car? How does it works? -Rephrased: Car working - -3. Follow up question: How does an AC work? -Rephrased: AC working - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: +Output only the rephrased query wrapped in an XML <query> element. Do not include any explanation or additional text. `; type ImageSearchChainInput = { @@ -54,12 +40,48 @@ const createImageSearchChain = (llm: BaseChatModel) => { return input.query; }, }), - PromptTemplate.fromTemplate(imageSearchChainPrompt), + ChatPromptTemplate.fromMessages([ + ['system', imageSearchChainPrompt], + [ + "user", + "<conversation>\n</conversation>\n<follow_up>\nWhat is a cat?\n</follow_up>" + ], + [ + "assistant", + "<query>A cat</query>" + ], + + [ + "user", + "<conversation>\n</conversation>\n<follow_up>\nWhat is a car? How does it work?\n</follow_up>" + ], + [ + "assistant", + "<query>Car working</query>" + ], + [ + "user", + "<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>" + ], + [ + "assistant", + "<query>AC working</query>" + ], + [ + 'user', + '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>' + ] + ]), llm, strParser, RunnableLambda.from(async (input: string) => { - input = input.replace(/<think>.*?<\/think>/g, ''); + const queryParser = new LineOutputParser({ + key: 'query' + }) + return (await queryParser.parse(input)) + }), + RunnableLambda.from(async (input: string) => { const res = await searchSearxng(input, { engines: ['bing images', 'google images'], }); From 7c4aa683a244137626c7d820c322f50c87fb79f7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 17:57:32 +0530 Subject: [PATCH 257/282] feat(chains): remove unused imports --- src/lib/chains/imageSearchAgent.ts | 43 ++++++++++++------------------ src/lib/chains/videoSearchAgent.ts | 31 ++++++++------------- 2 files changed, 28 insertions(+), 46 deletions(-) diff --git a/src/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts index 993cba9..a91b7bb 100644 --- a/src/lib/chains/imageSearchAgent.ts +++ b/src/lib/chains/imageSearchAgent.ts @@ -3,7 +3,7 @@ import { RunnableMap, RunnableLambda, } from '@langchain/core/runnables'; -import { ChatPromptTemplate, PromptTemplate } from '@langchain/core/prompts'; +import { ChatPromptTemplate } from '@langchain/core/prompts'; import formatChatHistoryAsString from '../utils/formatHistory'; import { BaseMessage } from '@langchain/core/messages'; import { StringOutputParser } from '@langchain/core/output_parsers'; @@ -43,43 +43,34 @@ const createImageSearchChain = (llm: BaseChatModel) => { ChatPromptTemplate.fromMessages([ ['system', imageSearchChainPrompt], [ - "user", - "<conversation>\n</conversation>\n<follow_up>\nWhat is a cat?\n</follow_up>" - ], - [ - "assistant", - "<query>A cat</query>" + 'user', + '<conversation>\n</conversation>\n<follow_up>\nWhat is a cat?\n</follow_up>', ], + ['assistant', '<query>A cat</query>'], [ - "user", - "<conversation>\n</conversation>\n<follow_up>\nWhat is a car? How does it work?\n</follow_up>" - ], - [ - "assistant", - "<query>Car working</query>" - ], - [ - "user", - "<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>" - ], - [ - "assistant", - "<query>AC working</query>" + 'user', + '<conversation>\n</conversation>\n<follow_up>\nWhat is a car? How does it work?\n</follow_up>', ], + ['assistant', '<query>Car working</query>'], [ 'user', - '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>' - ] + '<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>', + ], + ['assistant', '<query>AC working</query>'], + [ + 'user', + '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>', + ], ]), llm, strParser, RunnableLambda.from(async (input: string) => { const queryParser = new LineOutputParser({ - key: 'query' - }) + key: 'query', + }); - return (await queryParser.parse(input)) + return await queryParser.parse(input); }), RunnableLambda.from(async (input: string) => { const res = await searchSearxng(input, { diff --git a/src/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts index 8e158f5..3f878a8 100644 --- a/src/lib/chains/videoSearchAgent.ts +++ b/src/lib/chains/videoSearchAgent.ts @@ -3,7 +3,7 @@ import { RunnableMap, RunnableLambda, } from '@langchain/core/runnables'; -import { ChatPromptTemplate, PromptTemplate } from '@langchain/core/prompts'; +import { ChatPromptTemplate } from '@langchain/core/prompts'; import formatChatHistoryAsString from '../utils/formatHistory'; import { BaseMessage } from '@langchain/core/messages'; import { StringOutputParser } from '@langchain/core/output_parsers'; @@ -45,40 +45,31 @@ const createVideoSearchChain = (llm: BaseChatModel) => { ['system', videoSearchChainPrompt], [ 'user', - '<conversation>\n</conversation>\n<follow_up>\nHow does a car work?\n</follow_up>' - ], - [ - 'assistant', - '<query>How does a car work?</query>' + '<conversation>\n</conversation>\n<follow_up>\nHow does a car work?\n</follow_up>', ], + ['assistant', '<query>How does a car work?</query>'], [ 'user', - '<conversation>\n</conversation>\n<follow_up>\nWhat is the theory of relativity?\n</follow_up>' - ], - [ - 'assistant', - '<query>Theory of relativity</query>' + '<conversation>\n</conversation>\n<follow_up>\nWhat is the theory of relativity?\n</follow_up>', ], + ['assistant', '<query>Theory of relativity</query>'], [ 'user', - '<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>' - ], - [ - 'assistant', - '<query>AC working</query>' + '<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>', ], + ['assistant', '<query>AC working</query>'], [ 'user', - '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>' - ] + '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>', + ], ]), llm, strParser, RunnableLambda.from(async (input: string) => { const queryParser = new LineOutputParser({ - key: 'query' + key: 'query', }); - return (await queryParser.parse(input)); + return await queryParser.parse(input); }), RunnableLambda.from(async (input: string) => { const res = await searchSearxng(input, { From 7f629073850b7c80a528001c7cf2db6e3d5fe5d3 Mon Sep 17 00:00:00 2001 From: Willie Zutz <boarder2@bit-shift.com> Date: Sat, 19 Jul 2025 08:53:11 -0600 Subject: [PATCH 258/282] feat(weather): update measurement units to Imperial/Metric --- src/app/api/weather/route.ts | 15 +++++++++++---- src/app/settings/page.tsx | 28 ++++++++++++++++------------ src/components/WeatherWidget.tsx | 6 ++++-- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/app/api/weather/route.ts b/src/app/api/weather/route.ts index 1f9867f..afaf8a6 100644 --- a/src/app/api/weather/route.ts +++ b/src/app/api/weather/route.ts @@ -1,7 +1,10 @@ export const POST = async (req: Request) => { try { - const body: { lat: number; lng: number; temperatureUnit: 'C' | 'F' } = - await req.json(); + const body: { + lat: number; + lng: number; + measureUnit: 'Imperial' | 'Metric'; + } = await req.json(); if (!body.lat || !body.lng) { return Response.json( @@ -13,7 +16,9 @@ export const POST = async (req: Request) => { } const res = await fetch( - `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto${body.temperatureUnit === 'C' ? '' : '&temperature_unit=fahrenheit'}`, + `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto${ + body.measureUnit === 'Metric' ? '' : '&temperature_unit=fahrenheit' + }${body.measureUnit === 'Metric' ? '' : '&wind_speed_unit=mph'}`, ); const data = await res.json(); @@ -35,13 +40,15 @@ export const POST = async (req: Request) => { windSpeed: number; icon: string; temperatureUnit: 'C' | 'F'; + windSpeedUnit: 'm/s' | 'mph'; } = { temperature: data.current.temperature_2m, condition: '', humidity: data.current.relative_humidity_2m, windSpeed: data.current.wind_speed_10m, icon: '', - temperatureUnit: body.temperatureUnit, + temperatureUnit: body.measureUnit === 'Metric' ? 'C' : 'F', + windSpeedUnit: body.measureUnit === 'Metric' ? 'm/s' : 'mph', }; const code = data.current.weather_code; diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 045226c..1b13c9c 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -148,7 +148,9 @@ const Page = () => { const [automaticImageSearch, setAutomaticImageSearch] = useState(false); const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); const [systemInstructions, setSystemInstructions] = useState<string>(''); - const [temperatureUnit, setTemperatureUnit] = useState<'C' | 'F'>('C'); + const [measureUnit, setMeasureUnit] = useState<'Imperial' | 'Metric'>( + 'Metric', + ); const [savingStates, setSavingStates] = useState<Record<string, boolean>>({}); useEffect(() => { @@ -211,7 +213,9 @@ const Page = () => { setSystemInstructions(localStorage.getItem('systemInstructions')!); - setTemperatureUnit(localStorage.getItem('temperatureUnit')! as 'C' | 'F'); + setMeasureUnit( + localStorage.getItem('measureUnit')! as 'Imperial' | 'Metric', + ); setIsLoading(false); }; @@ -371,8 +375,8 @@ const Page = () => { localStorage.setItem('embeddingModel', value); } else if (key === 'systemInstructions') { localStorage.setItem('systemInstructions', value); - } else if (key === 'temperatureUnit') { - localStorage.setItem('temperatureUnit', value.toString()); + } else if (key === 'measureUnit') { + localStorage.setItem('measureUnit', value.toString()); } } catch (err) { console.error('Failed to save:', err); @@ -430,22 +434,22 @@ const Page = () => { </div> <div className="flex flex-col space-y-1"> <p className="text-black/70 dark:text-white/70 text-sm"> - Temperature Unit + Measurement Units </p> <Select - value={temperatureUnit ?? undefined} + value={measureUnit ?? undefined} onChange={(e) => { - setTemperatureUnit(e.target.value as 'C' | 'F'); - saveConfig('temperatureUnit', e.target.value); + setMeasureUnit(e.target.value as 'Imperial' | 'Metric'); + saveConfig('measureUnit', e.target.value); }} options={[ { - label: 'Celsius', - value: 'C', + label: 'Metric', + value: 'Metric', }, { - label: 'Fahrenheit', - value: 'F', + label: 'Imperial', + value: 'Imperial', }, ]} /> diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index 669b9ff..8eaf871 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -10,6 +10,7 @@ const WeatherWidget = () => { windSpeed: 0, icon: '', temperatureUnit: 'C', + windSpeedUnit: 'm/s', }); const [loading, setLoading] = useState(true); @@ -75,7 +76,7 @@ const WeatherWidget = () => { body: JSON.stringify({ lat: location.latitude, lng: location.longitude, - temperatureUnit: localStorage.getItem('temperatureUnit') ?? 'C', + measureUnit: localStorage.getItem('measureUnit') ?? 'Metric', }), }); @@ -95,6 +96,7 @@ const WeatherWidget = () => { windSpeed: data.windSpeed, icon: data.icon, temperatureUnit: data.temperatureUnit, + windSpeedUnit: data.windSpeedUnit, }); setLoading(false); }); @@ -139,7 +141,7 @@ const WeatherWidget = () => { </span> <span className="flex items-center text-xs text-black/60 dark:text-white/60"> <Wind className="w-3 h-3 mr-1" /> - {data.windSpeed} km/h + {data.windSpeed} {data.windSpeedUnit} </span> </div> <span className="text-xs text-black/60 dark:text-white/60 mt-1"> From 543f1df5ce7045be7178e5f122932ff66747ec35 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:08:45 +0530 Subject: [PATCH 259/282] feat(modules): update langchain packages --- package.json | 13 +- yarn.lock | 680 ++++++++++++++++++++++----------------------------- 2 files changed, 296 insertions(+), 397 deletions(-) diff --git a/package.json b/package.json index 999740d..9e9137f 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,12 @@ "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", "@icons-pack/react-simple-icons": "^12.3.0", - "@langchain/anthropic": "^0.3.15", - "@langchain/community": "^0.3.36", - "@langchain/core": "^0.3.42", - "@langchain/google-genai": "^0.1.12", - "@langchain/openai": "^0.0.25", + "@langchain/anthropic": "^0.3.24", + "@langchain/community": "^0.3.49", + "@langchain/core": "^0.3.66", + "@langchain/google-genai": "^0.2.15", + "@langchain/ollama": "^0.2.3", + "@langchain/openai": "^0.6.2", "@langchain/textsplitters": "^0.1.0", "@tailwindcss/typography": "^0.5.12", "@xenova/transformers": "^2.17.2", @@ -31,7 +32,7 @@ "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", "jspdf": "^3.0.1", - "langchain": "^0.1.30", + "langchain": "^0.3.30", "lucide-react": "^0.363.0", "mammoth": "^1.9.1", "markdown-to-jsx": "^7.7.2", diff --git a/yarn.lock b/yarn.lock index f2b847c..b8893e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,33 +12,10 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== -"@anthropic-ai/sdk@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.37.0.tgz#0018127404ecb9b8a12968068e0c4b3e8bbd6386" - integrity sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - -"@anthropic-ai/sdk@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" - integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - digest-fetch "^1.3.0" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" +"@anthropic-ai/sdk@^0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.56.0.tgz#8b6366d5d22235c3ec978c05b2c9420fdf426ed9" + integrity sha512-SLCB8M8+VMg1cpCucnA1XWHGWqVSZtIWzmOdDOEu3eTFZMB+A0sGZ1ESO5MHDnqrNTXz3safMrWx9x4rMZSOqA== "@babel/runtime@^7.12.5", "@babel/runtime@^7.26.7": version "7.27.3" @@ -393,9 +370,32 @@ integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== "@google/generative-ai@^0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.24.0.tgz#4d27af7d944c924a27a593c17ad1336535d53846" - integrity sha512-fnEITCGEB7NdX0BhoYZ/cq/7WPZ1QS5IzJJfC3Tg/OwkvBetMiVJciyaan297OvE4B9Jg1xvo0zIazX/9sGu1Q== + version "0.24.1" + resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.24.1.tgz#634a3c06f8ea7a6125c1b0d6c1e66bb11afb52c9" + integrity sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q== + +"@graphql-typed-document-node/core@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + +"@grpc/grpc-js@^1.13.1": + version "1.13.4" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.4.tgz#922fbc496e229c5fa66802d2369bf181c1df1c5a" + integrity sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.7.13": + version "0.7.15" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.15.tgz#4cdfbf35a35461fc843abe8b9e2c0770b5095e60" + integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" "@headlessui/react@^2.2.0": version "2.2.0" @@ -598,120 +598,77 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@langchain/anthropic@^0.3.15": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.3.15.tgz#0244cdb345cb492eb40aedd681881ebadfbb73f2" - integrity sha512-Ar2viYcZ64idgV7EtCBCb36tIkNtPAhQRxSaMTWPHGspFgMfvwRoleVri9e90sCpjpS9xhlHsIQ0LlUS/Atsrw== - dependencies: - "@anthropic-ai/sdk" "^0.37.0" - fast-xml-parser "^4.4.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.4" +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== -"@langchain/community@^0.3.36": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" - integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA== +"@langchain/anthropic@^0.3.24": + version "0.3.24" + resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.3.24.tgz#bc64ccab419fa61f0e3a1abb733046cc12bfadb4" + integrity sha512-Gi1TwXu5vkCxUMToiXaiwTTWq9v3WMyU3ldB/VEWjzbkr3nKF5kcp+HLqhvV7WWOFVTTNgG+pzfq8JALecq5MA== dependencies: - "@langchain/openai" ">=0.2.0 <0.5.0" + "@anthropic-ai/sdk" "^0.56.0" + fast-xml-parser "^4.4.1" + +"@langchain/community@^0.3.49": + version "0.3.49" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.49.tgz#9e67791c686cfbd378439afb7044cec571dca0f4" + integrity sha512-1AAo9mvr1FmqYHUpXhYI8P4NBPC4t9TfUAuvefEImrtb3gZ60fPelVu17ljWlKJcHC1hPSHYpPJWm0Yx7yRvrw== + dependencies: + "@langchain/openai" ">=0.2.0 <0.7.0" + "@langchain/weaviate" "^0.2.0" binary-extensions "^2.2.0" expr-eval "^2.0.2" flat "^5.0.2" js-yaml "^4.1.0" langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" - langsmith ">=0.2.8 <0.4.0" + langsmith "^0.3.33" uuid "^10.0.0" - zod "^3.22.3" - zod-to-json-schema "^3.22.5" + zod "^3.25.32" -"@langchain/community@~0.0.41": - version "0.0.44" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416" - integrity sha512-II9Hz90jJmfWRICtxTg1auQWzFw0npqacWiiOpaxNhzs6rptdf56gyfC48Z6n1ii4R8FfAlfX6YxhOE7lGGKXg== - dependencies: - "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.19" - expr-eval "^2.0.2" - flat "^5.0.2" - langsmith "~0.1.1" - uuid "^9.0.0" - zod "^3.22.3" - zod-to-json-schema "^3.22.5" - -"@langchain/core@^0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363" - integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg== +"@langchain/core@^0.3.66": + version "0.3.66" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.66.tgz#cd20687f29a07148436cd8b72b88c66d076c500c" + integrity sha512-d3SgSDOlgOjdIbReIXVQl9HaQzKqO/5+E+o3kJwoKXLGP9dxi7+lMyaII7yv7G8/aUxMWLwFES9zc1jFoeJEZw== dependencies: "@cfworker/json-schema" "^4.0.2" ansi-styles "^5.0.0" camelcase "6" decamelize "1.2.0" js-tiktoken "^1.0.12" - langsmith ">=0.2.8 <0.4.0" + langsmith "^0.3.46" mustache "^4.2.0" p-queue "^6.6.2" p-retry "4" uuid "^10.0.0" - zod "^3.22.4" + zod "^3.25.32" zod-to-json-schema "^3.22.3" -"@langchain/core@~0.1.44", "@langchain/core@~0.1.45": - version "0.1.54" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4" - integrity sha512-87pQ8dnWY8P1Kgnu/SgnRijLRNSEzTzkjBK6O/Z1klXf/eQTXAG5O5cKwe3lwM6Afn+4U2byzSMYjwViAYuR4g== - dependencies: - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/google-genai@^0.1.12": - version "0.1.12" - resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.1.12.tgz#6727253bda6f0d87cd74cf0bb6b1e0f398f60f32" - integrity sha512-0Ea0E2g63ejCuormVxbuoyJQ5BYN53i2/fb6WP8bMKzyh+y43R13V8JqOtr3e/GmgNyv3ou/VeaZjx7KAvu/0g== +"@langchain/google-genai@^0.2.15": + version "0.2.15" + resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.2.15.tgz#bf8c7f14ee5a0c16aaafc71f902ad8619e8089f2" + integrity sha512-fAD3xjzd5TxWQCKlttNeEc+b5tUX43hBqKH3rk3g+wbl1ToLqe3ocWawKRmGotEuI5jhDVmoHjDxoNMifFDgmg== dependencies: "@google/generative-ai" "^0.24.0" - zod-to-json-schema "^3.22.4" + uuid "^11.1.0" -"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" - integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ== +"@langchain/ollama@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@langchain/ollama/-/ollama-0.2.3.tgz#4868e66db4fc480f08c42fc652274abbab0416f0" + integrity sha512-1Obe45jgQspqLMBVlayQbGdywFmri8DgmGRdzNu0li56cG5RReYlRCFVDZBRMMvF9JhsP5eXRyfyivtKfITHWQ== + dependencies: + ollama "^0.5.12" + uuid "^10.0.0" + +"@langchain/openai@>=0.1.0 <0.7.0", "@langchain/openai@>=0.2.0 <0.7.0", "@langchain/openai@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.6.2.tgz#fb68fa7305ef419e772a56c29146810c0923513d" + integrity sha512-OjdSfGENdz4tR9TPN4KTat7vJIE6cgt7vT0z69qU1J1aHCs9MyNwqdaQFF++LVlZAae9aTpyCyqeODyge42oKw== dependencies: js-tiktoken "^1.0.12" - openai "^4.87.3" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@^0.0.25": - version "0.0.25" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" - integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q== - dependencies: - "@langchain/core" "~0.1.45" - js-tiktoken "^1.0.7" - openai "^4.26.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@~0.0.19", "@langchain/openai@~0.0.26": - version "0.0.26" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.26.tgz#ab989085e03f8bcc26a40d4d5abe9a2b73e5f2a8" - integrity sha512-FpqYvVRP2CkFFjTLrj2tbXeY6JTIgbq8tRoi0rvGzmhRpoi6cWHlfgclSzDm+e6P9DqKBkzDjo6SPTJgTOabNA== - dependencies: - "@langchain/core" "~0.1.45" - js-tiktoken "^1.0.7" - openai "^4.32.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" + openai "^5.3.0" + zod "^3.25.32" "@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0": version "0.1.0" @@ -720,6 +677,14 @@ dependencies: js-tiktoken "^1.0.12" +"@langchain/weaviate@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@langchain/weaviate/-/weaviate-0.2.1.tgz#51ad20cf6d40e63d6149e5d01f91597cdff66744" + integrity sha512-rlfAKF+GB0A5MUrol34oDrBkl4q6AefARk9KDW+LfzhV/74pZZLZyIPYPxvE4XwI3gvpwp024DNsDxK/4UW0/g== + dependencies: + uuid "^10.0.0" + weaviate-client "^3.5.2" + "@next/env@15.2.2": version "15.2.2" resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" @@ -983,14 +948,6 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== -"@types/node-fetch@^2.6.4": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - "@types/node@*", "@types/node@^20": version "20.12.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" @@ -1005,13 +962,6 @@ dependencies: undici-types "~6.20.0" -"@types/node@^18.11.18": - version "18.19.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327" - integrity sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg== - dependencies: - undici-types "~5.26.4" - "@types/pdf-parse@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" @@ -1062,11 +1012,6 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== -"@types/uuid@^9.0.1": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== - "@typescript-eslint/parser@^5.4.2 || ^6.0.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" @@ -1134,12 +1079,10 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" +abort-controller-x@^0.4.0, abort-controller-x@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/abort-controller-x/-/abort-controller-x-0.4.3.tgz#ff269788386fabd58a7b6eeaafcb6cf55c2958e0" + integrity sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA== acorn-jsx@^5.3.2: version "5.3.2" @@ -1151,13 +1094,6 @@ acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1439,11 +1375,6 @@ bare-stream@^2.0.0: dependencies: streamx "^2.21.0" -base-64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== - base64-arraybuffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" @@ -1467,11 +1398,6 @@ binary-extensions@^2.0.0, binary-extensions@^2.2.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -binary-search@^1.3.5: - version "1.3.6" - resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" - integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== - bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -1608,11 +1534,6 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -1638,6 +1559,15 @@ client-only@0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" @@ -1711,11 +1641,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -1753,9 +1678,9 @@ concat-map@0.0.1: integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== console-table-printer@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" - integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== + version "2.14.6" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.14.6.tgz#edfe0bf311fa2701922ed509443145ab51e06436" + integrity sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw== dependencies: simple-wcswidth "^1.0.1" @@ -1769,6 +1694,13 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cross-fetch@^3.1.5: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.2.0.tgz#34e9192f53bc757d6614304d9e5e6fb4edb782e3" + integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== + dependencies: + node-fetch "^2.7.0" + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1778,11 +1710,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - css-line-break@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" @@ -1911,14 +1838,6 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -digest-fetch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" - integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA== - dependencies: - base-64 "^0.1.0" - md5 "^2.3.0" - dingbat-to-unicode@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83" @@ -2458,11 +2377,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -2609,11 +2523,6 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" -form-data-encoder@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" - integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -2623,14 +2532,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -formdata-node@^4.3.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" - integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== - dependencies: - node-domexception "1.0.0" - web-streams-polyfill "4.0.0-beta.3" - fraction.js@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" @@ -2683,6 +2584,11 @@ gel@^2.0.0: shell-quote "^1.8.1" which "^4.0.0" +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -2813,6 +2719,19 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphql-request@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + +graphql@^16.11.0: + version "16.11.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633" + integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw== + guid-typescript@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" @@ -2888,13 +2807,6 @@ htmlparser2@^8.0.2: domutils "^3.0.1" entities "^4.4.0" -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -2950,11 +2862,6 @@ internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" -is-any-array@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" - integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== - is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" @@ -2997,11 +2904,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -3198,16 +3100,9 @@ jiti@^1.21.0: integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== js-tiktoken@^1.0.12: - version "1.0.19" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78" - integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g== - dependencies: - base64-js "^1.5.1" - -js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" - integrity sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA== + version "1.0.20" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.20.tgz#fa2733bf147acaf1bdcf9ab8a878e79c581c95f2" + integrity sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A== dependencies: base64-js "^1.5.1" @@ -3297,56 +3192,27 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0": - version "0.3.19" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b" - integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw== +"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0", langchain@^0.3.30: + version "0.3.30" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.30.tgz#9fc0467007009dc5e799d1f8fb9dd1137654e387" + integrity sha512-UyVsfwHDpHbrnWrjWuhJHqi8Non+Zcsf2kdpDTqyJF8NXrHBOpjdHT5LvPuW9fnE7miDTWf5mLcrWAGZgcrznQ== dependencies: - "@langchain/openai" ">=0.1.0 <0.5.0" + "@langchain/openai" ">=0.1.0 <0.7.0" "@langchain/textsplitters" ">=0.0.0 <0.2.0" js-tiktoken "^1.0.12" js-yaml "^4.1.0" jsonpointer "^5.0.1" - langsmith ">=0.2.8 <0.4.0" + langsmith "^0.3.33" openapi-types "^12.1.3" p-retry "4" uuid "^10.0.0" yaml "^2.2.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" + zod "^3.25.32" -langchain@^0.1.30: - version "0.1.31" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" - integrity sha512-J2iZZL48Nwdo1XDU5cS5YYm91b2L6sL3a8hH1gBljvDzCY7jbtUOTuIoRVx5iHN3DXuuLnszS4lhqg0u9hQxBQ== - dependencies: - "@anthropic-ai/sdk" "^0.9.1" - "@langchain/community" "~0.0.41" - "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.26" - binary-extensions "^2.2.0" - js-tiktoken "^1.0.7" - js-yaml "^4.1.0" - jsonpointer "^5.0.1" - langchainhub "~0.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" - openapi-types "^12.1.3" - p-retry "4" - uuid "^9.0.0" - yaml "^2.2.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -langchainhub@~0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" - integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== - -"langsmith@>=0.2.8 <0.4.0": - version "0.3.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f" - integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ== +langsmith@^0.3.33, langsmith@^0.3.46: + version "0.3.46" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.46.tgz#6d369f2c91aa771f49a5f7c4e4e67c12763cf737" + integrity sha512-Hhi4/cMjhWIGpu0DW5eQrXBbeeKQWPYYQyJCYzhFjod+xinMry4i8QR0gxrrgjGOgfMuU6nyK79YqjGTEPVbDA== dependencies: "@types/uuid" "^10.0.0" chalk "^4.1.2" @@ -3356,17 +3222,6 @@ langchainhub@~0.0.8: semver "^7.6.3" uuid "^10.0.0" -langsmith@~0.1.1, langsmith@~0.1.7: - version "0.1.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" - integrity sha512-iEzQLLB7/0nRpAwNBAR7B7N64fyByg5UsNjSvLaCCkQ9AS68PSafjB8xQkyI8QXXrGjU1dEqDRoa8m4SUuRdUw== - dependencies: - "@types/uuid" "^9.0.1" - commander "^10.0.1" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -3421,6 +3276,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.castarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" @@ -3453,6 +3313,11 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.0.0, long@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3507,15 +3372,6 @@ markdown-to-jsx@^7.7.2: resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g== -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -3582,48 +3438,12 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -ml-array-mean@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" - integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== - dependencies: - ml-array-sum "^1.1.6" - -ml-array-sum@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" - integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== - dependencies: - is-any-array "^2.0.0" - -ml-distance-euclidean@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" - integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== - -ml-distance@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" - integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw== - dependencies: - ml-array-mean "^1.1.6" - ml-distance-euclidean "^2.0.0" - ml-tree-similarity "^1.0.0" - -ml-tree-similarity@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" - integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== - dependencies: - binary-search "^1.3.5" - num-sort "^2.0.0" - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0, ms@^2.1.1: +ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3690,6 +3510,30 @@ next@^15.2.2: "@next/swc-win32-x64-msvc" "15.2.2" sharp "^0.33.5" +nice-grpc-client-middleware-retry@^3.1.11: + version "3.1.11" + resolved "https://registry.yarnpkg.com/nice-grpc-client-middleware-retry/-/nice-grpc-client-middleware-retry-3.1.11.tgz#4fc0128b891d184b6c98af3bfd6aca1b608a3fd1" + integrity sha512-xW/imz/kNG2g0DwTfH2eYEGrg1chSLrXtvGp9fg2qkhTgGFfAS/Pq3+t+9G8KThcC4hK/xlEyKvZWKk++33S6A== + dependencies: + abort-controller-x "^0.4.0" + nice-grpc-common "^2.0.2" + +nice-grpc-common@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nice-grpc-common/-/nice-grpc-common-2.0.2.tgz#e6aeebb2bd19d87114b351e291e30d79dd38acf7" + integrity sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ== + dependencies: + ts-error "^1.0.6" + +nice-grpc@^2.1.12: + version "2.1.12" + resolved "https://registry.yarnpkg.com/nice-grpc/-/nice-grpc-2.1.12.tgz#56ffdcc4d5bc3d0271c176210680c4bd10c5149b" + integrity sha512-J1n4Wg+D3IhRhGQb+iqh2OpiM0GzTve/kf2lnlW4S+xczmIEd0aHUDV1OsJ5a3q8GSTqJf+s4Rgg1M8uJltarw== + dependencies: + "@grpc/grpc-js" "^1.13.1" + abort-controller-x "^0.4.0" + nice-grpc-common "^2.0.2" + node-abi@^3.3.0: version "3.74.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" @@ -3702,17 +3546,12 @@ node-addon-api@^6.1.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-domexception@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - node-ensure@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== -node-fetch@^2.6.7: +node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -3734,11 +3573,6 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -num-sort@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" - integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== - object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3815,6 +3649,13 @@ object.values@^1.1.6, object.values@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" +ollama@^0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/ollama/-/ollama-0.5.16.tgz#cb695b4aab6f6c07236a04b3aee40160f4f9e892" + integrity sha512-OEbxxOIUZtdZgOaTPAULo051F5y+Z1vosxEYOoABPnQKeW7i4O8tJNlxCB+xioyoorVqgjkdj+TA1f1Hy2ug/w== + dependencies: + whatwg-fetch "^3.6.20" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -3860,32 +3701,10 @@ onnxruntime-web@1.14.0: onnxruntime-common "~1.14.0" platform "^1.3.6" -openai@^4.26.0, openai@^4.32.1: - version "4.33.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" - integrity sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" - -openai@^4.87.3: - version "4.87.4" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902" - integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" +openai@^5.3.0: + version "5.10.1" + resolved "https://registry.yarnpkg.com/openai/-/openai-5.10.1.tgz#4535a9603f4d03b2392bb2ca41a618a80fdcfacd" + integrity sha512-fq6xVfv1/gpLbsj8fArEt3b6B9jBxdhAK+VJ+bDvbUvNd+KTLlA3bnDeYZaBsGH9LUhJ1M1yXfp9sEyBLMx6eA== openapi-types@^12.1.3: version "12.1.3" @@ -4183,6 +4002,24 @@ protobufjs@^6.8.8: "@types/node" ">=13.7.0" long "^4.0.0" +protobufjs@^7.2.5: + version "7.5.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.3.tgz#13f95a9e3c84669995ec3652db2ac2fb00b89363" + integrity sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -4326,6 +4163,11 @@ regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4572,9 +4414,9 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" simple-wcswidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" - integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz#66722f37629d5203f9b47c5477b1225b85d6525b" + integrity sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw== slash@^3.0.0: version "3.0.0" @@ -4648,7 +4490,7 @@ streamx@^2.15.0, streamx@^2.21.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4950,6 +4792,11 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +ts-error@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ts-error/-/ts-error-1.0.6.tgz#277496f2a28de6c184cfce8dfd5cdd03a4e6b0fc" + integrity sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" @@ -5112,7 +4959,12 @@ uuid@^10.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== -uuid@^9.0.0: +uuid@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + +uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== @@ -5127,21 +4979,30 @@ validate.io-function@^1.0.2: resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== -web-streams-polyfill@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" - integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== - -web-streams-polyfill@^3.2.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== +weaviate-client@^3.5.2: + version "3.7.0" + resolved "https://registry.yarnpkg.com/weaviate-client/-/weaviate-client-3.7.0.tgz#cf11ccbc90ee1849869d6bebb79ec4a33056b722" + integrity sha512-q888bkHWJBdPgPHFoIc2GiFig42WbxHOgiSBVYYQUqJGA9VszaOpU/7Ip1fVATyyVjhjzRDvMebmRltirvpfMg== + dependencies: + abort-controller-x "^0.4.3" + graphql "^16.11.0" + graphql-request "^6.1.0" + long "^5.3.2" + nice-grpc "^2.1.12" + nice-grpc-client-middleware-retry "^3.1.11" + nice-grpc-common "^2.0.2" + uuid "^9.0.1" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +whatwg-fetch@^3.6.20: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -5249,6 +5110,15 @@ winston@^3.17.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -5268,16 +5138,44 @@ xmlbuilder@^10.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.2.1, yaml@^2.3.4: +yaml@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== + +yaml@^2.3.4: version "2.4.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yet-another-react-lightbox@^3.17.2: version "3.17.2" resolved "https://registry.yarnpkg.com/yet-another-react-lightbox/-/yet-another-react-lightbox-3.17.2.tgz#00474b83189ec4d81302792211ca31ffb808554c" @@ -5288,17 +5186,17 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5: - version "3.22.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" - integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== +zod-to-json-schema@^3.22.3: + version "3.24.6" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz#5920f020c4d2647edfbb954fa036082b92c9e12d" + integrity sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg== -zod-to-json-schema@^3.22.4: - version "3.24.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" - integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== - -zod@^3.22.3, zod@^3.22.4: +zod@^3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + +zod@^3.25.32: + version "3.25.76" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" + integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== From 8e0ae9b8672ac2c417f4dcd978e73e601aad2fd7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:09:21 +0530 Subject: [PATCH 260/282] feat(providers): switch to `apiKey` key --- src/lib/providers/deepseek.ts | 2 +- src/lib/providers/groq.ts | 5 ++++- src/lib/providers/lmstudio.ts | 4 ++-- src/lib/providers/openai.ts | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts index 46f2398..9c9ef5a 100644 --- a/src/lib/providers/deepseek.ts +++ b/src/lib/providers/deepseek.ts @@ -31,7 +31,7 @@ export const loadDeepseekChatModels = async () => { chatModels[model.key] = { displayName: model.displayName, model: new ChatOpenAI({ - openAIApiKey: deepseekApiKey, + apiKey: deepseekApiKey, modelName: model.key, temperature: 0.7, configuration: { diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 5435de4..6a196ee 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -29,12 +29,15 @@ export const loadGroqChatModels = async () => { chatModels[model.id] = { displayName: model.id, model: new ChatOpenAI({ - openAIApiKey: groqApiKey, + apiKey: groqApiKey, modelName: model.id, temperature: 0.7, configuration: { baseURL: 'https://api.groq.com/openai/v1', }, + metadata: { + 'model-type': 'groq', + }, }) as unknown as BaseChatModel, }; }); diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts index 811208f..f79c0aa 100644 --- a/src/lib/providers/lmstudio.ts +++ b/src/lib/providers/lmstudio.ts @@ -47,7 +47,7 @@ export const loadLMStudioChatModels = async () => { chatModels[model.id] = { displayName: model.name || model.id, model: new ChatOpenAI({ - openAIApiKey: 'lm-studio', + apiKey: 'lm-studio', configuration: { baseURL: ensureV1Endpoint(endpoint), }, @@ -83,7 +83,7 @@ export const loadLMStudioEmbeddingsModels = async () => { embeddingsModels[model.id] = { displayName: model.name || model.id, model: new OpenAIEmbeddings({ - openAIApiKey: 'lm-studio', + apiKey: 'lm-studio', configuration: { baseURL: ensureV1Endpoint(endpoint), }, diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index e68e574..c857b0e 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -67,7 +67,7 @@ export const loadOpenAIChatModels = async () => { chatModels[model.key] = { displayName: model.displayName, model: new ChatOpenAI({ - openAIApiKey: openaiApiKey, + apiKey: openaiApiKey, modelName: model.key, temperature: 0.7, }) as unknown as BaseChatModel, @@ -93,7 +93,7 @@ export const loadOpenAIEmbeddingModels = async () => { embeddingModels[model.key] = { displayName: model.displayName, model: new OpenAIEmbeddings({ - openAIApiKey: openaiApiKey, + apiKey: openaiApiKey, modelName: model.key, }) as unknown as Embeddings, }; From 77870b39cc361a6c819ab17b788d592c22c68164 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:09:46 +0530 Subject: [PATCH 261/282] feat(ollama): use `@langchain/ollama` library --- src/lib/providers/ollama.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index cca2142..d5c7899 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -6,8 +6,8 @@ export const PROVIDER_INFO = { key: 'ollama', displayName: 'Ollama', }; -import { ChatOllama } from '@langchain/community/chat_models/ollama'; -import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; +import { ChatOllama } from '@langchain/ollama'; +import { OllamaEmbeddings } from '@langchain/ollama'; export const loadOllamaChatModels = async () => { const ollamaApiEndpoint = getOllamaApiEndpoint(); From 829b4e71347b28a2ac1daa6e6373eff305418eb0 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:14:46 +0530 Subject: [PATCH 262/282] feat(custom-openai): use `apiKey` instead of `openAIApiKey` --- src/app/api/chat/route.ts | 2 +- src/app/api/images/route.ts | 2 +- src/app/api/search/route.ts | 2 +- src/app/api/suggestions/route.ts | 2 +- src/app/api/videos/route.ts | 2 +- src/lib/providers/aimlapi.ts | 4 ++-- src/lib/providers/index.ts | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index e566edb..2d53b75 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -223,7 +223,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ - openAIApiKey: getCustomOpenaiApiKey(), + apiKey: getCustomOpenaiApiKey(), modelName: getCustomOpenaiModelName(), temperature: 0.7, configuration: { diff --git a/src/app/api/images/route.ts b/src/app/api/images/route.ts index db39d9f..e02854d 100644 --- a/src/app/api/images/route.ts +++ b/src/app/api/images/route.ts @@ -49,7 +49,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ - openAIApiKey: getCustomOpenaiApiKey(), + apiKey: getCustomOpenaiApiKey(), modelName: getCustomOpenaiModelName(), temperature: 0.7, configuration: { diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 970ec42..16325de 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -81,7 +81,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ modelName: body.chatModel?.name || getCustomOpenaiModelName(), - openAIApiKey: + apiKey: body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), temperature: 0.7, configuration: { diff --git a/src/app/api/suggestions/route.ts b/src/app/api/suggestions/route.ts index e92e5ec..99179d2 100644 --- a/src/app/api/suggestions/route.ts +++ b/src/app/api/suggestions/route.ts @@ -48,7 +48,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ - openAIApiKey: getCustomOpenaiApiKey(), + apiKey: getCustomOpenaiApiKey(), modelName: getCustomOpenaiModelName(), temperature: 0.7, configuration: { diff --git a/src/app/api/videos/route.ts b/src/app/api/videos/route.ts index 34ae7fd..7e8288b 100644 --- a/src/app/api/videos/route.ts +++ b/src/app/api/videos/route.ts @@ -49,7 +49,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ - openAIApiKey: getCustomOpenaiApiKey(), + apiKey: getCustomOpenaiApiKey(), modelName: getCustomOpenaiModelName(), temperature: 0.7, configuration: { diff --git a/src/lib/providers/aimlapi.ts b/src/lib/providers/aimlapi.ts index e934362..9c982fe 100644 --- a/src/lib/providers/aimlapi.ts +++ b/src/lib/providers/aimlapi.ts @@ -38,7 +38,7 @@ export const loadAimlApiChatModels = async () => { chatModels[model.id] = { displayName: model.name || model.id, model: new ChatOpenAI({ - openAIApiKey: apiKey, + apiKey: apiKey, modelName: model.id, temperature: 0.7, configuration: { @@ -76,7 +76,7 @@ export const loadAimlApiEmbeddingModels = async () => { embeddingModels[model.id] = { displayName: model.name || model.id, model: new OpenAIEmbeddings({ - openAIApiKey: apiKey, + apiKey: apiKey, modelName: model.id, configuration: { baseURL: API_URL, diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 4b8a090..1b6bb2f 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -118,7 +118,7 @@ export const getAvailableChatModelProviders = async () => { [customOpenAiModelName]: { displayName: customOpenAiModelName, model: new ChatOpenAI({ - openAIApiKey: customOpenAiApiKey, + apiKey: customOpenAiApiKey, modelName: customOpenAiModelName, temperature: 0.7, configuration: { From 58c7be6e9589e3b1a849a59411312c5a1a797173 Mon Sep 17 00:00:00 2001 From: Samuel Dockery <samueldockery@gmail.com> Date: Sun, 20 Jul 2025 09:17:20 -0700 Subject: [PATCH 263/282] Update Gemini 2.5 Models --- src/lib/providers/gemini.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index b84e899..1d210e7 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -14,16 +14,12 @@ import { Embeddings } from '@langchain/core/embeddings'; const geminiChatModels: Record<string, string>[] = [ { - displayName: 'Gemini 2.5 Flash Preview 05-20', - key: 'gemini-2.5-flash-preview-05-20', + displayName: 'Gemini 2.5 Flash', + key: 'gemini-2.5-flash', }, { - displayName: 'Gemini 2.5 Pro Preview', - key: 'gemini-2.5-pro-preview-05-06', - }, - { - displayName: 'Gemini 2.5 Pro Experimental', - key: 'gemini-2.5-pro-preview-05-06', + displayName: 'Gemini 2.5 Pro', + key: 'gemini-2.5-pro', }, { displayName: 'Gemini 2.0 Flash', From 3f2a8f862cbc64adc739c08d9f5cf98a8886999b Mon Sep 17 00:00:00 2001 From: Samuel Dockery <samueldockery@gmail.com> Date: Sun, 20 Jul 2025 09:20:39 -0700 Subject: [PATCH 264/282] Fix name of provider in embeddings models error message --- src/lib/providers/gemini.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index b84e899..f64b271 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -108,7 +108,7 @@ export const loadGeminiEmbeddingModels = async () => { return embeddingModels; } catch (err) { - console.error(`Error loading OpenAI embeddings models: ${err}`); + console.error(`Error loading Gemini embeddings models: ${err}`); return {}; } }; From 37022fb11efacb2348a92c17e46e42cedb20cbcc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:20:16 +0530 Subject: [PATCH 265/282] feat(format-history): update role determination --- src/lib/utils/formatHistory.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/utils/formatHistory.ts b/src/lib/utils/formatHistory.ts index 6d0d309..6fdede6 100644 --- a/src/lib/utils/formatHistory.ts +++ b/src/lib/utils/formatHistory.ts @@ -1,8 +1,11 @@ -import { BaseMessage } from '@langchain/core/messages'; +import { BaseMessage, isAIMessage } from '@langchain/core/messages'; const formatChatHistoryAsString = (history: BaseMessage[]) => { return history - .map((message) => `${message._getType()}: ${message.content}`) + .map( + (message) => + `${isAIMessage(message) ? 'AI' : 'User:'}: ${message.content}`, + ) .join('\n'); }; From 11a828b0734dc7fb24a04f73a6657d152eec164a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:21:09 +0530 Subject: [PATCH 266/282] feat(message-box): close think box after thinking process ends --- src/components/MessageBox.tsx | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index a7c46ec..dc43aa2 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -21,8 +21,16 @@ import SearchVideos from './SearchVideos'; import { useSpeech } from 'react-text-to-speech'; import ThinkBox from './ThinkBox'; -const ThinkTagProcessor = ({ children }: { children: React.ReactNode }) => { - return <ThinkBox content={children as string} />; +const ThinkTagProcessor = ({ + children, + thinkingEnded, +}: { + children: React.ReactNode; + thinkingEnded: boolean; +}) => { + return ( + <ThinkBox content={children as string} thinkingEnded={thinkingEnded} /> + ); }; const MessageBox = ({ @@ -46,6 +54,7 @@ const MessageBox = ({ }) => { const [parsedMessage, setParsedMessage] = useState(message.content); const [speechMessage, setSpeechMessage] = useState(message.content); + const [thinkingEnded, setThinkingEnded] = useState(false); useEffect(() => { const citationRegex = /\[([^\]]+)\]/g; @@ -61,6 +70,10 @@ const MessageBox = ({ } } + if (message.role === 'assistant' && message.content.includes('</think>')) { + setThinkingEnded(true); + } + if ( message.role === 'assistant' && message?.sources && @@ -88,7 +101,7 @@ const MessageBox = ({ if (url) { return `<a href="${url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${numStr}</a>`; } else { - return `[${numStr}]`; + return ``; } }) .join(''); @@ -99,6 +112,14 @@ const MessageBox = ({ ); setSpeechMessage(message.content.replace(regex, '')); return; + } else if ( + message.role === 'assistant' && + message?.sources && + message.sources.length === 0 + ) { + setParsedMessage(processedMessage.replace(regex, '')); + setSpeechMessage(message.content.replace(regex, '')); + return; } setSpeechMessage(message.content.replace(regex, '')); @@ -111,6 +132,9 @@ const MessageBox = ({ overrides: { think: { component: ThinkTagProcessor, + props: { + thinkingEnded: thinkingEnded, + }, }, }, }; From 6ea17d54c62389afc0fa29cf422255480c44268c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:21:49 +0530 Subject: [PATCH 267/282] feat(chat-window): fix wrong history while rewriting --- src/components/ChatWindow.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 67a5d0c..6ff7d22 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -354,7 +354,11 @@ const ChatWindow = ({ id }: { id?: string }) => { } }, [isMessagesLoaded, isConfigReady]); - const sendMessage = async (message: string, messageId?: string) => { + const sendMessage = async ( + message: string, + messageId?: string, + rewrite = false, + ) => { if (loading) return; if (!isConfigReady) { toast.error('Cannot send message before the configuration is ready'); @@ -482,6 +486,8 @@ const ChatWindow = ({ id }: { id?: string }) => { } }; + const messageIndex = messages.findIndex((m) => m.messageId === messageId); + const res = await fetch('/api/chat', { method: 'POST', headers: { @@ -498,7 +504,9 @@ const ChatWindow = ({ id }: { id?: string }) => { files: fileIds, focusMode: focusMode, optimizationMode: optimizationMode, - history: chatHistory, + history: rewrite + ? chatHistory.slice(0, messageIndex === -1 ? undefined : messageIndex) + : chatHistory, chatModel: { name: chatModelProvider.name, provider: chatModelProvider.provider, @@ -552,7 +560,7 @@ const ChatWindow = ({ id }: { id?: string }) => { return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; }); - sendMessage(message.content, message.messageId); + sendMessage(message.content, message.messageId, true); }; useEffect(() => { From 9d89a4413bd34f15f9dc22dec164fbf9d83c7c43 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:20:49 +0530 Subject: [PATCH 268/282] feat(format-history): remove extra `:` --- src/app/api/search/route.ts | 3 +-- src/lib/utils/formatHistory.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 16325de..5f752ec 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -81,8 +81,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ modelName: body.chatModel?.name || getCustomOpenaiModelName(), - apiKey: - body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), + apiKey: body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), temperature: 0.7, configuration: { baseURL: diff --git a/src/lib/utils/formatHistory.ts b/src/lib/utils/formatHistory.ts index 6fdede6..733ffc0 100644 --- a/src/lib/utils/formatHistory.ts +++ b/src/lib/utils/formatHistory.ts @@ -4,7 +4,7 @@ const formatChatHistoryAsString = (history: BaseMessage[]) => { return history .map( (message) => - `${isAIMessage(message) ? 'AI' : 'User:'}: ${message.content}`, + `${isAIMessage(message) ? 'AI' : 'User'}: ${message.content}`, ) .join('\n'); }; From 70a61ee1eb097a2b65d63d12b6a325fe8582f734 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:21:07 +0530 Subject: [PATCH 269/282] feat(think-box): handle thinkingEnded --- src/components/ThinkBox.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/ThinkBox.tsx b/src/components/ThinkBox.tsx index 9c6a576..f830945 100644 --- a/src/components/ThinkBox.tsx +++ b/src/components/ThinkBox.tsx @@ -1,15 +1,23 @@ 'use client'; -import { useState } from 'react'; -import { cn } from '@/lib/utils'; +import { useEffect, useState } from 'react'; import { ChevronDown, ChevronUp, BrainCircuit } from 'lucide-react'; interface ThinkBoxProps { content: string; + thinkingEnded: boolean; } -const ThinkBox = ({ content }: ThinkBoxProps) => { - const [isExpanded, setIsExpanded] = useState(false); +const ThinkBox = ({ content, thinkingEnded }: ThinkBoxProps) => { + const [isExpanded, setIsExpanded] = useState(true); + + useEffect(() => { + if (thinkingEnded) { + setIsExpanded(false); + } else { + setIsExpanded(true); + } + }, [thinkingEnded]); return ( <div className="my-4 bg-light-secondary/50 dark:bg-dark-secondary/50 rounded-xl border border-light-200 dark:border-dark-200 overflow-hidden"> From 81a91da743f026361c96f5eaa09f94f839e2ecf2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:22:26 +0530 Subject: [PATCH 270/282] feat(gemini): use `model` instead of `modelName` --- src/lib/providers/gemini.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index f64b271..1538412 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -75,7 +75,7 @@ export const loadGeminiChatModels = async () => { displayName: model.displayName, model: new ChatGoogleGenerativeAI({ apiKey: geminiApiKey, - modelName: model.key, + model: model.key, temperature: 0.7, }) as unknown as BaseChatModel, }; From 3bee01cfa7ad65d957feb762f558975a53a747f4 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 28 Jul 2025 20:39:50 +0530 Subject: [PATCH 271/282] feat(discover): add topic selection --- src/app/discover/page.tsx | 198 +++++++++++++++++++++++--------------- 1 file changed, 122 insertions(+), 76 deletions(-) diff --git a/src/app/discover/page.tsx b/src/app/discover/page.tsx index eb7de7f..c7dce37 100644 --- a/src/app/discover/page.tsx +++ b/src/app/discover/page.tsx @@ -4,6 +4,7 @@ import { Search } from 'lucide-react'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import { toast } from 'sonner'; +import { cn } from '@/lib/utils'; interface Discover { title: string; @@ -12,60 +13,67 @@ interface Discover { thumbnail: string; } +const topics: { key: string; display: string }[] = [ + { + display: 'Tech & Science', + key: 'tech', + }, + { + display: 'Finance', + key: 'finance', + }, + { + display: 'Art & Culture', + key: 'art', + }, + { + display: 'Sports', + key: 'sports', + }, + { + display: 'Entertainment', + key: 'entertainment', + }, +]; + const Page = () => { const [discover, setDiscover] = useState<Discover[] | null>(null); const [loading, setLoading] = useState(true); + const [activeTopic, setActiveTopic] = useState<string>(topics[0].key); + + const fetchArticles = async (topic: string) => { + setLoading(true); + console.log(topic); + try { + const res = await fetch(`/api/discover?topic=${topic}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.message); + } + + data.blogs = data.blogs.filter((blog: Discover) => blog.thumbnail); + + setDiscover(data.blogs); + } catch (err: any) { + console.error('Error fetching data:', err.message); + toast.error('Error fetching data'); + } finally { + setLoading(false); + } + }; useEffect(() => { - const fetchData = async () => { - try { - const res = await fetch(`/api/discover`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); + fetchArticles(activeTopic); + }, [activeTopic]); - const data = await res.json(); - - if (!res.ok) { - throw new Error(data.message); - } - - data.blogs = data.blogs.filter((blog: Discover) => blog.thumbnail); - - setDiscover(data.blogs); - } catch (err: any) { - console.error('Error fetching data:', err.message); - toast.error('Error fetching data'); - } finally { - setLoading(false); - } - }; - - fetchData(); - }, []); - - return loading ? ( - <div className="flex flex-row items-center justify-center min-h-screen"> - <svg - aria-hidden="true" - className="w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]" - viewBox="0 0 100 101" - fill="none" - xmlns="http://www.w3.org/2000/svg" - > - <path - d="M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z" - fill="currentColor" - /> - <path - d="M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z" - fill="currentFill" - /> - </svg> - </div> - ) : ( + return ( <> <div> <div className="flex flex-col pt-4"> @@ -76,35 +84,73 @@ const Page = () => { <hr className="border-t border-[#2B2C2C] my-4 w-full" /> </div> - <div className="grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-4 pb-28 lg:pb-8 w-full justify-items-center lg:justify-items-start"> - {discover && - discover?.map((item, i) => ( - <Link - href={`/?q=Summary: ${item.url}`} - key={i} - className="max-w-sm rounded-lg overflow-hidden bg-light-secondary dark:bg-dark-secondary hover:-translate-y-[1px] transition duration-200" - target="_blank" - > - <img - className="object-cover w-full aspect-video" - src={ - new URL(item.thumbnail).origin + - new URL(item.thumbnail).pathname + - `?id=${new URL(item.thumbnail).searchParams.get('id')}` - } - alt={item.title} - /> - <div className="px-6 py-4"> - <div className="font-bold text-lg mb-2"> - {item.title.slice(0, 100)}... - </div> - <p className="text-black-70 dark:text-white/70 text-sm"> - {item.content.slice(0, 100)}... - </p> - </div> - </Link> - ))} + <div className="flex flex-row items-center space-x-2 overflow-x-auto"> + {topics.map((t, i) => ( + <div + key={i} + className={cn( + 'border-[0.1px] rounded-full text-sm px-3 py-1 text-nowrap transition duration-200 cursor-pointer', + activeTopic === t.key + ? 'text-cyan-300 bg-cyan-300/30 border-cyan-300/60' + : 'border-white/30 text-white/70 hover:text-white hover:border-white/40 hover:bg-white/5', + )} + onClick={() => setActiveTopic(t.key)} + > + <span>{t.display}</span> + </div> + ))} </div> + + {loading ? ( + <div className="flex flex-row items-center justify-center min-h-screen"> + <svg + aria-hidden="true" + className="w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]" + viewBox="0 0 100 101" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z" + fill="currentColor" + /> + <path + d="M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z" + fill="currentFill" + /> + </svg> + </div> + ) : ( + <div className="grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-4 pb-28 pt-5 lg:pb-8 w-full justify-items-center lg:justify-items-start"> + {discover && + discover?.map((item, i) => ( + <Link + href={`/?q=Summary: ${item.url}`} + key={i} + className="max-w-sm rounded-lg overflow-hidden bg-light-secondary dark:bg-dark-secondary hover:-translate-y-[1px] transition duration-200" + target="_blank" + > + <img + className="object-cover w-full aspect-video" + src={ + new URL(item.thumbnail).origin + + new URL(item.thumbnail).pathname + + `?id=${new URL(item.thumbnail).searchParams.get('id')}` + } + alt={item.title} + /> + <div className="px-6 py-4"> + <div className="font-bold text-lg mb-2"> + {item.title.slice(0, 100)}... + </div> + <p className="text-black-70 dark:text-white/70 text-sm"> + {item.content.slice(0, 100)}... + </p> + </div> + </Link> + ))} + </div> + )} </div> </> ); From 45b51ab1561b869c6641beac56d09952a890c6a8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:17:07 +0530 Subject: [PATCH 272/282] feat(discover-api): handle topics --- src/app/api/discover/route.ts | 48 ++++++++++++++++++++++------------- src/app/discover/page.tsx | 1 - 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index d0e56a6..4f141eb 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -1,37 +1,52 @@ import { searchSearxng } from '@/lib/searxng'; -const articleWebsites = [ - 'yahoo.com', - 'www.exchangewire.com', - 'businessinsider.com', - /* 'wired.com', - 'mashable.com', - 'theverge.com', - 'gizmodo.com', - 'cnet.com', - 'venturebeat.com', */ -]; +const websitesForTopic = { + tech: { + query: ['technology news', 'latest tech', 'AI', 'science and innovation'], + links: ['techcrunch.com', 'wired.com', 'theverge.com'], + }, + finance: { + query: ['finance news', 'economy', 'stock market', 'investing'], + links: ['bloomberg.com', 'cnbc.com', 'marketwatch.com'], + }, + art: { + query: ['art news', 'culture', 'modern art', 'cultural events'], + links: ['artnews.com', 'hyperallergic.com', 'theartnewspaper.com'], + }, + sports: { + query: ['sports news', 'latest sports', 'cricket football tennis'], + links: ['espn.com', 'bbc.com/sport', 'skysports.com'], + }, + entertainment: { + query: ['entertainment news', 'movies', 'TV shows', 'celebrities'], + links: ['hollywoodreporter.com', 'variety.com', 'deadline.com'], + }, +}; -const topics = ['AI', 'tech']; /* TODO: Add UI to customize this */ +type Topic = keyof typeof websitesForTopic; export const GET = async (req: Request) => { try { const params = new URL(req.url).searchParams; + const mode: 'normal' | 'preview' = (params.get('mode') as 'normal' | 'preview') || 'normal'; + const topic: Topic = (params.get('topic') as Topic) || 'tech'; + + const selectedTopic = websitesForTopic[topic]; let data = []; if (mode === 'normal') { data = ( await Promise.all([ - ...new Array(articleWebsites.length * topics.length) + ...new Array(selectedTopic.links.length * selectedTopic.query.length) .fill(0) .map(async (_, i) => { return ( await searchSearxng( - `site:${articleWebsites[i % articleWebsites.length]} ${ - topics[i % topics.length] + `site:${selectedTopic.links[i % selectedTopic.links.length]} ${ + selectedTopic.query[i % selectedTopic.query.length] }`, { engines: ['bing news'], @@ -45,11 +60,10 @@ export const GET = async (req: Request) => { ) .map((result) => result) .flat() - .sort(() => Math.random() - 0.5); } else { data = ( await searchSearxng( - `site:${articleWebsites[Math.floor(Math.random() * articleWebsites.length)]} ${topics[Math.floor(Math.random() * topics.length)]}`, + `site:${selectedTopic.links[Math.floor(Math.random() * selectedTopic.links.length)]} ${selectedTopic.query[Math.floor(Math.random() * selectedTopic.query.length)]}`, { engines: ['bing news'], pageno: 1, diff --git a/src/app/discover/page.tsx b/src/app/discover/page.tsx index c7dce37..8e20e50 100644 --- a/src/app/discover/page.tsx +++ b/src/app/discover/page.tsx @@ -43,7 +43,6 @@ const Page = () => { const fetchArticles = async (topic: string) => { setLoading(true); - console.log(topic); try { const res = await fetch(`/api/discover?topic=${topic}`, { method: 'GET', From 88be3a045bac4f0336f50050840213ce4cc7d421 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:18:36 +0530 Subject: [PATCH 273/282] feat(discover): randomly sort results --- src/app/api/discover/route.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index 4f141eb..c02d95c 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -60,6 +60,7 @@ export const GET = async (req: Request) => { ) .map((result) => result) .flat() + .sort(() => Math.random() - 0.5); } else { data = ( await searchSearxng( From 37cd6d3ab57cbe7c4fbb62750fd764cda953d9c7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 1 Aug 2025 20:41:07 +0530 Subject: [PATCH 274/282] feat(discover): prevent duplicate articles --- src/app/api/discover/route.ts | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index c02d95c..415aee8 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -38,28 +38,30 @@ export const GET = async (req: Request) => { let data = []; if (mode === 'normal') { + const seenUrls = new Set(); + data = ( - await Promise.all([ - ...new Array(selectedTopic.links.length * selectedTopic.query.length) - .fill(0) - .map(async (_, i) => { + await Promise.all( + selectedTopic.links.flatMap((link) => + selectedTopic.query.map(async (query) => { return ( - await searchSearxng( - `site:${selectedTopic.links[i % selectedTopic.links.length]} ${ - selectedTopic.query[i % selectedTopic.query.length] - }`, - { - engines: ['bing news'], - pageno: 1, - language: 'en', - }, - ) + await searchSearxng(`site:${link} ${query}`, { + engines: ['bing news'], + pageno: 1, + language: 'en', + }) ).results; }), - ]) + ), + ) ) - .map((result) => result) .flat() + .filter((item) => { + const url = item.url?.toLowerCase().trim(); + if (seenUrls.has(url)) return false; + seenUrls.add(url); + return true; + }) .sort(() => Math.random() - 0.5); } else { data = ( From eadbedb713d1bd26773ea357b4d5cd42563fde8c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 2 Aug 2025 17:14:34 +0530 Subject: [PATCH 275/282] feat(groq): switch to `@langchain/groq` for better handling --- package.json | 1 + src/lib/providers/groq.ts | 12 +++--------- yarn.lock | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 9e9137f..5715c2a 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@langchain/community": "^0.3.49", "@langchain/core": "^0.3.66", "@langchain/google-genai": "^0.2.15", + "@langchain/groq": "^0.2.3", "@langchain/ollama": "^0.2.3", "@langchain/openai": "^0.6.2", "@langchain/textsplitters": "^0.1.0", diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 6a196ee..4e7db51 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -1,4 +1,4 @@ -import { ChatOpenAI } from '@langchain/openai'; +import { ChatGroq } from '@langchain/groq'; import { getGroqApiKey } from '../config'; import { ChatModel } from '.'; @@ -28,16 +28,10 @@ export const loadGroqChatModels = async () => { groqChatModels.forEach((model: any) => { chatModels[model.id] = { displayName: model.id, - model: new ChatOpenAI({ + model: new ChatGroq({ apiKey: groqApiKey, - modelName: model.id, + model: model.id, temperature: 0.7, - configuration: { - baseURL: 'https://api.groq.com/openai/v1', - }, - metadata: { - 'model-type': 'groq', - }, }) as unknown as BaseChatModel, }; }); diff --git a/yarn.lock b/yarn.lock index b8893e7..8a6859a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -653,6 +653,14 @@ "@google/generative-ai" "^0.24.0" uuid "^11.1.0" +"@langchain/groq@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@langchain/groq/-/groq-0.2.3.tgz#3bfcbfc827cf469df3a1b5bb9799f4b0212b4625" + integrity sha512-r+yjysG36a0IZxTlCMr655Feumfb4IrOyA0jLLq4l7gEhVyMpYXMwyE6evseyU2LRP+7qOPbGRVpGqAIK0MsUA== + dependencies: + groq-sdk "^0.19.0" + zod "^3.22.4" + "@langchain/ollama@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@langchain/ollama/-/ollama-0.2.3.tgz#4868e66db4fc480f08c42fc652274abbab0416f0" @@ -2732,6 +2740,19 @@ graphql@^16.11.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633" integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw== +groq-sdk@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/groq-sdk/-/groq-sdk-0.19.0.tgz#564ce018172dc3e2e2793398e0227a035a357d09" + integrity sha512-vdh5h7ORvwvOvutA80dKF81b0gPWHxu6K/GOJBOM0n6p6CSqAVLhFfeS79Ef0j/yCycDR09jqY7jkYz9dLiS6w== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + guid-typescript@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" From 113299710874842d9ce69a8835b1868593d105d8 Mon Sep 17 00:00:00 2001 From: Samuel Dockery <samueldockery@gmail.com> Date: Sun, 10 Aug 2025 07:50:31 -0700 Subject: [PATCH 276/282] feat: Add support for latest AI models from Anthropic, Google, & OpenAI --- src/lib/providers/anthropic.ts | 12 ++++++++++++ src/lib/providers/gemini.ts | 4 ++++ src/lib/providers/openai.ts | 14 +++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index 2b0f2cc..6af2115 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -9,6 +9,18 @@ export const PROVIDER_INFO = { import { BaseChatModel } from '@langchain/core/language_models/chat_models'; const anthropicChatModels: Record<string, string>[] = [ + { + displayName: 'Claude 4.1 Opus', + key: 'claude-opus-4-1-20250805', + }, + { + displayName: 'Claude 4 Opus', + key: 'claude-opus-4-20250514', + }, + { + displayName: 'Claude 4 Sonnet', + key: 'claude-sonnet-4-20250514', + }, { displayName: 'Claude 3.7 Sonnet', key: 'claude-3-7-sonnet-20250219', diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index a9ef4d5..418e0a4 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -17,6 +17,10 @@ const geminiChatModels: Record<string, string>[] = [ displayName: 'Gemini 2.5 Flash', key: 'gemini-2.5-flash', }, + { + displayName: 'Gemini 2.5 Flash-Lite', + key: 'gemini-2.5-flash-lite', + }, { displayName: 'Gemini 2.5 Pro', key: 'gemini-2.5-pro', diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index c857b0e..a672e53 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -42,6 +42,18 @@ const openaiChatModels: Record<string, string>[] = [ displayName: 'GPT 4.1', key: 'gpt-4.1', }, + { + displayName: 'GPT 5 nano', + key: 'gpt-5-nano', + }, + { + displayName: 'GPT 5 mini', + key: 'gpt-5-mini', + }, + { + displayName: 'GPT 5', + key: 'gpt-5', + }, ]; const openaiEmbeddingModels: Record<string, string>[] = [ @@ -69,7 +81,7 @@ export const loadOpenAIChatModels = async () => { model: new ChatOpenAI({ apiKey: openaiApiKey, modelName: model.key, - temperature: 0.7, + temperature: 1, }) as unknown as BaseChatModel, }; }); From 3edd7d44dd5acfe7dbc416db8eb588b71cedb597 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 12 Aug 2025 21:39:14 +0530 Subject: [PATCH 277/282] feat(openai): conditionally set temperature --- src/lib/providers/openai.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index a672e53..7e26763 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -81,7 +81,7 @@ export const loadOpenAIChatModels = async () => { model: new ChatOpenAI({ apiKey: openaiApiKey, modelName: model.key, - temperature: 1, + temperature: model.key.includes('gpt-5') ? 1 : 0.7, }) as unknown as BaseChatModel, }; }); From 8fc78086547e414358dbbeb1d4f9d286fa2d0618 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 20 Aug 2025 20:20:50 +0530 Subject: [PATCH 278/282] feat(hooks): implement useChat hook --- src/lib/hooks/useChat.tsx | 643 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 643 insertions(+) create mode 100644 src/lib/hooks/useChat.tsx diff --git a/src/lib/hooks/useChat.tsx b/src/lib/hooks/useChat.tsx new file mode 100644 index 0000000..573ac6b --- /dev/null +++ b/src/lib/hooks/useChat.tsx @@ -0,0 +1,643 @@ +'use client'; + +import { Message } from '@/components/ChatWindow'; +import { createContext, useContext, useEffect, useRef, useState } from 'react'; +import crypto from 'crypto'; +import { useSearchParams } from 'next/navigation'; +import { toast } from 'sonner'; +import { Document } from '@langchain/core/documents'; +import { getSuggestions } from '../actions'; + +type ChatContext = { + messages: Message[]; + chatHistory: [string, string][]; + files: File[]; + fileIds: string[]; + focusMode: string; + chatId: string | undefined; + optimizationMode: string; + isMessagesLoaded: boolean; + loading: boolean; + notFound: boolean; + messageAppeared: boolean; + isReady: boolean; + hasError: boolean; + setOptimizationMode: (mode: string) => void; + setFocusMode: (mode: string) => void; + setFiles: (files: File[]) => void; + setFileIds: (fileIds: string[]) => void; + sendMessage: ( + message: string, + messageId?: string, + rewrite?: boolean, + ) => Promise<void>; + rewrite: (messageId: string) => void; +}; + +export interface File { + fileName: string; + fileExtension: string; + fileId: string; +} + +interface ChatModelProvider { + name: string; + provider: string; +} + +interface EmbeddingModelProvider { + name: string; + provider: string; +} + +const checkConfig = async ( + setChatModelProvider: (provider: ChatModelProvider) => void, + setEmbeddingModelProvider: (provider: EmbeddingModelProvider) => void, + setIsConfigReady: (ready: boolean) => void, + setHasError: (hasError: boolean) => void, +) => { + try { + let chatModel = localStorage.getItem('chatModel'); + let chatModelProvider = localStorage.getItem('chatModelProvider'); + let embeddingModel = localStorage.getItem('embeddingModel'); + let embeddingModelProvider = localStorage.getItem('embeddingModelProvider'); + + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (!autoImageSearch) { + localStorage.setItem('autoImageSearch', 'true'); + } + + if (!autoVideoSearch) { + localStorage.setItem('autoVideoSearch', 'false'); + } + + const providers = await fetch(`/api/models`, { + headers: { + 'Content-Type': 'application/json', + }, + }).then(async (res) => { + if (!res.ok) + throw new Error( + `Failed to fetch models: ${res.status} ${res.statusText}`, + ); + return res.json(); + }); + + if ( + !chatModel || + !chatModelProvider || + !embeddingModel || + !embeddingModelProvider + ) { + if (!chatModel || !chatModelProvider) { + const chatModelProviders = providers.chatModelProviders; + const chatModelProvidersKeys = Object.keys(chatModelProviders); + + if (!chatModelProviders || chatModelProvidersKeys.length === 0) { + return toast.error('No chat models available'); + } else { + chatModelProvider = + chatModelProvidersKeys.find( + (provider) => + Object.keys(chatModelProviders[provider]).length > 0, + ) || chatModelProvidersKeys[0]; + } + + if ( + chatModelProvider === 'custom_openai' && + Object.keys(chatModelProviders[chatModelProvider]).length === 0 + ) { + toast.error( + "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", + ); + return setHasError(true); + } + + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + } + + if (!embeddingModel || !embeddingModelProvider) { + const embeddingModelProviders = providers.embeddingModelProviders; + + if ( + !embeddingModelProviders || + Object.keys(embeddingModelProviders).length === 0 + ) + return toast.error('No embedding models available'); + + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + } + + localStorage.setItem('chatModel', chatModel!); + localStorage.setItem('chatModelProvider', chatModelProvider); + localStorage.setItem('embeddingModel', embeddingModel!); + localStorage.setItem('embeddingModelProvider', embeddingModelProvider); + } else { + const chatModelProviders = providers.chatModelProviders; + const embeddingModelProviders = providers.embeddingModelProviders; + + if ( + Object.keys(chatModelProviders).length > 0 && + (!chatModelProviders[chatModelProvider] || + Object.keys(chatModelProviders[chatModelProvider]).length === 0) + ) { + const chatModelProvidersKeys = Object.keys(chatModelProviders); + chatModelProvider = + chatModelProvidersKeys.find( + (key) => Object.keys(chatModelProviders[key]).length > 0, + ) || chatModelProvidersKeys[0]; + + localStorage.setItem('chatModelProvider', chatModelProvider); + } + + if ( + chatModelProvider && + !chatModelProviders[chatModelProvider][chatModel] + ) { + if ( + chatModelProvider === 'custom_openai' && + Object.keys(chatModelProviders[chatModelProvider]).length === 0 + ) { + toast.error( + "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", + ); + return setHasError(true); + } + + chatModel = Object.keys( + chatModelProviders[ + Object.keys(chatModelProviders[chatModelProvider]).length > 0 + ? chatModelProvider + : Object.keys(chatModelProviders)[0] + ], + )[0]; + + localStorage.setItem('chatModel', chatModel); + } + + if ( + Object.keys(embeddingModelProviders).length > 0 && + !embeddingModelProviders[embeddingModelProvider] + ) { + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + localStorage.setItem('embeddingModelProvider', embeddingModelProvider); + } + + if ( + embeddingModelProvider && + !embeddingModelProviders[embeddingModelProvider][embeddingModel] + ) { + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + localStorage.setItem('embeddingModel', embeddingModel); + } + } + + setChatModelProvider({ + name: chatModel!, + provider: chatModelProvider, + }); + + setEmbeddingModelProvider({ + name: embeddingModel!, + provider: embeddingModelProvider, + }); + + setIsConfigReady(true); + } catch (err) { + console.error('An error occurred while checking the configuration:', err); + setIsConfigReady(false); + setHasError(true); + } +}; + +const loadMessages = async ( + chatId: string, + setMessages: (messages: Message[]) => void, + setIsMessagesLoaded: (loaded: boolean) => void, + setChatHistory: (history: [string, string][]) => void, + setFocusMode: (mode: string) => void, + setNotFound: (notFound: boolean) => void, + setFiles: (files: File[]) => void, + setFileIds: (fileIds: string[]) => void, +) => { + const res = await fetch(`/api/chats/${chatId}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (res.status === 404) { + setNotFound(true); + setIsMessagesLoaded(true); + return; + } + + const data = await res.json(); + + const messages = data.messages.map((msg: any) => { + return { + ...msg, + ...JSON.parse(msg.metadata), + }; + }) as Message[]; + + setMessages(messages); + + const history = messages.map((msg) => { + return [msg.role, msg.content]; + }) as [string, string][]; + + console.debug(new Date(), 'app:messages_loaded'); + + document.title = messages[0].content; + + const files = data.chat.files.map((file: any) => { + return { + fileName: file.name, + fileExtension: file.name.split('.').pop(), + fileId: file.fileId, + }; + }); + + setFiles(files); + setFileIds(files.map((file: File) => file.fileId)); + + setChatHistory(history); + setFocusMode(data.chat.focusMode); + setIsMessagesLoaded(true); +}; + +export const chatContext = createContext<ChatContext>({ + chatHistory: [], + chatId: '', + fileIds: [], + files: [], + focusMode: '', + hasError: false, + isMessagesLoaded: false, + isReady: false, + loading: false, + messageAppeared: false, + messages: [], + notFound: false, + optimizationMode: '', + rewrite: () => {}, + sendMessage: async () => {}, + setFileIds: () => {}, + setFiles: () => {}, + setFocusMode: () => {}, + setOptimizationMode: () => {}, +}); + +export const ChatProvider = ({ + children, + id, +}: { + children: React.ReactNode; + id?: string; +}) => { + const searchParams = useSearchParams(); + const initialMessage = searchParams.get('q'); + + const [chatId, setChatId] = useState<string | undefined>(id); + const [newChatCreated, setNewChatCreated] = useState(false); + + const [loading, setLoading] = useState(false); + const [messageAppeared, setMessageAppeared] = useState(false); + + const [chatHistory, setChatHistory] = useState<[string, string][]>([]); + const [messages, setMessages] = useState<Message[]>([]); + + const [files, setFiles] = useState<File[]>([]); + const [fileIds, setFileIds] = useState<string[]>([]); + + const [focusMode, setFocusMode] = useState('webSearch'); + const [optimizationMode, setOptimizationMode] = useState('speed'); + + const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); + + const [notFound, setNotFound] = useState(false); + + const [chatModelProvider, setChatModelProvider] = useState<ChatModelProvider>( + { + name: '', + provider: '', + }, + ); + + const [embeddingModelProvider, setEmbeddingModelProvider] = + useState<EmbeddingModelProvider>({ + name: '', + provider: '', + }); + + const [isConfigReady, setIsConfigReady] = useState(false); + const [hasError, setHasError] = useState(false); + const [isReady, setIsReady] = useState(false); + + const messagesRef = useRef<Message[]>([]); + + useEffect(() => { + checkConfig( + setChatModelProvider, + setEmbeddingModelProvider, + setIsConfigReady, + setHasError, + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if ( + chatId && + !newChatCreated && + !isMessagesLoaded && + messages.length === 0 + ) { + loadMessages( + chatId, + setMessages, + setIsMessagesLoaded, + setChatHistory, + setFocusMode, + setNotFound, + setFiles, + setFileIds, + ); + } else if (!chatId) { + setNewChatCreated(true); + setIsMessagesLoaded(true); + setChatId(crypto.randomBytes(20).toString('hex')); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + messagesRef.current = messages; + }, [messages]); + + useEffect(() => { + if (isMessagesLoaded && isConfigReady) { + setIsReady(true); + console.debug(new Date(), 'app:ready'); + } else { + setIsReady(false); + } + }, [isMessagesLoaded, isConfigReady]); + + const rewrite = (messageId: string) => { + const index = messages.findIndex((msg) => msg.messageId === messageId); + + if (index === -1) return; + + const message = messages[index - 1]; + + setMessages((prev) => { + return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; + }); + setChatHistory((prev) => { + return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; + }); + + sendMessage(message.content, message.messageId, true); + }; + + useEffect(() => { + if (isReady && initialMessage && isConfigReady) { + if (!isConfigReady) { + toast.error('Cannot send message before the configuration is ready'); + return; + } + sendMessage(initialMessage); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isConfigReady, isReady, initialMessage]); + + const sendMessage: ChatContext['sendMessage'] = async ( + message, + messageId, + rewrite = false, + ) => { + if (loading) return; + setLoading(true); + setMessageAppeared(false); + + let sources: Document[] | undefined = undefined; + let recievedMessage = ''; + let added = false; + + messageId = messageId ?? crypto.randomBytes(7).toString('hex'); + + setMessages((prevMessages) => [ + ...prevMessages, + { + content: message, + messageId: messageId, + chatId: chatId!, + role: 'user', + createdAt: new Date(), + }, + ]); + + const messageHandler = async (data: any) => { + if (data.type === 'error') { + toast.error(data.data); + setLoading(false); + return; + } + + if (data.type === 'sources') { + sources = data.data; + if (!added) { + setMessages((prevMessages) => [ + ...prevMessages, + { + content: '', + messageId: data.messageId, + chatId: chatId!, + role: 'assistant', + sources: sources, + createdAt: new Date(), + }, + ]); + added = true; + } + setMessageAppeared(true); + } + + if (data.type === 'message') { + if (!added) { + setMessages((prevMessages) => [ + ...prevMessages, + { + content: data.data, + messageId: data.messageId, + chatId: chatId!, + role: 'assistant', + sources: sources, + createdAt: new Date(), + }, + ]); + added = true; + } + + setMessages((prev) => + prev.map((message) => { + if (message.messageId === data.messageId) { + return { ...message, content: message.content + data.data }; + } + + return message; + }), + ); + + recievedMessage += data.data; + setMessageAppeared(true); + } + + if (data.type === 'messageEnd') { + setChatHistory((prevHistory) => [ + ...prevHistory, + ['human', message], + ['assistant', recievedMessage], + ]); + + setLoading(false); + + const lastMsg = messagesRef.current[messagesRef.current.length - 1]; + + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (autoImageSearch === 'true') { + document + .getElementById(`search-images-${lastMsg.messageId}`) + ?.click(); + } + + if (autoVideoSearch === 'true') { + document + .getElementById(`search-videos-${lastMsg.messageId}`) + ?.click(); + } + + if ( + lastMsg.role === 'assistant' && + lastMsg.sources && + lastMsg.sources.length > 0 && + !lastMsg.suggestions + ) { + const suggestions = await getSuggestions(messagesRef.current); + setMessages((prev) => + prev.map((msg) => { + if (msg.messageId === lastMsg.messageId) { + return { ...msg, suggestions: suggestions }; + } + return msg; + }), + ); + } + } + }; + + const messageIndex = messages.findIndex((m) => m.messageId === messageId); + + const res = await fetch('/api/chat', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + content: message, + message: { + messageId: messageId, + chatId: chatId!, + content: message, + }, + chatId: chatId!, + files: fileIds, + focusMode: focusMode, + optimizationMode: optimizationMode, + history: rewrite + ? chatHistory.slice(0, messageIndex === -1 ? undefined : messageIndex) + : chatHistory, + chatModel: { + name: chatModelProvider.name, + provider: chatModelProvider.provider, + }, + embeddingModel: { + name: embeddingModelProvider.name, + provider: embeddingModelProvider.provider, + }, + systemInstructions: localStorage.getItem('systemInstructions'), + }), + }); + + if (!res.body) throw new Error('No response body'); + + const reader = res.body?.getReader(); + const decoder = new TextDecoder('utf-8'); + + let partialChunk = ''; + + while (true) { + const { value, done } = await reader.read(); + if (done) break; + + partialChunk += decoder.decode(value, { stream: true }); + + try { + const messages = partialChunk.split('\n'); + for (const msg of messages) { + if (!msg.trim()) continue; + const json = JSON.parse(msg); + messageHandler(json); + } + partialChunk = ''; + } catch (error) { + console.warn('Incomplete JSON, waiting for next chunk...'); + } + } + }; + + return ( + <chatContext.Provider + value={{ + messages, + chatHistory, + files, + fileIds, + focusMode, + chatId, + hasError, + isMessagesLoaded, + isReady, + loading, + messageAppeared, + notFound, + optimizationMode, + setFileIds, + setFiles, + setFocusMode, + setOptimizationMode, + rewrite, + sendMessage, + }} + > + {children} + </chatContext.Provider> + ); +}; + +export const useChat = () => { + const ctx = useContext(chatContext); + return ctx; +}; From 0b15bfbe3254ebd0d92a4c591789db9f28cb27f9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 20 Aug 2025 20:21:06 +0530 Subject: [PATCH 279/282] feat(app): switch to useChat hook --- src/app/c/[chatId]/page.tsx | 18 +- src/app/page.tsx | 5 +- src/components/Chat.tsx | 38 +- src/components/ChatWindow.tsx | 575 +----------------- src/components/EmptyChat.tsx | 34 +- src/components/EmptyChatMessageInput.tsx | 44 +- src/components/MessageBox.tsx | 11 +- src/components/MessageInput.tsx | 35 +- src/components/MessageInputActions/Attach.tsx | 17 +- .../MessageInputActions/AttachSmall.tsx | 15 +- src/components/MessageInputActions/Focus.tsx | 11 +- .../MessageInputActions/Optimization.tsx | 11 +- src/components/Navbar.tsx | 13 +- 13 files changed, 68 insertions(+), 759 deletions(-) diff --git a/src/app/c/[chatId]/page.tsx b/src/app/c/[chatId]/page.tsx index aac125a..672107a 100644 --- a/src/app/c/[chatId]/page.tsx +++ b/src/app/c/[chatId]/page.tsx @@ -1,9 +1,17 @@ -import ChatWindow from '@/components/ChatWindow'; -import React from 'react'; +'use client'; -const Page = ({ params }: { params: Promise<{ chatId: string }> }) => { - const { chatId } = React.use(params); - return <ChatWindow id={chatId} />; +import ChatWindow from '@/components/ChatWindow'; +import { useParams } from 'next/navigation'; +import React from 'react'; +import { ChatProvider } from '@/lib/hooks/useChat'; + +const Page = () => { + const { chatId }: { chatId: string } = useParams(); + return ( + <ChatProvider id={chatId}> + <ChatWindow /> + </ChatProvider> + ); }; export default Page; diff --git a/src/app/page.tsx b/src/app/page.tsx index e18aca9..25981b5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,4 +1,5 @@ import ChatWindow from '@/components/ChatWindow'; +import { ChatProvider } from '@/lib/hooks/useChat'; import { Metadata } from 'next'; import { Suspense } from 'react'; @@ -11,7 +12,9 @@ const Home = () => { return ( <div> <Suspense> - <ChatWindow /> + <ChatProvider> + <ChatWindow /> + </ChatProvider> </Suspense> </div> ); diff --git a/src/components/Chat.tsx b/src/components/Chat.tsx index 0cf125b..a5d8cf9 100644 --- a/src/components/Chat.tsx +++ b/src/components/Chat.tsx @@ -5,28 +5,11 @@ import MessageInput from './MessageInput'; import { File, Message } from './ChatWindow'; import MessageBox from './MessageBox'; import MessageBoxLoading from './MessageBoxLoading'; +import { useChat } from '@/lib/hooks/useChat'; + +const Chat = () => { + const { messages, loading, messageAppeared } = useChat(); -const Chat = ({ - loading, - messages, - sendMessage, - messageAppeared, - rewrite, - fileIds, - setFileIds, - files, - setFiles, -}: { - messages: Message[]; - sendMessage: (message: string) => void; - loading: boolean; - messageAppeared: boolean; - rewrite: (messageId: string) => void; - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: File[]; - setFiles: (files: File[]) => void; -}) => { const [dividerWidth, setDividerWidth] = useState(0); const dividerRef = useRef<HTMLDivElement | null>(null); const messageEnd = useRef<HTMLDivElement | null>(null); @@ -72,12 +55,8 @@ const Chat = ({ key={i} message={msg} messageIndex={i} - history={messages} - loading={loading} dividerRef={isLast ? dividerRef : undefined} isLast={isLast} - rewrite={rewrite} - sendMessage={sendMessage} /> {!isLast && msg.role === 'assistant' && ( <div className="h-px w-full bg-light-secondary dark:bg-dark-secondary" /> @@ -92,14 +71,7 @@ const Chat = ({ className="bottom-24 lg:bottom-10 fixed z-40" style={{ width: dividerWidth }} > - <MessageInput - loading={loading} - sendMessage={sendMessage} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <MessageInput /> </div> )} </div> diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 6ff7d22..0d40c83 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -1,17 +1,13 @@ 'use client'; -import { useEffect, useRef, useState } from 'react'; import { Document } from '@langchain/core/documents'; import Navbar from './Navbar'; import Chat from './Chat'; import EmptyChat from './EmptyChat'; -import crypto from 'crypto'; -import { toast } from 'sonner'; -import { useSearchParams } from 'next/navigation'; -import { getSuggestions } from '@/lib/actions'; import { Settings } from 'lucide-react'; import Link from 'next/link'; import NextError from 'next/error'; +import { useChat } from '@/lib/hooks/useChat'; export type Message = { messageId: string; @@ -29,547 +25,8 @@ export interface File { fileId: string; } -interface ChatModelProvider { - name: string; - provider: string; -} - -interface EmbeddingModelProvider { - name: string; - provider: string; -} - -const checkConfig = async ( - setChatModelProvider: (provider: ChatModelProvider) => void, - setEmbeddingModelProvider: (provider: EmbeddingModelProvider) => void, - setIsConfigReady: (ready: boolean) => void, - setHasError: (hasError: boolean) => void, -) => { - try { - let chatModel = localStorage.getItem('chatModel'); - let chatModelProvider = localStorage.getItem('chatModelProvider'); - let embeddingModel = localStorage.getItem('embeddingModel'); - let embeddingModelProvider = localStorage.getItem('embeddingModelProvider'); - - const autoImageSearch = localStorage.getItem('autoImageSearch'); - const autoVideoSearch = localStorage.getItem('autoVideoSearch'); - - if (!autoImageSearch) { - localStorage.setItem('autoImageSearch', 'true'); - } - - if (!autoVideoSearch) { - localStorage.setItem('autoVideoSearch', 'false'); - } - - const providers = await fetch(`/api/models`, { - headers: { - 'Content-Type': 'application/json', - }, - }).then(async (res) => { - if (!res.ok) - throw new Error( - `Failed to fetch models: ${res.status} ${res.statusText}`, - ); - return res.json(); - }); - - if ( - !chatModel || - !chatModelProvider || - !embeddingModel || - !embeddingModelProvider - ) { - if (!chatModel || !chatModelProvider) { - const chatModelProviders = providers.chatModelProviders; - const chatModelProvidersKeys = Object.keys(chatModelProviders); - - if (!chatModelProviders || chatModelProvidersKeys.length === 0) { - return toast.error('No chat models available'); - } else { - chatModelProvider = - chatModelProvidersKeys.find( - (provider) => - Object.keys(chatModelProviders[provider]).length > 0, - ) || chatModelProvidersKeys[0]; - } - - if ( - chatModelProvider === 'custom_openai' && - Object.keys(chatModelProviders[chatModelProvider]).length === 0 - ) { - toast.error( - "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", - ); - return setHasError(true); - } - - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - } - - if (!embeddingModel || !embeddingModelProvider) { - const embeddingModelProviders = providers.embeddingModelProviders; - - if ( - !embeddingModelProviders || - Object.keys(embeddingModelProviders).length === 0 - ) - return toast.error('No embedding models available'); - - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; - } - - localStorage.setItem('chatModel', chatModel!); - localStorage.setItem('chatModelProvider', chatModelProvider); - localStorage.setItem('embeddingModel', embeddingModel!); - localStorage.setItem('embeddingModelProvider', embeddingModelProvider); - } else { - const chatModelProviders = providers.chatModelProviders; - const embeddingModelProviders = providers.embeddingModelProviders; - - if ( - Object.keys(chatModelProviders).length > 0 && - (!chatModelProviders[chatModelProvider] || - Object.keys(chatModelProviders[chatModelProvider]).length === 0) - ) { - const chatModelProvidersKeys = Object.keys(chatModelProviders); - chatModelProvider = - chatModelProvidersKeys.find( - (key) => Object.keys(chatModelProviders[key]).length > 0, - ) || chatModelProvidersKeys[0]; - - localStorage.setItem('chatModelProvider', chatModelProvider); - } - - if ( - chatModelProvider && - !chatModelProviders[chatModelProvider][chatModel] - ) { - if ( - chatModelProvider === 'custom_openai' && - Object.keys(chatModelProviders[chatModelProvider]).length === 0 - ) { - toast.error( - "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", - ); - return setHasError(true); - } - - chatModel = Object.keys( - chatModelProviders[ - Object.keys(chatModelProviders[chatModelProvider]).length > 0 - ? chatModelProvider - : Object.keys(chatModelProviders)[0] - ], - )[0]; - - localStorage.setItem('chatModel', chatModel); - } - - if ( - Object.keys(embeddingModelProviders).length > 0 && - !embeddingModelProviders[embeddingModelProvider] - ) { - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - localStorage.setItem('embeddingModelProvider', embeddingModelProvider); - } - - if ( - embeddingModelProvider && - !embeddingModelProviders[embeddingModelProvider][embeddingModel] - ) { - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; - localStorage.setItem('embeddingModel', embeddingModel); - } - } - - setChatModelProvider({ - name: chatModel!, - provider: chatModelProvider, - }); - - setEmbeddingModelProvider({ - name: embeddingModel!, - provider: embeddingModelProvider, - }); - - setIsConfigReady(true); - } catch (err) { - console.error('An error occurred while checking the configuration:', err); - setIsConfigReady(false); - setHasError(true); - } -}; - -const loadMessages = async ( - chatId: string, - setMessages: (messages: Message[]) => void, - setIsMessagesLoaded: (loaded: boolean) => void, - setChatHistory: (history: [string, string][]) => void, - setFocusMode: (mode: string) => void, - setNotFound: (notFound: boolean) => void, - setFiles: (files: File[]) => void, - setFileIds: (fileIds: string[]) => void, -) => { - const res = await fetch(`/api/chats/${chatId}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); - - if (res.status === 404) { - setNotFound(true); - setIsMessagesLoaded(true); - return; - } - - const data = await res.json(); - - const messages = data.messages.map((msg: any) => { - return { - ...msg, - ...JSON.parse(msg.metadata), - }; - }) as Message[]; - - setMessages(messages); - - const history = messages.map((msg) => { - return [msg.role, msg.content]; - }) as [string, string][]; - - console.debug(new Date(), 'app:messages_loaded'); - - document.title = messages[0].content; - - const files = data.chat.files.map((file: any) => { - return { - fileName: file.name, - fileExtension: file.name.split('.').pop(), - fileId: file.fileId, - }; - }); - - setFiles(files); - setFileIds(files.map((file: File) => file.fileId)); - - setChatHistory(history); - setFocusMode(data.chat.focusMode); - setIsMessagesLoaded(true); -}; - -const ChatWindow = ({ id }: { id?: string }) => { - const searchParams = useSearchParams(); - const initialMessage = searchParams.get('q'); - - const [chatId, setChatId] = useState<string | undefined>(id); - const [newChatCreated, setNewChatCreated] = useState(false); - - const [chatModelProvider, setChatModelProvider] = useState<ChatModelProvider>( - { - name: '', - provider: '', - }, - ); - - const [embeddingModelProvider, setEmbeddingModelProvider] = - useState<EmbeddingModelProvider>({ - name: '', - provider: '', - }); - - const [isConfigReady, setIsConfigReady] = useState(false); - const [hasError, setHasError] = useState(false); - const [isReady, setIsReady] = useState(false); - - useEffect(() => { - checkConfig( - setChatModelProvider, - setEmbeddingModelProvider, - setIsConfigReady, - setHasError, - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const [loading, setLoading] = useState(false); - const [messageAppeared, setMessageAppeared] = useState(false); - - const [chatHistory, setChatHistory] = useState<[string, string][]>([]); - const [messages, setMessages] = useState<Message[]>([]); - - const [files, setFiles] = useState<File[]>([]); - const [fileIds, setFileIds] = useState<string[]>([]); - - const [focusMode, setFocusMode] = useState('webSearch'); - const [optimizationMode, setOptimizationMode] = useState('speed'); - - const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); - - const [notFound, setNotFound] = useState(false); - - useEffect(() => { - if ( - chatId && - !newChatCreated && - !isMessagesLoaded && - messages.length === 0 - ) { - loadMessages( - chatId, - setMessages, - setIsMessagesLoaded, - setChatHistory, - setFocusMode, - setNotFound, - setFiles, - setFileIds, - ); - } else if (!chatId) { - setNewChatCreated(true); - setIsMessagesLoaded(true); - setChatId(crypto.randomBytes(20).toString('hex')); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const messagesRef = useRef<Message[]>([]); - - useEffect(() => { - messagesRef.current = messages; - }, [messages]); - - useEffect(() => { - if (isMessagesLoaded && isConfigReady) { - setIsReady(true); - console.debug(new Date(), 'app:ready'); - } else { - setIsReady(false); - } - }, [isMessagesLoaded, isConfigReady]); - - const sendMessage = async ( - message: string, - messageId?: string, - rewrite = false, - ) => { - if (loading) return; - if (!isConfigReady) { - toast.error('Cannot send message before the configuration is ready'); - return; - } - - setLoading(true); - setMessageAppeared(false); - - let sources: Document[] | undefined = undefined; - let recievedMessage = ''; - let added = false; - - messageId = messageId ?? crypto.randomBytes(7).toString('hex'); - - setMessages((prevMessages) => [ - ...prevMessages, - { - content: message, - messageId: messageId, - chatId: chatId!, - role: 'user', - createdAt: new Date(), - }, - ]); - - const messageHandler = async (data: any) => { - if (data.type === 'error') { - toast.error(data.data); - setLoading(false); - return; - } - - if (data.type === 'sources') { - sources = data.data; - if (!added) { - setMessages((prevMessages) => [ - ...prevMessages, - { - content: '', - messageId: data.messageId, - chatId: chatId!, - role: 'assistant', - sources: sources, - createdAt: new Date(), - }, - ]); - added = true; - } - setMessageAppeared(true); - } - - if (data.type === 'message') { - if (!added) { - setMessages((prevMessages) => [ - ...prevMessages, - { - content: data.data, - messageId: data.messageId, - chatId: chatId!, - role: 'assistant', - sources: sources, - createdAt: new Date(), - }, - ]); - added = true; - } - - setMessages((prev) => - prev.map((message) => { - if (message.messageId === data.messageId) { - return { ...message, content: message.content + data.data }; - } - - return message; - }), - ); - - recievedMessage += data.data; - setMessageAppeared(true); - } - - if (data.type === 'messageEnd') { - setChatHistory((prevHistory) => [ - ...prevHistory, - ['human', message], - ['assistant', recievedMessage], - ]); - - setLoading(false); - - const lastMsg = messagesRef.current[messagesRef.current.length - 1]; - - const autoImageSearch = localStorage.getItem('autoImageSearch'); - const autoVideoSearch = localStorage.getItem('autoVideoSearch'); - - if (autoImageSearch === 'true') { - document - .getElementById(`search-images-${lastMsg.messageId}`) - ?.click(); - } - - if (autoVideoSearch === 'true') { - document - .getElementById(`search-videos-${lastMsg.messageId}`) - ?.click(); - } - - if ( - lastMsg.role === 'assistant' && - lastMsg.sources && - lastMsg.sources.length > 0 && - !lastMsg.suggestions - ) { - const suggestions = await getSuggestions(messagesRef.current); - setMessages((prev) => - prev.map((msg) => { - if (msg.messageId === lastMsg.messageId) { - return { ...msg, suggestions: suggestions }; - } - return msg; - }), - ); - } - } - }; - - const messageIndex = messages.findIndex((m) => m.messageId === messageId); - - const res = await fetch('/api/chat', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - content: message, - message: { - messageId: messageId, - chatId: chatId!, - content: message, - }, - chatId: chatId!, - files: fileIds, - focusMode: focusMode, - optimizationMode: optimizationMode, - history: rewrite - ? chatHistory.slice(0, messageIndex === -1 ? undefined : messageIndex) - : chatHistory, - chatModel: { - name: chatModelProvider.name, - provider: chatModelProvider.provider, - }, - embeddingModel: { - name: embeddingModelProvider.name, - provider: embeddingModelProvider.provider, - }, - systemInstructions: localStorage.getItem('systemInstructions'), - }), - }); - - if (!res.body) throw new Error('No response body'); - - const reader = res.body?.getReader(); - const decoder = new TextDecoder('utf-8'); - - let partialChunk = ''; - - while (true) { - const { value, done } = await reader.read(); - if (done) break; - - partialChunk += decoder.decode(value, { stream: true }); - - try { - const messages = partialChunk.split('\n'); - for (const msg of messages) { - if (!msg.trim()) continue; - const json = JSON.parse(msg); - messageHandler(json); - } - partialChunk = ''; - } catch (error) { - console.warn('Incomplete JSON, waiting for next chunk...'); - } - } - }; - - const rewrite = (messageId: string) => { - const index = messages.findIndex((msg) => msg.messageId === messageId); - - if (index === -1) return; - - const message = messages[index - 1]; - - setMessages((prev) => { - return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; - }); - setChatHistory((prev) => { - return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; - }); - - sendMessage(message.content, message.messageId, true); - }; - - useEffect(() => { - if (isReady && initialMessage && isConfigReady) { - sendMessage(initialMessage); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isConfigReady, isReady, initialMessage]); - +const ChatWindow = () => { + const { hasError, isReady, notFound, messages } = useChat(); if (hasError) { return ( <div className="relative"> @@ -594,31 +51,11 @@ const ChatWindow = ({ id }: { id?: string }) => { <div> {messages.length > 0 ? ( <> - <Navbar chatId={chatId!} messages={messages} /> - <Chat - loading={loading} - messages={messages} - sendMessage={sendMessage} - messageAppeared={messageAppeared} - rewrite={rewrite} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <Navbar /> + <Chat /> </> ) : ( - <EmptyChat - sendMessage={sendMessage} - focusMode={focusMode} - setFocusMode={setFocusMode} - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <EmptyChat /> )} </div> ) diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 0eb76ac..e40a338 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -5,27 +5,7 @@ import Link from 'next/link'; import WeatherWidget from './WeatherWidget'; import NewsArticleWidget from './NewsArticleWidget'; -const EmptyChat = ({ - sendMessage, - focusMode, - setFocusMode, - optimizationMode, - setOptimizationMode, - fileIds, - setFileIds, - files, - setFiles, -}: { - sendMessage: (message: string) => void; - focusMode: string; - setFocusMode: (mode: string) => void; - optimizationMode: string; - setOptimizationMode: (mode: string) => void; - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: File[]; - setFiles: (files: File[]) => void; -}) => { +const EmptyChat = () => { return ( <div className="relative"> <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5"> @@ -38,17 +18,7 @@ const EmptyChat = ({ <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> Research begins here. </h2> - <EmptyChatMessageInput - sendMessage={sendMessage} - focusMode={focusMode} - setFocusMode={setFocusMode} - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <EmptyChatMessageInput /> </div> <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center"> <div className="flex-1 w-full"> diff --git a/src/components/EmptyChatMessageInput.tsx b/src/components/EmptyChatMessageInput.tsx index 43d1e28..3c5ff6b 100644 --- a/src/components/EmptyChatMessageInput.tsx +++ b/src/components/EmptyChatMessageInput.tsx @@ -1,34 +1,15 @@ import { ArrowRight } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; -import CopilotToggle from './MessageInputActions/Copilot'; import Focus from './MessageInputActions/Focus'; import Optimization from './MessageInputActions/Optimization'; import Attach from './MessageInputActions/Attach'; -import { File } from './ChatWindow'; +import { useChat } from '@/lib/hooks/useChat'; -const EmptyChatMessageInput = ({ - sendMessage, - focusMode, - setFocusMode, - optimizationMode, - setOptimizationMode, - fileIds, - setFileIds, - files, - setFiles, -}: { - sendMessage: (message: string) => void; - focusMode: string; - setFocusMode: (mode: string) => void; - optimizationMode: string; - setOptimizationMode: (mode: string) => void; - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: File[]; - setFiles: (files: File[]) => void; -}) => { - const [copilotEnabled, setCopilotEnabled] = useState(false); +const EmptyChatMessageInput = () => { + const { sendMessage } = useChat(); + + /* const [copilotEnabled, setCopilotEnabled] = useState(false); */ const [message, setMessage] = useState(''); const inputRef = useRef<HTMLTextAreaElement | null>(null); @@ -84,20 +65,11 @@ const EmptyChatMessageInput = ({ /> <div className="flex flex-row items-center justify-between mt-4"> <div className="flex flex-row items-center space-x-2 lg:space-x-4"> - <Focus focusMode={focusMode} setFocusMode={setFocusMode} /> - <Attach - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - showText - /> + <Focus /> + <Attach showText /> </div> <div className="flex flex-row items-center space-x-1 sm:space-x-4"> - <Optimization - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - /> + <Optimization /> <button disabled={message.trim().length === 0} className="bg-[#24A0ED] text-white disabled:text-black/50 dark:disabled:text-white/50 disabled:bg-[#e0e0dc] dark:disabled:bg-[#ececec21] hover:bg-opacity-85 transition duration-100 rounded-full p-2" diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index dc43aa2..ab6acab 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -20,6 +20,7 @@ import SearchImages from './SearchImages'; import SearchVideos from './SearchVideos'; import { useSpeech } from 'react-text-to-speech'; import ThinkBox from './ThinkBox'; +import { useChat } from '@/lib/hooks/useChat'; const ThinkTagProcessor = ({ children, @@ -36,22 +37,16 @@ const ThinkTagProcessor = ({ const MessageBox = ({ message, messageIndex, - history, - loading, dividerRef, isLast, - rewrite, - sendMessage, }: { message: Message; messageIndex: number; - history: Message[]; - loading: boolean; dividerRef?: MutableRefObject<HTMLDivElement | null>; isLast: boolean; - rewrite: (messageId: string) => void; - sendMessage: (message: string) => void; }) => { + const { loading, messages: history, sendMessage, rewrite } = useChat(); + const [parsedMessage, setParsedMessage] = useState(message.content); const [speechMessage, setSpeechMessage] = useState(message.content); const [thinkingEnded, setThinkingEnded] = useState(false); diff --git a/src/components/MessageInput.tsx b/src/components/MessageInput.tsx index b6b1d96..9949c64 100644 --- a/src/components/MessageInput.tsx +++ b/src/components/MessageInput.tsx @@ -6,22 +6,11 @@ import Attach from './MessageInputActions/Attach'; import CopilotToggle from './MessageInputActions/Copilot'; import { File } from './ChatWindow'; import AttachSmall from './MessageInputActions/AttachSmall'; +import { useChat } from '@/lib/hooks/useChat'; + +const MessageInput = () => { + const { loading, sendMessage } = useChat(); -const MessageInput = ({ - sendMessage, - loading, - fileIds, - setFileIds, - files, - setFiles, -}: { - sendMessage: (message: string) => void; - loading: boolean; - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: File[]; - setFiles: (files: File[]) => void; -}) => { const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); const [textareaRows, setTextareaRows] = useState(1); @@ -79,14 +68,7 @@ const MessageInput = ({ mode === 'multi' ? 'flex-col rounded-lg' : 'flex-row rounded-full', )} > - {mode === 'single' && ( - <AttachSmall - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> - )} + {mode === 'single' && <AttachSmall />} <TextareaAutosize ref={inputRef} value={message} @@ -113,12 +95,7 @@ const MessageInput = ({ )} {mode === 'multi' && ( <div className="flex flex-row items-center justify-between w-full pt-2"> - <AttachSmall - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <AttachSmall /> <div className="flex flex-row items-center space-x-4"> <CopilotToggle copilotEnabled={copilotEnabled} diff --git a/src/components/MessageInputActions/Attach.tsx b/src/components/MessageInputActions/Attach.tsx index 7e2f7f2..fe33a4e 100644 --- a/src/components/MessageInputActions/Attach.tsx +++ b/src/components/MessageInputActions/Attach.tsx @@ -8,20 +8,11 @@ import { import { CopyPlus, File, LoaderCircle, Plus, Trash } from 'lucide-react'; import { Fragment, useRef, useState } from 'react'; import { File as FileType } from '../ChatWindow'; +import { useChat } from '@/lib/hooks/useChat'; + +const Attach = ({ showText }: { showText?: boolean }) => { + const { files, setFiles, setFileIds, fileIds } = useChat(); -const Attach = ({ - fileIds, - setFileIds, - showText, - files, - setFiles, -}: { - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - showText?: boolean; - files: FileType[]; - setFiles: (files: FileType[]) => void; -}) => { const [loading, setLoading] = useState(false); const fileInputRef = useRef<any>(); diff --git a/src/components/MessageInputActions/AttachSmall.tsx b/src/components/MessageInputActions/AttachSmall.tsx index 044b652..834b3f4 100644 --- a/src/components/MessageInputActions/AttachSmall.tsx +++ b/src/components/MessageInputActions/AttachSmall.tsx @@ -8,18 +8,11 @@ import { import { CopyPlus, File, LoaderCircle, Plus, Trash } from 'lucide-react'; import { Fragment, useRef, useState } from 'react'; import { File as FileType } from '../ChatWindow'; +import { useChat } from '@/lib/hooks/useChat'; + +const AttachSmall = () => { + const { files, setFiles, setFileIds, fileIds } = useChat(); -const AttachSmall = ({ - fileIds, - setFileIds, - files, - setFiles, -}: { - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: FileType[]; - setFiles: (files: FileType[]) => void; -}) => { const [loading, setLoading] = useState(false); const fileInputRef = useRef<any>(); diff --git a/src/components/MessageInputActions/Focus.tsx b/src/components/MessageInputActions/Focus.tsx index 875dbf7..9256aa7 100644 --- a/src/components/MessageInputActions/Focus.tsx +++ b/src/components/MessageInputActions/Focus.tsx @@ -15,6 +15,7 @@ import { } from '@headlessui/react'; import { SiReddit, SiYoutube } from '@icons-pack/react-simple-icons'; import { Fragment } from 'react'; +import { useChat } from '@/lib/hooks/useChat'; const focusModes = [ { @@ -55,13 +56,9 @@ const focusModes = [ }, ]; -const Focus = ({ - focusMode, - setFocusMode, -}: { - focusMode: string; - setFocusMode: (mode: string) => void; -}) => { +const Focus = () => { + const { focusMode, setFocusMode } = useChat(); + return ( <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg mt-[6.5px]"> <PopoverButton diff --git a/src/components/MessageInputActions/Optimization.tsx b/src/components/MessageInputActions/Optimization.tsx index ac8a7b0..fc812ad 100644 --- a/src/components/MessageInputActions/Optimization.tsx +++ b/src/components/MessageInputActions/Optimization.tsx @@ -7,6 +7,7 @@ import { Transition, } from '@headlessui/react'; import { Fragment } from 'react'; +import { useChat } from '@/lib/hooks/useChat'; const OptimizationModes = [ { @@ -34,13 +35,9 @@ const OptimizationModes = [ }, ]; -const Optimization = ({ - optimizationMode, - setOptimizationMode, -}: { - optimizationMode: string; - setOptimizationMode: (mode: string) => void; -}) => { +const Optimization = () => { + const { optimizationMode, setOptimizationMode } = useChat(); + return ( <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg"> <PopoverButton diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index e406ade..b0e8ea6 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,6 +10,7 @@ import { Transition, } from '@headlessui/react'; import jsPDF from 'jspdf'; +import { useChat } from '@/lib/hooks/useChat'; const downloadFile = (filename: string, content: string, type: string) => { const blob = new Blob([content], { type }); @@ -118,16 +119,12 @@ const exportAsPDF = (messages: Message[], title: string) => { doc.save(`${title || 'chat'}.pdf`); }; -const Navbar = ({ - chatId, - messages, -}: { - messages: Message[]; - chatId: string; -}) => { +const Navbar = () => { const [title, setTitle] = useState<string>(''); const [timeAgo, setTimeAgo] = useState<string>(''); + const { messages, chatId } = useChat(); + useEffect(() => { if (messages.length > 0) { const newTitle = @@ -206,7 +203,7 @@ const Navbar = ({ </PopoverPanel> </Transition> </Popover> - <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} /> + <DeleteChat redirect chatId={chatId!} chats={[]} setChats={() => {}} /> </div> </div> ); From f680188905edf60494bdb4254c3dd1b8f276afc2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 20 Aug 2025 20:32:13 +0530 Subject: [PATCH 280/282] feat(ollama): add ability to provide api key --- src/app/api/config/route.ts | 3 +++ src/app/settings/page.tsx | 20 ++++++++++++++++++++ src/lib/config.ts | 3 +++ src/lib/providers/ollama.ts | 10 +++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index 0c11b23..f117cce 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -11,6 +11,7 @@ import { getAimlApiKey, getLMStudioApiEndpoint, updateConfig, + getOllamaApiKey, } from '@/lib/config'; import { getAvailableChatModelProviders, @@ -53,6 +54,7 @@ export const GET = async (req: Request) => { config['openaiApiKey'] = getOpenaiApiKey(); config['ollamaApiUrl'] = getOllamaApiEndpoint(); + config['ollamaApiKey'] = getOllamaApiKey(); config['lmStudioApiUrl'] = getLMStudioApiEndpoint(); config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); @@ -93,6 +95,7 @@ export const POST = async (req: Request) => { }, OLLAMA: { API_URL: config.ollamaApiUrl, + API_KEY: config.ollamaApiKey, }, DEEPSEEK: { API_KEY: config.deepseekApiKey, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 1b13c9c..6fb8255 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -21,6 +21,7 @@ interface SettingsType { anthropicApiKey: string; geminiApiKey: string; ollamaApiUrl: string; + ollamaApiKey: string; lmStudioApiUrl: string; deepseekApiKey: string; aimlApiKey: string; @@ -818,6 +819,25 @@ const Page = () => { /> </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Ollama API Key (Can be left blank) + </p> + <Input + type="text" + placeholder="Ollama API Key" + value={config.ollamaApiKey} + isSaving={savingStates['ollamaApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + ollamaApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('ollamaApiKey', value)} + /> + </div> + <div className="flex flex-col space-y-1"> <p className="text-black/70 dark:text-white/70 text-sm"> GROQ API Key diff --git a/src/lib/config.ts b/src/lib/config.ts index d885e13..79d69dc 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -31,6 +31,7 @@ interface Config { }; OLLAMA: { API_URL: string; + API_KEY: string; }; DEEPSEEK: { API_KEY: string; @@ -86,6 +87,8 @@ export const getSearxngApiEndpoint = () => export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; +export const getOllamaApiKey = () => loadConfig().MODELS.OLLAMA.API_KEY; + export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY; export const getAimlApiKey = () => loadConfig().MODELS.AIMLAPI.API_KEY; diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index d5c7899..cb0b848 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -1,5 +1,5 @@ import axios from 'axios'; -import { getKeepAlive, getOllamaApiEndpoint } from '../config'; +import { getKeepAlive, getOllamaApiEndpoint, getOllamaApiKey } from '../config'; import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { @@ -11,6 +11,7 @@ import { OllamaEmbeddings } from '@langchain/ollama'; export const loadOllamaChatModels = async () => { const ollamaApiEndpoint = getOllamaApiEndpoint(); + const ollamaApiKey = getOllamaApiKey(); if (!ollamaApiEndpoint) return {}; @@ -33,6 +34,9 @@ export const loadOllamaChatModels = async () => { model: model.model, temperature: 0.7, keepAlive: getKeepAlive(), + ...(ollamaApiKey + ? { headers: { Authorization: `Bearer ${ollamaApiKey}` } } + : {}), }), }; }); @@ -46,6 +50,7 @@ export const loadOllamaChatModels = async () => { export const loadOllamaEmbeddingModels = async () => { const ollamaApiEndpoint = getOllamaApiEndpoint(); + const ollamaApiKey = getOllamaApiKey(); if (!ollamaApiEndpoint) return {}; @@ -66,6 +71,9 @@ export const loadOllamaEmbeddingModels = async () => { model: new OllamaEmbeddings({ baseUrl: ollamaApiEndpoint, model: model.model, + ...(ollamaApiKey + ? { headers: { Authorization: `Bearer ${ollamaApiKey}` } } + : {}), }), }; }); From 72f26b4370bd2b6206cbc5db37273920203aea8c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 21 Aug 2025 17:47:49 +0530 Subject: [PATCH 281/282] feat(upload): save files uploaded after chat created --- src/app/api/chat/route.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index 2d53b75..8798075 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -1,11 +1,7 @@ -import prompts from '@/lib/prompts'; -import MetaSearchAgent from '@/lib/search/metaSearchAgent'; import crypto from 'crypto'; import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { EventEmitter } from 'stream'; import { - chatModelProviders, - embeddingModelProviders, getAvailableChatModelProviders, getAvailableEmbeddingModelProviders, } from '@/lib/providers'; @@ -138,6 +134,8 @@ const handleHistorySave = async ( where: eq(chats.id, message.chatId), }); + const fileData = files.map(getFileDetails); + if (!chat) { await db .insert(chats) @@ -146,9 +144,16 @@ const handleHistorySave = async ( title: message.content, createdAt: new Date().toString(), focusMode: focusMode, - files: files.map(getFileDetails), + files: fileData, }) .execute(); + } else if (JSON.stringify(chat.files ?? []) != JSON.stringify(fileData)) { + db + .update(chats) + .set({ + files: files.map(getFileDetails), + }) + .where(eq(chats.id, message.chatId)); } const messageExists = await db.query.messages.findFirst({ From 8dc54efbdd3cac2da3092e2864dfd52bd5dc92d1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 21 Aug 2025 17:48:55 +0530 Subject: [PATCH 282/282] feat(chat-route): lint & beautify --- src/app/api/chat/route.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index 8798075..ba88da6 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -148,8 +148,7 @@ const handleHistorySave = async ( }) .execute(); } else if (JSON.stringify(chat.files ?? []) != JSON.stringify(fileData)) { - db - .update(chats) + db.update(chats) .set({ files: files.map(getFileDetails), })