From 5cb72ad4a3ef4a161c51f0ed282968288674d9dd Mon Sep 17 00:00:00 2001 From: Sceik <60520115+sceuick@users.noreply.github.com> Date: Sun, 16 Jul 2023 12:44:49 +0800 Subject: [PATCH] Embeddings (#509) --- .github/workflows/dev-deploy.yml | 12 +- README.md | 33 +- common/grammar.ts | 4 + common/presets.ts | 4 + common/presets/openai.ts | 25 +- common/prompt.ts | 53 +- common/template-parser.ts | 12 +- common/types/index.ts | 4 +- common/types/memory.ts | 8 + common/types/schema.ts | 5 + model/app.py | 4 +- model/memory.py | 169 +-- package.json | 36 +- pnpm-lock.yaml | 1332 +++++++++++++++++++-- srv/adapter/claude.ts | 7 +- srv/adapter/generate.ts | 4 +- srv/adapter/type.ts | 3 + srv/api/chat/edit.ts | 2 + srv/api/chat/message.ts | 4 + srv/api/pipeline.ts | 30 + srv/api/settings.ts | 1 + srv/app.ts | 5 + srv/bin.ts | 29 +- srv/config.ts | 2 + srv/module.d.ts | 6 + srv/start.ts | 14 + tests/__snapshots__/prompt.spec.js.snap | 2 + tests/parser.spec.ts | 17 +- tests/util.ts | 19 +- web/App.tsx | 6 + web/Navigation.tsx | 10 +- web/pages/Character/CreateChat.tsx | 351 ------ web/pages/Character/card-utils.ts | 4 +- web/pages/Chat/ChatGenSettings.tsx | 13 +- web/pages/Chat/ChatSettings.tsx | 3 + web/pages/Chat/CreateChatForm.tsx | 2 +- web/pages/Chat/components/MemoryModal.tsx | 56 +- web/pages/Guides/Memory.tsx | 69 ++ web/pages/Guides/Pipeline.tsx | 38 + web/pages/Home/index.tsx | 7 +- web/pages/Memory/EmbedContent.tsx | 101 ++ web/pages/Memory/index.tsx | 57 +- web/pages/Settings/AISettings.tsx | 14 +- web/shared/FileInput.tsx | 16 +- web/shared/GenerationSettings.tsx | 22 + web/shared/PromptEditor/index.tsx | 2 + web/shared/RangeInput.tsx | 3 +- web/shared/Slot.tsx | 98 +- web/shared/Tabs.tsx | 16 +- web/shared/adapter.ts | 2 +- web/store/chat.ts | 5 +- web/store/create.ts | 2 +- web/store/data/chars.ts | 6 +- web/store/data/messages.ts | 68 +- web/store/data/pdf-import.ts | 13 + web/store/data/pipeline.ts | 296 ++++- web/store/data/storage.ts | 9 +- web/store/flags.ts | 2 - web/store/memory.ts | 13 + web/store/settings.ts | 13 +- 60 files changed, 2413 insertions(+), 750 deletions(-) create mode 100644 common/types/memory.ts create mode 100644 srv/api/pipeline.ts delete mode 100644 web/pages/Character/CreateChat.tsx create mode 100644 web/pages/Guides/Memory.tsx create mode 100644 web/pages/Guides/Pipeline.tsx create mode 100644 web/pages/Memory/EmbedContent.tsx create mode 100644 web/store/data/pdf-import.ts diff --git a/.github/workflows/dev-deploy.yml b/.github/workflows/dev-deploy.yml index b4cacfc48..33f542728 100644 --- a/.github/workflows/dev-deploy.yml +++ b/.github/workflows/dev-deploy.yml @@ -40,11 +40,12 @@ jobs: env: INJECT_SCRIPT: ${{ secrets.INJECT_SCRIPT }} run: | + pnpm run build:server pnpm run build:prod cp dist/index.html dist/original.html node .github/inject.js - - name: Publish to Dev + - name: Publish to DEV uses: BetaHuhn/do-spaces-action@v2 with: access_key: ${{ secrets.S3_ACCESS_KEY}} @@ -53,3 +54,12 @@ jobs: space_region: ${{ secrets.S3_REGION }} permission: public-read source: dist + + - name: Publish to NPM + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + node .github/rev-version.js $GITHUB_SHA + npm publish diff --git a/README.md b/README.md index 75c8f088d..0418e8db7 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,13 @@ Agnaistic is bundled as an NPM package and can be installed globally: # View launch options: > agnai help -# Run with the pipeline features (Coming soon!) +# Run with the Pipeline features > agnai --pipeline ``` When using the NPM package, your images and JSON files will be stored in: `HOME_FOLDER/.agnai`. -E.g. `/home/sceuick/.agnai/json` `/home/sceuick/.agnai/assets` +E.g. Linux: `/home/sceuick/.agnai/` Mac: `/Users/sceuick/.agnai` Windows: `C:\Users\sceuick\.agnai`. ## Features @@ -41,9 +41,9 @@ E.g. `/home/sceuick/.agnai/json` `/home/sceuick/.agnai/assets` - User settings: Which AI service to use and their own settings - User generation settings - Chat specific overrides: AI Service, Character, Generation Settings -- **Optional pipeline features (Coming soon!)** - - Text summarization for images - - TODO: Long-term memory, image captioning, text-to-speech, ... +- **Optional pipeline features** + - Long-term memory + - Wikipedia Article and PDF embedding ## Running with Docker @@ -73,18 +73,6 @@ E.g. `/home/sceuick/.agnai/json` `/home/sceuick/.agnai/assets` - Mac/Linux: `npm run start:public` - Windows: `npm run start:public:win` -## Design Goals - -This project quickly deviated from the upstream project. This project is not intended to be a SaaS nor be centered around the Pygmalion model. -Ultimately the design goals for this project are my own. - -- High quality codebase -- AI Services: Transparently use a variety of AI models and services to converse with - - Initial AI services: Kobold, AI Horde, and Novel -- Supporting additional AI services should be low friction -- Lightweight to self-host -- Avoiding native dependencies and Docker to be easy for non-technical people to install and run - ## Self-Hosting Settings To try and cater for the small tweaks and tuning that people need for their specific needs at an application level we have `settings.json`. @@ -145,10 +133,13 @@ The important parts of the stack are: # Windows > npm run start:win -# Install and run pipeline API -> npm run model:init # Install poetry into a virtual environment -> npm run model:deps # Install/update poetry dependencies -> npm run model:start # Start the pipeline API +# Install and run Pipeline API +# If required, this will update the dependencies before running the API +> npm run model # Install poetry into a virtual environment + +# Run everything with a single commmand: +> npm run start:all # Linux and OSX +> npm run start:all:win # Windows ``` ### Recommended Developer Tooling diff --git a/common/grammar.ts b/common/grammar.ts index 658e65a8e..fc9cd07e5 100644 --- a/common/grammar.ts +++ b/common/grammar.ts @@ -81,6 +81,8 @@ Memory "memory" = "memory"i { return "memory" } Message "message" = "msg"i / "message"i / "text"i { return "message" } ChatAge "chat-age" = "chat_age"i { return "chat_age" } IdleDuration "idle-duration" = "idle_duration"i { return "idle_duration" } +ChatEmbed "chat-embed" = "chat_embed"i { return "chat_embed" } +UserEmbed "user-embed" = "user"i { return "user_embed" } // Iterable entities Bots "bots" = ( "bots"i / "characters"i ) { return "bots" } @@ -100,4 +102,6 @@ Interp "interp" / Message / ChatAge / IdleDuration + / ChatEmbed + / UserEmbed ` diff --git a/common/presets.ts b/common/presets.ts index 68c32f47f..eabd680c7 100644 --- a/common/presets.ts +++ b/common/presets.ts @@ -16,8 +16,12 @@ export const chatGenSettings = { repetitionPenalty: 'number', repetitionPenaltyRange: 'number', repetitionPenaltySlope: 'number', + memoryContextLimit: 'number?', memoryDepth: 'number?', + memoryChatEmbedLimit: 'number?', + memoryUserEmbedLimit: 'number?', + typicalP: 'number', topP: 'number', topK: 'number', diff --git a/common/presets/openai.ts b/common/presets/openai.ts index 613a73211..fcd03b34e 100644 --- a/common/presets/openai.ts +++ b/common/presets/openai.ts @@ -19,10 +19,14 @@ export const openaiPresets = { ignoreCharacterUjb: false, useGaslight: true, gaslight: `{{system_prompt}} -Description of {{char}}: -{{personality}} +Description of {{char}}: {{personality}} + Circumstances and context of the dialogue: {{scenario}} -Facts: {{memory}}`, + +Facts: {{memory}} + +Relevant Information: {{user_embed}} +`, }, openaiAlt: { name: 'Turbo (#2)', @@ -40,10 +44,14 @@ Facts: {{memory}}`, ignoreCharacterUjb: false, useGaslight: true, gaslight: `{{system_prompt}} -Description of {{char}}: -{{personality}} +Description of {{char}}: {{personality}} + Circumstances and context of the dialogue: {{scenario}} -Facts: {{memory}}`, + +Facts: {{memory}} + +Relevant Information: {{user_embed}} +`, }, openaiTurbo: { name: 'DaVinci', @@ -61,9 +69,10 @@ Facts: {{memory}}`, ignoreCharacterUjb: false, systemPrompt: `Enter roleplay mode. You will write {{char}}'s next reply in a dialogue between {{char}} and {{user}}. Do not decide what {{user}} says or does. Use Internet roleplay style, e.g. no quotation marks, and write user actions in italic in third person like: *example*. You are allowed to use markdown. Be proactive, creative, drive the plot and conversation forward. Write at least one paragraph, up to four. Always stay in character. Always keep the conversation going. (Repetition is highly discouraged)`, gaslight: `{{system_prompt}} -Description of {{char}}: -{{personality}} +Description of {{char}}: {{personality}} + Circumstances and context of the dialogue: {{scenario}} + Facts: {{memory}}`, }, } satisfies Record> diff --git a/common/prompt.ts b/common/prompt.ts index 905ab78a4..7b48f0acf 100644 --- a/common/prompt.ts +++ b/common/prompt.ts @@ -9,6 +9,7 @@ import { defaultPresets, getFallbackPreset, isDefaultPreset } from './presets' import { parseTemplate } from './template-parser' import { Encoder } from './tokenize' import { elapsedSince, trimSentence } from './util' +import { Memory } from './types' export const SAMPLE_CHAT_MARKER = `System: New conversation started. Previous conversations are examples only.` export const SAMPLE_CHAT_PREAMBLE = `How {{char}} speaks:` @@ -26,6 +27,9 @@ export type PromptParts = { /** User's impersonated personality */ impersonality?: string + + chatEmbeds: string[] + userEmbeds: string[] } export type Prompt = { @@ -57,6 +61,8 @@ export type PromptOpts = { impersonate?: AppSchema.Character lastMessage: string trimSentences?: boolean + chatEmbeds: Memory.UserEmbed<{ name: string }>[] + userEmbeds: Memory.UserEmbed[] } type BuildPromptOpts = { @@ -69,6 +75,8 @@ type BuildPromptOpts = { members: AppSchema.Profile[] settings?: Partial impersonate?: AppSchema.Character + chatEmbed?: Memory.UserEmbed<{ name: string }>[] + userEmbed?: Memory.UserEmbed[] } /** {{user}}, , {{char}}, , case insensitive */ @@ -90,6 +98,8 @@ const HOLDER_NAMES = { chatAge: 'chat_age', idleDuration: 'idle_duration', impersonating: 'impersonating', + chatEmbed: 'chat_embed', + userEmbed: 'user_embed', } export const HOLDERS = { @@ -106,6 +116,8 @@ export const HOLDERS = { systemPrompt: /{{system_prompt}}/gi, linebreak: /{{(br|linebreak|newline)}}/gi, impersonating: /{{impersonating}}/gi, + chatEmbed: /{{chat_embed}}/gi, + userEmbed: /{{user_embed}}/gi, } const ALL_HOLDERS = new RegExp( @@ -255,6 +267,8 @@ export function injectPlaceholders(template: string, { opts, parts, history: his .replace(HOLDERS.linebreak, '\n') .replace(HOLDERS.chatAge, elapsedSince(opts.chat.createdAt)) .replace(HOLDERS.idleDuration, elapsedSince(rest.lastMessage || '')) + .replace(HOLDERS.chatEmbed, parts.chatEmbeds.join('\n') || '') + .replace(HOLDERS.userEmbed, parts.userEmbeds.join('\n') || '') // system prompt should not support other placeholders .replace(HOLDERS.systemPrompt, newline(parts.systemPrompt)) // All placeholders support {{char}} and {{user}} placeholders therefore these must be last @@ -279,6 +293,8 @@ function removeUnusedPlaceholders(template: string, parts: PromptParts) { const useScenario = !!parts.scenario const useSystemPrompt = !!parts.systemPrompt const useImpersonality = !!parts.impersonality + const useChatEmbed = parts.chatEmbeds.join('').length > 0 + const useUserEmbed = parts.userEmbeds.join('').length > 0 /** * Filter out lines that contain only one 'one of a kind' placeholder where the placeholder is empty @@ -300,6 +316,8 @@ function removeUnusedPlaceholders(template: string, parts: PromptParts) { if (!useScenario && line.match(HOLDERS.scenario)) return false if (!useImpersonality && line.match(HOLDERS.impersonating)) return false if (!useSystemPrompt && line.match(HOLDERS.systemPrompt)) return false + if (!useChatEmbed && line.match(HOLDERS.chatEmbed)) return false + if (!useUserEmbed && line.match(HOLDERS.userEmbed)) return false return true }) .join('\n') @@ -310,7 +328,7 @@ function removeUnusedPlaceholders(template: string, parts: PromptParts) { export function ensureValidTemplate( template: string, parts: PromptParts, - skip?: Array<'history' | 'post' | 'persona' | 'scenario'> + skip?: Array<'history' | 'post' | 'persona' | 'scenario' | 'userEmbed' | 'chatEmbed'> ) { const skips = new Set(skip || []) let hasScenario = !!template.match(HOLDERS.scenario) @@ -318,9 +336,13 @@ export function ensureValidTemplate( let hasHistory = !!template.match(HOLDERS.history) let hasPost = !!template.match(HOLDERS.post) let hasUjb = !!template.match(HOLDERS.ujb) + let hasUserEmbed = !!template.match(HOLDERS.userEmbed) + // let hasChatEmbed = !!template.match(HOLDERS.chatEmbed) const useScenario = !!parts.scenario const usePersona = !!parts.persona + const useUserEmbed = parts.userEmbeds.length > 0 + // const useChatEmbed = parts.chatEmbeds.length > 0 let modified = removeUnusedPlaceholders(template, parts) @@ -334,6 +356,11 @@ export function ensureValidTemplate( modified += `\n{{char}}'s persona: {{${HOLDER_NAMES.persona}}}` } + if (!skips.has('userEmbed') && !hasUserEmbed && useUserEmbed) { + hasUserEmbed = true + modified += `\nRelevant Information: {{${HOLDER_NAMES.userEmbed}}}` + } + if (!skips.has('post') && !skips.has('history') && !hasHistory && !hasPost) { modified += `\n{{history}}\n{{post}}` } else if (!skips.has('history') && !hasHistory && hasPost) { @@ -361,6 +388,8 @@ type PromptPartsOptions = Pick< | 'replyAs' | 'impersonate' | 'characters' + | 'chatEmbeds' + | 'userEmbeds' > export function getPromptParts(opts: PromptPartsOptions, lines: string[], encoder: Encoder) { @@ -378,6 +407,8 @@ export function getPromptParts(opts: PromptPartsOptions, lines: string[], encode ), post: [], allPersonas: [], + chatEmbeds: [], + userEmbeds: [], } const personalities = new Set([replyAs._id]) @@ -440,6 +471,18 @@ export function getPromptParts(opts: PromptPartsOptions, lines: string[], encode parts.post = post.map(replace) + if (opts.userEmbeds) { + const embeds = opts.userEmbeds.map((line) => line.text) + const fit = fillPromptWithLines(encoder, opts.settings?.memoryUserEmbedLimit || 500, '', embeds) + parts.userEmbeds = fit + } + + if (opts.chatEmbeds) { + const embeds = opts.chatEmbeds.map((line) => `${line.name}: ${line.text}`) + const fit = fillPromptWithLines(encoder, opts.settings?.memoryChatEmbedLimit || 500, '', embeds) + parts.chatEmbeds = fit + } + return parts } @@ -607,7 +650,7 @@ export function getChatPreset( } // #4 - const { adapter, isThirdParty } = getAdapter(chat, user) + const { adapter, isThirdParty } = getAdapter(chat, user, undefined) const fallbackId = user.defaultPresets?.[isThirdParty ? 'kobold' : adapter] if (fallbackId) { @@ -627,7 +670,11 @@ export function getChatPreset( * 3. chat.adapter * 4. user.defaultAdapter */ -export function getAdapter(chat: AppSchema.Chat, config: AppSchema.User, preset?: Partial) { +export function getAdapter( + chat: AppSchema.Chat, + config: AppSchema.User, + preset: Partial | undefined +) { const chatAdapter = !chat.adapter || chat.adapter === 'default' ? config.defaultAdapter : chat.adapter let adapter = preset?.service ? preset.service : chatAdapter diff --git a/common/template-parser.ts b/common/template-parser.ts index 3a7e86488..e6cd11496 100644 --- a/common/template-parser.ts +++ b/common/template-parser.ts @@ -1,7 +1,7 @@ import { formatCharacter } from './characters' import { grammar } from './grammar' import { PromptParts } from './prompt' -import { AppSchema } from '/common/types' +import { AppSchema, Memory } from '/common/types' import peggy from 'peggy' import { elapsedSince } from './util' @@ -37,6 +37,8 @@ type Holder = | 'chat_age' | 'idle_duration' | 'all_personalities' + | 'chat_embed' + | 'user_embed' type IterableHolder = 'history' | 'bots' @@ -56,6 +58,8 @@ export type ParseOpts = { characters: Record sender: AppSchema.Profile lastMessage?: string + chatEmbed?: Memory.UserEmbed<{ name: string }>[] + userEmbed?: Memory.UserEmbed[] } export function parseTemplate(template: string, opts: ParseOpts) { @@ -254,6 +258,12 @@ function getPlaceholder(value: Holder, opts: ParseOpts) { case 'all_personalities': return opts.parts.allPersonas?.join('\n') || '' + + case 'chat_embed': + return opts.parts.chatEmbeds.join('\n') || '' + + case 'user_embed': + return opts.parts.userEmbeds.join('\n') || '' } } diff --git a/common/types/index.ts b/common/types/index.ts index b664cd557..1ac35f005 100644 --- a/common/types/index.ts +++ b/common/types/index.ts @@ -1,6 +1,8 @@ import * as UI from './ui' import * as Sprite from './sprite' +import * as Memory from './memory' export * from './schema' export * from './texttospeech-schema' -export { UI, Sprite } + +export { UI, Sprite, Memory } diff --git a/common/types/memory.ts b/common/types/memory.ts new file mode 100644 index 000000000..5f2251557 --- /dev/null +++ b/common/types/memory.ts @@ -0,0 +1,8 @@ +export type UserEmbed = { + id: string + distance: number + text: string + date: string +} & T + +export type ChatEmbed = { _id: string; msg: string; name: string; createdAt: string } diff --git a/common/types/schema.ts b/common/types/schema.ts index 037f1cb61..bd32ebd16 100644 --- a/common/types/schema.ts +++ b/common/types/schema.ts @@ -37,6 +37,7 @@ export namespace AppSchema { policies?: boolean flags?: string + pipelineProxyEnabled: boolean authUrls: string[] } @@ -142,6 +143,7 @@ export namespace AppSchema { mode?: 'standard' | 'adventure' userId: string memoryId?: string + userEmbedId?: string memberIds: string[] characters?: Record @@ -325,6 +327,9 @@ export namespace AppSchema { memoryDepth?: number memoryContextLimit?: number memoryReverseWeight?: boolean + memoryChatEmbedLimit?: number + memoryUserEmbedLimit?: number + src?: string images?: { diff --git a/model/app.py b/model/app.py index e9ecc5ba3..2bf79a544 100644 --- a/model/app.py +++ b/model/app.py @@ -3,7 +3,7 @@ from server import app -@app.get("/status") +@app.get("/pipeline/status") def statusGet(): return { "status": "ok", @@ -13,7 +13,7 @@ def statusGet(): } -@app.post("/summarize") +@app.post("/pipeline/summarize") def summarizePost(): if summary.enabled is False: return {"success": False, "summary": None, "error": "Summarizer disabled"} diff --git a/model/memory.py b/model/memory.py index bb508e79c..e61db1118 100644 --- a/model/memory.py +++ b/model/memory.py @@ -11,85 +11,120 @@ dir = abspath("./db") -if args.all or args.memory: - print(f"Preparing ChromaDB... {dir}") - client = chromadb.Client( - Settings( - anonymized_telemetry=False, - persist_directory=dir, - chroma_db_impl="duckdb+parquet", - ) +print(f"Preparing ChromaDB... {dir}") +client = chromadb.Client( + Settings( + anonymized_telemetry=False, + persist_directory=dir, + chroma_db_impl="duckdb+parquet", ) - model = embedding_functions.SentenceTransformerEmbeddingFunction( - model_name="all-MiniLM-L6-v2" +) +model = embedding_functions.SentenceTransformerEmbeddingFunction( + model_name="all-MiniLM-L6-v2" +) +trx = SentenceTransformer("all-MiniLM-L6-v2") +embed = lambda *args, **kwargs: trx.encode(*args, **kwargs).tolist() + + +@app.post("/pipeline/embed//reembed") +def memoryReembed(chat_id): + payload = request.get_json(silent=True) + messages = payload.get("messages", False) or None + + if messages is None: + return {"success": False, "error": ".messages missing in payload"} + + documents = [msg["msg"] for msg in messages] + ids = [msg["_id"] for msg in messages] + metadatas = [{"name": msg["name"], "date": msg["createdAt"]} for msg in messages] + + try: + client.delete_collection(chat_id) + except: + pass + + collection = client.get_or_create_collection(name=chat_id, embedding_function=embed) + collection.upsert(ids=ids, documents=documents, metadatas=metadatas) + + return {"success": True} + + +@app.post("/pipeline/embed//chat") +def chatEmbed(chat_id): + payload = request.get_json(silent=True) + messages = payload.get("messages", False) or None + + if messages is None: + return {"success": False, "error": ".messages missing in payload"} + + documents = [msg["msg"] for msg in messages] + ids = [msg["_id"] for msg in messages] + metadatas = [{"name": msg["name"], "date": msg["createdAt"]} for msg in messages] + + collection = client.get_or_create_collection( + name=chat_id, embedding_function=embed, metadata={"type": "chat"} ) - trx = SentenceTransformer("all-MiniLM-L6-v2") - embed = lambda *args, **kwargs: trx.encode(*args, **kwargs).tolist() - - @app.post("/memory//reembed") - def memoryReembed(chat_id): - payload = request.get_json(silent=True) - messages = payload.get("messages", False) or None - - if messages is None: - return {"success": False, "error": ".messages missing in payload"} - - documents = [msg["msg"] for msg in messages] - ids = [msg["_id"] for msg in messages] - metadatas = [ - {"name": msg["name"], "date": msg["createdAt"]} for msg in messages - ] - - try: - client.delete_collection(chat_id) - except: - pass - - collection = client.get_or_create_collection( - name=chat_id, embedding_function=embed - ) - collection.upsert(ids=ids, documents=documents, metadatas=metadatas) + collection.upsert(ids=ids, documents=documents, metadatas=metadatas) + client.persist() - return {"success": True} + return {"success": True} - @app.post("/memory//embed") - def memoryEmbed(chat_id): - payload = request.get_json(silent=True) - messages = payload.get("messages", False) or None - if messages is None: - return {"success": False, "error": ".messages missing in payload"} +@app.post("/pipeline/embed/") +def embedContent(name): + payload = request.get_json(silent=True) + documents = payload.get("documents") + ids = payload.get("ids") + metadatas = payload.get("metadatas") - documents = [msg["msg"] for msg in messages] - ids = [msg["_id"] for msg in messages] - metadatas = [ - {"name": msg["name"], "date": msg["createdAt"]} for msg in messages - ] + try: + client.delete_collection(name) + except: + pass - collection = client.get_or_create_collection( - name=chat_id, embedding_function=embed - ) - collection.upsert(ids=ids, documents=documents, metadatas=metadatas) + collection = client.get_or_create_collection( + name=name, embedding_function=embed, metadata={"type": "user"} + ) - return {"success": True} + collection.upsert(ids=ids, documents=documents, metadatas=metadatas) + client.persist() - @app.post("/memory/") - def memoryRecall(chat_id): - payload = request.get_json(silent=True) - collection = client.get_or_create_collection( - name=chat_id, embedding_function=embed - ) + return {"success": True} + + +@app.delete("/pipeline/embed/") +def removeEmbed(name): + client.delete_collection(name) + return {"success": True} - memories = collection.query( - query_texts=payload["message"], + +@app.post("/pipeline/embed//query") +def recallContent(name): + payload = request.get_json(silent=True) + message = payload.get("message") + try: + collection = client.get_collection(name) + results = collection.query( + query_texts=message, n_results=25, ) - print(memories) + return {"result": results} + except: + return {"result": None} + + +@app.get("/pipeline/embed") +def listCollections(): + collections = client.list_collections() + + results = [] + + for i, row in enumerate(collections): + results.append({"id": row.id, "name": row.name, "metadata": row.metadata}) + + return {"result": results} - return {"memories": memories} - print("ChromaDB ready") - enabled = True -else: - print("ChromeDB skipped") +print("ChromaDB ready") +enabled = True diff --git a/package.json b/package.json index af9c22532..3361324aa 100644 --- a/package.json +++ b/package.json @@ -40,29 +40,30 @@ "build:all:win": "npm run build:win && npm run build:server", "build:api": "tsc -p api.tsconfig.json", "build:server": "tsc -p srv.tsconfig.json", - "build:server:watch": "tsc -p srv.tsconfig.json -w", + "build:watch": "tsc -p srv.tsconfig.json -w", "format": "prettier --check \"web/**/*.tsx\" \"web/**/*.ts\" \"web/**/*.css\" \"web/**/*.html\" && prettier --check \"srv/**/*.ts\"", "format:fix": "prettier \"web/**/*.ts\" \"web/**/*.tsx\" --write && prettier \"srv/**/*.ts\" --write && prettier \"common/**/*.ts\" --write", - "model:init": "python3 -m venv ./.model && .model/bin/pip install poetry==1.4.1 && .model/bin/poetry config virtualenvs.in-project true", - "model:deps": ".model/bin/poetry install --no-interaction --no-ansi", + "model:init": "python3 -m venv ./.model && .model/bin/pip install poetry==1.4.1 && .model/bin/poetry config virtualenvs.in-project true && npm run model:deps", + "model:deps": ".model/bin/poetry install --no-interaction --no-ansi || exit 0", "model:start": ".model/bin/poetry run python model/app.py", - "model:watch": "nodemon -e py --watch model --exec \"python -m flask --app model/app.py run --host 0.0.0.0 -p 5001\"", - "model": "npm run model:start", + "model:watch": "npm run model:init && nodemon -e py --watch model --exec \".model/bin/poetry run python model/app.py\"", + "model": "npm run model:init && npm run model:start", "server": "node srv/start.js", "server:watch": "nodemon -e js --delay 2 --watch srv --watch common --watch \".env\" --exec \"node --inspect srv/start.js\"", - "start:all": "concurrently -c auto -n web,api,tsc \"parcel web/index.html\" \"npm run server:watch\" \"npm run build:server:watch\"", "start:web": "parcel web/index.html", - "start": "concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:server:watch\"", - "watch": "concurrently -c auto -n web,tsc \"parcel web/index.html --no-cache\" \"npm run build:server:watch\"", - "start:cluster": "concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:server:watch\"", - "start:https": "concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache --https\" \"npm run server:watch\" \"npm run build:server:watch\"", - "start:debug": "LOG_LEVEL=debug concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:server:watch\"", + "start": "concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\"", + "start:all": "PIPELINE_PROXY=true concurrently -c auto -n web,api,tsc,pipe \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\" \"npm run model:watch\"", + "watch": "concurrently -c auto -n web,tsc \"parcel web/index.html --no-cache\" \"npm run build:watch\"", + "start:cluster": "concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\"", + "start:https": "concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache --https\" \"npm run server:watch\" \"npm run build:watch\"", + "start:debug": "LOG_LEVEL=debug concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\"", "start:public": "concurrently -c auto -n web,api,lt \"parcel watch web/index.html\" \"npm run server:watch\" \"npx lt --port 3001\"", "start:public:win": "concurrently -c auto -n web,api,lt \"parcel watch web/index.html\" \"npm run server:watch\" \"npx lt --local-host 127.0.0.1 --port 3001\"", - "start:win": "concurrently -c auto -n web,api,tsc \"parcel web/index.html\" \"npm run server:watch\" \"npm run build:server:watch\"", + "start:win": "concurrently -c auto -n web,api,tsc \"parcel web/index.html\" \"npm run server:watch\" \"npm run build:watch\"", + "start:win:all": "set PIPELINE_PROXY=true && concurrently -c auto -n web,api,tsc,pipe \"parcel web/index.html\" \"npm run server:watch\" \"npm run build:watch\" \"npm run model:watch\"", "selfhost": "npm run deps && npm run build:all && SELF_HOST=1 npm run server", "selfhost:win": "set \"SELF_HOST=1\" && npm run deps && npm run build:all && npm run server", - "start:debug:win": "set LOG_LEVEL=debug && concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:server:watch\"", + "start:debug:win": "set LOG_LEVEL=debug && concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\"", "test": "mocha --inline-diffs \"tests/**.spec.js\"", "snapshot": "UPDATE_SNAPSHOT=1 mocha --inline-diffs \"tests/**.spec.js\"", "typecheck": "tsc -p tsconfig.json", @@ -98,6 +99,7 @@ "sentencepiece-js": "^1.1.0", "throng": "^5.0.0", "uuid": "^9.0.0", + "wikijs": "^6.4.1", "ws": "^8.12.1" }, "devDependencies": { @@ -118,6 +120,7 @@ "@types/google-publisher-tag": "^1.20230410.0", "@types/js-cookie": "^3.0.2", "@types/jsonwebtoken": "^9.0.1", + "@types/localtunnel": "^2.0.1", "@types/mocha": "^10.0.1", "@types/multer": "^1.4.7", "@types/needle": "^3.2.0", @@ -126,12 +129,15 @@ "@types/throng": "^5.0.4", "@types/uuid": "^9.0.0", "@types/ws": "^8.5.4", + "assert": "^2.0.0", "babel-preset-solid": "^1.6.9", + "browserify-zlib": "^0.2.0", "buffer": "^5.5.0", "chai": "^4.3.7", "concurrently": "^7.6.0", "crypto-browserify": "^3.12.0", "events": "^3.1.0", + "https-browserify": "^1.0.0", "js-cookie": "^3.0.1", "localforage": "^1.10.0", "localtunnel": "^2.0.2", @@ -141,6 +147,8 @@ "nodemon": "^3.0.1", "parcel": "^2.9.3", "path-browserify": "^1.0.0", + "pdfdataextract": "^3.2.0", + "pdfjs-dist": "2.10.377", "png-chunk-text": "^1.0.0", "png-chunks-encode": "^1.0.0", "png-chunks-extract": "^1.0.0", @@ -149,9 +157,11 @@ "prettier-plugin-tailwindcss": "^0.2.1", "process": "^0.11.10", "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", "showdown": "^2.1.0", "solid-js": "1.7.6", "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", "tailwindcss": "^3.3.2", "typescript": "^5.1.3", "url": "^0.11.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20a994bc1..f1f6fdce4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ dependencies: uuid: specifier: ^9.0.0 version: 9.0.0 + wikijs: + specifier: ^6.4.1 + version: registry.npmjs.org/wikijs@6.4.1 ws: specifier: ^8.12.1 version: 8.12.1 @@ -136,6 +139,9 @@ devDependencies: '@types/jsonwebtoken': specifier: ^9.0.1 version: 9.0.1 + '@types/localtunnel': + specifier: ^2.0.1 + version: registry.npmjs.org/@types/localtunnel@2.0.1 '@types/mocha': specifier: ^10.0.1 version: 10.0.1 @@ -160,9 +166,15 @@ devDependencies: '@types/ws': specifier: ^8.5.4 version: 8.5.4 + assert: + specifier: ^2.0.0 + version: registry.npmjs.org/assert@2.0.0 babel-preset-solid: specifier: ^1.6.9 version: 1.6.9(@babel/core@7.20.12) + browserify-zlib: + specifier: ^0.2.0 + version: registry.npmjs.org/browserify-zlib@0.2.0 buffer: specifier: ^5.5.0 version: 5.5.0 @@ -178,6 +190,9 @@ devDependencies: events: specifier: ^3.1.0 version: 3.1.0 + https-browserify: + specifier: ^1.0.0 + version: registry.npmjs.org/https-browserify@1.0.0 js-cookie: specifier: ^3.0.1 version: 3.0.1 @@ -205,6 +220,12 @@ devDependencies: path-browserify: specifier: ^1.0.0 version: 1.0.0 + pdfdataextract: + specifier: ^3.2.0 + version: registry.npmjs.org/pdfdataextract@3.2.0(worker-loader@3.0.8) + pdfjs-dist: + specifier: 2.10.377 + version: registry.npmjs.org/pdfjs-dist@2.10.377(worker-loader@3.0.8) png-chunk-text: specifier: ^1.0.0 version: 1.0.0 @@ -229,6 +250,9 @@ devDependencies: punycode: specifier: ^1.4.1 version: 1.4.1 + querystring-es3: + specifier: ^0.2.1 + version: registry.npmjs.org/querystring-es3@0.2.1 showdown: specifier: ^2.1.0 version: 2.1.0 @@ -238,6 +262,9 @@ devDependencies: stream-browserify: specifier: ^3.0.0 version: 3.0.0 + stream-http: + specifier: ^3.1.0 + version: registry.npmjs.org/stream-http@3.2.0 tailwindcss: specifier: ^3.3.2 version: 3.3.2 @@ -1589,7 +1616,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.13.0 + '@types/node': registry.npmjs.org/@types/node@18.13.0 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -1650,7 +1677,7 @@ packages: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.13.0 + '@types/node': registry.npmjs.org/@types/node@18.13.0 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -2747,7 +2774,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.13.0 + '@types/node': registry.npmjs.org/@types/node@18.13.0 dev: true /@types/cors@2.8.13: @@ -2777,7 +2804,7 @@ packages: /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.13.0 + '@types/node': registry.npmjs.org/@types/node@18.13.0 dev: true /@types/http-errors@2.0.1: @@ -2836,6 +2863,7 @@ packages: /@types/node@18.13.0: resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} + dev: true /@types/prettier@2.7.3: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} @@ -2853,7 +2881,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 18.13.0 + '@types/node': registry.npmjs.org/@types/node@18.13.0 dev: true /@types/serve-static@1.15.2: @@ -2887,7 +2915,7 @@ packages: /@types/whatwg-url@8.2.2: resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} dependencies: - '@types/node': 18.13.0 + '@types/node': registry.npmjs.org/@types/node@18.13.0 '@types/webidl-conversions': 7.0.0 dev: false @@ -3007,7 +3035,7 @@ packages: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} dependencies: bn.js: 4.12.0 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 dev: true @@ -3180,8 +3208,8 @@ packages: cipher-base: 1.0.4 create-hash: 1.2.0 evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 + inherits: registry.npmjs.org/inherits@2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /browserify-cipher@1.0.1: @@ -3197,8 +3225,8 @@ packages: dependencies: cipher-base: 1.0.4 des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 + inherits: registry.npmjs.org/inherits@2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /browserify-rsa@4.1.0: @@ -3216,10 +3244,10 @@ packages: create-hash: 1.2.0 create-hmac: 1.1.7 elliptic: 6.5.4 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 parse-asn1: 5.1.6 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 + readable-stream: registry.npmjs.org/readable-stream@3.6.2 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /browserslist@4.21.9: @@ -3374,8 +3402,8 @@ packages: /cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 + inherits: registry.npmjs.org/inherits@2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /cliui@7.0.4: @@ -3463,8 +3491,8 @@ packages: engines: {'0': node >= 0.8} dependencies: buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 + inherits: registry.npmjs.org/inherits@2.0.4 + readable-stream: registry.npmjs.org/readable-stream@2.3.8 typedarray: 0.0.6 dev: false @@ -3488,7 +3516,7 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: false /content-type@1.0.5: @@ -3547,7 +3575,7 @@ packages: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} dependencies: cipher-base: 1.0.4 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 sha.js: 2.4.11 @@ -3558,9 +3586,9 @@ packages: dependencies: cipher-base: 1.0.4 create-hash: 1.2.0 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 ripemd160: 2.0.2 - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 sha.js: 2.4.11 dev: true @@ -3698,7 +3726,7 @@ packages: /des.js@1.1.0: resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} dependencies: - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 minimalistic-assert: 1.0.1 dev: true @@ -3783,7 +3811,7 @@ packages: /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} dependencies: - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: false /ee-first@1.1.1: @@ -3801,7 +3829,7 @@ packages: brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 dev: true @@ -3890,7 +3918,7 @@ packages: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} dependencies: md5.js: 1.3.5 - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /expect@28.1.3: @@ -4127,7 +4155,7 @@ packages: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -4138,7 +4166,7 @@ packages: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -4149,7 +4177,7 @@ packages: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -4161,7 +4189,7 @@ packages: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 minimatch: 5.1.6 once: 1.4.0 dev: false @@ -4226,15 +4254,15 @@ packages: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 + inherits: registry.npmjs.org/inherits@2.0.4 + readable-stream: registry.npmjs.org/readable-stream@3.6.2 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 minimalistic-assert: 1.0.1 dev: true @@ -4247,7 +4275,7 @@ packages: resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} dependencies: glob: 8.1.0 - readable-stream: 3.6.2 + readable-stream: registry.npmjs.org/readable-stream@3.6.2 dev: false /hex-rgb@4.3.0: @@ -4317,7 +4345,7 @@ packages: engines: {node: '>= 0.8'} dependencies: depd: 2.0.0 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 @@ -4373,6 +4401,7 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true /ip@2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} @@ -4510,7 +4539,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.6 - '@types/node': 18.13.0 + '@types/node': registry.npmjs.org/@types/node@18.13.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -4600,7 +4629,7 @@ packages: resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@types/node': 18.13.0 + '@types/node': registry.npmjs.org/@types/node@18.13.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -4670,14 +4699,14 @@ packages: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: false /jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} dependencies: jwa: 1.4.1 - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: false /lie@3.1.1: @@ -4810,8 +4839,8 @@ packages: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 + inherits: registry.npmjs.org/inherits@2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /mdn-data@2.0.14: @@ -5278,7 +5307,7 @@ packages: browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 pbkdf2: 3.1.2 - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /parse-css-color@0.1.2: @@ -5348,7 +5377,7 @@ packages: create-hash: 1.2.0 create-hmac: 1.1.7 ripemd160: 2.0.2 - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 sha.js: 2.4.11 dev: true @@ -5378,7 +5407,7 @@ packages: /pino-abstract-transport@1.0.0: resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} dependencies: - readable-stream: 4.4.0 + readable-stream: registry.npmjs.org/readable-stream@4.4.0 split2: 4.2.0 dev: false @@ -5499,7 +5528,7 @@ packages: engines: {node: '>=4'} dependencies: cssesc: 3.0.0 - util-deprecate: 1.0.2 + util-deprecate: registry.npmjs.org/util-deprecate@1.0.2 dev: true /postcss-value-parser@4.2.0: @@ -5610,7 +5639,7 @@ packages: create-hash: 1.2.0 parse-asn1: 5.1.6 randombytes: 2.1.0 - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /pump@3.0.0: @@ -5650,14 +5679,14 @@ packages: /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /randomfill@1.0.4: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} dependencies: randombytes: 2.1.0 - safe-buffer: 5.2.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /range-parser@1.2.1: @@ -5694,25 +5723,14 @@ packages: pify: 2.3.0 dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: false - /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + inherits: registry.npmjs.org/inherits@2.0.4 + string_decoder: registry.npmjs.org/string_decoder@1.3.0 + util-deprecate: registry.npmjs.org/util-deprecate@1.0.2 + dev: true /readable-stream@4.4.0: resolution: {integrity: sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==} @@ -5784,7 +5802,7 @@ packages: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: hash-base: 3.1.0 - inherits: 2.0.4 + inherits: registry.npmjs.org/inherits@2.0.4 dev: true /run-parallel@1.2.0: @@ -5799,10 +5817,6 @@ packages: tslib: 2.5.3 dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -5907,8 +5921,8 @@ packages: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 + inherits: registry.npmjs.org/inherits@2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 dev: true /shell-quote@1.8.1: @@ -6053,17 +6067,6 @@ packages: strip-ansi: 6.0.1 dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: false - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -6322,9 +6325,6 @@ packages: react: registry.npmjs.org/react@18.2.0 dev: true - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util@0.12.3: resolution: {integrity: sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==} dependencies: @@ -6556,6 +6556,61 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: true + registry.npmjs.org/@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz} + name: '@jridgewell/gen-mapping' + version: 0.3.3 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': registry.npmjs.org/@jridgewell/set-array@1.1.2 + '@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15 + '@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.18 + dev: true + + registry.npmjs.org/@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz} + name: '@jridgewell/resolve-uri' + version: 3.1.0 + engines: {node: '>=6.0.0'} + dev: true + + registry.npmjs.org/@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz} + name: '@jridgewell/set-array' + version: 1.1.2 + engines: {node: '>=6.0.0'} + dev: true + + registry.npmjs.org/@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz} + name: '@jridgewell/source-map' + version: 0.3.5 + dependencies: + '@jridgewell/gen-mapping': registry.npmjs.org/@jridgewell/gen-mapping@0.3.3 + '@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.18 + dev: true + + registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz} + name: '@jridgewell/sourcemap-codec' + version: 1.4.14 + dev: true + + registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz} + name: '@jridgewell/sourcemap-codec' + version: 1.4.15 + dev: true + + registry.npmjs.org/@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz} + name: '@jridgewell/trace-mapping' + version: 0.3.18 + dependencies: + '@jridgewell/resolve-uri': registry.npmjs.org/@jridgewell/resolve-uri@3.1.0 + '@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.14 + dev: true + registry.npmjs.org/@lmdb/lmdb-darwin-arm64@2.7.11: resolution: {integrity: sha512-r6+vYq2vKzE+vgj/rNVRMwAevq0+ZR9IeMFIqcSga+wMtMdXQ27KqQ7uS99/yXASg29bos7yHP3yk4x6Iio0lw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.7.11.tgz} name: '@lmdb/lmdb-darwin-arm64' @@ -6792,18 +6847,464 @@ packages: version: 1.1.3 dev: true + registry.npmjs.org/@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz} + name: '@types/eslint-scope' + version: 3.7.4 + dependencies: + '@types/eslint': registry.npmjs.org/@types/eslint@8.44.0 + '@types/estree': registry.npmjs.org/@types/estree@1.0.1 + dev: true + + registry.npmjs.org/@types/eslint@8.44.0: + resolution: {integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz} + name: '@types/eslint' + version: 8.44.0 + dependencies: + '@types/estree': registry.npmjs.org/@types/estree@1.0.1 + '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.12 + dev: true + + registry.npmjs.org/@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz} + name: '@types/estree' + version: 1.0.1 + dev: true + registry.npmjs.org/@types/google-publisher-tag@1.20230410.0: resolution: {integrity: sha512-H2oBE/QXFzxP7iLJq+ohEb5yflIwhIfc6E4F4AkMpiCYfvKFZkQaH2VoBs/Jf8QdthT7ZkHYTzNiRoI2ch0D1Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/google-publisher-tag/-/google-publisher-tag-1.20230410.0.tgz} name: '@types/google-publisher-tag' version: 1.20230410.0 dev: true + registry.npmjs.org/@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz} + name: '@types/json-schema' + version: 7.0.12 + dev: true + + registry.npmjs.org/@types/localtunnel@2.0.1: + resolution: {integrity: sha512-0h/ggh+tp9uKHc2eEOLdMgWW0cNwsQfn6iEE1Y44FszNB4BQyL5N6xvd5BnChZksB0YgVqa5MKxJt0dFoOKRxw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/localtunnel/-/localtunnel-2.0.1.tgz} + name: '@types/localtunnel' + version: 2.0.1 + dependencies: + '@types/node': registry.npmjs.org/@types/node@18.13.0 + dev: true + + registry.npmjs.org/@types/node@18.13.0: + resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz} + name: '@types/node' + version: 18.13.0 + + registry.npmjs.org/@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz} + name: '@webassemblyjs/ast' + version: 1.11.6 + dependencies: + '@webassemblyjs/helper-numbers': registry.npmjs.org/@webassemblyjs/helper-numbers@1.11.6 + '@webassemblyjs/helper-wasm-bytecode': registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode@1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz} + name: '@webassemblyjs/floating-point-hex-parser' + version: 1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz} + name: '@webassemblyjs/helper-api-error' + version: 1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz} + name: '@webassemblyjs/helper-buffer' + version: 1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz} + name: '@webassemblyjs/helper-numbers' + version: 1.11.6 + dependencies: + '@webassemblyjs/floating-point-hex-parser': registry.npmjs.org/@webassemblyjs/floating-point-hex-parser@1.11.6 + '@webassemblyjs/helper-api-error': registry.npmjs.org/@webassemblyjs/helper-api-error@1.11.6 + '@xtuc/long': registry.npmjs.org/@xtuc/long@4.2.2 + dev: true + + registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz} + name: '@webassemblyjs/helper-wasm-bytecode' + version: 1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz} + name: '@webassemblyjs/helper-wasm-section' + version: 1.11.6 + dependencies: + '@webassemblyjs/ast': registry.npmjs.org/@webassemblyjs/ast@1.11.6 + '@webassemblyjs/helper-buffer': registry.npmjs.org/@webassemblyjs/helper-buffer@1.11.6 + '@webassemblyjs/helper-wasm-bytecode': registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode@1.11.6 + '@webassemblyjs/wasm-gen': registry.npmjs.org/@webassemblyjs/wasm-gen@1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz} + name: '@webassemblyjs/ieee754' + version: 1.11.6 + dependencies: + '@xtuc/ieee754': registry.npmjs.org/@xtuc/ieee754@1.2.0 + dev: true + + registry.npmjs.org/@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz} + name: '@webassemblyjs/leb128' + version: 1.11.6 + dependencies: + '@xtuc/long': registry.npmjs.org/@xtuc/long@4.2.2 + dev: true + + registry.npmjs.org/@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz} + name: '@webassemblyjs/utf8' + version: 1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz} + name: '@webassemblyjs/wasm-edit' + version: 1.11.6 + dependencies: + '@webassemblyjs/ast': registry.npmjs.org/@webassemblyjs/ast@1.11.6 + '@webassemblyjs/helper-buffer': registry.npmjs.org/@webassemblyjs/helper-buffer@1.11.6 + '@webassemblyjs/helper-wasm-bytecode': registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode@1.11.6 + '@webassemblyjs/helper-wasm-section': registry.npmjs.org/@webassemblyjs/helper-wasm-section@1.11.6 + '@webassemblyjs/wasm-gen': registry.npmjs.org/@webassemblyjs/wasm-gen@1.11.6 + '@webassemblyjs/wasm-opt': registry.npmjs.org/@webassemblyjs/wasm-opt@1.11.6 + '@webassemblyjs/wasm-parser': registry.npmjs.org/@webassemblyjs/wasm-parser@1.11.6 + '@webassemblyjs/wast-printer': registry.npmjs.org/@webassemblyjs/wast-printer@1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz} + name: '@webassemblyjs/wasm-gen' + version: 1.11.6 + dependencies: + '@webassemblyjs/ast': registry.npmjs.org/@webassemblyjs/ast@1.11.6 + '@webassemblyjs/helper-wasm-bytecode': registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode@1.11.6 + '@webassemblyjs/ieee754': registry.npmjs.org/@webassemblyjs/ieee754@1.11.6 + '@webassemblyjs/leb128': registry.npmjs.org/@webassemblyjs/leb128@1.11.6 + '@webassemblyjs/utf8': registry.npmjs.org/@webassemblyjs/utf8@1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz} + name: '@webassemblyjs/wasm-opt' + version: 1.11.6 + dependencies: + '@webassemblyjs/ast': registry.npmjs.org/@webassemblyjs/ast@1.11.6 + '@webassemblyjs/helper-buffer': registry.npmjs.org/@webassemblyjs/helper-buffer@1.11.6 + '@webassemblyjs/wasm-gen': registry.npmjs.org/@webassemblyjs/wasm-gen@1.11.6 + '@webassemblyjs/wasm-parser': registry.npmjs.org/@webassemblyjs/wasm-parser@1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz} + name: '@webassemblyjs/wasm-parser' + version: 1.11.6 + dependencies: + '@webassemblyjs/ast': registry.npmjs.org/@webassemblyjs/ast@1.11.6 + '@webassemblyjs/helper-api-error': registry.npmjs.org/@webassemblyjs/helper-api-error@1.11.6 + '@webassemblyjs/helper-wasm-bytecode': registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode@1.11.6 + '@webassemblyjs/ieee754': registry.npmjs.org/@webassemblyjs/ieee754@1.11.6 + '@webassemblyjs/leb128': registry.npmjs.org/@webassemblyjs/leb128@1.11.6 + '@webassemblyjs/utf8': registry.npmjs.org/@webassemblyjs/utf8@1.11.6 + dev: true + + registry.npmjs.org/@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz} + name: '@webassemblyjs/wast-printer' + version: 1.11.6 + dependencies: + '@webassemblyjs/ast': registry.npmjs.org/@webassemblyjs/ast@1.11.6 + '@xtuc/long': registry.npmjs.org/@xtuc/long@4.2.2 + dev: true + + registry.npmjs.org/@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz} + name: '@xtuc/ieee754' + version: 1.2.0 + dev: true + + registry.npmjs.org/@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz} + name: '@xtuc/long' + version: 4.2.2 + dev: true + + registry.npmjs.org/acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz} + id: registry.npmjs.org/acorn-import-assertions/1.9.0 + name: acorn-import-assertions + version: 1.9.0 + peerDependencies: + acorn: ^8 + dependencies: + acorn: registry.npmjs.org/acorn@8.10.0 + dev: true + + registry.npmjs.org/acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz} + name: acorn + version: 8.10.0 + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + registry.npmjs.org/ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz} + id: registry.npmjs.org/ajv-keywords/3.5.2 + name: ajv-keywords + version: 3.5.2 + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: registry.npmjs.org/ajv@6.12.6 + dev: true + + registry.npmjs.org/ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz} + name: ajv + version: 6.12.6 + dependencies: + fast-deep-equal: registry.npmjs.org/fast-deep-equal@3.1.3 + fast-json-stable-stringify: registry.npmjs.org/fast-json-stable-stringify@2.1.0 + json-schema-traverse: registry.npmjs.org/json-schema-traverse@0.4.1 + uri-js: registry.npmjs.org/uri-js@4.4.1 + dev: true + + registry.npmjs.org/assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/assert/-/assert-2.0.0.tgz} + name: assert + version: 2.0.0 + dependencies: + es6-object-assign: registry.npmjs.org/es6-object-assign@1.1.0 + is-nan: registry.npmjs.org/is-nan@1.3.2 + object-is: registry.npmjs.org/object-is@1.1.5 + util: registry.npmjs.org/util@0.12.3 + dev: true + + registry.npmjs.org/available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz} + name: available-typed-arrays + version: 1.0.5 + engines: {node: '>= 0.4'} + dev: true + + registry.npmjs.org/big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz} + name: big.js + version: 5.2.2 + dev: true + + registry.npmjs.org/browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz} + name: browserify-zlib + version: 0.2.0 + dependencies: + pako: registry.npmjs.org/pako@1.0.11 + dev: true + + registry.npmjs.org/browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz} + name: browserslist + version: 4.21.9 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: registry.npmjs.org/caniuse-lite@1.0.30001507 + electron-to-chromium: registry.npmjs.org/electron-to-chromium@1.4.440 + node-releases: registry.npmjs.org/node-releases@2.0.12 + update-browserslist-db: registry.npmjs.org/update-browserslist-db@1.0.11(browserslist@4.21.9) + dev: true + + registry.npmjs.org/buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz} + name: buffer-from + version: 1.1.2 + dev: true + + registry.npmjs.org/builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz} + name: builtin-status-codes + version: 3.0.0 + dev: true + + registry.npmjs.org/call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz} + name: call-bind + version: 1.0.2 + dependencies: + function-bind: registry.npmjs.org/function-bind@1.1.1 + get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.1 + dev: true + + registry.npmjs.org/camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz} + name: camelcase + version: 4.1.0 + engines: {node: '>=4'} + dev: false + + registry.npmjs.org/caniuse-lite@1.0.30001507: + resolution: {integrity: sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz} + name: caniuse-lite + version: 1.0.30001507 + dev: true + registry.npmjs.org/chance@1.1.11: resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/chance/-/chance-1.1.11.tgz} name: chance version: 1.1.11 dev: false + registry.npmjs.org/chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz} + name: chrome-trace-event + version: 1.0.3 + engines: {node: '>=6.0'} + dev: true + + registry.npmjs.org/commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/commander/-/commander-2.20.3.tgz} + name: commander + version: 2.20.3 + dev: true + + registry.npmjs.org/cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz} + name: cross-fetch + version: 3.1.8 + dependencies: + node-fetch: registry.npmjs.org/node-fetch@2.6.12 + transitivePeerDependencies: + - encoding + dev: false + + registry.npmjs.org/define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz} + name: define-properties + version: 1.2.0 + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: registry.npmjs.org/has-property-descriptors@1.0.0 + object-keys: registry.npmjs.org/object-keys@1.1.1 + dev: true + + registry.npmjs.org/electron-to-chromium@1.4.440: + resolution: {integrity: sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz} + name: electron-to-chromium + version: 1.4.440 + dev: true + + registry.npmjs.org/emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz} + name: emojis-list + version: 3.0.0 + engines: {node: '>= 4'} + dev: true + + registry.npmjs.org/enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz} + name: enhanced-resolve + version: 5.15.0 + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 + tapable: registry.npmjs.org/tapable@2.2.1 + dev: true + + registry.npmjs.org/es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz} + name: es-module-lexer + version: 1.3.0 + dev: true + + registry.npmjs.org/es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz} + name: es6-object-assign + version: 1.1.0 + dev: true + + registry.npmjs.org/escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz} + name: escalade + version: 3.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz} + name: eslint-scope + version: 5.1.1 + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: registry.npmjs.org/esrecurse@4.3.0 + estraverse: registry.npmjs.org/estraverse@4.3.0 + dev: true + + registry.npmjs.org/esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz} + name: esrecurse + version: 4.3.0 + engines: {node: '>=4.0'} + dependencies: + estraverse: registry.npmjs.org/estraverse@5.3.0 + dev: true + + registry.npmjs.org/estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz} + name: estraverse + version: 4.3.0 + engines: {node: '>=4.0'} + dev: true + + registry.npmjs.org/estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz} + name: estraverse + version: 5.3.0 + engines: {node: '>=4.0'} + dev: true + + registry.npmjs.org/events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/events/-/events-3.3.0.tgz} + name: events + version: 3.3.0 + engines: {node: '>=0.8.x'} + dev: true + + registry.npmjs.org/fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} + name: fast-deep-equal + version: 3.1.3 + dev: true + + registry.npmjs.org/fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} + name: fast-json-stable-stringify + version: 2.1.0 + dev: true + + registry.npmjs.org/for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz} + name: for-each + version: 0.3.3 + dependencies: + is-callable: registry.npmjs.org/is-callable@1.2.7 + dev: true + registry.npmjs.org/fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz} name: fsevents @@ -6814,12 +7315,202 @@ packages: dev: true optional: true + registry.npmjs.org/function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz} + name: function-bind + version: 1.1.1 + dev: true + + registry.npmjs.org/get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz} + name: get-intrinsic + version: 1.2.1 + dependencies: + function-bind: registry.npmjs.org/function-bind@1.1.1 + has: registry.npmjs.org/has@1.0.3 + has-proto: registry.npmjs.org/has-proto@1.0.1 + has-symbols: registry.npmjs.org/has-symbols@1.0.3 + dev: true + + registry.npmjs.org/glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz} + name: glob-to-regexp + version: 0.4.1 + dev: true + + registry.npmjs.org/gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz} + name: gopd + version: 1.0.1 + dependencies: + get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.1 + dev: true + + registry.npmjs.org/graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz} + name: graceful-fs + version: 4.2.11 + dev: true + + registry.npmjs.org/has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz} + name: has-flag + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz} + name: has-property-descriptors + version: 1.0.0 + dependencies: + get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.1 + dev: true + + registry.npmjs.org/has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz} + name: has-proto + version: 1.0.1 + engines: {node: '>= 0.4'} + dev: true + + registry.npmjs.org/has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz} + name: has-symbols + version: 1.0.3 + engines: {node: '>= 0.4'} + dev: true + + registry.npmjs.org/has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz} + name: has-tostringtag + version: 1.0.0 + engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmjs.org/has-symbols@1.0.3 + dev: true + + registry.npmjs.org/has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/has/-/has-1.0.3.tgz} + name: has + version: 1.0.3 + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: registry.npmjs.org/function-bind@1.1.1 + dev: true + + registry.npmjs.org/https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz} + name: https-browserify + version: 1.0.0 + dev: true + + registry.npmjs.org/hyntax@1.1.9: + resolution: {integrity: sha512-xjxyDLbVDdLgjPnl4NM+Iu6il3UPmk6PNCBXruQKeuKDc/HtaZx1hk1AtMgw3vsn9YnLZRfoBpPxYMXcoT5KAA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/hyntax/-/hyntax-1.1.9.tgz} + name: hyntax + version: 1.1.9 + engines: {node: '>=6.11.1', npm: '>=5.3.0'} + dev: false + + registry.npmjs.org/infobox-parser@3.6.2: + resolution: {integrity: sha512-lasdwvbtjCtDDO6mArAs/ueFEnBJRyo2UbZPAkd5rEG5NVJ3XFCOvbMwNTT/rJlFv1+ORw8D3UvZV4brpgATCg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/infobox-parser/-/infobox-parser-3.6.2.tgz} + name: infobox-parser + version: 3.6.2 + dependencies: + camelcase: registry.npmjs.org/camelcase@4.1.0 + dev: false + + registry.npmjs.org/inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz} + name: inherits + version: 2.0.4 + + registry.npmjs.org/is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz} + name: is-arguments + version: 1.1.1 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmjs.org/call-bind@1.0.2 + has-tostringtag: registry.npmjs.org/has-tostringtag@1.0.0 + dev: true + + registry.npmjs.org/is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz} + name: is-callable + version: 1.2.7 + engines: {node: '>= 0.4'} + dev: true + + registry.npmjs.org/is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz} + name: is-generator-function + version: 1.0.10 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmjs.org/has-tostringtag@1.0.0 + dev: true + + registry.npmjs.org/is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz} + name: is-nan + version: 1.3.2 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmjs.org/call-bind@1.0.2 + define-properties: registry.npmjs.org/define-properties@1.2.0 + dev: true + + registry.npmjs.org/is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz} + name: is-typed-array + version: 1.1.10 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmjs.org/available-typed-arrays@1.0.5 + call-bind: registry.npmjs.org/call-bind@1.0.2 + for-each: registry.npmjs.org/for-each@0.3.3 + gopd: registry.npmjs.org/gopd@1.0.1 + has-tostringtag: registry.npmjs.org/has-tostringtag@1.0.0 + dev: true + + registry.npmjs.org/jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz} + name: jest-worker + version: 27.5.1 + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': registry.npmjs.org/@types/node@18.13.0 + merge-stream: registry.npmjs.org/merge-stream@2.0.0 + supports-color: registry.npmjs.org/supports-color@8.1.1 + dev: true + registry.npmjs.org/js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz} name: js-tokens version: 4.0.0 dev: true + registry.npmjs.org/json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz} + name: json-parse-even-better-errors + version: 2.3.1 + dev: true + + registry.npmjs.org/json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz} + name: json-schema-traverse + version: 0.4.1 + dev: true + + registry.npmjs.org/json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/json5/-/json5-2.2.3.tgz} + name: json5 + version: 2.2.3 + engines: {node: '>=6'} + hasBin: true + dev: true + registry.npmjs.org/lightningcss-darwin-arm64@1.21.1: resolution: {integrity: sha512-dljpsZ15RN4AxI958n9qO7sAv29FRuUMCB10CSDBGmDOW+oDDbNLs1k5/7MlYg5FXnZqznUSTtHBFHFyo1Rs2Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.1.tgz} name: lightningcss-darwin-arm64 @@ -6908,6 +7599,24 @@ packages: dev: true optional: true + registry.npmjs.org/loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz} + name: loader-runner + version: 4.3.0 + engines: {node: '>=6.11.5'} + dev: true + + registry.npmjs.org/loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz} + name: loader-utils + version: 2.0.4 + engines: {node: '>=8.9.0'} + dependencies: + big.js: registry.npmjs.org/big.js@5.2.2 + emojis-list: registry.npmjs.org/emojis-list@3.0.0 + json5: registry.npmjs.org/json5@2.2.3 + dev: true + registry.npmjs.org/loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz} name: loose-envify @@ -6917,6 +7626,28 @@ packages: js-tokens: registry.npmjs.org/js-tokens@4.0.0 dev: true + registry.npmjs.org/merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz} + name: merge-stream + version: 2.0.0 + dev: true + + registry.npmjs.org/mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz} + name: mime-db + version: 1.52.0 + engines: {node: '>= 0.6'} + dev: true + + registry.npmjs.org/mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz} + name: mime-types + version: 2.1.35 + engines: {node: '>= 0.6'} + dependencies: + mime-db: registry.npmjs.org/mime-db@1.52.0 + dev: true + registry.npmjs.org/msgpackr-extract@3.0.2: resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz} name: msgpackr-extract @@ -6935,6 +7666,105 @@ packages: dev: true optional: true + registry.npmjs.org/neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz} + name: neo-async + version: 2.6.2 + dev: true + + registry.npmjs.org/node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz} + name: node-fetch + version: 2.6.12 + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: registry.npmjs.org/whatwg-url@5.0.0 + dev: false + + registry.npmjs.org/node-releases@2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz} + name: node-releases + version: 2.0.12 + dev: true + + registry.npmjs.org/object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz} + name: object-is + version: 1.1.5 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmjs.org/call-bind@1.0.2 + define-properties: registry.npmjs.org/define-properties@1.2.0 + dev: true + + registry.npmjs.org/object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz} + name: object-keys + version: 1.1.1 + engines: {node: '>= 0.4'} + dev: true + + registry.npmjs.org/pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/pako/-/pako-1.0.11.tgz} + name: pako + version: 1.0.11 + dev: true + + registry.npmjs.org/pdfdataextract@3.2.0(worker-loader@3.0.8): + resolution: {integrity: sha512-t4W7h+cdr/aefdftzxmf+3w4ntVO70OlOFAGgH2zrbc+lDmYKIzAUXJhP+zpIqK6SnkRnZrQOC0fv/sejUJnrg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/pdfdataextract/-/pdfdataextract-3.2.0.tgz} + id: registry.npmjs.org/pdfdataextract/3.2.0 + name: pdfdataextract + version: 3.2.0 + dependencies: + pdfjs-dist: registry.npmjs.org/pdfjs-dist@2.10.377(worker-loader@3.0.8) + transitivePeerDependencies: + - worker-loader + dev: true + + registry.npmjs.org/pdfjs-dist@2.10.377(worker-loader@3.0.8): + resolution: {integrity: sha512-i0jRShtvgfsVQUNCoFYH4SVhPO3U0yhtiFLfZ0RR0B+68N+Vnwq+8B3cjWjLEwWGh8wg1XQ/sYMYKUlHn/Qpsw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.10.377.tgz} + id: registry.npmjs.org/pdfjs-dist/2.10.377 + name: pdfjs-dist + version: 2.10.377 + peerDependencies: + worker-loader: ^3.0.7 + dependencies: + worker-loader: registry.npmjs.org/worker-loader@3.0.8(webpack@5.88.1) + dev: true + + registry.npmjs.org/picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz} + name: picocolors + version: 1.0.0 + dev: true + + registry.npmjs.org/punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz} + name: punycode + version: 2.3.0 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz} + name: querystring-es3 + version: 0.2.1 + engines: {node: '>=0.4.x'} + dev: true + + registry.npmjs.org/randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz} + name: randombytes + version: 2.1.0 + dependencies: + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 + dev: true + registry.npmjs.org/react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/react/-/react-18.2.0.tgz} name: react @@ -6944,6 +7774,53 @@ packages: loose-envify: registry.npmjs.org/loose-envify@1.4.0 dev: true + registry.npmjs.org/readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz} + name: readable-stream + version: 2.3.8 + dependencies: + core-util-is: 1.0.3 + inherits: registry.npmjs.org/inherits@2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: registry.npmjs.org/safe-buffer@5.1.2 + string_decoder: registry.npmjs.org/string_decoder@1.1.1 + util-deprecate: registry.npmjs.org/util-deprecate@1.0.2 + dev: false + + registry.npmjs.org/readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz} + name: readable-stream + version: 3.6.2 + engines: {node: '>= 6'} + dependencies: + inherits: registry.npmjs.org/inherits@2.0.4 + string_decoder: registry.npmjs.org/string_decoder@1.3.0 + util-deprecate: registry.npmjs.org/util-deprecate@1.0.2 + + registry.npmjs.org/readable-stream@4.4.0: + resolution: {integrity: sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz} + name: readable-stream + version: 4.4.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + dev: false + + registry.npmjs.org/safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz} + name: safe-buffer + version: 5.1.2 + dev: false + + registry.npmjs.org/safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz} + name: safe-buffer + version: 5.2.1 + registry.npmjs.org/saslprep@1.0.3: resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz} name: saslprep @@ -6954,3 +7831,288 @@ packages: sparse-bitfield: 3.0.3 dev: false optional: true + + registry.npmjs.org/schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz} + name: schema-utils + version: 3.3.0 + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.12 + ajv: registry.npmjs.org/ajv@6.12.6 + ajv-keywords: registry.npmjs.org/ajv-keywords@3.5.2(ajv@6.12.6) + dev: true + + registry.npmjs.org/serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz} + name: serialize-javascript + version: 6.0.1 + dependencies: + randombytes: registry.npmjs.org/randombytes@2.1.0 + dev: true + + registry.npmjs.org/source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz} + name: source-map-support + version: 0.5.21 + dependencies: + buffer-from: registry.npmjs.org/buffer-from@1.1.2 + source-map: registry.npmjs.org/source-map@0.6.1 + dev: true + + registry.npmjs.org/source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz} + name: source-map + version: 0.6.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz} + name: stream-http + version: 3.2.0 + dependencies: + builtin-status-codes: registry.npmjs.org/builtin-status-codes@3.0.0 + inherits: registry.npmjs.org/inherits@2.0.4 + readable-stream: registry.npmjs.org/readable-stream@3.6.2 + xtend: registry.npmjs.org/xtend@4.0.2 + dev: true + + registry.npmjs.org/string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz} + name: string_decoder + version: 1.1.1 + dependencies: + safe-buffer: registry.npmjs.org/safe-buffer@5.1.2 + dev: false + + registry.npmjs.org/string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz} + name: string_decoder + version: 1.3.0 + dependencies: + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 + + registry.npmjs.org/supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz} + name: supports-color + version: 8.1.1 + engines: {node: '>=10'} + dependencies: + has-flag: registry.npmjs.org/has-flag@4.0.0 + dev: true + + registry.npmjs.org/tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz} + name: tapable + version: 2.2.1 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/terser-webpack-plugin@5.3.9(webpack@5.88.1): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz} + id: registry.npmjs.org/terser-webpack-plugin/5.3.9 + name: terser-webpack-plugin + version: 5.3.9 + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.18 + jest-worker: registry.npmjs.org/jest-worker@27.5.1 + schema-utils: registry.npmjs.org/schema-utils@3.3.0 + serialize-javascript: registry.npmjs.org/serialize-javascript@6.0.1 + terser: registry.npmjs.org/terser@5.19.0 + webpack: registry.npmjs.org/webpack@5.88.1 + dev: true + + registry.npmjs.org/terser@5.19.0: + resolution: {integrity: sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/terser/-/terser-5.19.0.tgz} + name: terser + version: 5.19.0 + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': registry.npmjs.org/@jridgewell/source-map@0.3.5 + acorn: registry.npmjs.org/acorn@8.10.0 + commander: registry.npmjs.org/commander@2.20.3 + source-map-support: registry.npmjs.org/source-map-support@0.5.21 + dev: true + + registry.npmjs.org/tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz} + name: tr46 + version: 0.0.3 + dev: false + + registry.npmjs.org/update-browserslist-db@1.0.11(browserslist@4.21.9): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz} + id: registry.npmjs.org/update-browserslist-db/1.0.11 + name: update-browserslist-db + version: 1.0.11 + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: registry.npmjs.org/browserslist@4.21.9 + escalade: registry.npmjs.org/escalade@3.1.1 + picocolors: registry.npmjs.org/picocolors@1.0.0 + dev: true + + registry.npmjs.org/uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz} + name: uri-js + version: 4.4.1 + dependencies: + punycode: registry.npmjs.org/punycode@2.3.0 + dev: true + + registry.npmjs.org/util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz} + name: util-deprecate + version: 1.0.2 + + registry.npmjs.org/util@0.12.3: + resolution: {integrity: sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/util/-/util-0.12.3.tgz} + name: util + version: 0.12.3 + dependencies: + inherits: registry.npmjs.org/inherits@2.0.4 + is-arguments: registry.npmjs.org/is-arguments@1.1.1 + is-generator-function: registry.npmjs.org/is-generator-function@1.0.10 + is-typed-array: registry.npmjs.org/is-typed-array@1.1.10 + safe-buffer: registry.npmjs.org/safe-buffer@5.2.1 + which-typed-array: registry.npmjs.org/which-typed-array@1.1.9 + dev: true + + registry.npmjs.org/watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz} + name: watchpack + version: 2.4.0 + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: registry.npmjs.org/glob-to-regexp@0.4.1 + graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 + dev: true + + registry.npmjs.org/webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz} + name: webidl-conversions + version: 3.0.1 + dev: false + + registry.npmjs.org/webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz} + name: webpack-sources + version: 3.2.3 + engines: {node: '>=10.13.0'} + dev: true + + registry.npmjs.org/webpack@5.88.1: + resolution: {integrity: sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz} + name: webpack + version: 5.88.1 + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': registry.npmjs.org/@types/eslint-scope@3.7.4 + '@types/estree': registry.npmjs.org/@types/estree@1.0.1 + '@webassemblyjs/ast': registry.npmjs.org/@webassemblyjs/ast@1.11.6 + '@webassemblyjs/wasm-edit': registry.npmjs.org/@webassemblyjs/wasm-edit@1.11.6 + '@webassemblyjs/wasm-parser': registry.npmjs.org/@webassemblyjs/wasm-parser@1.11.6 + acorn: registry.npmjs.org/acorn@8.10.0 + acorn-import-assertions: registry.npmjs.org/acorn-import-assertions@1.9.0(acorn@8.10.0) + browserslist: registry.npmjs.org/browserslist@4.21.9 + chrome-trace-event: registry.npmjs.org/chrome-trace-event@1.0.3 + enhanced-resolve: registry.npmjs.org/enhanced-resolve@5.15.0 + es-module-lexer: registry.npmjs.org/es-module-lexer@1.3.0 + eslint-scope: registry.npmjs.org/eslint-scope@5.1.1 + events: registry.npmjs.org/events@3.3.0 + glob-to-regexp: registry.npmjs.org/glob-to-regexp@0.4.1 + graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 + json-parse-even-better-errors: registry.npmjs.org/json-parse-even-better-errors@2.3.1 + loader-runner: registry.npmjs.org/loader-runner@4.3.0 + mime-types: registry.npmjs.org/mime-types@2.1.35 + neo-async: registry.npmjs.org/neo-async@2.6.2 + schema-utils: registry.npmjs.org/schema-utils@3.3.0 + tapable: registry.npmjs.org/tapable@2.2.1 + terser-webpack-plugin: registry.npmjs.org/terser-webpack-plugin@5.3.9(webpack@5.88.1) + watchpack: registry.npmjs.org/watchpack@2.4.0 + webpack-sources: registry.npmjs.org/webpack-sources@3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + registry.npmjs.org/whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz} + name: whatwg-url + version: 5.0.0 + dependencies: + tr46: registry.npmjs.org/tr46@0.0.3 + webidl-conversions: registry.npmjs.org/webidl-conversions@3.0.1 + dev: false + + registry.npmjs.org/which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz} + name: which-typed-array + version: 1.1.9 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmjs.org/available-typed-arrays@1.0.5 + call-bind: registry.npmjs.org/call-bind@1.0.2 + for-each: registry.npmjs.org/for-each@0.3.3 + gopd: registry.npmjs.org/gopd@1.0.1 + has-tostringtag: registry.npmjs.org/has-tostringtag@1.0.0 + is-typed-array: registry.npmjs.org/is-typed-array@1.1.10 + dev: true + + registry.npmjs.org/wikijs@6.4.1: + resolution: {integrity: sha512-fnYyT9ISD9hFgAxFJu7Kzsomz48w7FpvvAfTuArvkMQY1bG9JPXoyURqUzYGcQA8FCq6MuZfjqT/6hP8Mh4hQA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/wikijs/-/wikijs-6.4.1.tgz} + name: wikijs + version: 6.4.1 + engines: {node: '>=0.10.4'} + dependencies: + cross-fetch: registry.npmjs.org/cross-fetch@3.1.8 + hyntax: registry.npmjs.org/hyntax@1.1.9 + infobox-parser: registry.npmjs.org/infobox-parser@3.6.2 + transitivePeerDependencies: + - encoding + dev: false + + registry.npmjs.org/worker-loader@3.0.8(webpack@5.88.1): + resolution: {integrity: sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz} + id: registry.npmjs.org/worker-loader/3.0.8 + name: worker-loader + version: 3.0.8 + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: registry.npmjs.org/loader-utils@2.0.4 + schema-utils: registry.npmjs.org/schema-utils@3.3.0 + webpack: registry.npmjs.org/webpack@5.88.1 + dev: true + + registry.npmjs.org/xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz} + name: xtend + version: 4.0.2 + engines: {node: '>=0.4'} + dev: true diff --git a/srv/adapter/claude.ts b/srv/adapter/claude.ts index bf66aa4e5..3c18e8b5e 100644 --- a/srv/adapter/claude.ts +++ b/srv/adapter/claude.ts @@ -235,7 +235,12 @@ function createClaudePrompt(opts: AdapterProps): string { ) const gaslightCost = encoder()('Human: ' + gaslight) let ujb = parts.ujb ? `Human: ${parts.ujb}` : '' - ujb = injectPlaceholders(ujb, { opts, parts, encoder: encoder(), characters: opts.characters || {} }) + ujb = injectPlaceholders(ujb, { + opts, + parts, + encoder: encoder(), + characters: opts.characters || {}, + }) const maxBudget = maxContextLength - maxResponseTokens - gaslightCost - encoder()(ujb) - encoder()(opts.replyAs.name + ':') diff --git a/srv/adapter/generate.ts b/srv/adapter/generate.ts index 68dbc9bcb..f7e223e5a 100644 --- a/srv/adapter/generate.ts +++ b/srv/adapter/generate.ts @@ -86,7 +86,7 @@ export async function createInferenceStream(opts: InferenceRequest) { guest: opts.guest, user: opts.user, replyAs: {} as any, - parts: { persona: '', post: [], allPersonas: [] }, + parts: { persona: '', post: [], allPersonas: [], chatEmbeds: [], userEmbeds: [] }, prompt: opts.prompt, sender: {} as any, settings: mapPresetsToAdapter(opts.settings, opts.settings.service!), @@ -119,6 +119,8 @@ export async function createTextStreamV2(opts: GenerateRequestV2, log: AppLog, g replyAs: opts.replyAs, impersonate: opts.impersonate, characters: opts.characters, + chatEmbeds: opts.chatEmbeds || [], + userEmbeds: opts.userEmbeds || [], }, [...opts.lines].reverse(), encoder diff --git a/srv/adapter/type.ts b/srv/adapter/type.ts index b4df75c91..32619fb6b 100644 --- a/srv/adapter/type.ts +++ b/srv/adapter/type.ts @@ -1,6 +1,7 @@ import type { PromptParts } from '../../common/prompt' import { AppSchema } from '../../common/types/schema' import { AppLog } from '../logger' +import { Memory } from '/common/types' export type GenerateRequestV2 = { requestId: string @@ -33,6 +34,8 @@ export type GenerateRequestV2 = { /** Date ISO string */ lastMessage?: string + chatEmbeds?: Array> + userEmbeds?: Memory.UserEmbed[] } export type GenerateOptions = { diff --git a/srv/api/chat/edit.ts b/srv/api/chat/edit.ts index cf09e94bf..6106d706d 100644 --- a/srv/api/chat/edit.ts +++ b/srv/api/chat/edit.ts @@ -20,6 +20,7 @@ export const updateChat = handle(async ({ params, body, user }) => { overrides: { '?': 'any?', ...personaValidator }, scenarioIds: ['string?'], useOverrides: 'boolean?', + userEmbedId: 'string?', }, body, true @@ -34,6 +35,7 @@ export const updateChat = handle(async ({ params, body, user }) => { mode: body.mode ?? prev.mode, adapter: body.adapter ?? prev.adapter, memoryId: body.memoryId ?? prev.memoryId, + userEmbedId: body.userEmbedId ?? prev.userEmbedId, scenarioIds: body.scenarioIds ?? [], } diff --git a/srv/api/chat/message.ts b/srv/api/chat/message.ts index 971f8f673..1084c80df 100644 --- a/srv/api/chat/message.ts +++ b/srv/api/chat/message.ts @@ -49,11 +49,15 @@ const genValidator = { sampleChat: ['string?'], post: ['string'], allPersonas: 'any?', + chatEmbeds: 'any?', + userEmbeds: 'any?', }, lines: ['string'], text: 'string?', settings: 'any?', lastMessage: 'string?', + chatEmbeds: 'any?', + userEmbeds: 'any?', } as const export const getMessages = handle(async ({ userId, params, query }) => { diff --git a/srv/api/pipeline.ts b/srv/api/pipeline.ts new file mode 100644 index 000000000..a82943340 --- /dev/null +++ b/srv/api/pipeline.ts @@ -0,0 +1,30 @@ +import needle from 'needle' +import { StatusError, wrap } from './wrap' +import { Router } from 'express' + +const router = Router() + +const proxy = wrap(async (req) => { + const method = req.method === 'GET' ? 'get' : req.method === 'DELETE' ? 'delete' : 'post' + const body = method === 'post' ? req.body : undefined + + /** + * @todo + * Consider allowing a configurable URL for pipeline. + * Potentially use environment variable. + */ + + const res = + method === 'post' + ? await needle(method, `http://localhost:5001${req.baseUrl}`, body, { json: true }) + : await needle(method, `http://localhost:5001${req.baseUrl}`, { json: true }) + + if (res.statusCode && res.statusCode >= 400) { + throw new StatusError(res.statusMessage || res.body, res.statusCode) + } + return res.body +}) + +router.use('/*', proxy) + +export default router diff --git a/srv/api/settings.ts b/srv/api/settings.ts index 5dc71238f..db69e5e99 100644 --- a/srv/api/settings.ts +++ b/srv/api/settings.ts @@ -38,6 +38,7 @@ export async function getAppConfig() { patreon: config.ui.patreon, policies: config.ui.policies, authUrls: config.auth.urls, + pipelineProxyEnabled: config.pipelineProxy, } } diff --git a/srv/app.ts b/srv/app.ts index 42c833ff4..680534239 100644 --- a/srv/app.ts +++ b/srv/app.ts @@ -8,6 +8,7 @@ import { resolve } from 'path' import { setupSockets } from './api/ws' import { config } from './config' import { createServer } from './server' +import pipeline from './api/pipeline' const upload = multer({ limits: { fileSize: config.limits.upload * 1024 * 1024 } }) @@ -28,6 +29,10 @@ const index = resolve(baseFolder, 'dist', 'index.html') app.use('/api', api) +if (config.pipelineProxy) { + app.use('/pipeline', pipeline) +} + if (!config.storage.enabled) { app.use('/assets', express.static(config.assetFolder)) app.use('/', express.static(config.assetFolder)) diff --git a/srv/bin.ts b/srv/bin.ts index bad975b97..9fc99cf33 100644 --- a/srv/bin.ts +++ b/srv/bin.ts @@ -4,12 +4,11 @@ import * as path from 'path' import * as os from 'os' import { mkdirpSync } from 'mkdirp' import { copyFileSync, readdirSync } from 'fs' - const argv = require('minimist')(process.argv.slice(2)) -const folders = getFolders() const pkg = require('../package.json') +const folders = getFolders() const options: string[] = [] const disableJson = flag( @@ -21,12 +20,9 @@ const disableJson = flag( const debug = flag(`Enable debug logging. This will print payloads sent to the AI`, 'd', 'debug') const port = flag(`Choose the port to run the server on. Default: 3001`, 'p', 'port') -/** - * These are disabled until they are ready for release - */ -const summarizer = false ?? flag(`Run the summarizer pipeline feature`, 's', 'summary') -const memory = false ?? flag(`Run the long-term memory pipeline feature`, 'm', 'memory') -const pipeline = false ?? flag('Enable all pipeline features', 'pipeline') +const pipeline = flag('Run the Pipeline API with the Embedding feature (ChromaDB)', 'pipeline') +const summarizer = false ?? flag(`Pipeline API: Run the text summarizer`, 's', 'summary') +const tunnel = flag('Expose your Agnai server using LocalTunnel', 't', 'tunnel') if (argv.help || argv.h) { help() @@ -37,7 +33,6 @@ if (debug) { } const jsonLocation = flag(`Provide a location for the JSON files folder. Defaults to: ${folders.json}`, 'f', 'files') - const assets = flag(`Provide a location for the assets (images) folder. Defaults to: ${folders.assets}`, 'a', 'assets') if (jsonLocation) { @@ -102,9 +97,13 @@ function help(code = 0) { process.exit(code) } -require('./start') +runPipeline().then(() => { + if (tunnel) { + process.env.PUBLIC_TUNNEL = 'true' + } -runPipeline() + require('./start') +}) function getFolders() { const home = path.resolve(os.homedir(), '.agnai') @@ -176,7 +175,9 @@ function pathExists(path: string) { } async function runPipeline() { - if (!pipeline || !memory || !summarizer) return + if (!pipeline && !summarizer) return + + process.env.PIPELINE_PROXY = 'true' const pip = path.resolve(folders.pipeline, 'bin/pip') const poetry = path.resolve(folders.pipeline, 'bin/poetry') @@ -192,8 +193,8 @@ async function runPipeline() { // await execAsync(`${poetry} show`) await execAsync(`${poetry} install --no-interaction --no-ansi`) - console.log('starting API...') - execAsync(`${poetry} run python -m flask --app ${folders.root}/model/app.py run -p 5001`) + console.log('Starting Pipeline API...') + execAsync(`${poetry} run python ${folders.root}/model/app.py`) } async function execAsync(command: string) { diff --git a/srv/config.ts b/srv/config.ts index b58ee9a43..a9750766f 100644 --- a/srv/config.ts +++ b/srv/config.ts @@ -109,6 +109,8 @@ export const config = { keys: { REPLICATE: env('REPLICATE_KEY', ''), }, + pipelineProxy: !!env('PIPELINE_PROXY', ''), + publicTunnel: !!env('PUBLIC_TUNNEL', ''), } insertInject() diff --git a/srv/module.d.ts b/srv/module.d.ts index 916032f11..fca6711c1 100644 --- a/srv/module.d.ts +++ b/srv/module.d.ts @@ -8,3 +8,9 @@ declare module 'sentencepiece-js' { encodePieices(text: ReturnType): string } } + +declare module '*.js' { + const mod: any = {} + + export = mod +} diff --git a/srv/start.ts b/srv/start.ts index 912df4479..e172148fb 100644 --- a/srv/start.ts +++ b/srv/start.ts @@ -1,5 +1,6 @@ import 'module-alias/register' import './tokenize' +import lt from 'localtunnel' import * as os from 'os' import throng from 'throng' import { initMessageBus } from './api/ws' @@ -23,6 +24,10 @@ export async function start() { server.listen(config.port, '0.0.0.0', async () => { logger.info({ port: config.port, version: pkg.version }, `Server started http://127.0.0.1:${config.port}`) + + if (config.publicTunnel) { + await startTunnel() + } }) if (config.jsonStorage) { @@ -65,3 +70,12 @@ if (config.clustering) { } else { startWorker() } + +async function startTunnel() { + const proxy = await lt({ port: config.port }) + logger.info(`[LocalTunnel] Agnaistic public URL: ${proxy.url}`) + + proxy.on('close', () => { + logger.warn('[LocalTunnel] Agnaistic public URL close') + }) +} diff --git a/tests/__snapshots__/prompt.spec.js.snap b/tests/__snapshots__/prompt.spec.js.snap index f8bdab5bc..91ddbcec4 100644 --- a/tests/__snapshots__/prompt.spec.js.snap +++ b/tests/__snapshots__/prompt.spec.js.snap @@ -156,6 +156,7 @@ Object { ], "parts": Object { "allPersonas": Array [], + "chatEmbeds": Array [], "greeting": "GREETING", "memory": "", "persona": "OtherBot replies a lot", @@ -168,6 +169,7 @@ Object { "scenario": "MAIN MainChar", "systemPrompt": "", "ujb": "", + "userEmbeds": Array [], }, "template": "GASLIGHT TEMPLATE You diff --git a/tests/parser.spec.ts b/tests/parser.spec.ts index f0013f6f3..9e14bc421 100644 --- a/tests/parser.spec.ts +++ b/tests/parser.spec.ts @@ -23,9 +23,7 @@ const history = [ toUserMsg(profile, 'User response'), toBotMsg(chars[1], 'Multibot message'), ] -const lines = history.map( - (h) => `${h.characterId ? characters[h.characterId]?.name : profile.handle}: ${h.msg}` -) +const lines = history.map((h) => `${h.characterId ? characters[h.characterId]?.name : profile.handle}: ${h.msg}`) describe('Template parser tests', () => { it('will render a basic template', () => { @@ -83,18 +81,11 @@ Scenario: {{scenario}} }) }) -function test( - template: string, - overrides: Partial = {}, - charOverrides: Partial = {} -) { +function test(template: string, overrides: Partial = {}, charOverrides: Partial = {}) { return parseTemplate(template, getParseOpts(overrides, charOverrides)) } -function getParseOpts( - overrides: Partial = {}, - charOverrides: Partial = {} -) { +function getParseOpts(overrides: Partial = {}, charOverrides: Partial = {}) { const overChat = overrides.char ? toChat(overrides.char) : chat const overChar = { ...char, ...charOverrides } const parts = getPromptParts( @@ -106,6 +97,8 @@ function getParseOpts( replyAs: overChar, user, kind: 'send', + chatEmbeds: [], + userEmbeds: [], }, lines, encoder diff --git a/tests/util.ts b/tests/util.ts index 0e8468f71..62c5f6d93 100644 --- a/tests/util.ts +++ b/tests/util.ts @@ -35,9 +35,7 @@ const history = [ const characters = toMap([main, replyAs]) -const lines = history.map( - (h) => `${h.characterId ? characters[h.characterId]?.name : profile.handle}: ${h.msg}` -) +const lines = history.map((h) => `${h.characterId ? characters[h.characterId]?.name : profile.handle}: ${h.msg}`) export const entities = { chat, @@ -78,6 +76,8 @@ export function build( replyAs: opts.replyAs || replyAs, characters: {}, lastMessage: '', + chatEmbeds: [], + userEmbeds: [], }, encoder ) @@ -93,18 +93,11 @@ export function toMsg(text: string) { return toUserMsg(profile, text) } -export function template( - prompt: string, - overrides: Partial, - main?: Partial -) { +export function template(prompt: string, overrides: Partial, main?: Partial) { return parseTemplate(prompt, getParseOpts(overrides, main)) } -function getParseOpts( - overrides: Partial = {}, - charOverrides: Partial = {} -) { +function getParseOpts(overrides: Partial = {}, charOverrides: Partial = {}) { const overChat = overrides.char ? toChat(overrides.char) : chat const overChar = { ...main, ...charOverrides } const parts = getPromptParts( @@ -116,6 +109,8 @@ function getParseOpts( replyAs: overChar, user, kind: 'send', + chatEmbeds: [], + userEmbeds: [], }, lines, getEncoder('main', '') diff --git a/web/App.tsx b/web/App.tsx index 5305cbf02..ecd7ab1c7 100644 --- a/web/App.tsx +++ b/web/App.tsx @@ -34,6 +34,8 @@ import FAQ from './pages/Home/FAQ' import CreateChatForm from './pages/Chat/CreateChatForm' import Modal from './shared/Modal' import { ContextProvider } from './store/context' +import PipelineGuide from './pages/Guides/Pipeline' +import MemoryGuide from './pages/Guides/Memory' const App: Component = () => { const state = userStore() @@ -61,6 +63,10 @@ const App: Component = () => { import('./pages/Memory/EditMemoryPage'))} /> import('./pages/TermsOfService'))} /> import('./pages/PrivacyPolicy'))} /> + + + + import('./pages/Invite/InvitesPage'))} /> diff --git a/web/Navigation.tsx b/web/Navigation.tsx index aab8b3f75..a3d28ad68 100644 --- a/web/Navigation.tsx +++ b/web/Navigation.tsx @@ -12,6 +12,7 @@ import { Moon, Settings, ShoppingBag, + Signal, Sliders, Sun, Sword, @@ -122,7 +123,10 @@ const UserNavigation: Component = () => { - Memory + Memory{' '} + + + @@ -205,6 +209,7 @@ const GuestNavigation: Component = () => { config: s.config, guest: s.guestAccessAllowed, flags: s.flags, + pipelineOnline: s.pipelineOnline, })) return ( @@ -235,6 +240,9 @@ const GuestNavigation: Component = () => { Memory + + + diff --git a/web/pages/Character/CreateChat.tsx b/web/pages/Character/CreateChat.tsx deleted file mode 100644 index 012766c17..000000000 --- a/web/pages/Character/CreateChat.tsx +++ /dev/null @@ -1,351 +0,0 @@ -import { useNavigate } from '@solidjs/router' -import { Check, X } from 'lucide-solid' -import { Component, createEffect, createMemo, createSignal, For, onMount, Show } from 'solid-js' -import Button from '../../shared/Button' -import Select from '../../shared/Select' -import Modal from '../../shared/Modal' -import PersonaAttributes, { getAttributeMap } from '../../shared/PersonaAttributes' -import TextInput from '../../shared/TextInput' -import { getStrictForm } from '../../shared/util' -import { NewChat, characterStore, chatStore, presetStore, scenarioStore, settingStore, userStore } from '../../store' -import CharacterSelect from '../../shared/CharacterSelect' -import { AutoPreset, getPresetOptions } from '../../shared/adapter' -import { defaultPresets, isDefaultPreset } from '/common/presets' -import { AppSchema } from '/common/types' -import ServiceWarning from '/web/shared/ServiceWarning' -import { PresetSelect } from '/web/shared/PresetSelect' -import { Card } from '/web/shared/Card' -import { Toggle } from '/web/shared/Toggle' -import Divider from '/web/shared/Divider' - -const options = [ - { value: 'wpp', label: 'W++' }, - { value: 'boostyle', label: 'Boostyle' }, - { value: 'sbf', label: 'SBF' }, -] - -const CreateChatModal: Component<{ - show: boolean - close: () => void - charId?: string -}> = (props) => { - let ref: any - - const nav = useNavigate() - const cfg = settingStore() - const user = userStore((s) => ({ ...s.user })) - const presets = presetStore((s) => s.presets) - const scenarios = scenarioStore() - const state = characterStore((s) => ({ - chars: (s.characters?.list || []).filter((c) => c.userId === user._id), - loaded: s.characters.loaded, - })) - - const [selectedId, setSelected] = createSignal() - const [useOverrides, setUseOverrides] = createSignal(false) - const [scenario, setScenario] = createSignal() - - const char = createMemo(() => state.chars.find((ch) => ch._id === selectedId() || ch._id === props.charId)) - - const currScenarios = createMemo(() => { - return [ - { value: '', label: "Use character's scenario" }, - ...scenarios.scenarios.map((s) => ({ label: s.name, value: s._id })), - ] - }) - - createEffect(() => { - if (props.charId) return - const curr = selectedId() - if (curr) return - - if (!state.chars.length) return - setSelected(state.chars[0]._id) - }) - - const [presetId, setPresetId] = createSignal(user.defaultPreset) - - const presetOptions = createMemo(() => { - const opts = getPresetOptions(presets, { builtin: true }).filter((pre) => pre.value !== 'chat') - return [{ label: 'System Built-in Preset (Horde)', value: AutoPreset.service, custom: false }].concat(opts) - }) - - const selectedPreset = createMemo(() => { - const id = presetId() - if (!id) return defaultPresets.horde - if (isDefaultPreset(id)) return defaultPresets[id] - return presets.find((pre) => pre._id === id) - }) - - onMount(() => { - characterStore.getCharacters() - scenarioStore.getAll() - }) - - const setScenarioById = (scenarioId: string) => { - setScenario(scenarios.scenarios.find((s) => s._id === scenarioId)) - } - - const onCreate = () => { - const character = char() - if (!character) return - - const { scenarioId, ...body } = getStrictForm(ref, { - genPreset: 'string', - name: 'string', - greeting: 'string?', - scenario: 'string?', - scenarioId: 'string', - sampleChat: 'string', - schema: ['wpp', 'boostyle', 'sbf', 'text'], - mode: ['standard', 'adventure', null], - } as const) - - const attributes = getAttributeMap(ref) - - const characterId = character._id - - const overrides = useOverrides() - ? { - greeting: body.greeting, - scenario: body.scenario, - sampleChat: body.sampleChat, - genPreset: presetId(), - overrides: { kind: body.schema, attributes }, - } - : { - greeting: undefined, - scenario: undefined, - sampleChat: undefined, - overrides: undefined, - } - - if (useOverrides()) { - overrides.greeting = body.greeting - } - - const payload: NewChat = { - ...body, - ...overrides, - useOverrides: useOverrides(), - } - - /** - * It is correct to use `chat.scenario` as scenario's can only be used when overriding the scenario. - */ - const scenario = scenarios.scenarios.find((s) => s._id === scenarioId && s.overwriteCharacterScenario) - - if (scenario) { - if (scenario.entries.some((e) => e.trigger.kind === 'onGreeting')) payload.greeting = undefined - if (scenario.overwriteCharacterScenario) { - payload.scenario = scenario.text - } else if (scenario.text) { - payload.scenario += '\n' + scenario.text - } - } - /** End of area to validate */ - - chatStore.createChat(characterId, payload, (id) => nav(`/chat/${id}`)) - } - - return ( - - - - - - } - > -
-
- Optionally modify some of the conversation context. You can override other aspects of the character's persona - from the conversation after it is created. -
-
The information provided here is only applied to the newly created conversation.
-
- - - setSelected(c?._id)} - /> - - - - } - /> - - - - setScenarioById(option.value)} - /> - - - - - - - - {/* */} - - - - - - - - - - - -
- - - - - - {(item) => ( - - - - )} - - -
-
-
-
-
- ) -} - -export default CreateChatModal diff --git a/web/pages/Character/card-utils.ts b/web/pages/Character/card-utils.ts index 77b50b664..aa49389be 100644 --- a/web/pages/Character/card-utils.ts +++ b/web/pages/Character/card-utils.ts @@ -1,6 +1,6 @@ import extract from 'png-chunks-extract' import text from 'png-chunk-text' -import { getImageBuffer } from '../../store/data/chars' +import { getFileBuffer } from '../../store/data/chars' export type ImageCard = { name: string @@ -22,7 +22,7 @@ export type ImageCard = { } export async function extractCardData(file: File) { - const buffer = await getImageBuffer(file) + const buffer = await getFileBuffer(file) const extractions = extract(buffer as any) if (!extractions.length) { throw new Error('No extractions found') diff --git a/web/pages/Chat/ChatGenSettings.tsx b/web/pages/Chat/ChatGenSettings.tsx index 213b6e31c..bddb22622 100644 --- a/web/pages/Chat/ChatGenSettings.tsx +++ b/web/pages/Chat/ChatGenSettings.tsx @@ -7,7 +7,7 @@ import GenerationSettings from '../../shared/GenerationSettings' import { getStrictForm } from '../../shared/util' import { chatStore, toastStore, userStore } from '../../store' import { presetStore } from '../../store' -import { getAdapter } from '../../../common/prompt' +import { getAdapter, getChatPreset } from '../../../common/prompt' import { AIAdapter, AI_ADAPTERS, adapterSettings } from '../../../common/adapters' import { AutoPreset, getClientPreset, getPresetOptions } from '../../shared/adapter' import ServiceWarning from '/web/shared/ServiceWarning' @@ -18,7 +18,7 @@ import TextInput from '/web/shared/TextInput' const chatGenValidator = { ...chatGenSettings, - name: 'string?', + name: 'string', service: ['', ...AI_ADAPTERS], } as const @@ -62,7 +62,8 @@ export const ChatGenSettings: Component<{ return { name: preset.name, preset, fallback: true } } - const adapter = genAdapter() || getAdapter(props.chat, user.user).adapter + const preset = getChatPreset(props.chat, user.user, state.presets) + const adapter = genAdapter() || getAdapter(props.chat, user.user, preset).adapter if (!user.user.defaultPresets) { const preset = getFallbackPreset(adapter) @@ -71,9 +72,6 @@ export const ChatGenSettings: Component<{ } const presetId = user.user.defaultPresets[adapter] - const preset = isDefaultPreset(presetId) - ? defaultPresets[presetId] - : state.presets.find((pre) => pre._id === presetId) if (!preset) return const fallback = isDefaultPreset(presetId) @@ -213,13 +211,12 @@ export const ChatGenSettings: Component<{ ) } -function isPresetDirty(original: AppSchema.GenSettings, compare: Omit) { +function isPresetDirty(original: AppSchema.GenSettings, compare: Omit) { const svc = original.service for (const key in compare) { const prop = key as keyof AppSchema.GenSettings switch (prop) { - case 'name': case 'service': continue } diff --git a/web/pages/Chat/ChatSettings.tsx b/web/pages/Chat/ChatSettings.tsx index 849a7fcc3..f6fdaee16 100644 --- a/web/pages/Chat/ChatSettings.tsx +++ b/web/pages/Chat/ChatSettings.tsx @@ -135,6 +135,9 @@ const ChatSettingsModal: Component<{ show: boolean; close: () => void }> = (prop return (
+ + {state.chat?._id} + diff --git a/web/pages/Chat/CreateChatForm.tsx b/web/pages/Chat/CreateChatForm.tsx index 934c93a4c..36a56036e 100644 --- a/web/pages/Chat/CreateChatForm.tsx +++ b/web/pages/Chat/CreateChatForm.tsx @@ -69,7 +69,7 @@ const CreateChatForm: Component<{ setScenario(scenarios.find((s) => s._id === scenarioId)) } - const [presetId, setPresetId] = createSignal(user.defaultPreset) + const [presetId, setPresetId] = createSignal(user.defaultPreset || 'horde') const presets = presetStore((s) => s.presets) const presetOptions = createMemo(() => { diff --git a/web/pages/Chat/components/MemoryModal.tsx b/web/pages/Chat/components/MemoryModal.tsx index 033dab189..0db2e6aac 100644 --- a/web/pages/Chat/components/MemoryModal.tsx +++ b/web/pages/Chat/components/MemoryModal.tsx @@ -1,5 +1,5 @@ import { Save } from 'lucide-solid' -import { Component, createSignal, onMount, Show } from 'solid-js' +import { Component, createMemo, createSignal, onMount, Show } from 'solid-js' import { AppSchema } from '../../../../common/types/schema' import Button from '../../../shared/Button' import Divider from '../../../shared/Divider' @@ -8,6 +8,9 @@ import Modal from '../../../shared/Modal' import { chatStore } from '../../../store' import { memoryStore } from '../../../store' import EditMemoryForm, { EntrySort } from '../../Memory/EditMemory' +import EmbedContent from '../../Memory/EmbedContent' +import PageHeader from '/web/shared/PageHeader' +import { A } from '@solidjs/router' const ChatMemoryModal: Component<{ chat: AppSchema.Chat @@ -17,9 +20,11 @@ const ChatMemoryModal: Component<{ const state = memoryStore((s) => ({ books: s.books, items: s.books.list.map((book) => ({ label: book.name, value: book._id })), + embeds: s.embeds.filter((em) => em.metadata.type === 'user'), })) const [id, setId] = createSignal(props.chat.memoryId || '') + const [embedId, setEmbedId] = createSignal(props.chat.userEmbedId) const [book, setBook] = createSignal() const [entrySort, setEntrySort] = createSignal('creationDate') const updateEntrySort = (item: Option) => { @@ -39,6 +44,7 @@ const ChatMemoryModal: Component<{ onMount(() => { changeBook(props.chat.memoryId || '') + memoryStore.listCollections() }) const onSubmit = (ev: Event) => { @@ -53,6 +59,10 @@ const ChatMemoryModal: Component<{ chatStore.editChat(props.chat._id, { memoryId: id() }, undefined) } + const useUserEmbed = () => { + chatStore.editChat(props.chat._id, { userEmbedId: embedId() }, undefined) + } + const Footer = () => ( <> + + +
diff --git a/web/pages/Guides/Memory.tsx b/web/pages/Guides/Memory.tsx new file mode 100644 index 000000000..668da557a --- /dev/null +++ b/web/pages/Guides/Memory.tsx @@ -0,0 +1,69 @@ +import { Component } from 'solid-js' +import PageHeader from '/web/shared/PageHeader' +import { markdown } from '/web/shared/markdown' + +const MemoryGuide: Component = () => { + return ( + <> + +
+ + ) +} + +const text = ` +## What is it? + +Memory books are a way to dynamically provide context to your characters as you talk with them. Instead of filling up your entire context budget with your \`Scenario\`, \`Persona\` and \`Sample Chat\`, you can use Memory Books instead. + +## How does it work? + +When you create a **Memory Entry**, you provide: \`keywords\` and the \`entry\` text. +You can also provide \`priority\` and \`weight\`, but we'll get to that later. + +- Keywords: + - These are words that "trigger" the memory to be inserted into your prompt. + - E.g. \`drink, thrist, hydrate, hydrate\` +- Entry: + - This is the text that is inserted into your prompt when one of your keywords is found. + - E.g. \`{{user}}'s favourite drink is red cordial on the rocks\` + +Your generation settings will have a **Memory Depth**. This is the maximum number of chat messages that Agnai will scan for keywords. +It is important to remember this all happens in your browser. + +### Why is it important to remember this occurs in the browser? + +_Note: This does not apply to anonymous/guest users. Guest users always have the entire chat history available for prompt building._ + +If you configure your memory depth above \`100\`, the keywords may not trigger as you expect them to. +When you initially load your chat, you will be sent a maximum of 100 messages from the server. You can continue to scroll up to retrieve more messages. + +## What are priority and weight? + +In a nutshell, these two values are used to determine which memories to include in your memory budget (\`memory context limit\`) and in what order they appear in the prompt. + +### Priority + +The higher this value is, the more "important" it is. To evalulate which memories we will include in the prompt: + +- We sort the memories by priority +- We add the memories one by one to the prompt until the budget is full + +### Weight + +The higher this value is, the further toward the bottom of the memory prompt the memory will be. +The theory is: the further toward the bottom of the prompt something is, the more important it is when generating a response. + +After the memories have been "pruned" to fit inside the budget the memories and then sorted by weight. + +## What memory generation settings do you recommend? + +At the moment I have no idea. I would be very interested to hear your experiences as you experiment with them. + +The generation settings available to play with are: \`depth\` and \`contextLimit\`. + +- **Depth**: This is the maximum number of chat messages to scan for keywords. +- **Context Limit**: This is the maximum number of tokens that the memory prompt will consume from your "Max Context Length". +` + +export default MemoryGuide diff --git a/web/pages/Guides/Pipeline.tsx b/web/pages/Guides/Pipeline.tsx new file mode 100644 index 000000000..3d69eed46 --- /dev/null +++ b/web/pages/Guides/Pipeline.tsx @@ -0,0 +1,38 @@ +import { Component } from 'solid-js' +import PageHeader from '/web/shared/PageHeader' +import { markdown } from '/web/shared/markdown' + +const PipelineGuide: Component = () => { + return ( + <> + +
+ + ) +} + +const text = ` +### What is the Pipeline API? +The Pipeline API allows you to run additional features to enhance your conversations. +Agnai.chat and local hosted conversations are both supported. +At the moment, only Embedding support using ChromaDB is currently available. + +### How do I install and run the Pipeline? +- You'll need [Node.JS v16+](https://nodejs.org/en/download) and [Python 3.10+](https://www.python.org/downloads/) installed. +- Install Agnaistic using the NPM Package. From your terminal: \`npm install agnai -g \` +- Run \`agnai --pipeline\` from your terminal + +### How do I now use the Pipeline? +- Head to your \`Settings -> AI Settings\` and enable "Use Local Pipeline" and hit Save. +- If your Pipeline is successfully connected, you will see a notification and a green Signal bar next to \`Memory\` in the main menu. + +### How do I create and use Embeddings? +- In your \`Chat Options -> Memory\` modal, you can create embeddings from Wikipedia Articles or PDFs. This can also be done from the \`Memory -> Embeddings\` page. +- Once created, choose the Embedding from dropdown in the Memory modal and click \`Use Embedding\`. + + +The \`{{user_embed}}\` placeholder will automatically be injected into your prompt if you provide embedding information. +You can also manually add this to the \`{{user_embed}}\` placeholder to your template. +` + +export default PipelineGuide diff --git a/web/pages/Home/index.tsx b/web/pages/Home/index.tsx index 461bf8d54..19f9467f8 100644 --- a/web/pages/Home/index.tsx +++ b/web/pages/Home/index.tsx @@ -57,6 +57,11 @@ const HomePage: Component = () => {
diff --git a/web/pages/Memory/EmbedContent.tsx b/web/pages/Memory/EmbedContent.tsx new file mode 100644 index 000000000..c53e89add --- /dev/null +++ b/web/pages/Memory/EmbedContent.tsx @@ -0,0 +1,101 @@ +import { Component, Show, createSignal } from 'solid-js' +import { getStrictForm } from '/web/shared/util' +import { pipelineApi } from '/web/store/data/pipeline' +import { toastStore } from '/web/store/toasts' +import TextInput from '/web/shared/TextInput' +import Button from '/web/shared/Button' +import { memoryStore, settingStore } from '/web/store' +import FileInput, { FileInputResult } from '/web/shared/FileInput' +import Divider from '/web/shared/Divider' +import { slugify } from '/common/util' + +export { EmbedContent as default } + +const EmbedContent: Component = (props) => { + let ref: any + const cfg = settingStore() + + const [loading, setLoading] = createSignal(false) + const [pdfName, setPdfName] = createSignal('') + const [file, setFile] = createSignal() + + const embedWiki = async () => { + setLoading(true) + try { + const { wiki } = getStrictForm(ref, { wiki: 'string' }) + await pipelineApi.embedArticle(wiki) + toastStore.success('Successfully created embedding') + setLoading(false) + memoryStore.listCollections() + } finally { + setLoading(false) + } + } + + const embedPdf = async () => { + setLoading(true) + try { + const { pdfName } = getStrictForm(ref, { pdfName: 'string' }) + const pdf = file() + if (!pdf) { + toastStore.error(`No PDF loaded`) + return + } + + const slug = slugify(pdfName) + await pipelineApi.embedPdf(slug, pdf) + toastStore.success(`Successfully created embedding: ${slug}`) + memoryStore.listCollections() + } finally { + setLoading(false) + } + } + + const onFile = (files: FileInputResult[]) => { + const file = files[0] + if (!file) { + setFile() + setPdfName('') + return + } + + setFile(() => file.file) + setPdfName(slugify(file.file.name).slice(0, 63)) + } + + return ( + + + + + + + + + + + + + + ) +} diff --git a/web/pages/Memory/index.tsx b/web/pages/Memory/index.tsx index 12550e70e..2d739fbf8 100644 --- a/web/pages/Memory/index.tsx +++ b/web/pages/Memory/index.tsx @@ -1,17 +1,65 @@ import { A } from '@solidjs/router' import { assertValid } from '/common/valid' import { Download, Plus, Trash, Upload, X } from 'lucide-solid' -import { Component, createEffect, createSignal, For, Show } from 'solid-js' +import { Component, createEffect, createSignal, For, Match, onMount, Show, Switch } from 'solid-js' import { AppSchema } from '../../../common/types/schema' import Button from '../../shared/Button' import FileInput, { FileInputResult, getFileAsString } from '../../shared/FileInput' import Modal from '../../shared/Modal' import PageHeader from '../../shared/PageHeader' import { setComponentPageTitle } from '../../shared/util' -import { memoryStore, toastStore } from '../../store' +import { memoryStore, settingStore, toastStore } from '../../store' +import Tabs, { useTabs } from '/web/shared/Tabs' +import { Card } from '/web/shared/Card' +import EmbedContent from './EmbedContent' const MemoryPage: Component = () => { setComponentPageTitle('Memory') + const tabs = useTabs(['Books', 'Embeddings']) + const cfg = settingStore() + + return ( + <> + + + + + + + + + + + + + + ) +} + +export default MemoryPage + +const EmbedsTab: Component = (props) => { + const state = memoryStore() + + onMount(() => { + memoryStore.listCollections() + }) + + return ( + <> + + + +
+ embed.metadata.type === 'user')}> + {(each) => {each.name}} + +
+ + ) +} + +const BooksTab: Component = (props) => { const state = memoryStore() const [showImport, setImport] = createSignal(false) @@ -26,7 +74,7 @@ const MemoryPage: Component = () => { return ( <> {' '} @@ -36,6 +84,7 @@ const MemoryPage: Component = () => { } /> +