Full Code of Mintplex-Labs/anything-llm for AI

master 02ee24baac8d cached
997 files
5.8 MB
1.6M tokens
3174 symbols
1 requests
Download .txt
Showing preview only (6,258K chars total). Download the full file or copy to clipboard to get everything.
Repository: Mintplex-Labs/anything-llm
Branch: master
Commit: 02ee24baac8d
Files: 997
Total size: 5.8 MB

Directory structure:
gitextract_5urqiqdy/

├── .devcontainer/
│   ├── README.md
│   └── devcontainer.json
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01_bug.yml
│   │   ├── 02_feature.yml
│   │   ├── 03_documentation.yml
│   │   └── config.yml
│   └── workflows/
│       ├── build-and-push-image-semver.yaml
│       ├── build-and-push-image.yaml
│       ├── build-qa-tag.yaml
│       ├── check-package-versions.yaml
│       ├── check-translations.yaml
│       ├── cleanup-qa-tag.yaml
│       ├── lint.yaml
│       ├── run-tests.yaml
│       └── sponsors.yaml
├── .gitignore
├── .gitmodules
├── .hadolint.yaml
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .vscode/
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── BARE_METAL.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── TERMS_SELF_HOSTED.md
├── cloud-deployments/
│   ├── aws/
│   │   └── cloudformation/
│   │       ├── DEPLOY.md
│   │       ├── aws_https_instructions.md
│   │       └── cloudformation_create_anythingllm.json
│   ├── digitalocean/
│   │   └── terraform/
│   │       ├── DEPLOY.md
│   │       ├── main.tf
│   │       ├── outputs.tf
│   │       └── user_data.tp1
│   ├── gcp/
│   │   └── deployment/
│   │       ├── DEPLOY.md
│   │       └── gcp_deploy_anything_llm.yaml
│   ├── helm/
│   │   └── charts/
│   │       └── anythingllm/
│   │           ├── .helmignore
│   │           ├── Chart.yaml
│   │           ├── README.md
│   │           ├── README.md.gotmpl
│   │           ├── templates/
│   │           │   ├── NOTES.txt
│   │           │   ├── _helpers.tpl
│   │           │   ├── configmap.yaml
│   │           │   ├── deployment.yaml
│   │           │   ├── extra-objects.yaml
│   │           │   ├── ingress.yaml
│   │           │   ├── pvc.yaml
│   │           │   ├── service.yaml
│   │           │   ├── serviceaccount.yaml
│   │           │   └── tests/
│   │           │       └── test-connection.yaml
│   │           └── values.yaml
│   ├── huggingface-spaces/
│   │   └── Dockerfile
│   └── k8/
│       └── manifest.yaml
├── collector/
│   ├── .env.example
│   ├── .gitignore
│   ├── .nvmrc
│   ├── __tests__/
│   │   └── utils/
│   │       ├── WhisperProviders/
│   │       │   └── ffmpeg/
│   │       │       └── index.test.js
│   │       └── url/
│   │           └── index.test.js
│   ├── eslint.config.mjs
│   ├── extensions/
│   │   ├── index.js
│   │   └── resync/
│   │       └── index.js
│   ├── hotdir/
│   │   └── __HOTDIR__.md
│   ├── index.js
│   ├── middleware/
│   │   ├── httpLogger.js
│   │   ├── setDataSigner.js
│   │   └── verifyIntegrity.js
│   ├── nodemon.json
│   ├── package.json
│   ├── processLink/
│   │   ├── convert/
│   │   │   └── generic.js
│   │   ├── helpers/
│   │   │   └── index.js
│   │   └── index.js
│   ├── processRawText/
│   │   └── index.js
│   ├── processSingleFile/
│   │   ├── convert/
│   │   │   ├── asAudio.js
│   │   │   ├── asDocx.js
│   │   │   ├── asEPub.js
│   │   │   ├── asImage.js
│   │   │   ├── asMbox.js
│   │   │   ├── asOfficeMime.js
│   │   │   ├── asPDF/
│   │   │   │   ├── PDFLoader/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── asTxt.js
│   │   │   └── asXlsx.js
│   │   └── index.js
│   ├── storage/
│   │   ├── .gitignore
│   │   └── tmp/
│   │       └── .placeholder
│   ├── utils/
│   │   ├── EncryptionWorker/
│   │   │   └── index.js
│   │   ├── OCRLoader/
│   │   │   ├── index.js
│   │   │   └── validLangs.js
│   │   ├── WhisperProviders/
│   │   │   ├── OpenAiWhisper.js
│   │   │   ├── ffmpeg/
│   │   │   │   └── index.js
│   │   │   └── localWhisper.js
│   │   ├── comKey/
│   │   │   └── index.js
│   │   ├── constants.js
│   │   ├── downloadURIToFile/
│   │   │   └── index.js
│   │   ├── extensions/
│   │   │   ├── Confluence/
│   │   │   │   ├── ConfluenceLoader/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── DrupalWiki/
│   │   │   │   ├── DrupalWiki/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── ObsidianVault/
│   │   │   │   └── index.js
│   │   │   ├── PaperlessNgx/
│   │   │   │   ├── PaperlessNgxLoader/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── RepoLoader/
│   │   │   │   ├── GithubRepo/
│   │   │   │   │   ├── RepoLoader/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── GitlabRepo/
│   │   │   │   │   ├── RepoLoader/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── WebsiteDepth/
│   │   │   │   └── index.js
│   │   │   └── YoutubeTranscript/
│   │   │       ├── YoutubeLoader/
│   │   │       │   ├── index.js
│   │   │       │   └── youtube-transcript.js
│   │   │       └── index.js
│   │   ├── files/
│   │   │   ├── index.js
│   │   │   └── mime.js
│   │   ├── http/
│   │   │   └── index.js
│   │   ├── logger/
│   │   │   └── index.js
│   │   ├── runtimeSettings/
│   │   │   └── index.js
│   │   ├── shell.js
│   │   ├── tokenizer/
│   │   │   └── index.js
│   │   └── url/
│   │       └── index.js
│   └── yarn.lock
├── docker/
│   ├── .env.example
│   ├── Dockerfile
│   ├── HOW_TO_USE_DOCKER.md
│   ├── docker-compose.yml
│   ├── docker-entrypoint.sh
│   ├── docker-healthcheck.sh
│   └── vex/
│       ├── CVE-2019-10790.vex.json
│       ├── CVE-2024-29415.vex.json
│       ├── CVE-2024-37890.vex.json
│       └── CVE-2024-4068.vex.json
├── eslint.config.js
├── extras/
│   ├── scripts/
│   │   └── verifyPackageVersions.mjs
│   ├── support/
│   │   └── announcements/
│   │       ├── 2025-04-08.json
│   │       ├── 2025-07-08.json
│   │       ├── 2026-01-12.json
│   │       └── list.txt
│   └── translator/
│       ├── .env.example
│       ├── README.md
│       └── index.mjs
├── frontend/
│   ├── .env.example
│   ├── .gitignore
│   ├── .nvmrc
│   ├── eslint.config.js
│   ├── index.html
│   ├── jsconfig.json
│   ├── package.json
│   ├── postcss.config.js
│   ├── public/
│   │   ├── manifest.json
│   │   ├── robots.txt
│   │   └── service-workers/
│   │       └── push-notifications.js
│   ├── scripts/
│   │   └── postbuild.js
│   ├── src/
│   │   ├── App.jsx
│   │   ├── AuthContext.jsx
│   │   ├── LogoContext.jsx
│   │   ├── PWAContext.jsx
│   │   ├── PfpContext.jsx
│   │   ├── ThemeContext.jsx
│   │   ├── components/
│   │   │   ├── CanViewChatHistory/
│   │   │   │   └── index.jsx
│   │   │   ├── ChangeWarning/
│   │   │   │   └── index.jsx
│   │   │   ├── ChatBubble/
│   │   │   │   └── index.jsx
│   │   │   ├── CommunityHub/
│   │   │   │   ├── PublishEntityModal/
│   │   │   │   │   ├── AgentFlows/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── SlashCommands/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── SystemPrompts/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   └── UnauthenticatedHubModal/
│   │   │   │       └── index.jsx
│   │   │   ├── ContextualSaveBar/
│   │   │   │   └── index.jsx
│   │   │   ├── DataConnectorOption/
│   │   │   │   └── media/
│   │   │   │       └── index.js
│   │   │   ├── DefaultChat/
│   │   │   │   └── index.jsx
│   │   │   ├── EmbeddingSelection/
│   │   │   │   ├── AzureAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── CohereOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── EmbedderItem/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GeminiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GenericOpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LMStudioOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LemonadeOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LiteLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LocalAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MistralAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── NativeEmbeddingOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OllamaOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenRouterOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── VoyageAiOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── ErrorBoundaryFallback/
│   │   │   │   └── index.jsx
│   │   │   ├── Footer/
│   │   │   │   └── index.jsx
│   │   │   ├── KeyboardShortcutsHelp/
│   │   │   │   └── index.jsx
│   │   │   ├── LLMSelection/
│   │   │   │   ├── AnthropicAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ApiPieOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── AwsBedrockLLMOptions/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── regions.js
│   │   │   │   ├── AzureAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── CohereAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── CometApiLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── DPAISOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── DeepSeekOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── DockerModelRunnerOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── FireworksAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── FoundryOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GeminiLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GenericOpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GiteeAIOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GroqAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── HuggingFaceOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── KoboldCPPOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LLMItem/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LLMProviderOption/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LMStudioOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LemonadeOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LiteLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LocalAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MistralOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MoonshotAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── NovitaLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── NvidiaNimOptions/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   ├── managed.jsx
│   │   │   │   │   └── remote.jsx
│   │   │   │   ├── OllamaLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenRouterOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PPIOLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PerplexityOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PrivateModeOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── SambaNovaOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── TextGenWebUIOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── TogetherAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── XAiLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── ZAiLLMOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── ModalWrapper/
│   │   │   │   └── index.jsx
│   │   │   ├── Modals/
│   │   │   │   ├── DisplayRecoveryCodeModal/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ManageWorkspace/
│   │   │   │   │   ├── DataConnectors/
│   │   │   │   │   │   ├── ConnectorOption/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── Connectors/
│   │   │   │   │   │   │   ├── Confluence/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── DrupalWiki/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── Github/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── Gitlab/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── Obsidian/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── PaperlessNgx/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── WebsiteDepth/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── Youtube/
│   │   │   │   │   │   │       └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Documents/
│   │   │   │   │   │   ├── Directory/
│   │   │   │   │   │   │   ├── ContextMenu/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── FileRow/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── FolderRow/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── FolderSelectionPopup/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── MoveToFolderIcon.jsx
│   │   │   │   │   │   │   ├── NewFolderModal/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   └── utils.js
│   │   │   │   │   │   ├── UploadFile/
│   │   │   │   │   │   │   ├── FileUploadProgress/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── WorkspaceDirectory/
│   │   │   │   │   │   │   ├── WorkspaceFileRow/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── NewWorkspace.jsx
│   │   │   │   └── Password/
│   │   │   │       ├── MultiUserAuth.jsx
│   │   │   │       ├── SingleUserAuth.jsx
│   │   │   │       └── index.jsx
│   │   │   ├── Preloader.jsx
│   │   │   ├── PrivateRoute/
│   │   │   │   └── index.jsx
│   │   │   ├── ProviderPrivacy/
│   │   │   │   ├── constants.js
│   │   │   │   └── index.jsx
│   │   │   ├── SettingsButton/
│   │   │   │   └── index.jsx
│   │   │   ├── SettingsSidebar/
│   │   │   │   ├── MenuOption/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── Sidebar/
│   │   │   │   ├── ActiveWorkspaces/
│   │   │   │   │   ├── ThreadContainer/
│   │   │   │   │   │   ├── ThreadItem/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── SearchBox/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── SidebarToggle/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── SpeechToText/
│   │   │   │   └── BrowserNative/
│   │   │   │       └── index.jsx
│   │   │   ├── TextToSpeech/
│   │   │   │   ├── BrowserNative/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ElevenLabsOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenAiGenericOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── PiperTTSOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── TranscriptionSelection/
│   │   │   │   ├── NativeTranscriptionOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── OpenAiOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── UserIcon/
│   │   │   │   └── index.jsx
│   │   │   ├── UserMenu/
│   │   │   │   ├── AccountModal/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── UserButton/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── VectorDBSelection/
│   │   │   │   ├── AstraDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ChromaCloudOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ChromaDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LanceDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MilvusDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PGVectorOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PineconeDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── QDrantDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── VectorDBItem/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── WeaviateDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── ZillizCloudOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── WorkspaceChat/
│   │   │   │   ├── ChatContainer/
│   │   │   │   │   ├── ChatHistory/
│   │   │   │   │   │   ├── Chartable/
│   │   │   │   │   │   │   ├── CustomCell.jsx
│   │   │   │   │   │   │   ├── CustomTooltip.jsx
│   │   │   │   │   │   │   ├── chart-utils.js
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── Citation/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── HistoricalMessage/
│   │   │   │   │   │   │   ├── Actions/
│   │   │   │   │   │   │   │   ├── ActionMenu/
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   ├── DeleteMessage/
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   ├── EditMessage/
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   ├── RenderMetrics/
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   ├── TTSButton/
│   │   │   │   │   │   │   │   │   ├── asyncTts.jsx
│   │   │   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   │   │   ├── native.jsx
│   │   │   │   │   │   │   │   │   └── piperTTS.jsx
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── PromptReply/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── StatusResponse/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── ThoughtContainer/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── ChatTooltips/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── DnDWrapper/
│   │   │   │   │   │   ├── FileUploadWarningModal/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── PromptInput/
│   │   │   │   │   │   ├── AgentMenu/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── AttachItem/
│   │   │   │   │   │   │   ├── ParsedFilesMenu/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── Attachments/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── LLMSelector/
│   │   │   │   │   │   │   ├── ChatModelSelection/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── LLMSelector/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── SetupProvider/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── action.jsx
│   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   └── utils.js
│   │   │   │   │   │   ├── SpeechToText/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── StopGenerationButton/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── TextSizeMenu/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── ToolsMenu/
│   │   │   │   │   │   │   ├── Tabs/
│   │   │   │   │   │   │   │   ├── AgentSkills/
│   │   │   │   │   │   │   │   │   ├── SkillRow/
│   │   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   └── SlashCommands/
│   │   │   │   │   │   │   │       ├── SlashCommandRow/
│   │   │   │   │   │   │   │       │   └── index.jsx
│   │   │   │   │   │   │   │       ├── SlashPresets/
│   │   │   │   │   │   │   │       │   ├── AddPresetModal.jsx
│   │   │   │   │   │   │   │       │   ├── EditPresetModal.jsx
│   │   │   │   │   │   │   │       │   └── constants.js
│   │   │   │   │   │   │   │       └── index.jsx
│   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   └── useToolsMenuItems.js
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── SourcesSidebar/
│   │   │   │   │   │   ├── MobileCitationModal/
│   │   │   │   │   │   │   ├── SourceDetailView/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── SourceItem/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── TextSizeMenu/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── WorkspaceModelPicker/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LoadingChat/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── contexts/
│   │   │   │   └── TTSProvider.jsx
│   │   │   └── lib/
│   │   │       ├── CTAButton/
│   │   │       │   └── index.jsx
│   │   │       ├── ModelTable/
│   │   │       │   ├── index.jsx
│   │   │       │   ├── layout.jsx
│   │   │       │   └── loading.jsx
│   │   │       ├── MonoProviderIcon/
│   │   │       │   └── index.jsx
│   │   │       ├── QuickActions/
│   │   │       │   └── index.jsx
│   │   │       ├── SuggestedMessages/
│   │   │       │   └── index.jsx
│   │   │       └── Toggle/
│   │   │           └── index.jsx
│   │   ├── hooks/
│   │   │   ├── useAppVersion.js
│   │   │   ├── useChatContainerQuickScroll.js
│   │   │   ├── useChatHistoryScrollHandle.js
│   │   │   ├── useCommunityHubAuth.js
│   │   │   ├── useCopyText.js
│   │   │   ├── useGetProvidersModels.js
│   │   │   ├── useLanguageOptions.js
│   │   │   ├── useLoginMode.js
│   │   │   ├── useLogo.js
│   │   │   ├── useModal.js
│   │   │   ├── useOnboardingComplete.js
│   │   │   ├── usePfp.js
│   │   │   ├── usePrefersDarkMode.js
│   │   │   ├── usePromptInputStorage.js
│   │   │   ├── useProviderEndpointAutoDiscovery.js
│   │   │   ├── useQuery.js
│   │   │   ├── useScrollActiveItemIntoView.js
│   │   │   ├── useSimpleSSO.js
│   │   │   ├── useTextSize.js
│   │   │   ├── useTheme.js
│   │   │   ├── useUser.js
│   │   │   └── useWebPushNotifications.js
│   │   ├── i18n.js
│   │   ├── index.css
│   │   ├── locales/
│   │   │   ├── ar/
│   │   │   │   └── common.js
│   │   │   ├── cs/
│   │   │   │   └── common.js
│   │   │   ├── da/
│   │   │   │   └── common.js
│   │   │   ├── de/
│   │   │   │   └── common.js
│   │   │   ├── dynamicKeyAllowlist.js
│   │   │   ├── en/
│   │   │   │   └── common.js
│   │   │   ├── es/
│   │   │   │   └── common.js
│   │   │   ├── et/
│   │   │   │   └── common.js
│   │   │   ├── fa/
│   │   │   │   └── common.js
│   │   │   ├── findUnusedTranslations.mjs
│   │   │   ├── fr/
│   │   │   │   └── common.js
│   │   │   ├── he/
│   │   │   │   └── common.js
│   │   │   ├── it/
│   │   │   │   └── common.js
│   │   │   ├── ja/
│   │   │   │   └── common.js
│   │   │   ├── ko/
│   │   │   │   └── common.js
│   │   │   ├── lv/
│   │   │   │   └── common.js
│   │   │   ├── nl/
│   │   │   │   └── common.js
│   │   │   ├── normalizeEn.mjs
│   │   │   ├── pl/
│   │   │   │   └── common.js
│   │   │   ├── pt_BR/
│   │   │   │   └── common.js
│   │   │   ├── resources.js
│   │   │   ├── ro/
│   │   │   │   └── common.js
│   │   │   ├── ru/
│   │   │   │   └── common.js
│   │   │   ├── tr/
│   │   │   │   └── common.js
│   │   │   ├── verifyTranslations.mjs
│   │   │   ├── vn/
│   │   │   │   └── common.js
│   │   │   ├── zh/
│   │   │   │   └── common.js
│   │   │   └── zh_TW/
│   │   │       └── common.js
│   │   ├── main.jsx
│   │   ├── media/
│   │   │   └── animations/
│   │   │       ├── agent-animation.webm
│   │   │       └── thinking-animation.webm
│   │   ├── models/
│   │   │   ├── admin.js
│   │   │   ├── agentFlows.js
│   │   │   ├── appearance.js
│   │   │   ├── browserExtensionApiKey.js
│   │   │   ├── communityHub.js
│   │   │   ├── dataConnector.js
│   │   │   ├── document.js
│   │   │   ├── embed.js
│   │   │   ├── experimental/
│   │   │   │   ├── agentPlugins.js
│   │   │   │   └── liveSync.js
│   │   │   ├── invite.js
│   │   │   ├── mcpServers.js
│   │   │   ├── mobile.js
│   │   │   ├── promptHistory.js
│   │   │   ├── system.js
│   │   │   ├── systemPromptVariable.js
│   │   │   ├── utils/
│   │   │   │   ├── dmrUtils.js
│   │   │   │   └── lemonadeUtils.js
│   │   │   ├── workspace.js
│   │   │   └── workspaceThread.js
│   │   ├── pages/
│   │   │   ├── 404.jsx
│   │   │   ├── Admin/
│   │   │   │   ├── AgentBuilder/
│   │   │   │   │   ├── AddBlockMenu/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── BlockList/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── HeaderMenu/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── nodes/
│   │   │   │   │       ├── ApiCallNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── CodeNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── FileNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── FinishNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── FlowInfoNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── LLMInstructionNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── StartNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── WebScrapingNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       └── WebsiteNode/
│   │   │   │   │           └── index.jsx
│   │   │   │   ├── Agents/
│   │   │   │   │   ├── AgentFlows/
│   │   │   │   │   │   ├── FlowPanel.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── AgentSkillSettings/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Badges/
│   │   │   │   │   │   └── default.jsx
│   │   │   │   │   ├── DefaultSkillPanel/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── GenericSkillPanel/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Imported/
│   │   │   │   │   │   ├── ImportedSkillConfig/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── SkillList/
│   │   │   │   │   │       └── index.jsx
│   │   │   │   │   ├── MCPServers/
│   │   │   │   │   │   ├── ServerPanel.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── SQLConnectorSelection/
│   │   │   │   │   │   ├── DBConnection.jsx
│   │   │   │   │   │   ├── SQLConnectionModal.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── WebSearchSelection/
│   │   │   │   │   │   ├── SearchProviderItem/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── SearchProviderOptions/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── skills.js
│   │   │   │   ├── DefaultSystemPrompt/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ExperimentalFeatures/
│   │   │   │   │   ├── Features/
│   │   │   │   │   │   └── LiveSync/
│   │   │   │   │   │       ├── manage/
│   │   │   │   │   │       │   ├── DocumentSyncQueueRow/
│   │   │   │   │   │       │   │   └── index.jsx
│   │   │   │   │   │       │   └── index.jsx
│   │   │   │   │   │       └── toggle.jsx
│   │   │   │   │   ├── features.js
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Invitations/
│   │   │   │   │   ├── InviteRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── NewInviteModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Logging/
│   │   │   │   │   ├── LogRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── SystemPromptVariables/
│   │   │   │   │   ├── AddVariableModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── VariableRow/
│   │   │   │   │   │   ├── EditVariableModal/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Users/
│   │   │   │   │   ├── NewUserModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── UserRow/
│   │   │   │   │   │   ├── EditUserModal/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   └── Workspaces/
│   │   │   │       ├── NewWorkspaceModal/
│   │   │   │       │   └── index.jsx
│   │   │   │       ├── WorkspaceRow/
│   │   │   │       │   └── index.jsx
│   │   │   │       └── index.jsx
│   │   │   ├── GeneralSettings/
│   │   │   │   ├── ApiKeys/
│   │   │   │   │   ├── ApiKeyRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── NewApiKeyModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── AudioPreference/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   ├── stt.jsx
│   │   │   │   │   └── tts.jsx
│   │   │   │   ├── BrowserExtensionApiKey/
│   │   │   │   │   ├── BrowserExtensionApiKeyRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── NewBrowserExtensionApiKeyModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ChatEmbedWidgets/
│   │   │   │   │   ├── EmbedChats/
│   │   │   │   │   │   ├── ChatRow/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── MarkdownRenderer.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── EmbedConfigs/
│   │   │   │   │   │   ├── EmbedRow/
│   │   │   │   │   │   │   ├── CodeSnippetModal/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── EditEmbedModal/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── NewEmbedModal/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Chats/
│   │   │   │   │   ├── ChatRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── MarkdownRenderer.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── CommunityHub/
│   │   │   │   │   ├── Authentication/
│   │   │   │   │   │   ├── UserItems/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   └── useUserItems.js
│   │   │   │   │   ├── ImportItem/
│   │   │   │   │   │   ├── Steps/
│   │   │   │   │   │   │   ├── Completed/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── Introduction/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── PullAndReview/
│   │   │   │   │   │   │   │   ├── HubItem/
│   │   │   │   │   │   │   │   │   ├── AgentFlow.jsx
│   │   │   │   │   │   │   │   │   ├── AgentSkill.jsx
│   │   │   │   │   │   │   │   │   ├── SlashCommand.jsx
│   │   │   │   │   │   │   │   │   ├── SystemPrompt.jsx
│   │   │   │   │   │   │   │   │   ├── Unknown.jsx
│   │   │   │   │   │   │   │   │   └── index.js
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Trending/
│   │   │   │   │   │   ├── HubItems/
│   │   │   │   │   │   │   ├── HubItemCard/
│   │   │   │   │   │   │   │   ├── agentFlow.jsx
│   │   │   │   │   │   │   │   ├── agentSkill.jsx
│   │   │   │   │   │   │   │   ├── generic.jsx
│   │   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   │   ├── slashCommand.jsx
│   │   │   │   │   │   │   │   └── systemPrompt.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── utils.js
│   │   │   │   ├── EmbeddingPreference/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── EmbeddingTextSplitterPreference/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LLMPreference/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MobileConnections/
│   │   │   │   │   ├── ConnectionModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── DeviceRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PrivacyAndData/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Security/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Settings/
│   │   │   │   │   ├── Branding/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Chat/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Interface/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── components/
│   │   │   │   │       ├── AutoSpeak/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── AutoSubmit/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── ChatRenderHTML/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── CustomAppName/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── CustomLogo/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── CustomSiteSettings/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── FooterCustomization/
│   │   │   │   │       │   ├── NewIconForm/
│   │   │   │   │       │   │   └── index.jsx
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── LanguagePreference/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── ShowScrollbar/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── SpellCheck/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── SupportEmail/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       └── ThemePreference/
│   │   │   │   │           └── index.jsx
│   │   │   │   ├── TranscriptionPreference/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── VectorDatabase/
│   │   │   │       └── index.jsx
│   │   │   ├── Invite/
│   │   │   │   ├── NewUserModal/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── Login/
│   │   │   │   ├── SSO/
│   │   │   │   │   └── simple.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── Main/
│   │   │   │   ├── Home/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── OnboardingFlow/
│   │   │   │   ├── Steps/
│   │   │   │   │   ├── DataHandling/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Home/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── LLMPreference/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Survey/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── UserSetup/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── WorkspaceChat/
│   │   │   │   └── index.jsx
│   │   │   └── WorkspaceSettings/
│   │   │       ├── AgentConfig/
│   │   │       │   ├── AgentLLMSelection/
│   │   │       │   │   ├── AgentLLMItem/
│   │   │       │   │   │   └── index.jsx
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── AgentModelSelection/
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       ├── ChatSettings/
│   │   │       │   ├── ChatHistorySettings/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ChatModeSelection/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ChatPromptSettings/
│   │   │       │   │   ├── ChatPromptHistory/
│   │   │       │   │   │   ├── PromptHistoryItem/
│   │   │       │   │   │   │   └── index.jsx
│   │   │       │   │   │   └── index.jsx
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ChatQueryRefusalResponse/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ChatTemperatureSettings/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── WorkspaceLLMSelection/
│   │   │       │   │   ├── ChatModelSelection/
│   │   │       │   │   │   └── index.jsx
│   │   │       │   │   ├── WorkspaceLLMItem/
│   │   │       │   │   │   └── index.jsx
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       ├── GeneralAppearance/
│   │   │       │   ├── DeleteWorkspace/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── SuggestedChatMessages/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── WorkspaceName/
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       ├── Members/
│   │   │       │   ├── AddMemberModal/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── WorkspaceMemberRow/
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       ├── VectorDatabase/
│   │   │       │   ├── DocumentSimilarityThreshold/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── MaxContextSnippets/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ResetDatabase/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── VectorCount/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── VectorDBIdentifier/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── VectorSearchMode/
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       └── index.jsx
│   │   └── utils/
│   │       ├── chat/
│   │       │   ├── agent.js
│   │       │   ├── hljs-libraries/
│   │       │   │   └── svelte.js
│   │       │   ├── index.js
│   │       │   ├── markdown.js
│   │       │   ├── plugins/
│   │       │   │   └── markdown-katex.js
│   │       │   ├── purify.js
│   │       │   └── themes/
│   │       │       ├── github-dark.css
│   │       │       └── github.css
│   │       ├── constants.js
│   │       ├── directories.js
│   │       ├── keyboardShortcuts.js
│   │       ├── numbers.js
│   │       ├── paths.js
│   │       ├── piperTTS/
│   │       │   ├── index.js
│   │       │   └── worker.js
│   │       ├── request.js
│   │       ├── session.js
│   │       ├── toast.js
│   │       ├── types.js
│   │       └── username.js
│   ├── tailwind.config.js
│   └── vite.config.js
├── locales/
│   ├── README.fa-IR.md
│   ├── README.ja-JP.md
│   ├── README.tr-TR.md
│   └── README.zh-CN.md
├── package.json
├── pull_request_template.md
└── server/
    ├── .env.example
    ├── .flowconfig
    ├── .gitignore
    ├── .nvmrc
    ├── __tests__/
    │   ├── models/
    │   │   ├── systemPromptVariables.test.js
    │   │   └── user.test.js
    │   └── utils/
    │       ├── SQLConnectors/
    │       │   └── connectionParser.test.js
    │       ├── TextSplitter/
    │       │   └── index.test.js
    │       ├── agentFlows/
    │       │   └── executor.test.js
    │       ├── agents/
    │       │   ├── aibitat/
    │       │   │   └── providers/
    │       │   │       └── helpers/
    │       │   │           └── untooled.test.js
    │       │   └── defaults.test.js
    │       ├── chats/
    │       │   ├── openaiCompatible.test.js
    │       │   └── openaiHelpers.test.js
    │       ├── helpers/
    │       │   ├── azureOpenAiModelPref.test.js
    │       │   └── convertTo.test.js
    │       ├── safeJSONStringify/
    │       │   └── safeJSONStringify.test.js
    │       └── vectorDbProviders/
    │           └── pgvector/
    │               └── index.test.js
    ├── endpoints/
    │   ├── admin.js
    │   ├── agentFlows.js
    │   ├── agentWebsocket.js
    │   ├── api/
    │   │   ├── admin/
    │   │   │   └── index.js
    │   │   ├── auth/
    │   │   │   └── index.js
    │   │   ├── document/
    │   │   │   └── index.js
    │   │   ├── embed/
    │   │   │   └── index.js
    │   │   ├── index.js
    │   │   ├── openai/
    │   │   │   ├── compatibility-test-script.cjs
    │   │   │   ├── helpers.js
    │   │   │   └── index.js
    │   │   ├── system/
    │   │   │   └── index.js
    │   │   ├── userManagement/
    │   │   │   └── index.js
    │   │   ├── workspace/
    │   │   │   └── index.js
    │   │   └── workspaceThread/
    │   │       └── index.js
    │   ├── browserExtension.js
    │   ├── chat.js
    │   ├── communityHub.js
    │   ├── document.js
    │   ├── embed/
    │   │   └── index.js
    │   ├── embedManagement.js
    │   ├── experimental/
    │   │   ├── imported-agent-plugins.js
    │   │   ├── index.js
    │   │   └── liveSync.js
    │   ├── extensions/
    │   │   └── index.js
    │   ├── invite.js
    │   ├── mcpServers.js
    │   ├── mobile/
    │   │   ├── index.js
    │   │   ├── middleware/
    │   │   │   └── index.js
    │   │   └── utils/
    │   │       └── index.js
    │   ├── system.js
    │   ├── utils/
    │   │   ├── dockerModelRunnerUtils.js
    │   │   └── lemonadeUtilsEndpoints.js
    │   ├── utils.js
    │   ├── webPush.js
    │   ├── workspaceThreads.js
    │   ├── workspaces.js
    │   └── workspacesParsedFiles.js
    ├── eslint.config.mjs
    ├── index.js
    ├── jobs/
    │   ├── cleanup-orphan-documents.js
    │   ├── helpers/
    │   │   └── index.js
    │   └── sync-watched-documents.js
    ├── jsconfig.json
    ├── middleware/
    │   └── httpLogger.js
    ├── models/
    │   ├── apiKeys.js
    │   ├── browserExtensionApiKey.js
    │   ├── cacheData.js
    │   ├── communityHub.js
    │   ├── documentSyncQueue.js
    │   ├── documentSyncRun.js
    │   ├── documents.js
    │   ├── embedChats.js
    │   ├── embedConfig.js
    │   ├── eventLogs.js
    │   ├── invite.js
    │   ├── mobileDevice.js
    │   ├── passwordRecovery.js
    │   ├── promptHistory.js
    │   ├── slashCommandsPresets.js
    │   ├── systemPromptVariables.js
    │   ├── systemSettings.js
    │   ├── telemetry.js
    │   ├── temporaryAuthToken.js
    │   ├── user.js
    │   ├── vectors.js
    │   ├── workspace.js
    │   ├── workspaceAgentInvocation.js
    │   ├── workspaceChats.js
    │   ├── workspaceParsedFiles.js
    │   ├── workspaceThread.js
    │   ├── workspaceUsers.js
    │   └── workspacesSuggestedMessages.js
    ├── nodemon.json
    ├── package.json
    ├── prisma/
    │   ├── migrations/
    │   │   ├── 20230921191814_init/
    │   │   │   └── migration.sql
    │   │   ├── 20231101001441_init/
    │   │   │   └── migration.sql
    │   │   ├── 20231101195421_init/
    │   │   │   └── migration.sql
    │   │   ├── 20231129012019_add/
    │   │   │   └── migration.sql
    │   │   ├── 20240113013409_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240118201333_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240202002020_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240206181106_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240206211916_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240208224848_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240210004405_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240216214639_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240219211018_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240301002308_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240326231053_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240405015034_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240412183346_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240425004220_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240430230707_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240510032311_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240618224346_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240821215625_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240824005054_init/
    │   │   │   └── migration.sql
    │   │   ├── 20241003192954_init/
    │   │   │   └── migration.sql
    │   │   ├── 20241029203722_init/
    │   │   │   └── migration.sql
    │   │   ├── 20241029233509_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250102204948_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250226005538_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250318154720_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250506214129_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250709230835_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250725194841_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250808171557_init/
    │   │   │   └── migration.sql
    │   │   ├── 20260130040204_init/
    │   │   │   └── migration.sql
    │   │   ├── 20260313192859_init/
    │   │   │   └── migration.sql
    │   │   └── migration_lock.toml
    │   ├── schema.prisma
    │   └── seed.js
    ├── storage/
    │   ├── README.md
    │   └── models/
    │       ├── .gitignore
    │       ├── README.md
    │       └── downloaded/
    │           └── .placeholder
    ├── swagger/
    │   ├── dark-swagger.css
    │   ├── index.css
    │   ├── index.js
    │   ├── init.js
    │   ├── openapi.json
    │   └── utils.js
    └── utils/
        ├── AiProviders/
        │   ├── anthropic/
        │   │   └── index.js
        │   ├── apipie/
        │   │   └── index.js
        │   ├── azureOpenAi/
        │   │   └── index.js
        │   ├── bedrock/
        │   │   ├── index.js
        │   │   └── utils.js
        │   ├── cohere/
        │   │   └── index.js
        │   ├── cometapi/
        │   │   ├── constants.js
        │   │   └── index.js
        │   ├── deepseek/
        │   │   └── index.js
        │   ├── dellProAiStudio/
        │   │   └── index.js
        │   ├── dockerModelRunner/
        │   │   └── index.js
        │   ├── fireworksAi/
        │   │   └── index.js
        │   ├── foundry/
        │   │   └── index.js
        │   ├── gemini/
        │   │   ├── defaultModels.js
        │   │   ├── index.js
        │   │   └── syncStaticLists.mjs
        │   ├── genericOpenAi/
        │   │   └── index.js
        │   ├── giteeai/
        │   │   └── index.js
        │   ├── groq/
        │   │   └── index.js
        │   ├── huggingface/
        │   │   └── index.js
        │   ├── koboldCPP/
        │   │   └── index.js
        │   ├── lemonade/
        │   │   └── index.js
        │   ├── liteLLM/
        │   │   └── index.js
        │   ├── lmStudio/
        │   │   └── index.js
        │   ├── localAi/
        │   │   └── index.js
        │   ├── mistral/
        │   │   └── index.js
        │   ├── modelMap/
        │   │   ├── index.js
        │   │   └── legacy.js
        │   ├── moonshotAi/
        │   │   └── index.js
        │   ├── novita/
        │   │   └── index.js
        │   ├── nvidiaNim/
        │   │   └── index.js
        │   ├── ollama/
        │   │   └── index.js
        │   ├── openAi/
        │   │   └── index.js
        │   ├── openRouter/
        │   │   └── index.js
        │   ├── perplexity/
        │   │   ├── index.js
        │   │   ├── models.js
        │   │   └── scripts/
        │   │       ├── .gitignore
        │   │       ├── chat_models.txt
        │   │       └── parse.mjs
        │   ├── ppio/
        │   │   └── index.js
        │   ├── privatemode/
        │   │   └── index.js
        │   ├── sambanova/
        │   │   └── index.js
        │   ├── textGenWebUI/
        │   │   └── index.js
        │   ├── togetherAi/
        │   │   └── index.js
        │   ├── xai/
        │   │   └── index.js
        │   └── zai/
        │       └── index.js
        ├── BackgroundWorkers/
        │   └── index.js
        ├── DocumentManager/
        │   └── index.js
        ├── EmbeddingEngines/
        │   ├── azureOpenAi/
        │   │   └── index.js
        │   ├── cohere/
        │   │   └── index.js
        │   ├── gemini/
        │   │   └── index.js
        │   ├── genericOpenAi/
        │   │   └── index.js
        │   ├── lemonade/
        │   │   └── index.js
        │   ├── liteLLM/
        │   │   └── index.js
        │   ├── lmstudio/
        │   │   └── index.js
        │   ├── localAi/
        │   │   └── index.js
        │   ├── mistral/
        │   │   └── index.js
        │   ├── native/
        │   │   ├── constants.js
        │   │   └── index.js
        │   ├── ollama/
        │   │   └── index.js
        │   ├── openAi/
        │   │   └── index.js
        │   ├── openRouter/
        │   │   └── index.js
        │   └── voyageAi/
        │       └── index.js
        ├── EmbeddingRerankers/
        │   └── native/
        │       └── index.js
        ├── EncryptionManager/
        │   └── index.js
        ├── MCP/
        │   ├── hypervisor/
        │   │   └── index.js
        │   └── index.js
        ├── PasswordRecovery/
        │   └── index.js
        ├── PushNotifications/
        │   └── index.js
        ├── TextSplitter/
        │   └── index.js
        ├── TextToSpeech/
        │   ├── elevenLabs/
        │   │   └── index.js
        │   ├── index.js
        │   ├── openAi/
        │   │   └── index.js
        │   └── openAiGeneric/
        │       └── index.js
        ├── agentFlows/
        │   ├── executor.js
        │   ├── executors/
        │   │   ├── api-call.js
        │   │   ├── llm-instruction.js
        │   │   └── web-scraping.js
        │   ├── flowTypes.js
        │   └── index.js
        ├── agents/
        │   ├── aibitat/
        │   │   ├── error.js
        │   │   ├── example/
        │   │   │   ├── .gitignore
        │   │   │   ├── beginner-chat.js
        │   │   │   ├── blog-post-coding.js
        │   │   │   └── websocket/
        │   │   │       ├── index.html
        │   │   │       ├── websock-branding-collab.js
        │   │   │       └── websock-multi-turn-chat.js
        │   │   ├── index.js
        │   │   ├── plugins/
        │   │   │   ├── chat-history.js
        │   │   │   ├── cli.js
        │   │   │   ├── file-history.js
        │   │   │   ├── http-socket.js
        │   │   │   ├── index.js
        │   │   │   ├── memory.js
        │   │   │   ├── rechart.js
        │   │   │   ├── save-file-browser.js
        │   │   │   ├── sql-agent/
        │   │   │   │   ├── SQLConnectors/
        │   │   │   │   │   ├── MSSQL.js
        │   │   │   │   │   ├── MySQL.js
        │   │   │   │   │   ├── Postgresql.js
        │   │   │   │   │   ├── index.js
        │   │   │   │   │   └── utils.js
        │   │   │   │   ├── get-table-schema.js
        │   │   │   │   ├── index.js
        │   │   │   │   ├── list-database.js
        │   │   │   │   ├── list-table.js
        │   │   │   │   └── query.js
        │   │   │   ├── summarize.js
        │   │   │   ├── web-browsing.js
        │   │   │   ├── web-scraping.js
        │   │   │   └── websocket.js
        │   │   ├── providers/
        │   │   │   ├── ai-provider.js
        │   │   │   ├── anthropic.js
        │   │   │   ├── apipie.js
        │   │   │   ├── azure.js
        │   │   │   ├── bedrock.js
        │   │   │   ├── cohere.js
        │   │   │   ├── cometapi.js
        │   │   │   ├── deepseek.js
        │   │   │   ├── dellProAiStudio.js
        │   │   │   ├── dockerModelRunner.js
        │   │   │   ├── fireworksai.js
        │   │   │   ├── foundry.js
        │   │   │   ├── gemini.js
        │   │   │   ├── genericOpenAi.js
        │   │   │   ├── giteeai.js
        │   │   │   ├── groq.js
        │   │   │   ├── helpers/
        │   │   │   │   ├── classes.js
        │   │   │   │   ├── tooled.js
        │   │   │   │   └── untooled.js
        │   │   │   ├── index.js
        │   │   │   ├── koboldcpp.js
        │   │   │   ├── lemonade.js
        │   │   │   ├── litellm.js
        │   │   │   ├── lmstudio.js
        │   │   │   ├── localai.js
        │   │   │   ├── mistral.js
        │   │   │   ├── moonshotAi.js
        │   │   │   ├── novita.js
        │   │   │   ├── nvidiaNim.js
        │   │   │   ├── ollama.js
        │   │   │   ├── openai.js
        │   │   │   ├── openrouter.js
        │   │   │   ├── perplexity.js
        │   │   │   ├── ppio.js
        │   │   │   ├── privatemode.js
        │   │   │   ├── sambanova.js
        │   │   │   ├── textgenwebui.js
        │   │   │   ├── togetherai.js
        │   │   │   ├── xai.js
        │   │   │   └── zai.js
        │   │   └── utils/
        │   │       ├── dedupe.js
        │   │       ├── summarize.js
        │   │       └── toolReranker.js
        │   ├── defaults.js
        │   ├── ephemeral.js
        │   ├── imported-manifest.schema.json
        │   ├── imported.js
        │   └── index.js
        ├── boot/
        │   ├── MetaGenerator.js
        │   ├── eagerLoadContextWindows.js
        │   ├── index.js
        │   └── markOnboarded.js
        ├── chats/
        │   ├── agents.js
        │   ├── apiChatHandler.js
        │   ├── commands/
        │   │   └── reset.js
        │   ├── embed.js
        │   ├── index.js
        │   ├── openaiCompatible.js
        │   └── stream.js
        ├── collectorApi/
        │   └── index.js
        ├── comKey/
        │   └── index.js
        ├── database/
        │   └── index.js
        ├── files/
        │   ├── index.js
        │   ├── logo.js
        │   ├── multer.js
        │   ├── pfp.js
        │   └── purgeDocument.js
        ├── helpers/
        │   ├── admin/
        │   │   └── index.js
        │   ├── camelcase.js
        │   ├── chat/
        │   │   ├── LLMPerformanceMonitor.js
        │   │   ├── convertTo.js
        │   │   ├── index.js
        │   │   └── responses.js
        │   ├── customModels.js
        │   ├── index.js
        │   ├── portAvailabilityChecker.js
        │   ├── search.js
        │   ├── shell.js
        │   ├── tiktoken.js
        │   └── updateENV.js
        ├── http/
        │   └── index.js
        ├── logger/
        │   └── index.js
        ├── middleware/
        │   ├── chatHistoryViewable.js
        │   ├── communityHubDownloadsEnabled.js
        │   ├── embedMiddleware.js
        │   ├── featureFlagEnabled.js
        │   ├── isSupportedRepoProviders.js
        │   ├── multiUserProtected.js
        │   ├── simpleSSOEnabled.js
        │   ├── validApiKey.js
        │   ├── validBrowserExtensionApiKey.js
        │   ├── validWorkspace.js
        │   └── validatedRequest.js
        ├── prisma/
        │   ├── PRISMA.md
        │   └── index.js
        ├── telemetry/
        │   └── index.js
        ├── vectorDbProviders/
        │   ├── astra/
        │   │   ├── ASTRA_SETUP.md
        │   │   └── index.js
        │   ├── base.js
        │   ├── chroma/
        │   │   └── index.js
        │   ├── chromacloud/
        │   │   └── index.js
        │   ├── lance/
        │   │   └── index.js
        │   ├── milvus/
        │   │   ├── MILVUS_SETUP.md
        │   │   └── index.js
        │   ├── pgvector/
        │   │   ├── SETUP.md
        │   │   └── index.js
        │   ├── pinecone/
        │   │   ├── PINECONE_SETUP.md
        │   │   └── index.js
        │   ├── qdrant/
        │   │   ├── QDRANT_SETUP.md
        │   │   └── index.js
        │   ├── weaviate/
        │   │   ├── WEAVIATE_SETUP.md
        │   │   └── index.js
        │   └── zilliz/
        │       └── index.js
        └── vectorStore/
            └── resetAllVectorStores.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .devcontainer/README.md
================================================
# AnythingLLM Development Container Setup

Welcome to the AnythingLLM development container configuration, designed to create a seamless and feature-rich development environment for this project.

<center><h1><b>PLEASE READ THIS</b></h1></center>

## Prerequisites

- [Docker](https://www.docker.com/get-started)
- [Visual Studio Code](https://code.visualstudio.com/)
- [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) VS Code extension

## Features

- **Base Image**: Built on `mcr.microsoft.com/devcontainers/javascript-node:1-18-bookworm`, thus Node.JS LTS v18.
- **Additional Tools**: Includes `hadolint`, and essential apt-packages such as `curl`, `gnupg`, and more.
- **Ports**: Configured to auto-forward ports `3000` (Frontend) and `3001` (Backend).
- **Environment Variables**: Sets `NODE_ENV` to `development` and `ESLINT_USE_FLAT_CONFIG` to `true`.
- **VS Code Extensions**: A suite of extensions such as `Prettier`, `Docker`, `ESLint`, and more are automatically installed. Please revise if you do not agree with any of these extensions. AI-powered extensions and time trackers are (for now) not included to avoid any privacy concerns, but you can install them later in your own environment.

## Getting Started

1. Using GitHub Codespaces. Just select to create a new workspace, and the devcontainer will be created for you.

2. Using your Local VSCode (Release or Insiders). We suggest you first make a fork of the repo and then clone it to your local machine using VSCode tools. Then open the project folder in VSCode, which will prompt you to open the project in a devcontainer. Select yes, and the devcontainer will be created for you. If this does not happen, you can open the command palette and select "Remote-Containers: Reopen in Container".

## On Creation:

When the container is built for the first time, it will automatically run `yarn setup` to ensure everything is in place for the Collector, Server and Frontend. This command is expected to be automatically re-run if there is a content change on next reboot.

## Work in the Container:

Once the container is up, be patient. Some extensions may complain because dependencies are still being installed, and in the Extensions tab, some may ask you to "Reload" the project. Don't do that yet. First, wait until all settle down for the first time. We suggest you create a new VSCode profile for this devcontainer, so any configuration and extensions you change, won't affect your default profile.

Checklist:

- [ ] The usual message asking you to start the Server and Frontend in different windows are now "hidden" in the building process of the devcontainer. Don't forget to do as suggested.
- [ ] Open a JavaScript file, for example "server/index.js" and check if `eslint` is working. It will complain that `'err' is defined but never used.`. This means it is working.
- [ ] Open a React File, for example, "frontend/src/main.jsx," and check if `eslint` complains about `Fast refresh only works when a file has exports. Move your component(s) to a separate file.`. Again, it means `eslint` is working. Now check at the status bar if the `Prettier` has a double checkmark :heavy_check_mark: (double). It means Prettier is working. You will see a nice extension `Formatting:`:heavy_check_mark: that can be used to disable the `Format on Save` feature temporarily.
- [ ] Check if, on the left pane, you have the NPM Scripts (this may be disabled; look at the "Explorer" tree-dots up-right). There will be scripts inside the `package.json` files. You will basically need to run the `dev:collector`, `dev:server` and the `dev:frontend` in this order. When the frontend finishes starting, a window browser will open **inside** the VSCode. Still, you can open it outside.

:warning: **Important for all developers** :warning:

- [ ] When you are using the `NODE_ENV=development` the server will not store the configurations you set for security reasons. Please set the proper config on file `.env.development`. The side-effect if you don't, everytime you restart the server, you will be sent to the "Onboarding" page again.

**Note when using GitHub Codespaces**

- [ ] When running the "Server" for the first time, it will automatically configure its port to be publicly accessible by default, as this is required for the front end to reach the server backend. To know more, read the content of the `.env` file on the frontend folder about this, and if any issues occur, make sure to manually set the port "Visibility" of the "Server" is set to "Public" if needed. Again, this is only needed for developing on GitHub Codespaces.


**For the Collector:**

- [x] In the past, the Collector dwelled within the Python domain, but now it has journeyed to the splendid realm of Node.JS. Consequently, the configuration complexities of bygone versions are no longer a concern.

### Now it is ready to start

In the status bar you will see three shortcuts names `Collector`, `Server` and `Frontend`. Just click-and-wait on that order (don't forget to set the Server port 3001 to Public if you are using GH Codespaces **_before_** starting the Frontend).

Now you can enjoy your time developing instead of reconfiguring everything.

## Debugging with the devcontainers

### For debugging the collector, server and frontend

First, make sure the built-in extension (ms-vscode.js-debug) is active (I don't know why it would not be, but just in case). If you want, you can install the nightly version (ms-vscode.js-debug-nightly)

Then, in the "Run and Debug" tab (Ctrl+shift+D), you can select on the menu:

- Collector debug. This will start the collector in debug mode and attach the debugger. Works very well.
- Server debug. This will start the server in debug mode and attach the debugger. Works very well.
- Frontend debug. This will start the frontend in debug mode and attach the debugger. I am still struggling with this one. I don't know if VSCode can handle the .jsx files seamlessly as the pure .js on the server. Maybe there is a need for a particular configuration for Vite or React. Anyway, it starts. Another two configurations launch Chrome and Edge, and I think we could add breakpoints on .jsx files somehow. The best scenario would be always to use the embedded browser. WIP.

Please leave comments on the Issues tab or the [![](https://img.shields.io/discord/1114740394715004990?logo=Discord&logoColor=white&label=Discord&labelColor=%235568ee&color=%2355A2DD&link=https%3A%2F%2Fdiscord.gg%2F6UyHPeGZAC)]("https://discord.gg/6UyHPeGZAC")


================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node
{
  "name": "Node.js",
  // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
  // "build": {
  //   "args": {
  //     "ARG_UID": "1000",
  //     "ARG_GID": "1000"
  //   },
  //   "dockerfile": "Dockerfile"
  // },
  // "containerUser": "anythingllm",
  // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
  "image": "mcr.microsoft.com/devcontainers/javascript-node:1-18-bookworm",

  "forwardPorts": [3001, 3000],

  // Features to add to the dev container. More info: https://containers.dev/features.
  "features": {
    // Docker very useful linter
    "ghcr.io/dhoeric/features/hadolint:1": {
      "version": "latest"
    },
    // Terraform support
    "ghcr.io/devcontainers/features/terraform:1": {},
    // Just a wrap to install needed packages
    "ghcr.io/devcontainers-contrib/features/apt-packages:1": {
      // Dependencies copied from ../docker/Dockerfile plus some dev stuff
      "packages": [
        "build-essential",
        "ca-certificates",
        "curl",
        "ffmpeg",
        "fonts-liberation",
        "git",
        "gnupg",
        "htop",
        "less",
        "libappindicator1",
        "libasound2",
        "libatk-bridge2.0-0",
        "libatk1.0-0",
        "libc6",
        "libcairo2",
        "libcups2",
        "libdbus-1-3",
        "libexpat1",
        "libfontconfig1",
        "libgbm1",
        "libgcc1",
        "libgfortran5",
        "libglib2.0-0",
        "libgtk-3-0",
        "libnspr4",
        "libnss3",
        "libpango-1.0-0",
        "libpangocairo-1.0-0",
        "libstdc++6",
        "libx11-6",
        "libx11-xcb1",
        "libxcb1",
        "libxcomposite1",
        "libxcursor1",
        "libxdamage1",
        "libxext6",
        "libxfixes3",
        "libxi6",
        "libxrandr2",
        "libxrender1",
        "libxss1",
        "libxtst6",
        "locales",
        "lsb-release",
        "procps",
        "tzdata",
        "wget",
        "xdg-utils"
      ]
    }
  },
  "updateContentCommand": "cd server && yarn && cd ../collector && PUPPETEER_DOWNLOAD_BASE_URL=https://storage.googleapis.com/chrome-for-testing-public yarn && cd ../frontend && yarn && cd .. && yarn setup:envs && yarn prisma:setup && echo \"Please run yarn dev:server, yarn dev:collector, and yarn dev:frontend in separate terminal tabs.\"",
  // Use 'postCreateCommand' to run commands after the container is created.
  // This configures VITE for github codespaces and installs gh cli
  "postCreateCommand": "if [ \"${CODESPACES}\" = \"true\" ]; then echo 'VITE_API_BASE=\"https://$CODESPACE_NAME-3001.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN/api\"' > ./frontend/.env && (type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) && sudo mkdir -p -m 755 /etc/apt/keyrings && wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg && echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null && sudo apt update && sudo apt install gh -y; fi",
  "portsAttributes": {
    "3001": {
      "label": "Backend",
      "onAutoForward": "notify"
    },
    "3000": {
      "label": "Frontend",
      "onAutoForward": "openPreview"
    }
  },
  "capAdd": [
    "SYS_ADMIN" // needed for puppeteer using headless chrome in sandbox
  ],
  "remoteEnv": {
    "NODE_ENV": "development",
    "ESLINT_USE_FLAT_CONFIG": "true",
    "ANYTHING_LLM_RUNTIME": "docker"
  },
  // "initializeCommand": "echo Initialize....",
  "shutdownAction": "stopContainer",
  // Configure tool-specific properties.
  "customizations": {
    "codespaces": {
      "openFiles": [
        "README.md",
        ".devcontainer/README.md"
      ]
    },
    "vscode": {
      "openFiles": [
        "README.md",
        ".devcontainer/README.md"
      ],
      "extensions": [
        "bierner.github-markdown-preview",
        "bradlc.vscode-tailwindcss",
        "dbaeumer.vscode-eslint",
        "editorconfig.editorconfig",
        "esbenp.prettier-vscode",
        "exiasr.hadolint",
        "flowtype.flow-for-vscode",
        "gamunu.vscode-yarn",
        "hashicorp.terraform",
        "mariusschulz.yarn-lock-syntax",
        "ms-azuretools.vscode-docker",
        "streetsidesoftware.code-spell-checker",
        "actboy168.tasks",
        "tombonnike.vscode-status-bar-format-toggle",
        "ms-vscode.js-debug"
      ],
      "settings": {
        "[css]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[dockercompose]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[dockerfile]": {
          "editor.defaultFormatter": "ms-azuretools.vscode-docker"
        },
        "[html]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[javascript]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[javascriptreact]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[json]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[jsonc]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[markdown]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[postcss]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[toml]": {
          "editor.defaultFormatter": "tamasfe.even-better-toml"
        },
        "eslint.debug": true,
        "eslint.enable": true,
        "eslint.experimental.useFlatConfig": true,
        "eslint.run": "onSave",
        "files.associations": {
          ".*ignore": "ignore",
          ".editorconfig": "editorconfig",
          ".env*": "properties",
          ".flowconfig": "ini",
          ".prettierrc": "json",
          "*.css": "tailwindcss",
          "*.md": "markdown",
          "*.sh": "shellscript",
          "docker-compose.*": "dockercompose",
          "Dockerfile*": "dockerfile",
          "yarn.lock": "yarnlock"
        },
        "javascript.format.enable": false,
        "javascript.inlayHints.enumMemberValues.enabled": true,
        "javascript.inlayHints.functionLikeReturnTypes.enabled": true,
        "javascript.inlayHints.parameterTypes.enabled": true,
        "javascript.inlayHints.variableTypes.enabled": true,
        "js/ts.implicitProjectConfig.module": "CommonJS",
        "json.format.enable": false,
        "json.schemaDownload.enable": true,
        "npm.autoDetect": "on",
        "npm.packageManager": "yarn",
        "prettier.useEditorConfig": false,
        "tailwindCSS.files.exclude": [
          "**/.git/**",
          "**/node_modules/**",
          "**/.hg/**",
          "**/.svn/**",
          "**/dist/**"
        ],
        "typescript.validate.enable": false,
        "workbench.editorAssociations": {
          "*.md": "vscode.markdown.preview.editor"
        }
      }
    }
  }
  // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
  // "remoteUser": "root"
}


================================================
FILE: .dockerignore
================================================
**/server/utils/agents/aibitat/example/**
**/server/storage/documents/**
**/server/storage/vector-cache/**
**/server/storage/*.db
**/server/storage/lancedb
**/collector/hotdir/**
**/collector/outputs/**
**/node_modules/
**/dist/
**/v-env/
**/__pycache__/
**/.env
**/.env.*
**/bundleinspector.html
**/tmp/**
**/.log
!docker/.env.example
!frontend/.env.production

================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

[*]
# Non-configurable Prettier behaviors
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true

# Configurable Prettier behaviors
# (change these if your Prettier config differs)
end_of_line = lf
indent_style = space
indent_size = 2
max_line_length = 80


================================================
FILE: .gitattributes
================================================
* text=auto eol=lf

================================================
FILE: .github/FUNDING.yml
================================================
github: Mintplex-Labs

================================================
FILE: .github/ISSUE_TEMPLATE/01_bug.yml
================================================
name: 🐛 Bug Report
description: File a bug report for AnythingLLM
title: "[BUG]: "
labels: [possible bug]
body:
  - type: markdown
    attributes:
      value: | 
        Use this template to file a bug report for AnythingLLM. Please be as descriptive as possible to allow everyone to replicate and solve your issue.
  - type: dropdown
    id: runtime
    attributes:
      label: How are you running AnythingLLM?
      description: AnythingLLM can be run in many environments, pick the one that best represents where you encounter the bug.
      options:
        - Docker (local)
        - Docker (remote machine)
        - Local development
        - AnythingLLM desktop app
        - All versions
        - Not listed
      default: 0
    validations:
      required: true

  - type: textarea
    id: what-happened
    attributes:
      label: What happened?
      description: Also tell us, what did you expect to happen?
    validations:
      required: true

  - type: textarea
    id: reproduction
    attributes:
      label: Are there known steps to reproduce?
      description: |
        Let us know how to reproduce the bug and we may be able to fix it more
        quickly. This is not required, but it is helpful.
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/02_feature.yml
================================================
name: ✨ New Feature suggestion
description: Suggest a new feature for AnythingLLM!
title: "[FEAT]: "
labels: [enhancement, feature request]
body:
  - type: markdown
    attributes:
      value: |
        Share a new idea for a feature or improvement. Be sure to search existing
        issues first to avoid duplicates.

  - type: textarea
    id: description
    attributes:
      label: What would you like to see?
      description: |
        Describe the feature and why it would be useful to your use-case as well as others.
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/03_documentation.yml
================================================
name: 📚 Documentation improvement
title: "[DOCS]: "
description: Report an issue or problem with the documentation.
labels: [documentation]

body:
  - type: textarea
    id: description
    attributes:
      label: Description
      description: Describe the issue with the documentation that is giving you trouble or causing confusion.
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: 🧑‍🤝‍🧑 Community Discord
    url: https://discord.gg/6UyHPeGZAC
    about: Interact with the Mintplex Labs community here by asking for help, discussing and more!


================================================
FILE: .github/workflows/build-and-push-image-semver.yaml
================================================
name: Publish AnythingLLM Docker image on Release (amd64 & arm64)

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  release:
    types: [published]

jobs:
  push_multi_platform_to_registries:
    name: Push Docker multi-platform image to multiple registries
    runs-on: ubuntu-22.04-arm
    permissions:
      packages: write
      contents: read
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Check if DockerHub build needed
        shell: bash
        run: |
          # Check if the secret for USERNAME is set (don't even check for the password)
          if [[ -z "${{ secrets.DOCKER_USERNAME }}" ]]; then
            echo "DockerHub build not needed"
            echo "enabled=false" >> $GITHUB_OUTPUT
          else
            echo "DockerHub build needed"
            echo "enabled=true" >> $GITHUB_OUTPUT
          fi
        id: dockerhub

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          version: v0.22.0
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        # Only login to the Docker Hub if the repo is mintplex/anythingllm, to allow for forks to build on GHCR
        if: steps.dockerhub.outputs.enabled == 'true' 
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: |
            ${{ steps.dockerhub.outputs.enabled == 'true' && 'mintplexlabs/anythingllm' || '' }}
            ghcr.io/${{ github.repository }}
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}

      - name: Build and push multi-platform Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./docker/Dockerfile
          push: true
          sbom: true
          provenance: mode=max
          platforms: linux/amd64,linux/arm64
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
      
      # For Docker scout there are some intermediary reported CVEs which exists outside
      # of execution content or are unreachable by an attacker but exist in image.
      # We create VEX files for these so they don't show in scout summary. 
      - name: Collect known and verified CVE exceptions
        id: cve-list
        run: |
          # Collect CVEs from filenames in vex folder
          CVE_NAMES=""
          for file in ./docker/vex/*.vex.json; do
            [ -e "$file" ] || continue
            filename=$(basename "$file")
            stripped_filename=${filename%.vex.json}
            CVE_NAMES+=" $stripped_filename"
          done
          echo "CVE_EXCEPTIONS=$CVE_NAMES" >> $GITHUB_OUTPUT
        shell: bash

      # About VEX attestations https://docs.docker.com/scout/explore/exceptions/
      # Justifications https://github.com/openvex/spec/blob/main/OPENVEX-SPEC.md#status-justifications
      - name: Add VEX attestations
        env:
          CVE_EXCEPTIONS: ${{ steps.cve-list.outputs.CVE_EXCEPTIONS }}
        run: |
          echo $CVE_EXCEPTIONS
          curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
          for cve in $CVE_EXCEPTIONS; do
            for tag in "${{ join(fromJSON(steps.meta.outputs.json).tags, ' ') }}"; do
              echo "Attaching VEX exception $cve to $tag"
              docker scout attestation add \
              --file "./docker/vex/$cve.vex.json" \
              --predicate-type https://openvex.dev/ns/v0.2.0 \
              $tag
            done
          done
        shell: bash


================================================
FILE: .github/workflows/build-and-push-image.yaml
================================================
# This GitHub action is for publishing of the primary image for AnythingLLM
# It will publish a linux/amd64 and linux/arm64 image at the same time
# This file should ONLY BY USED FOR `master` BRANCH. 
# TODO: GitHub now has an ubuntu-24.04-arm64 runner, but we still need
# to use QEMU to build the arm64 image because Chromium is not available for Linux arm64
# so builds will still fail, or fail much more often. Its inconsistent and frustrating.
name: Publish AnythingLLM Primary Docker image (amd64/arm64)

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  push:
    branches: ['master'] # master branch only. Do not modify.
    paths-ignore:
      - '**.md'
      - '.gitmodules'
      - 'cloud-deployments/**/*'
      - 'images/**/*'
      - '.vscode/**/*'
      - '**/.env.example'
      - '.github/ISSUE_TEMPLATE/**/*'
      - '.devcontainer/**/*'
      - 'embed/**/*' # Embed is submodule
      - 'browser-extension/**/*' # Chrome extension is submodule
      - 'server/utils/agents/aibitat/example/**/*' # Do not push new image for local dev testing of new aibitat images.
      - 'extras/**/*' # Extra is just for news and other local content.

jobs:
  push_multi_platform_to_registries:
    name: Push Docker multi-platform image to multiple registries
    runs-on: ubuntu-22.04-arm
    permissions:
      packages: write
      contents: read
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Check if DockerHub build needed
        shell: bash
        run: |
          # Check if the secret for USERNAME is set (don't even check for the password)
          if [[ -z "${{ secrets.DOCKER_USERNAME }}" ]]; then
            echo "DockerHub build not needed"
            echo "enabled=false" >> $GITHUB_OUTPUT
          else
            echo "DockerHub build needed"
            echo "enabled=true" >> $GITHUB_OUTPUT
          fi
        id: dockerhub

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          version: v0.22.0
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        # Only login to the Docker Hub if the repo is mintplex/anythingllm, to allow for forks to build on GHCR
        if: steps.dockerhub.outputs.enabled == 'true' 
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: |
            ${{ steps.dockerhub.outputs.enabled == 'true' && 'mintplexlabs/anythingllm' || '' }}
            ghcr.io/${{ github.repository }}
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr

      - name: Build and push multi-platform Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./docker/Dockerfile
          push: true
          sbom: true
          provenance: mode=max
          platforms: linux/amd64,linux/arm64
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
      
      # For Docker scout there are some intermediary reported CVEs which exists outside
      # of execution content or are unreachable by an attacker but exist in image.
      # We create VEX files for these so they don't show in scout summary. 
      - name: Collect known and verified CVE exceptions
        id: cve-list
        run: |
          # Collect CVEs from filenames in vex folder
          CVE_NAMES=""
          for file in ./docker/vex/*.vex.json; do
            [ -e "$file" ] || continue
            filename=$(basename "$file")
            stripped_filename=${filename%.vex.json}
            CVE_NAMES+=" $stripped_filename"
          done
          echo "CVE_EXCEPTIONS=$CVE_NAMES" >> $GITHUB_OUTPUT
        shell: bash

      # About VEX attestations https://docs.docker.com/scout/explore/exceptions/
      # Justifications https://github.com/openvex/spec/blob/main/OPENVEX-SPEC.md#status-justifications
      - name: Add VEX attestations
        env:
          CVE_EXCEPTIONS: ${{ steps.cve-list.outputs.CVE_EXCEPTIONS }}
        run: |
          echo $CVE_EXCEPTIONS
          curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
          for cve in $CVE_EXCEPTIONS; do
            for tag in "${{ join(fromJSON(steps.meta.outputs.json).tags, ' ') }}"; do
              echo "Attaching VEX exception $cve to $tag"
              docker scout attestation add \
              --file "./docker/vex/$cve.vex.json" \
              --predicate-type https://openvex.dev/ns/v0.2.0 \
              $tag
            done
          done
        shell: bash

================================================
FILE: .github/workflows/build-qa-tag.yaml
================================================
# Builds a QA GHCR image for a PR when the "PR: Ready for QA" label is present.
# Triggers on:
#   - "PR: Ready for QA" label added to a PR
#   - New commits pushed to a PR that already has the label will trigger a new build
name: Build QA GHCR Image

on:
  pull_request:
    types: [labeled, synchronize]
    paths-ignore:
      - "**.md"
      - ".gitmodules"
      - "cloud-deployments/**/*"
      - "images/**/*"
      - ".vscode/**/*"
      - "**/.env.example"
      - ".github/ISSUE_TEMPLATE/**/*"
      - ".devcontainer/**/*"
      - "embed/**/*"
      - "browser-extension/**/*"
      - "extras/**/*"

concurrency:
  group: qa-build-pr-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  build:
    name: Build and push QA image for PR
    runs-on: ubuntu-22.04-arm
    # Run when labeled with "PR: Ready for QA"
    if: >-
      ${{ contains(github.event.pull_request.labels.*.name, 'PR: Ready for QA') }}
    permissions:
      packages: write
      contents: read
      pull-requests: write
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          version: v0.22.0

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Set lowercase repository owner
        run: echo "REPO_OWNER_LC=${GITHUB_REPOSITORY_OWNER,,}" >> $GITHUB_ENV

      - name: Build and push
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./docker/Dockerfile
          push: true
          sbom: true
          provenance: mode=max
          platforms: linux/arm64
          tags: ghcr.io/${{ env.REPO_OWNER_LC }}/${{ github.event.repository.name }}:pr-${{ github.event.pull_request.number }}
          cache-from: type=gha
          cache-to: type=gha,mode=max


================================================
FILE: .github/workflows/check-package-versions.yaml
================================================
# This GitHub action is for checking the versions of the packages in the project.
# Any package that is present in both the `server` and `collector` package.json file
# is checked to ensure that they are the same version.
name: Check package versions

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  pull_request:
    types: [opened, synchronize, reopened]
    paths:
      - "server/package.json"
      - "collector/package.json"

jobs:
  run-script:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Run verifyPackageVersions.mjs script
        run: |
          cd extras/scripts
          node verifyPackageVersions.mjs

      - name: Fail job on error
        if: failure()
        run: exit 1


================================================
FILE: .github/workflows/check-translations.yaml
================================================
# This GitHub action is for validation of all languages which translations are offered for
# in the locales folder in `frontend/src`. All languages are compared to the EN translation
# schema since that is the fallback language setting. This workflow will run on all PRs that
# modify any files in the translation directory
name: Verify translations files

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  pull_request:
    types: [opened, synchronize, reopened]
    paths:
      - "frontend/src/locales/**.js"

jobs:
  run-script:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Run verifyTranslations.mjs script
        run: |
          cd frontend/src/locales
          node verifyTranslations.mjs

      - name: Fail job on error
        if: failure()
        run: exit 1


================================================
FILE: .github/workflows/cleanup-qa-tag.yaml
================================================
# Cleans up the GHCR image tag when the PR is closed or the "PR: Ready for QA" label is removed.
name: Cleanup QA GHCR Image

on:
  pull_request:
    types: [closed, unlabeled]
  workflow_dispatch:
    inputs:
      pr_number:
        description: 'PR number to clean up (e.g., 123)'
        required: true

jobs:
  cleanup-manual:
    name: Delete QA GHCR image tag (manual)
    runs-on: ubuntu-latest
    if: github.event_name == 'workflow_dispatch'
    permissions:
      packages: write
    steps:
      - name: Delete PR tag from GHCR
        env:
          GH_TOKEN: ${{ secrets.ALLM_RW_PACKAGES }}
          PR_NUMBER: ${{ inputs.pr_number }}
        run: |
          # Must use lowercase - packages are published with lowercase owner
          ORG_LC="${GITHUB_REPOSITORY_OWNER,,}"
          REPO_LC="${GITHUB_REPOSITORY#*/}"
          REPO_LC="${REPO_LC,,}"
          
          echo "Looking for tag: pr-${PR_NUMBER}"
          echo "Package: /orgs/${ORG_LC}/packages/container/${REPO_LC}/versions"
          
          VERSION_ID=$(gh api \
            -H "Accept: application/vnd.github+json" \
            --paginate \
            "/orgs/${ORG_LC}/packages/container/${REPO_LC}/versions" \
            --jq ".[] | select(.metadata.container.tags[] == \"pr-${PR_NUMBER}\") | .id")
          
          if [ -n "$VERSION_ID" ]; then
            echo "Deleting package version $VERSION_ID (tag: pr-${PR_NUMBER})"
            gh api \
              --method DELETE \
              -H "Accept: application/vnd.github+json" \
              "/orgs/${ORG_LC}/packages/container/${REPO_LC}/versions/$VERSION_ID"
          else
            echo "No package found with tag pr-${PR_NUMBER}, skipping cleanup"
          fi

  cleanup-auto:
    name: Delete QA GHCR image tag (auto)
    runs-on: ubuntu-latest
    if: >-
      (github.event.action == 'closed' && contains(github.event.pull_request.labels.*.name, 'PR: Ready for QA')) ||
      (github.event.action == 'unlabeled' && github.event.label.name == 'PR: Ready for QA')
    permissions:
      packages: write
    steps:
      - name: Delete PR tag from GHCR
        env:
          GH_TOKEN: ${{ secrets.ALLM_RW_PACKAGES }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
        run: |
          # Must use lowercase - packages are published with lowercase owner
          ORG_LC="${GITHUB_REPOSITORY_OWNER,,}"
          REPO_LC="${GITHUB_REPOSITORY#*/}"
          REPO_LC="${REPO_LC,,}"
          
          VERSION_ID=$(gh api \
            -H "Accept: application/vnd.github+json" \
            --paginate \
            "/orgs/${ORG_LC}/packages/container/${REPO_LC}/versions" \
            --jq ".[] | select(.metadata.container.tags[] == \"pr-${PR_NUMBER}\") | .id" \
            2>/dev/null || true)
          
          if [ -n "$VERSION_ID" ]; then
            echo "Deleting package version $VERSION_ID (tag: pr-${PR_NUMBER})"
            gh api \
              --method DELETE \
              -H "Accept: application/vnd.github+json" \
              "/orgs/${ORG_LC}/packages/container/${REPO_LC}/versions/$VERSION_ID"
          else
            echo "No package found with tag pr-${PR_NUMBER}, skipping cleanup"
          fi


================================================
FILE: .github/workflows/lint.yaml
================================================
name: Lint

concurrency:
  group: lint-${{ github.ref }}
  cancel-in-progress: true

on:
  pull_request:
    types: [opened, synchronize, reopened]
    paths:
      - "server/**/*.js"
      - "server/eslint.config.mjs"
      - "collector/**/*.js"
      - "collector/eslint.config.mjs"
      - "frontend/src/**/*.js"
      - "frontend/src/**/*.jsx"
      - "frontend/eslint.config.js"

jobs:
  lint:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "18"

      - name: Cache server dependencies
        uses: actions/cache@v4
        with:
          path: server/node_modules
          key: ${{ runner.os }}-yarn-server-${{ hashFiles('server/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-server-

      - name: Cache frontend dependencies
        uses: actions/cache@v4
        with:
          path: frontend/node_modules
          key: ${{ runner.os }}-yarn-frontend-${{ hashFiles('frontend/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-frontend-

      - name: Cache collector dependencies
        uses: actions/cache@v4
        with:
          path: collector/node_modules
          key: ${{ runner.os }}-yarn-collector-${{ hashFiles('collector/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-collector-

      - name: Install server dependencies
        run: cd server && yarn install --frozen-lockfile

      - name: Install frontend dependencies
        run: cd frontend && yarn install --frozen-lockfile

      - name: Install collector dependencies
        run: cd collector && yarn install --frozen-lockfile
        env:
          PUPPETEER_SKIP_DOWNLOAD: "true"
          SHARP_IGNORE_GLOBAL_LIBVIPS: "true"

      - name: Lint server
        run: cd server && yarn lint:check

      - name: Lint frontend
        run: cd frontend && yarn lint:check

      - name: Lint collector
        run: cd collector && yarn lint:check


================================================
FILE: .github/workflows/run-tests.yaml
================================================
name: Run backend tests

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  pull_request:
    types: [opened, synchronize, reopened]
    paths:
      - "server/**.js"
      - "collector/**.js"

jobs:
  run-script:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Cache root dependencies
        uses: actions/cache@v3
        with:
          path: |
            node_modules
            ~/.cache/yarn
          key: ${{ runner.os }}-yarn-root-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-root-

      - name: Cache server dependencies
        uses: actions/cache@v3
        with:
          path: |
            server/node_modules
            ~/.cache/yarn
          key: ${{ runner.os }}-yarn-server-${{ hashFiles('server/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-server-

      - name: Cache collector dependencies
        uses: actions/cache@v3
        with:
          path: |
            collector/node_modules
            ~/.cache/yarn
          key: ${{ runner.os }}-yarn-collector-${{ hashFiles('collector/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-collector-

      - name: Install root dependencies
        if: steps.cache-root.outputs.cache-hit != 'true'
        run: yarn install --frozen-lockfile

      - name: Install server dependencies
        if: steps.cache-server.outputs.cache-hit != 'true'
        run: cd server && yarn install --frozen-lockfile

      - name: Install collector dependencies
        if: steps.cache-collector.outputs.cache-hit != 'true'
        run: cd collector && yarn install --frozen-lockfile
        env:
          PUPPETEER_SKIP_DOWNLOAD: "true"
          SHARP_IGNORE_GLOBAL_LIBVIPS: "true"

      - name: Setup environment and Prisma
        run: yarn setup:envs && yarn prisma:setup

      - name: Run test suites
        run: yarn test

      - name: Fail job on error
        if: failure()
        run: exit 1


================================================
FILE: .github/workflows/sponsors.yaml
================================================
name: Generate Sponsors README

on:
  schedule:
    - cron: "0 12 * * 3" # Run every Wednesday at 12:00 PM UTC

permissions:
  contents: write
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout 🛎️
        uses: actions/checkout@v2

      - name: Generate All Sponsors README
        id: generate-all-sponsors
        uses: JamesIves/github-sponsors-readme-action@v1
        with:
          token: ${{ secrets.SPONSOR_PAT }}
          file: 'README.md'
          organization: true
          active-only: false
          marker: 'all-sponsors'

      - name: Commit and Push 🚀
        uses: stefanzweifel/git-auto-commit-action@v5
        id: auto-commit-action
        with:
          commit_message: 'Update Sponsors README'
          file_pattern: 'README.md'

      - name: Generate PR if changes detected
        uses: peter-evans/create-pull-request@v7
        if: steps.auto-commit-action.outputs.files_changed == 'true'
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          title: 'Update Sponsors README'
          branch: 'chore/update-sponsors'
          base: 'master'
          draft: false
          reviewers: 'timothycarambat'
          assignees: 'timothycarambat'
          maintainer-can-modify: true

================================================
FILE: .gitignore
================================================
v-env
.env
!.env.example

node_modules
__pycache__
v-env
.DS_Store
aws_cf_deploy_anything_llm.json
yarn.lock
*.bak
.idea


================================================
FILE: .gitmodules
================================================
[submodule "browser-extension"]
	path = browser-extension
	url = https://github.com/Mintplex-Labs/anythingllm-extension.git
[submodule "embed"]
	path = embed
	url = https://github.com/Mintplex-Labs/anythingllm-embed.git
	branch = main


================================================
FILE: .hadolint.yaml
================================================
failure-threshold: warning
ignored:
  - DL3008
  - DL3013
format: tty
trustedRegistries:
  - docker.io
  - gcr.io


================================================
FILE: .nvmrc
================================================
v18.18.0


================================================
FILE: .prettierignore
================================================
# defaults
**/.git
**/.svn
**/.hg
**/node_modules

#frontend
frontend/bundleinspector.html
**/dist

#server
server/swagger/openapi.json
server/**/*.mjs

#embed
**/static/**
embed/src/utils/chat/hljs.js


================================================
FILE: .prettierrc
================================================
{
  "tabWidth": 2,
  "useTabs": false,
  "endOfLine": "lf",
  "semi": true,
  "singleQuote": false,
  "printWidth": 80,
  "trailingComma": "es5",
  "bracketSpacing": true,
  "bracketSameLine": false,
  "overrides": [
    {
      "files": ["*.js", "*.mjs", "*.jsx"],
      "options": {
        "parser": "flow",
        "arrowParens": "always"
      }
    },
    {
      "files": ["*.config.js"],
      "options": {
        "semi": false,
        "parser": "flow",
        "trailingComma": "none"
      }
    },
    {
      "files": "*.html",
      "options": {
        "bracketSameLine": true
      }
    },
    {
      "files": ".prettierrc",
      "options": { "parser": "json" }
    }
  ]
}


================================================
FILE: .vscode/launch.json
================================================
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Collector debug",
      "request": "launch",
      "cwd": "${workspaceFolder}/collector",
      "env": {
        "NODE_ENV": "development"
      },
      "runtimeArgs": [
        "index.js"
      ],
      // not using yarn/nodemon because it doesn't work with breakpoints
      // "runtimeExecutable": "yarn",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "type": "node"
    },
    {
      "name": "Server debug",
      "request": "launch",
      "cwd": "${workspaceFolder}/server",
      "env": {
        "NODE_ENV": "development"
      },
      "runtimeArgs": [
        "index.js"
      ],
      // not using yarn/nodemon because it doesn't work with breakpoints
      // "runtimeExecutable": "yarn",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "type": "node"
    },
    {
      "name": "Frontend debug",
      "request": "launch",
      "cwd": "${workspaceFolder}/frontend",
      "env": {
        "NODE_ENV": "development",
      },
      "runtimeExecutable": "${workspaceFolder}/frontend/node_modules/.bin/vite",
      "runtimeArgs": [
        "--debug",
        "--host=0.0.0.0"
      ],
      // "runtimeExecutable": "yarn",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "type": "node"
    },
    {
      "name": "Launch Edge",
      "request": "launch",
      "type": "msedge",
      "url": "http://localhost:3000",
      "webRoot": "${workspaceFolder}"
    },
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome against localhost",
      "url": "http://localhost:3000",
      "webRoot": "${workspaceFolder}"
    }
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "cSpell.words": [
    "adoc",
    "aibitat",
    "AIbitat",
    "allm",
    "anythingllm",
    "Apipie",
    "Astra",
    "Chartable",
    "cleancss",
    "comkey",
    "cooldown",
    "cooldowns",
    "datafile",
    "Deduplicator",
    "Dockerized",
    "docpath",
    "elevenlabs",
    "Embeddable",
    "epub",
    "fireworksai",
    "GROQ",
    "hljs",
    "huggingface",
    "inferencing",
    "koboldcpp",
    "Langchain",
    "lmstudio",
    "localai",
    "mbox",
    "Milvus",
    "Mintplex",
    "mixtral",
    "moderations",
    "novita",
    "numpages",
    "Ollama",
    "Oobabooga",
    "openai",
    "opendocument",
    "openrouter",
    "pagerender",
    "ppio",
    "Qdrant",
    "royalblue",
    "SearchApi",
    "searxng",
    "SerpApi",
    "Serper",
    "Serply",
    "streamable",
    "textgenwebui",
    "togetherai",
    "Unembed",
    "uuidv",
    "vectordbs",
    "Weaviate",
    "XAILLM",
    "Zilliz"
  ],
  "eslint.experimental.useFlatConfig": true,
  "docker.languageserver.formatter.ignoreMultilineInstructions": true
}

================================================
FILE: .vscode/tasks.json
================================================
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "options": {
        "cwd": "${workspaceFolder}/collector",
        "statusbar": {
          "color": "#ffea00",
          "detail": "Runs the collector",
          "label": "Collector: $(play) run",
          "running": {
            "color": "#ffea00",
            "label": "Collector: $(gear~spin) running"
          }
        }
      },
      "command": "cd ${workspaceFolder}/collector/ && yarn dev",
      "runOptions": {
        "instanceLimit": 1,
        "reevaluateOnRerun": true
      },
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": false,
        "panel": "shared",
        "showReuseMessage": true,
        "clear": false
      },
      "label": "Collector: run"
    },
    {
      "type": "shell",
      "options": {
        "cwd": "${workspaceFolder}/server",
        "statusbar": {
          "color": "#ffea00",
          "detail": "Runs the server",
          "label": "Server: $(play) run",
          "running": {
            "color": "#ffea00",
            "label": "Server: $(gear~spin) running"
          }
        }
      },
      "command": "if [ \"${CODESPACES}\" = \"true\" ]; then while ! gh codespace ports -c $CODESPACE_NAME | grep 3001; do sleep 1; done; gh codespace ports visibility 3001:public -c $CODESPACE_NAME; fi & cd ${workspaceFolder}/server/ && yarn dev",
      "runOptions": {
        "instanceLimit": 1,
        "reevaluateOnRerun": true
      },
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": false,
        "panel": "shared",
        "showReuseMessage": true,
        "clear": false
      },
      "label": "Server: run"
    },
    {
      "type": "shell",
      "options": {
        "cwd": "${workspaceFolder}/frontend",
        "statusbar": {
          "color": "#ffea00",
          "detail": "Runs the frontend",
          "label": "Frontend: $(play) run",
          "running": {
            "color": "#ffea00",
            "label": "Frontend: $(gear~spin) running"
          }
        }
      },
      "command": "cd ${workspaceFolder}/frontend/ && yarn dev",
      "runOptions": {
        "instanceLimit": 1,
        "reevaluateOnRerun": true
      },
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": false,
        "panel": "shared",
        "showReuseMessage": true,
        "clear": false
      },
      "label": "Frontend: run"
    }
  ]
}


================================================
FILE: BARE_METAL.md
================================================
# Run AnythingLLM in production without Docker

> [!WARNING]
> This method of deployment is **not supported** by the core-team and is to be used as a reference for your deployment.
> You are fully responsible for securing your deployment and data in this mode.
> **Any issues** experienced from bare-metal or non-containerized deployments will be **not** answered or supported.

Here you can find the scripts and known working process to run AnythingLLM outside of a Docker container.

### Minimum Requirements
> [!TIP]
> You should aim for at least 2GB of RAM. Disk storage is proportional to however much data
> you will be storing (documents, vectors, models, etc). Minimum 10GB recommended.

- NodeJS v18
- Yarn


## Getting started

1. Clone the repo into your server as the user who the application will run as.
`git clone git@github.com:Mintplex-Labs/anything-llm.git`

2. `cd anything-llm` and run `yarn setup`. This will install all dependencies to run in production as well as debug the application.

3. `cp server/.env.example server/.env` to create the basic ENV file for where instance settings will be read from on service start.

4. Ensure that the `server/.env` file has _at least_ these keys to start. These values will persist and this file will be automatically written and managed after your first successful boot.
```
STORAGE_DIR="/your/absolute/path/to/server/storage"
```

5. Edit the `frontend/.env` file for the `VITE_BASE_API` to now be set to `/api`. This is documented in the .env for which one you should use.
```
# VITE_API_BASE='http://localhost:3001/api' # Use this URL when developing locally
# VITE_API_BASE="https://$CODESPACE_NAME-3001.$GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN/api" # for GitHub Codespaces
VITE_API_BASE='/api' # Use this URL deploying on non-localhost address OR in docker.
```

## To start the application

AnythingLLM is comprised of three main sections. The `frontend`, `server`, and `collector`. When running in production you will be running `server` and `collector` on two different processes, with a build step for compilation of the frontend.

1. Build the frontend application.
`cd frontend && yarn build` - this will produce a `frontend/dist` folder that will be used later.

2. Copy `frontend/dist` to `server/public` - `cp -R frontend/dist server/public`.
This should create a folder in `server` named `public` which contains a top level `index.html` file and various other files/folders.

3. Migrate and prepare your database file.
```
cd server && npx prisma generate --schema=./prisma/schema.prisma
cd server && npx prisma migrate deploy --schema=./prisma/schema.prisma
```

4. Boot the server in production
`cd server && NODE_ENV=production node index.js &`

5. Boot the collection in another process
`cd collector && NODE_ENV=production node index.js &`

AnythingLLM should now be running on `http://localhost:3001`!

## Updating AnythingLLM

To update AnythingLLM with future updates you can `git pull origin master` to pull in the latest code and then repeat steps 2 - 5 to deploy with all changes fully.

_note_ You should ensure that each folder runs `yarn` again to ensure packages are up to date in case any dependencies were added, changed, or removed.

_note_ You should `pkill node` before running an update so that you are not running multiple AnythingLLM processes on the same instance as this can cause conflicts.


### Example update script

```shell
#!/bin/bash

cd $HOME/anything-llm &&\
git checkout . &&\
git pull origin master &&\
echo "HEAD pulled to commit $(git log -1 --pretty=format:"%h" | tail -n 1)"

echo "Freezing current ENVs"
curl -I "http://localhost:3001/api/env-dump" | head -n 1|cut -d$' ' -f2

echo "Rebuilding Frontend"
cd $HOME/anything-llm/frontend && yarn && yarn build && cd $HOME/anything-llm

echo "Copying to Server Public"
rm -rf server/public
cp -r frontend/dist server/public

echo "Killing node processes"
pkill node

echo "Installing collector dependencies"
cd $HOME/anything-llm/collector && yarn

echo "Installing server dependencies & running migrations"
cd $HOME/anything-llm/server && yarn
cd $HOME/anything-llm/server && npx prisma migrate deploy --schema=./prisma/schema.prisma
cd $HOME/anything-llm/server && npx prisma generate

echo "Booting up services."
truncate -s 0 /logs/server.log # Or any other log file location.
truncate -s 0 /logs/collector.log

cd $HOME/anything-llm/server
(NODE_ENV=production node index.js) &> /logs/server.log &

cd $HOME/anything-llm/collector
(NODE_ENV=production node index.js) &> /logs/collector.log &
```

## Using Nginx?

If you are using Nginx, you can use the following example configuration to proxy the requests to the server. Chats for streaming require **websocket** connections, so you need to ensure that the Nginx configuration is set up to support websockets. You can do this with a simple reverse proxy configuration.

```nginx
server {
   # Enable websocket connections for agent protocol.
   location ~* ^/api/agent-invocation/(.*) {
      proxy_pass http://0.0.0.0:3001;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
   }

   listen 80;
   server_name [insert FQDN here];
   location / {
      # Prevent timeouts on long-running requests.
      proxy_connect_timeout       605;
      proxy_send_timeout          605;
      proxy_read_timeout          605;
      send_timeout                605;
      keepalive_timeout           605;

      # Enable readable HTTP Streaming for LLM streamed responses
      proxy_buffering off; 
      proxy_cache off;

      # Proxy your locally running service
      proxy_pass  http://0.0.0.0:3001;
    }
}
```

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to AnythingLLM

AnythingLLM is an open-source project and we welcome contributions from the community.

## Reporting Issues

If you encounter a bug or have a feature request, please open an issue on the
[GitHub issue tracker](https://github.com/mintplex-labs/anything-llm).

## Picking an issue

We track issues on the GitHub issue tracker. If you are looking for something to
work on, check the [good first issue](https://github.com/mintplex-labs/anything-llm/contribute) label. These issues are typically the best described and have the smallest scope. There may be issues that are not labeled as good first issue, but are still a good starting point.

If there's an issue you are interested in working on, please leave a comment on the issue. This will help us avoid duplicate work. Additionally, if you have questions about the issue, please ask them in the issue comments. We are happy to provide guidance on how to approach the issue.

## Before you start

Keep in mind that we are a small team and have limited resources. We will do our best to review and merge your PRs, but please be patient. Ultimately, **we become the maintainer** of your changes. It is our responsibility to make sure that the changes are working as expected and are of high quality as well as being compatible with the rest of the project both for existing users and for future users & features.

Before you start working on an issue, please read the following so that you don't waste time on something that is not a good fit for the project or is more suitable for a personal fork. We would rather answer a comment on an issue than close a PR after you've spent time on it. Your time is valuable and we appreciate your time and effort to make AnythingLLM better.

0. (most important) If you are making a PR that does not have a corresponding issue, **it will not be merged.** _The only exception to this is language translations._

1. If you are modifying the permission system for a new role or something custom, you are likely better off forking the project and building your own version since this is a core part of the project and is only to be maintained by the AnythingLLM team.

2. Integrations (LLM, Vector DB, etc.) are reviewed at our discretion. We will eventually get to them. Do not expect us to merge your integration PR instantly since there are often many moving parts and we want to make sure we get it right. We will get to it!

3. It is our discretion to merge or not merge a PR. We value every contribution, but we also value the quality of the code and the user experience we envision for the project. It is a fine line to walk when running a project like this and please understand that merging or not merging a PR is not a reflection of the quality of the contribution and is not personal. We will do our best to provide feedback on the PR and help you make the changes necessary to get it merged.

4. **Security** is always important. If you have a security concern, please do not open an issue. Instead, please open a CVE on our designated reporting platform [Huntr](https://huntr.com) or contact us at [team@mintplexlabs.com](mailto:team@mintplexlabs.com).

## Configuring Git

First, fork the repository on GitHub, then clone your fork:

```bash
git clone https://github.com/<username>/anything-llm.git
cd anything-llm
```

Then add the main repository as a remote:

```bash
git remote add upstream https://github.com/mintplex-labs/anything-llm.git
git fetch upstream
```

## Setting up your development environment

In the root of the repository, run:

```bash
yarn setup
```

This will install the dependencies, set up the proper and expected ENV files for the project, and run the prisma setup script.
Next, run:

```bash
yarn dev:all
```
This will start the server, frontend, and collector in development mode. Changes to the code will be hot reloaded.

## Best practices for pull requests

For the best chance of having your pull request accepted, please follow these guidelines:

1. Unit test all bug fixes and new features. Your code will not be merged if it
   doesn't have tests.
1. If you change the public API, update the documentation in the `anythingllm-docs` repository.
1. Aim to minimize the number of changes in each pull request. Keep to solving
   one problem at a time, when possible.
1. Before marking a pull request ready-for-review, do a self review of your code.
   Is it clear why you are making the changes? Are the changes easy to understand?
1. Use [conventional commit messages](https://www.conventionalcommits.org/en/) as pull request titles. Examples:
    * New feature: `feat: adding foo API`
    * Bug fix: `fix: issue with foo API`
    * Documentation change: `docs: adding foo API documentation`
1. If your pull request is a work in progress, leave the pull request as a draft.
   We will assume the pull request is ready for review when it is opened.
1. When writing tests, test the error cases. Make sure they have understandable
   error messages.

## Project structure

The core library is written in Node.js. There are additional sub-repositories for the embed widget and browser extension. These are not part of the core AnythingLLM project, but are maintained by the AnythingLLM team.

* `server`: Node.js server source code
* `frontend`: React frontend source code
* `collector`: Python collector source code

## Release process

Changes to the core AnythingLLM project are released through the `master` branch. When a PR is merged into `master`, a new version of the package is published to Docker and GitHub Container Registry under the `latest` tag.

When a new version is released, the following steps are taken a new image is built and pushed to Docker Hub and GitHub Container Registry under the associated version tag. Version tags are of the format `v<major>.<minor>.<patch>` and are pinned code, while `latest` is the latest version of the code at any point in time.

### Desktop propagation

Changes to the desktop app are downstream of the core AnythingLLM project. Releases of the desktop app are published at the same time as the core AnythingLLM project. Code from the core AnythingLLM project is copied into the desktop app into an Electron wrapper. The Electron wrapper that wraps around the core AnythingLLM project is **not** part of the core AnythingLLM project, but is maintained by the AnythingLLM team.

## License

By contributing to AnythingLLM (this repository), you agree to license your contributions under the MIT license.


================================================
FILE: LICENSE
================================================
The MIT License

Copyright (c) Mintplex Labs Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

================================================
FILE: README.md
================================================
<a name="readme-top"></a>

<p align="center">
  <a href="https://anythingllm.com"><img src="https://github.com/Mintplex-Labs/anything-llm/blob/master/images/wordmark.png?raw=true" alt="AnythingLLM logo"></a>
</p>

<div align='center'>
<a href="https://trendshift.io/repositories/2415" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2415" alt="Mintplex-Labs%2Fanything-llm | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</div>

<p align="center">
    <b>AnythingLLM:</b> The all-in-one AI app you were looking for.<br />
    Chat with your docs, use AI Agents, hyper-configurable, multi-user, & no frustrating setup required.
</p>

<p align="center">
  <a href="https://discord.gg/6UyHPeGZAC" target="_blank">
      <img src="https://img.shields.io/badge/chat-mintplex_labs-blue.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAH1UExURQAAAP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////r6+ubn5+7u7/3+/v39/enq6urq6/v7+97f39rb26eoqT1BQ0pOT4+Rkuzs7cnKykZKS0NHSHl8fdzd3ejo6UxPUUBDRdzc3RwgIh8jJSAkJm5xcvHx8aanqB4iJFBTVezt7V5hYlJVVuLj43p9fiImKCMnKZKUlaaoqSElJ21wcfT09O3u7uvr6zE0Nr6/wCUpK5qcnf7+/nh7fEdKTHx+f0tPUOTl5aipqiouMGtubz5CRDQ4OsTGxufn515hY7a3uH1/gXBydIOFhlVYWvX29qaoqCQoKs7Pz/Pz87/AwUtOUNfY2dHR0mhrbOvr7E5RUy8zNXR2d/f39+Xl5UZJSx0hIzQ3Odra2/z8/GlsbaGjpERHSezs7L/BwScrLTQ4Odna2zM3Obm7u3x/gKSmp9jZ2T1AQu/v71pdXkVISr2+vygsLiInKTg7PaOlpisvMcXGxzk8PldaXPLy8u7u7rm6u7S1tsDBwvj4+MPExbe4ueXm5s/Q0Kyf7ewAAAAodFJOUwAABClsrNjx/QM2l9/7lhmI6jTB/kA1GgKJN+nea6vy/MLZQYeVKK3rVA5tAAAAAWJLR0QB/wIt3gAAAAd0SU1FB+cKBAAmMZBHjXIAAAISSURBVDjLY2CAAkYmZhZWNnYODnY2VhZmJkYGVMDIycXNw6sBBbw8fFycyEoYGfkFBDVQgKAAPyMjQl5IWEQDDYgIC8FUMDKKsmlgAWyiEBWMjGJY5YEqxMAqGMWFNXAAYXGgAkYJSQ2cQFKCkYFRShq3AmkpRgYJbghbU0tbB0Tr6ukbgGhDI10gySfBwCwDUWBsYmpmDqQtLK2sbTQ0bO3sHYA8GWYGWWj4WTs6Obu4ami4OTm7exhqeHp5+4DCVJZBDmqdr7ufn3+ArkZgkJ+fU3CIRmgYWFiOARYGvo5OQUHhEUAFTkF+kVHRsLBgkIeyYmLjwoOc4hMSk5JTnINS06DC8gwcEEZ6RqZGlpOfc3ZObl5+gZ+TR2ERWFyBQQFMF5eklmqUpQb5+ReU61ZUOvkFVVXXQBSAraitq29o1GiKcfLzc29u0mjxBzq0tQ0kww5xZHtHUGeXhkZhdxBYgZ4d0LI6c4gjwd7siQQraOp1AivQ6CuAKZCDBBRQQQNQgUb/BGf3cqCCiZOcnCe3QQIKHNRTpk6bDgpZjRkzg3pBQTBrdtCcuZCgluAD0vPmL1gIdvSixUuWgqNs2YJ+DUhkEYxuggkGmOQUcckrioPTJCOXEnZ5JS5YslbGnuyVERlDDFvGEUPOWvwqaH6RVkHKeuDMK6SKnHlVhTgx8jeTmqy6Eij7K6nLqiGyPwChsa1MUrnq1wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMy0xMC0wNFQwMDozODo0OSswMDowMB9V0a8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjMtMTAtMDRUMDA6Mzg6NDkrMDA6MDBuCGkTAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDIzLTEwLTA0VDAwOjM4OjQ5KzAwOjAwOR1IzAAAAABJRU5ErkJggg==" alt="Discord">
  </a> |
  <a href="https://github.com/Mintplex-Labs/anything-llm/blob/master/LICENSE" target="_blank">
      <img src="https://img.shields.io/static/v1?label=license&message=MIT&color=white" alt="License">
  </a> |
  <a href="https://docs.anythingllm.com" target="_blank">
    Docs
  </a> |
   <a href="https://my.mintplexlabs.com/aio-checkout?product=anythingllm" target="_blank">
    Hosted Instance
  </a>
</p>

<p align="center">
  <b>English</b> · <a href='./locales/README.zh-CN.md'>简体中文</a> · <a href='./locales/README.ja-JP.md'>日本語</a>
</p>

<p align="center">
👉 AnythingLLM for desktop (Mac, Windows, & Linux)! <a href="https://anythingllm.com/download" target="_blank"> Download Now</a>
</p>

Chat with your docs. Automate complex workflows with AI Agents. Hyper-configurable, multi-user ready, battle-tested—and runs locally by default with zero setup friction.

![Chatting](https://github.com/Mintplex-Labs/anything-llm/releases/download/v1.11.2/AnythingLLM720p.gif)

<details>
<summary><kbd>Watch the demo!</kbd></summary>

[![Watch the video](/images/youtube.png)](https://youtu.be/f95rGD9trL0)

</details>

### Product Overview

AnythingLLM is the all-in-one AI application that lets you build a private, fully-featured ChatGPT—without compromises. Connect your favorite local or cloud LLM, ingest your documents, and start chatting in minutes. Out of the box you get built-in agents, multi-user support, vector databases, and document pipelines — no extra configuration required.

AnythingLLM supports multiple users as well where you can control the access and experience per user without compromising the security or privacy of the instance or your intellectual property.

## Cool features of AnythingLLM

- [Intelligent Skill Selection](https://docs.anythingllm.com/agent/intelligent-tool-selection) Enable **unlimited** tools for your models while reducing token usage by up to 80% per query
- [**No-code AI Agent builder**](https://docs.anythingllm.com/agent-flows/overview)
- [**Full MCP-compatibility**](https://docs.anythingllm.com/mcp-compatibility/overview)
- **Multi-modal support (both closed and open-source LLMs!)**
- [**Custom AI Agents**](https://docs.anythingllm.com/agent/custom/introduction)
- 👤 Multi-user instance support and permissioning _Docker version only_
- 🦾 Agents inside your workspace (browse the web, etc)
- 💬 [Custom Embeddable Chat widget for your website](https://github.com/Mintplex-Labs/anythingllm-embed/blob/main/README.md) _Docker version only_
- 📖 Multiple document type support (PDF, TXT, DOCX, etc)
- Intuitive chat UI with drag-and-drop uploads and source citations.
- Production-ready for any cloud deployment.
- Works with all popular [closed and open-source LLM providers](#supported-llms-embedder-models-speech-models-and-vector-databases).
- Built-in optimizations for large document sets—lower costs and faster responses than other chat UIs.
- Full Developer API for custom integrations!
- ...and much more—install in minutes and see for yourself.

### Supported LLMs, Embedder Models, Speech models, and Vector Databases

**Large Language Models (LLMs):**

- [Any open-source llama.cpp compatible model](/server/storage/models/README.md#text-generation-llm-selection)
- [OpenAI](https://openai.com)
- [OpenAI (Generic)](https://openai.com)
- [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service)
- [AWS Bedrock](https://aws.amazon.com/bedrock/)
- [Anthropic](https://www.anthropic.com/)
- [NVIDIA NIM (chat models)](https://build.nvidia.com/explore/discover)
- [Google Gemini Pro](https://ai.google.dev/)
- [Hugging Face (chat models)](https://huggingface.co/)
- [Ollama (chat models)](https://ollama.ai/)
- [LM Studio (all models)](https://lmstudio.ai)
- [LocalAI (all models)](https://localai.io/)
- [Together AI (chat models)](https://www.together.ai/)
- [Fireworks AI (chat models)](https://fireworks.ai/)
- [Perplexity (chat models)](https://www.perplexity.ai/)
- [OpenRouter (chat models)](https://openrouter.ai/)
- [DeepSeek (chat models)](https://deepseek.com/)
- [Mistral](https://mistral.ai/)
- [Groq](https://groq.com/)
- [Cohere](https://cohere.com/)
- [KoboldCPP](https://github.com/LostRuins/koboldcpp)
- [LiteLLM](https://github.com/BerriAI/litellm)
- [Text Generation Web UI](https://github.com/oobabooga/text-generation-webui)
- [Apipie](https://apipie.ai/)
- [xAI](https://x.ai/)
- [Z.AI (chat models)](https://z.ai/model-api)
- [Novita AI (chat models)](https://novita.ai/model-api/product/llm-api?utm_source=github_anything-llm&utm_medium=github_readme&utm_campaign=link)
- [PPIO](https://ppinfra.com?utm_source=github_anything-llm)
- [Gitee AI](https://ai.gitee.com/)
- [Moonshot AI](https://www.moonshot.ai/)
- [Microsoft Foundry Local](https://github.com/microsoft/Foundry-Local)
- [CometAPI (chat models)](https://api.cometapi.com/)
- [Docker Model Runner](https://docs.docker.com/ai/model-runner/)
- [PrivateModeAI (chat models)](https://privatemode.ai/)
- [SambaNova Cloud (chat models)](https://cloud.sambanova.ai/)
- [Lemonade by AMD](https://lemonade-server.ai)

**Embedder models:**

- [AnythingLLM Native Embedder](/server/storage/models/README.md) (default)
- [OpenAI](https://openai.com)
- [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service)
- [LocalAI (all)](https://localai.io/)
- [Ollama (all)](https://ollama.ai/)
- [LM Studio (all)](https://lmstudio.ai)
- [Cohere](https://cohere.com/)

**Audio Transcription models:**

- [AnythingLLM Built-in](https://github.com/Mintplex-Labs/anything-llm/tree/master/server/storage/models#audiovideo-transcription) (default)
- [OpenAI](https://openai.com/)

**TTS (text-to-speech) support:**

- Native Browser Built-in (default)
- [PiperTTSLocal - runs in browser](https://github.com/rhasspy/piper)
- [OpenAI TTS](https://platform.openai.com/docs/guides/text-to-speech/voice-options)
- [ElevenLabs](https://elevenlabs.io/)
- Any OpenAI Compatible TTS service.

**STT (speech-to-text) support:**

- Native Browser Built-in (default)

**Vector Databases:**

- [LanceDB](https://github.com/lancedb/lancedb) (default)
- [PGVector](https://github.com/pgvector/pgvector)
- [Astra DB](https://www.datastax.com/products/datastax-astra)
- [Pinecone](https://pinecone.io)
- [Chroma & ChromaCloud](https://trychroma.com)
- [Weaviate](https://weaviate.io)
- [Qdrant](https://qdrant.tech)
- [Milvus](https://milvus.io)
- [Zilliz](https://zilliz.com)

### Technical Overview

This monorepo consists of six main sections:

- `frontend`: A viteJS + React frontend that you can run to easily create and manage all your content the LLM can use.
- `server`: A NodeJS express server to handle all the interactions and do all the vectorDB management and LLM interactions.
- `collector`: NodeJS express server that processes and parses documents from the UI.
- `docker`: Docker instructions and build process + information for building from source.
- `embed`: Submodule for generation & creation of the [web embed widget](https://github.com/Mintplex-Labs/anythingllm-embed).
- `browser-extension`: Submodule for the [chrome browser extension](https://github.com/Mintplex-Labs/anythingllm-extension).

## 🛳 Self-Hosting

Mintplex Labs & the community maintain a number of deployment methods, scripts, and templates that you can use to run AnythingLLM locally. Refer to the table below to read how to deploy on your preferred environment or to automatically deploy.
| Docker | AWS | GCP | Digital Ocean | Render.com |
|----------------------------------------|----|-----|---------------|------------|
| [![Deploy on Docker][docker-btn]][docker-deploy] | [![Deploy on AWS][aws-btn]][aws-deploy] | [![Deploy on GCP][gcp-btn]][gcp-deploy] | [![Deploy on DigitalOcean][do-btn]][do-deploy] | [![Deploy on Render.com][render-btn]][render-deploy] |

| Railway                                             | RepoCloud                                                 | Elestio                                             | Northflank                                                   |
| --------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------ |
| [![Deploy on Railway][railway-btn]][railway-deploy] | [![Deploy on RepoCloud][repocloud-btn]][repocloud-deploy] | [![Deploy on Elestio][elestio-btn]][elestio-deploy] | [![Deploy on Northflank][northflank-btn]][northflank-deploy] |

[or set up a production AnythingLLM instance without Docker →](./BARE_METAL.md)

## How to setup for development

- `yarn setup` To fill in the required `.env` files you'll need in each of the application sections (from root of repo).
  - Go fill those out before proceeding. Ensure `server/.env.development` is filled or else things won't work right.
- `yarn dev:server` To boot the server locally (from root of repo).
- `yarn dev:frontend` To boot the frontend locally (from root of repo).
- `yarn dev:collector` To then run the document collector (from root of repo).

[Learn about documents](./server/storage/documents/DOCUMENTS.md)

## Telemetry & Privacy

AnythingLLM by Mintplex Labs Inc contains a telemetry feature that collects anonymous usage information.

<details>
<summary><kbd>More about Telemetry & Privacy for AnythingLLM</kbd></summary>

### Why?

We use this information to help us understand how AnythingLLM is used, to help us prioritize work on new features and bug fixes, and to help us improve AnythingLLM's performance and stability.

### Opting out

Set `DISABLE_TELEMETRY` in your server or docker .env settings to "true" to opt out of telemetry. You can also do this in-app by going to the sidebar > `Privacy` and disabling telemetry.

### What do you explicitly track?

We will only track usage details that help us make product and roadmap decisions, specifically:

- Type of your installation (Docker or Desktop)

- When a document is added or removed. No information _about_ the document. Just that the event occurred. This gives us an idea of use.

- Type of vector database in use. This helps us prioritize changes when updates arrive for that provider.

- Type of LLM provider & model tag in use. This helps us prioritize changes when updates arrive for that provider or model, or combination thereof. eg: reasoning vs regular, multi-modal models, etc.

- When a chat is sent. This is the most regular "event" and gives us an idea of the daily-activity of this project across all installations. Again, only the **event** is sent - we have no information on the nature or content of the chat itself.

You can verify these claims by finding all locations `Telemetry.sendTelemetry` is called. Additionally these events are written to the output log so you can also see the specific data which was sent - if enabled. **No IP or other identifying information is collected**. The Telemetry provider is [PostHog](https://posthog.com/) - an open-source telemetry collection service.

We take privacy very seriously, and we hope you understand that we want to learn how our tool is used, without using annoying popup surveys, so we can build something worth using. The anonymous data is _never_ shared with third parties, ever.

[View all telemetry events in source code](https://github.com/search?q=repo%3AMintplex-Labs%2Fanything-llm%20.sendTelemetry(&type=code)

</details>

## 👋 Contributing

- [Contributing to AnythingLLM](./CONTRIBUTING.md) - How to contribute to AnythingLLM.

## 💖 Sponsors

### Premium Sponsors

<!-- premium-sponsors (reserved for $100/mth sponsors who request to be called out here and/or are non-private sponsors) -->
<a href="https://www.dcsdigital.co.uk" target="_blank">
  <img src="https://a8cforagenciesportfolio.wordpress.com/wp-content/uploads/2024/08/logo-image-232621379.png" height="100px" alt="User avatar: DCS DIGITAL" />
</a>
<!-- premium-sponsors -->

### All Sponsors

<!-- all-sponsors --><a href="https://github.com/jaschadub"><img src="https:&#x2F;&#x2F;github.com&#x2F;jaschadub.png" width="60px" alt="User avatar: Jascha" /></a><a href="https://github.com/KickingAss2024"><img src="https:&#x2F;&#x2F;github.com&#x2F;KickingAss2024.png" width="60px" alt="User avatar: KickAss" /></a><a href="https://github.com/ShadowArcanist"><img src="https:&#x2F;&#x2F;github.com&#x2F;ShadowArcanist.png" width="60px" alt="User avatar: ShadowArcanist" /></a><a href="https://github.com/AtlasVIA"><img src="https:&#x2F;&#x2F;github.com&#x2F;AtlasVIA.png" width="60px" alt="User avatar: Atlas" /></a><a href="https://github.com/cope"><img src="https:&#x2F;&#x2F;github.com&#x2F;cope.png" width="60px" alt="User avatar: Predrag Stojadinović" /></a><a href="https://github.com/DiegoSpinola"><img src="https:&#x2F;&#x2F;github.com&#x2F;DiegoSpinola.png" width="60px" alt="User avatar: Diego Spinola" /></a><a href="https://github.com/PortlandKyGuy"><img src="https:&#x2F;&#x2F;github.com&#x2F;PortlandKyGuy.png" width="60px" alt="User avatar: Kyle" /></a><a href="https://github.com/peperunas"><img src="https:&#x2F;&#x2F;github.com&#x2F;peperunas.png" width="60px" alt="User avatar: Giulio De Pasquale" /></a><a href="https://github.com/jasoncdavis0"><img src="https:&#x2F;&#x2F;github.com&#x2F;jasoncdavis0.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/macstadium"><img src="https:&#x2F;&#x2F;github.com&#x2F;macstadium.png" width="60px" alt="User avatar: MacStadium" /></a><a href="https://github.com/armlynobinguar"><img src="https:&#x2F;&#x2F;github.com&#x2F;armlynobinguar.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/MikeHago"><img src="https:&#x2F;&#x2F;github.com&#x2F;MikeHago.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/maaisde"><img src="https:&#x2F;&#x2F;github.com&#x2F;maaisde.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/mhollier117"><img src="https:&#x2F;&#x2F;github.com&#x2F;mhollier117.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/pleabargain"><img src="https:&#x2F;&#x2F;github.com&#x2F;pleabargain.png" width="60px" alt="User avatar: Dennis" /></a><a href="https://github.com/broichan"><img src="https:&#x2F;&#x2F;github.com&#x2F;broichan.png" width="60px" alt="User avatar: Michael Hamilton, Ph.D." /></a><a href="https://github.com/azim-charaniya"><img src="https:&#x2F;&#x2F;github.com&#x2F;azim-charaniya.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/gabriellemon"><img src="https:&#x2F;&#x2F;github.com&#x2F;gabriellemon.png" width="60px" alt="User avatar: TernaryLabs" /></a><a href="https://github.com/CelaDaniel"><img src="https:&#x2F;&#x2F;github.com&#x2F;CelaDaniel.png" width="60px" alt="User avatar: Daniel Cela" /></a><a href="https://github.com/altrsadmin"><img src="https:&#x2F;&#x2F;github.com&#x2F;altrsadmin.png" width="60px" alt="User avatar: Alesso" /></a><a href="https://github.com/bitjungle"><img src="https:&#x2F;&#x2F;github.com&#x2F;bitjungle.png" width="60px" alt="User avatar: Rune Mathisen" /></a><a href="https://github.com/pcrossleyAC"><img src="https:&#x2F;&#x2F;github.com&#x2F;pcrossleyAC.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/saroj-pattnaik"><img src="https:&#x2F;&#x2F;github.com&#x2F;saroj-pattnaik.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/techmedic5"><img src="https:&#x2F;&#x2F;github.com&#x2F;techmedic5.png" width="60px" alt="User avatar: Alan" /></a><a href="https://github.com/ddocta"><img src="https:&#x2F;&#x2F;github.com&#x2F;ddocta.png" width="60px" alt="User avatar: Damien Peters" /></a><a href="https://github.com/dcsdigital"><img src="https:&#x2F;&#x2F;github.com&#x2F;dcsdigital.png" width="60px" alt="User avatar: DCS Digital" /></a><a href="https://github.com/pm7y"><img src="https:&#x2F;&#x2F;github.com&#x2F;pm7y.png" width="60px" alt="User avatar: Paul Mcilreavy" /></a><a href="https://github.com/tilwolf"><img src="https:&#x2F;&#x2F;github.com&#x2F;tilwolf.png" width="60px" alt="User avatar: Til Wolf" /></a><a href="https://github.com/ozzyoss77"><img src="https:&#x2F;&#x2F;github.com&#x2F;ozzyoss77.png" width="60px" alt="User avatar: Leopoldo Crhistian Riverin Gomez" /></a><a href="https://github.com/AlphaEcho11"><img src="https:&#x2F;&#x2F;github.com&#x2F;AlphaEcho11.png" width="60px" alt="User avatar: AJEsau" /></a><a href="https://github.com/svanomm"><img src="https:&#x2F;&#x2F;github.com&#x2F;svanomm.png" width="60px" alt="User avatar: Steven VanOmmeren" /></a><a href="https://github.com/socketbox"><img src="https:&#x2F;&#x2F;github.com&#x2F;socketbox.png" width="60px" alt="User avatar: Casey Boettcher" /></a><a href="https://github.com/zebbern"><img src="https:&#x2F;&#x2F;github.com&#x2F;zebbern.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/avineetbespin"><img src="https:&#x2F;&#x2F;github.com&#x2F;avineetbespin.png" width="60px" alt="User avatar: Avineet" /></a><a href="https://github.com/invictus-1"><img src="https:&#x2F;&#x2F;github.com&#x2F;invictus-1.png" width="60px" alt="User avatar: Chris" /></a><a href="https://github.com/mirbyte"><img src="https:&#x2F;&#x2F;github.com&#x2F;mirbyte.png" width="60px" alt="User avatar: mirko" /></a><a href="https://github.com/bisonbet"><img src="https:&#x2F;&#x2F;github.com&#x2F;bisonbet.png" width="60px" alt="User avatar: Tim Champ" /></a><a href="https://github.com/Sinkingdev"><img src="https:&#x2F;&#x2F;github.com&#x2F;Sinkingdev.png" width="60px" alt="User avatar: Peter Mathisen" /></a><a href="https://github.com/Ed-STEM"><img src="https:&#x2F;&#x2F;github.com&#x2F;Ed-STEM.png" width="60px" alt="User avatar: Ed di Girolamo" /></a><a href="https://github.com/milkowski"><img src="https:&#x2F;&#x2F;github.com&#x2F;milkowski.png" width="60px" alt="User avatar: Wojciech Miłkowski" /></a><a href="https://github.com/ADS-Fund"><img src="https:&#x2F;&#x2F;github.com&#x2F;ADS-Fund.png" width="60px" alt="User avatar: ADS Fund" /></a><a href="https://github.com/arc46-io"><img src="https:&#x2F;&#x2F;github.com&#x2F;arc46-io.png" width="60px" alt="User avatar: arc46 GmbH" /></a><a href="https://github.com/liyin2015"><img src="https:&#x2F;&#x2F;github.com&#x2F;liyin2015.png" width="60px" alt="User avatar: Li Yin" /></a><a href="https://github.com/SylphAI-Inc"><img src="https:&#x2F;&#x2F;github.com&#x2F;SylphAI-Inc.png" width="60px" alt="User avatar: SylphAI" /></a><!-- all-sponsors -->

## 🌟 Contributors

[![anythingllm contributors](https://contrib.rocks/image?repo=mintplex-labs/anything-llm)](https://github.com/mintplex-labs/anything-llm/graphs/contributors)

[![Star History Chart](https://api.star-history.com/svg?repos=mintplex-labs/anything-llm&type=Timeline)](https://star-history.com/#mintplex-labs/anything-llm&Date)

## 🔗 More Products

- **[VectorAdmin][vector-admin]:** An all-in-one GUI & tool-suite for managing vector databases.
- **[OpenAI Assistant Swarm][assistant-swarm]:** Turn your entire library of OpenAI assistants into one single army commanded from a single agent.

<div align="right">

[![][back-to-top]](#readme-top)

</div>

---

Copyright © 2026 [Mintplex Labs][profile-link]. <br />
This project is [MIT](./LICENSE) licensed.

<!-- LINK GROUP -->

[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-222628?style=flat-square
[profile-link]: https://github.com/mintplex-labs
[vector-admin]: https://github.com/mintplex-labs/vector-admin
[assistant-swarm]: https://github.com/Mintplex-Labs/openai-assistant-swarm
[docker-btn]: ./images/deployBtns/docker.png
[docker-deploy]: ./docker/HOW_TO_USE_DOCKER.md
[aws-btn]: ./images/deployBtns/aws.png
[aws-deploy]: ./cloud-deployments/aws/cloudformation/DEPLOY.md
[gcp-btn]: https://deploy.cloud.run/button.svg
[gcp-deploy]: ./cloud-deployments/gcp/deployment/DEPLOY.md
[do-btn]: https://www.deploytodo.com/do-btn-blue.svg
[do-deploy]: ./cloud-deployments/digitalocean/terraform/DEPLOY.md
[render-btn]: https://render.com/images/deploy-to-render-button.svg
[render-deploy]: https://render.com/deploy?repo=https://github.com/Mintplex-Labs/anything-llm&branch=render
[render-btn]: https://render.com/images/deploy-to-render-button.svg
[render-deploy]: https://render.com/deploy?repo=https://github.com/Mintplex-Labs/anything-llm&branch=render
[railway-btn]: https://railway.app/button.svg
[railway-deploy]: https://railway.app/template/HNSCS1?referralCode=WFgJkn
[repocloud-btn]: https://d16t0pc4846x52.cloudfront.net/deploylobe.svg
[repocloud-deploy]: https://repocloud.io/details/?app_id=276
[elestio-btn]: https://elest.io/images/logos/deploy-to-elestio-btn.png
[elestio-deploy]: https://elest.io/open-source/anythingllm
[northflank-btn]: https://assets.northflank.com/deploy_to_northflank_smm_36700fb050.svg
[northflank-deploy]: https://northflank.com/stacks/deploy-anythingllm


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

Use this section to tell people about which versions of your project are
currently being supported with security updates.

| Version | Supported          |
| ------- | ------------------ |
| 0.1.x   | :white_check_mark: |


## Reporting a Vulnerability

If a security concern is found that you would like to disclose you can create a PR for it or if you would like to clear this issue before posting you can email [Core Mintplex Labs Team](mailto:team@mintplexlabs.com).


================================================
FILE: TERMS_SELF_HOSTED.md
================================================
# AnythingLLM Self-Hosted: Data Privacy & Terms of Service

This document outlines the privacy standards, data handling procedures, and licensing terms for the self-hosted version of AnythingLLM, developed by Mintplex Labs Inc.

## 1. Data Sovereignty & Local-First Architecture
AnythingLLM is designed as a **local-first** application. When utilizing the self-hosted version (Docker, Desktop, or Source):
* **No External Access:** Mintplex Labs Inc. does not host, store, or have access to any documents, chat histories, workspace settings, or embeddings created within your instance.
* **On-Premise Storage:** All data resides strictly on the infrastructure provisioned and managed by the user or their organization.
* **Air-Gap Capability:** AnythingLLM can be operated in a strictly air-gapped environment with no internet connectivity, provided local LLM and Vector database providers (e.g., Ollama, LocalAI, LanceDB) are utilized.

## 2. Telemetry and Analytics
To improve software performance and stability, AnythingLLM includes an optional telemetry feature.
* **Anonymity:** Collected data is strictly anonymous and contains no Personally Identifiable Information (PII), document content, chat logs, fingerprinting data, or any other sensitive information. Purely usage based data is collected.
* **Opt-Out:** Users may disable telemetry at any time via the **Settings** menu within the application. Once disabled, no usage data is transmitted to Mintplex Labs.

## 3. Third-Party Integrations
AnythingLLM allows users to connect to external services (e.g., OpenAI, Anthropic, Pinecone). 
* **Data Transmission:** When these services are enabled, data is transmitted directly from your instance to the third-party provider. 
* **Governing Terms:** Data handled by third-party providers is subject to their respective Terms of Service and Privacy Policies. Mintplex Labs is not responsible for the data practices of these external entities.

_by default, AnythingLLM does **everything on-device first** - so you would have to manually configure and enable these integrations to be subject to third party terms._

## 4. Security & Network
* **No "Phone Home":** Aside from [optional telemetry](https://github.com/Mintplex-Labs/anything-llm?tab=readme-ov-file#telemetry--privacy), the software does not require an external connection to Mintplex Labs servers to function.
* **Environment Security:** The user is responsible for securing the host environment, including network firewalls, SSL/TLS encryption, and access control for the AnythingLLM instance.
* **CDN Assets:** Out of a convience to international users, we use a hosted CDN to mirror some critical path models (eg: the default embedder and reranking ONNX models) which are not available in all regions. These models are downloaded from our CDN as a fallback, and any air-gapped installations you can either download these models manually or use another provider. Assets of these nature are downloaded once and cached in your associated local storage.

## 5. Licensing and Liability
* **License:** The AnythingLLM core is provided under the **MIT License**.
* **No Warranty:** As per the license agreement, the software is provided "as is," without warranty of any kind, express or implied, including but not limited to the warranties of merchantability or fitness for a particular purpose.
* **Liability:** In no event shall the authors or copyright holders be liable for any claim, damages, or other liability arising from the use of the software.

## 6. Support and Compatibility
While Mintplex Labs prioritizes stability and backward compatibility, the self-hosted version is used at the user's discretion. Formal Service Level Agreements (SLAs) are not provided for the standard self-hosted version unless otherwise negotiated via a separate enterprise agreement.

---
*Last Updated: March 2026*

================================================
FILE: cloud-deployments/aws/cloudformation/DEPLOY.md
================================================
# How to deploy a private AnythingLLM instance on AWS

With an AWS account you can easily deploy a private AnythingLLM instance on AWS. This will create a url that you can access from any browser over HTTP (HTTPS not supported). This single instance will run on your own keys and they will not be exposed - however if you want your instance to be protected it is highly recommend that you set a password once setup is complete.

**Quick Launch (EASY)**
1. Log in to your AWS account
2. Open [CloudFormation](https://us-west-1.console.aws.amazon.com/cloudformation/home)
3. Ensure you are deploying in a geographic zone that is nearest to your physical location to reduce latency.
4. Click `Create Stack`

![Create Stack](../../../images/screenshots/create_stack.png)

5. Use the file `cloudformation_create_anythingllm.json` as your JSON template.

![Upload Stack](../../../images/screenshots/upload.png)

6. Click Deploy.  
7. Wait for stack events to finish and be marked as `Completed`
8. View `Outputs` tab.

![Stack Output](../../../images/screenshots/cf_outputs.png)

9. Wait for all resources to be built. Now wait until instance is available on `[InstanceIP]:3001`.
This process may take up to 10 minutes. See **Note** below on how to visualize this process.

The output of this cloudformation stack will be:
- 1 EC2 Instance
- 1 Security Group with 0.0.0.0/0 access on port 3001
- 1 EC2 Instance Volume `gb2` of 10Gib minimum - customizable pre-deploy.

**Requirements**
- An AWS account with billing information.

## Please read this notice before submitting issues about your deployment

**Note:** 
Your instance will not be available instantly. Depending on the instance size you launched with it can take 5-10 minutes to fully boot up.

If you want to check the instance's progress, navigate to [your deployed EC2 instances](https://us-west-1.console.aws.amazon.com/ec2/home) and connect to your instance via SSH in browser.

Once connected run `sudo tail -f /var/log/cloud-init-output.log` and wait for the file to conclude deployment of the docker image.
You should see an output like this
```
[+] Running 2/2
 ⠿ Network docker_anything-llm  Created 
 ⠿ Container anything-llm       Started  
```

Additionally, your use of this deployment process means you are responsible for any costs of these AWS resources fully.

================================================
FILE: cloud-deployments/aws/cloudformation/aws_https_instructions.md
================================================
# How to Configure HTTPS for Anything LLM AWS private deployment
Instructions for manual https configuration after generating and running the aws cloudformation template (aws_build_from_source_no_credentials.json). Tested on following browsers: Firefox version 119, Chrome version 118, Edge 118.

**Requirements**
- Successful deployment of Amazon Linux 2023 EC2 instance with Docker container running Anything LLM
- Admin priv to configure Elastic IP for EC2 instance via AWS Management Console UI
- Admin priv to configure DNS services (i.e. AWS Route 53) via AWS Management Console UI
- Admin priv to configure EC2 Security Group rules via AWS Management Console UI

## Step 1: Allocate and assign Elastic IP Address to your deployed EC2 instance
1. Follow AWS instructions on allocating EIP here: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-instance-addressing-eips-allocating
2. Follow AWS instructions on assigning EIP to EC2 instance here: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-instance-addressing-eips-associating  

## Step 2: Configure DNS A record to resolve to the previously assigned EC2 instance via EIP 
These instructions assume that you already have a top-level domain configured and are using a subdomain 
to access AnythingLLM.
1. Follow AWS instructions on routing traffic to EC2 instance here: https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html 

## Step 3: Install and enable nginx
These instructions are for CLI configuration and assume you are logged in to EC2 instance as the ec2-user.
1. $sudo yum install nginx -y
2. $sudo systemctl enable nginx && sudo systemctl start nginx

## Step 4: Install certbot
These instructions are for CLI configuration and assume you are logged in to EC2 instance as the ec2-user.
1. $sudo yum install -y augeas-libs
2. $sudo python3 -m venv /opt/certbot/
3. $sudo /opt/certbot/bin/pip install --upgrade pip
4. $sudo /opt/certbot/bin/pip install certbot certbot-nginx
5. $sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

## Step 5: Configure temporary Inbound Traffic Rule for Security Group to certbot DNS verification
1. Follow AWS instructions on creating inbound rule (http port 80 0.0.0.0/0) for EC2 security group here: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule

## Step 6: Comment out default http NGINX proxy configuration
These instructions are for CLI configuration and assume you are logged in to EC2 instance as the ec2-user.
1. $sudo vi /etc/nginx/nginx.conf
2. In the nginx.conf file, comment out the default server block configuration for http/port 80. It should look something like the following:
```
#    server {
#        listen       80;
#        listen       [::]:80;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#        location = /404.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
#    }
```
3. Enter ':wq' to save the changes to the nginx default config

## Step 7: Create simple http proxy configuration for AnythingLLM 
These instructions are for CLI configuration and assume you are logged in to EC2 instance as the ec2-user.
1. $sudo vi /etc/nginx/conf.d/anything.conf
2. Add the following configuration ensuring that you add your FQDN:.

```
server {
   # Enable websocket connections for agent protocol.
   location ~* ^/api/agent-invocation/(.*) {
      proxy_pass http://0.0.0.0:3001;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
   }

   listen 80;
   server_name [insert FQDN here];
   location / {
      # Prevent timeouts on long-running requests.
      proxy_connect_timeout       605;
      proxy_send_timeout          605;
      proxy_read_timeout          605;
      send_timeout                605;
      keepalive_timeout           605;

      # Enable readable HTTP Streaming for LLM streamed responses
      proxy_buffering off; 
      proxy_cache off;

      # Proxy your locally running service
      proxy_pass  http://0.0.0.0:3001;
    }
}
```
3. Enter ':wq' to save the changes to the anything config file

## Step 8: Test nginx http proxy config and restart nginx service
These instructions are for CLI configuration and assume you are logged in to EC2 instance as the ec2-user.
1. $sudo nginx -t
2. $sudo systemctl restart nginx
3. Navigate to http://FQDN in a browser and you should be proxied to the AnythingLLM web UI.

## Step 9: Generate/install cert
These instructions are for CLI configuration and assume you are logged in to EC2 instance as the ec2-user.
1. $sudo certbot --nginx -d [Insert FQDN here] 
    Example command: $sudo certbot --nginx -d anythingllm.exampleorganization.org
    This command will generate the appropriate certificate files, write the files to /etc/letsencrypt/live/yourFQDN, and make updates to the nginx
    configuration file for anythingllm located at /etc/nginx/conf.d/anything.llm
3. Enter the email address you would like to use for updates.
4. Accept the terms of service.
5. Accept or decline to receive communication from LetsEncrypt.

## Step 10: Test Cert installation
1. $sudo cat /etc/nginx/conf.d/anything.conf
Your should see a completely updated configuration that includes https/443 and a redirect configuration for http/80. 
2. Navigate to https://FQDN in a browser and you should be proxied to the AnythingLLM web UI.

## Step 11: (Optional) Remove temporary Inbound Traffic Rule for Security Group to certbot DNS verification
1. Follow AWS instructions on deleting inbound rule (http port 80 0.0.0.0/0) for EC2 security group here: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#deleting-security-group-rule


================================================
FILE: cloud-deployments/aws/cloudformation/cloudformation_create_anythingllm.json
================================================
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Create a stack that runs AnythingLLM on a single instance",
  "Parameters": {
    "InstanceType": {
      "Description": "EC2 instance type",
      "Type": "String",
      "Default": "t3.small"
    },
    "InstanceVolume": {
      "Description": "Storage size of disk on Instance in GB",
      "Type": "Number",
      "Default": 10,
      "MinValue": 4
    }
  },
  "Resources": {
    "AnythingLLMInstance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "ImageId": {
          "Fn::FindInMap": [
            "Region2AMI",
            {
              "Ref": "AWS::Region"
            },
            "AMI"
          ]
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "SecurityGroupIds": [
          {
            "Ref": "AnythingLLMInstanceSecurityGroup"
          }
        ],
        "BlockDeviceMappings": [
          {
            "DeviceName": {
              "Fn::FindInMap": [
                "Region2AMI",
                {
                  "Ref": "AWS::Region"
                },
                "RootDeviceName"
              ]
            },
            "Ebs": {
              "VolumeSize": {
                "Ref": "InstanceVolume"
              }
            }
          }
        ],
        "UserData": {
          "Fn::Base64": {
            "Fn::Join": [
              "",
              [
                "Content-Type: multipart/mixed; boundary=\"//\"\n",
                "MIME-Version: 1.0\n",
                "\n",
                "--//\n",
                "Content-Type: text/cloud-config; charset=\"us-ascii\"\n",
                "MIME-Version: 1.0\n",
                "Content-Transfer-Encoding: 7bit\n",
                "Content-Disposition: attachment; filename=\"cloud-config.txt\"\n",
                "\n",
                "\n",
                "#cloud-config\n",
                "cloud_final_modules:\n",
                "- [scripts-user, once-per-instance]\n",
                "\n",
                "\n",
                "--//\n",
                "Content-Type: text/x-shellscript; charset=\"us-ascii\"\n",
                "MIME-Version: 1.0\n",
                "Content-Transfer-Encoding: 7bit\n",
                "Content-Disposition: attachment; filename=\"userdata.txt\"\n",
                "\n",
                "\n",
                "#!/bin/bash\n",
                "# check output of userdata script with sudo tail -f /var/log/cloud-init-output.log\n",
                "sudo yum install docker iptables -y\n",
                "sudo iptables -A OUTPUT -m owner ! --uid-owner root -d 169.254.169.254 -j DROP\n",
                "sudo systemctl enable docker\n",
                "sudo systemctl start docker\n",
                "mkdir -p /home/ec2-user/anythingllm\n",
                "touch /home/ec2-user/anythingllm/.env\n",
                "sudo chown ec2-user:ec2-user -R /home/ec2-user/anythingllm\n",
                "docker pull mintplexlabs/anythingllm\n",
                "docker run -d -p 3001:3001 --cap-add SYS_ADMIN -v /home/ec2-user/anythingllm:/app/server/storage -v /home/ec2-user/anythingllm/.env:/app/server/.env -e STORAGE_DIR=\"/app/server/storage\" mintplexlabs/anythingllm\n",
                "echo \"Container ID: $(sudo docker ps --latest --quiet)\"\n",
                "export ONLINE=$(curl -Is http://localhost:3001/api/ping | head -n 1|cut -d$' ' -f2)\n",
                "echo \"Health check: $ONLINE\"\n",
                "echo \"Setup complete! AnythingLLM instance is now online!\"\n",
                "\n",
                "--//--\n"
              ]
            ]
          }
        }
      }
    },
    "AnythingLLMInstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "AnythingLLM Instance Security Group",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "22",
            "ToPort": "22",
            "CidrIp": "0.0.0.0/0"
          },
          {
            "IpProtocol": "tcp",
            "FromPort": "3001",
            "ToPort": "3001",
            "CidrIp": "0.0.0.0/0"
          },
          {
            "IpProtocol": "tcp",
            "FromPort": "3001",
            "ToPort": "3001",
            "CidrIpv6": "::/0"
          }
        ]
      }
    }
  },
  "Outputs": {
    "ServerIp": {
      "Description": "IP address of the AnythingLLM instance",
      "Value": {
        "Fn::GetAtt": [
          "AnythingLLMInstance",
          "PublicIp"
        ]
      }
    },
    "ServerURL": {
      "Description": "URL of the AnythingLLM server",
      "Value": {
        "Fn::Join": [
          "",
          [
            "http://",
            {
              "Fn::GetAtt": [
                "AnythingLLMInstance",
                "PublicIp"
              ]
            },
            ":3001"
          ]
        ]
      }
    }
  },
  "Mappings": {
    "Region2AMI": {
      "ap-south-1": {
        "AMI": "ami-0e6329e222e662a52",
        "RootDeviceName": "/dev/xvda"
      },
      "eu-north-1": {
        "AMI": "ami-08c308b1bb265e927",
        "RootDeviceName": "/dev/xvda"
      },
      "eu-west-3": {
        "AMI": "ami-069d1ea6bc64443f0",
        "RootDeviceName": "/dev/xvda"
      },
      "eu-west-2": {
        "AMI": "ami-06a566ca43e14780d",
        "RootDeviceName": "/dev/xvda"
      },
      "eu-west-1": {
        "AMI": "ami-0a8dc52684ee2fee2",
        "RootDeviceName": "/dev/xvda"
      },
      "ap-northeast-3": {
        "AMI": "ami-0c8a89b455fae8513",
        "RootDeviceName": "/dev/xvda"
      },
      "ap-northeast-2": {
        "AMI": "ami-0ff56409a6e8ea2a0",
        "RootDeviceName": "/dev/xvda"
      },
      "ap-northeast-1": {
        "AMI": "ami-0ab0bbbd329f565e6",
        "RootDeviceName": "/dev/xvda"
      },
      "ca-central-1": {
        "AMI": "ami-033c256a10931f206",
        "RootDeviceName": "/dev/xvda"
      },
      "sa-east-1": {
        "AMI": "ami-0dabf4dab6b183eef",
        "RootDeviceName": "/dev/xvda"
      },
      "ap-southeast-1": {
        "AMI": "ami-0dc5785603ad4ff54",
        "RootDeviceName": "/dev/xvda"
      },
      "ap-southeast-2": {
        "AMI": "ami-0c5d61202c3b9c33e",
        "RootDeviceName": "/dev/xvda"
      },
      "eu-central-1": {
        "AMI": "ami-004359656ecac6a95",
        "RootDeviceName": "/dev/xvda"
      },
      "us-east-1": {
        "AMI": "ami-0cff7528ff583bf9a",
        "RootDeviceName": "/dev/xvda"
      },
      "us-east-2": {
        "AMI": "ami-02238ac43d6385ab3",
        "RootDeviceName": "/dev/xvda"
      },
      "us-west-1": {
        "AMI": "ami-01163e76c844a2129",
        "RootDeviceName": "/dev/xvda"
      },
      "us-west-2": {
        "AMI": "ami-0ceecbb0f30a902a6",
        "RootDeviceName": "/dev/xvda"
      }
    }
  }
}

================================================
FILE: cloud-deployments/digitalocean/terraform/DEPLOY.md
================================================
# How to deploy a private AnythingLLM instance on DigitalOcean using Terraform

With a DigitalOcean account, you can easily deploy a private AnythingLLM instance using Terraform. This will create a URL that you can access from any browser over HTTP (HTTPS not supported). This single instance will run on your own keys, and they will not be exposed. However, if you want your instance to be protected, it is highly recommended that you set a password once setup is complete.

The output of this Terraform configuration will be:
- 1 DigitalOcean Droplet
- An IP address to access your application

**Requirements**
- An DigitalOcean  account with billing information
- Terraform installed on your local machine
  - Follow the instructions in the [official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for your operating system.

## How to deploy on DigitalOcean
Open your terminal and navigate to the `docker` folder
1. Create a `.env` file by cloning the `.env.example`. 
2. Navigate to `digitalocean/terraform` folder.
3. Replace the token value in the provider "digitalocean" block in main.tf with your DigitalOcean API token.
4. Run the following commands to initialize Terraform, review the infrastructure changes, and apply them:
    ```
    terraform init  
    terraform plan  
    terraform apply  
    ```
Confirm the changes by typing yes when prompted.
5. Once the deployment is complete, Terraform will output the public IP address of your droplet. You can access your application using this IP address.

## How to deploy on DigitalOcean
To delete the resources created by Terraform, run the following command in the terminal:
`
terraform destroy  
`

## Please read this notice before submitting issues about your deployment

**Note:** 
Your instance will not be available instantly. Depending on the instance size you launched with it can take anywhere from 5-10 minutes to fully boot up.

If you want to check the instances progress, navigate to [your deployed instances](https://cloud.digitalocean.com/droplets) and connect to your instance via SSH in browser.

Once connected run `sudo tail -f /var/log/cloud-init-output.log` and wait for the file to conclude deployment of the docker image.


Additionally, your use of this deployment process means you are responsible for any costs of these Digital Ocean resources fully.


================================================
FILE: cloud-deployments/digitalocean/terraform/main.tf
================================================
terraform {
  required_version = ">= 1.0.0"

  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

provider "digitalocean" {  
  # Add your DigitalOcean API token here  
  token = "DigitalOcean API token"  
}  

  
resource "digitalocean_droplet" "anything_llm_instance" {  
  image  = "ubuntu-24-04-x64"  
  name   = "anything-llm-instance"  
  region = "nyc3"  
  size   = "s-2vcpu-2gb"  
  
  user_data = templatefile("user_data.tp1", {   
    env_content = local.formatted_env_content 
  })
}  

locals {  
  env_content = file("../../../docker/.env")  
  formatted_env_content = join("\n", [  
    for line in split("\n", local.env_content) :  
    line  
    if !(  
      (  
        substr(line, 0, 1) == "#"  
      ) ||  
      (  
        substr(line, 0, 3) == "UID"  
      ) ||  
      (  
        substr(line, 0, 3) == "GID"  
      ) ||  
      (  
        substr(line, 0, 11) == "CLOUD_BUILD"  
      ) ||  
      (  
        line == ""  
      )  
    )  
  ])  
}

================================================
FILE: cloud-deployments/digitalocean/terraform/outputs.tf
================================================
output "ip_address" {
  value = digitalocean_droplet.anything_llm_instance.ipv4_address
  description = "The public IP address of your droplet application."
}

================================================
FILE: cloud-deployments/digitalocean/terraform/user_data.tp1
================================================
#!/bin/bash  
# check output of userdata script with sudo tail -f /var/log/cloud-init-output.log 
  
sudo apt-get update  
sudo apt-get install -y docker.io  
sudo usermod -a -G docker ubuntu
  
sudo systemctl enable docker  
sudo systemctl start docker  
  
mkdir -p /home/anythingllm
cat <<EOF >/home/anythingllm/.env
${env_content}
EOF

sudo docker pull mintplexlabs/anythingllm
sudo docker run -d -p 3001:3001 --cap-add SYS_ADMIN -v /home/anythingllm:/app/server/storage -v /home/anythingllm/.env:/app/server/.env -e STORAGE_DIR="/app/server/storage" mintplexlabs/anythingllm
echo "Container ID: $(sudo docker ps --latest --quiet)"  
  
export ONLINE=$(curl -Is http://localhost:3001/api/ping | head -n 1|cut -d$' ' -f2)  
echo "Health check: $ONLINE"  
echo "Setup complete! AnythingLLM instance is now online!"  


================================================
FILE: cloud-deployments/gcp/deployment/DEPLOY.md
================================================
# How to deploy a private AnythingLLM instance on GCP

With a GCP account you can easily deploy a private AnythingLLM instance on GCP. This will create a url that you can access from any browser over HTTP (HTTPS not supported). This single instance will run on your own keys and they will not be exposed - however if you want your instance to be protected it is highly recommend that you set a password once setup is complete.

The output of this cloudformation stack will be:
- 1 GCP VM
- 1 Security Group with 0.0.0.0/0 access on Ports 22 & 3001
- 1 GCP VM Volume `gb2` of 10Gib minimum

**Requirements**
- An GCP account with billing information.

## How to deploy on GCP
Open your terminal
1. Log in to your GCP account using the following command:
    ```
    gcloud auth login 
    ```

2. After successful login, Run the following command to create a deployment using the Deployment Manager CLI:

  ```

  gcloud deployment-manager deployments create anything-llm-deployment --config gcp/deployment/gcp_deploy_anything_llm.yaml

  ```

Once you execute these steps, the CLI will initiate the deployment process on GCP based on your configuration file. You can monitor the deployment status and view the outputs using the Google Cloud Console or the Deployment Manager CLI commands.

```
gcloud compute instances get-serial-port-output anything-llm-instance 
```

ssh into the instance

```
gcloud compute ssh anything-llm-instance 
```

Delete the deployment
```
gcloud deployment-manager deployments delete anything-llm-deployment 
```

## Please read this notice before submitting issues about your deployment

**Note:** 
Your instance will not be available instantly. Depending on the instance size you launched with it can take anywhere from 5-10 minutes to fully boot up.

If you want to check the instances progress, navigate to [your deployed instances](https://console.cloud.google.com/compute/instances) and connect to your instance via SSH in browser.

Once connected run `sudo tail -f /var/log/cloud-init-output.log` and wait for the file to conclude deployment of the docker image.

Additionally, your use of this deployment process means you are responsible for any costs of these GCP resources fully.


================================================
FILE: cloud-deployments/gcp/deployment/gcp_deploy_anything_llm.yaml
================================================
resources:  
  - name: anything-llm-instance  
    type: compute.v1.instance  
    properties:  
      zone: us-central1-a  
      machineType: zones/us-central1-a/machineTypes/n1-standard-1  
      disks:  
        - deviceName: boot  
          type: PERSISTENT  
          boot: true  
          autoDelete: true  
          initializeParams:  
            sourceImage: projects/ubuntu-os-cloud/global/images/family/ubuntu-2004-lts  
            diskSizeGb: 10  
      networkInterfaces:  
        - network: global/networks/default  
          accessConfigs:  
            - name: External NAT  
              type: ONE_TO_ONE_NAT  
      metadata:  
        items:  
          - key: startup-script  
            value: |  
              #!/bin/bash  
              # check output of userdata script with sudo tail -f /var/log/cloud-init-output.log  

              sudo apt-get update  
              sudo apt-get install -y docker.io  
              sudo usermod -a -G docker ubuntu
              sudo systemctl enable docker  
              sudo systemctl start docker  

              mkdir -p /home/anythingllm
              touch /home/anythingllm/.env
              sudo chown -R ubuntu:ubuntu /home/anythingllm
               
              sudo docker pull mintplexlabs/anythingllm
              sudo docker run -d -p 3001:3001 --cap-add SYS_ADMIN -v /home/anythingllm:/app/server/storage -v /home/anythingllm/.env:/app/server/.env -e STORAGE_DIR="/app/server/storage" mintplexlabs/anythingllm
              echo "Container ID: $(sudo docker ps --latest --quiet)"  

              export ONLINE=$(curl -Is http://localhost:3001/api/ping | head -n 1|cut -d$' ' -f2)  
              echo "Health check: $ONLINE"  

              echo "Setup complete! AnythingLLM instance is now online!"  



================================================
FILE: cloud-deployments/helm/charts/anythingllm/.helmignore
================================================
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/


================================================
FILE: cloud-deployments/helm/charts/anythingllm/Chart.yaml
================================================
apiVersion: v2
name: anythingllm
description: The all-in-one Desktop & Docker AI application with built-in RAG, AI agents, No-code agent builder, MCP compatibility, and more.
type: application
version: 1.0.0
appVersion: "1.85.0"
icon: https://raw.githubusercontent.com/Mintplex-Labs/anything-llm/refs/heads/master/frontend/public/favicon.png

================================================
FILE: cloud-deployments/helm/charts/anythingllm/README.md
================================================
# anythingllm

![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.85.0](https://img.shields.io/badge/AppVersion-1.85.0-informational?style=flat-square)

![AnythingLLM](https://raw.githubusercontent.com/Mintplex-Labs/anything-llm/master/images/wordmark.png)

[AnythingLLM](https://github.com/Mintplex-Labs/anything-llm)

The all-in-one Desktop & Docker AI application with built-in RAG, AI agents, No-code agent builder, MCP compatibility, and more.

**Configuration & Usage**

- **Config vs Secrets:** This chart exposes application configuration via two mechanisms:
  - `config` (in `values.yaml`) — rendered into a `ConfigMap` and injected using `envFrom` in the pod. Do NOT place sensitive values (API keys, secrets) in `config` because `ConfigMap`s are not encrypted.
  - `env` / `envFrom` — the preferred way to inject secrets. Use Kubernetes `Secret` objects and reference them from `env` (with `valueFrom.secretKeyRef`) or `envFrom.secretRef`.

- **Storage & STORAGE_DIR mapping:** The chart creates (or mounts) a `PersistentVolumeClaim` using the `persistentVolume.*` settings. The container mount path is set from `persistentVolume.mountPath`. Ensure the container `STORAGE_DIR` config key matches that path (defaults are set in `values.yaml`).

**Providing API keys & secrets (recommended)**

Use Kubernetes Secrets. Below are example workflows and `values.yaml` snippets.

1) Create a Kubernetes Secret with API keys:

```
kubectl create secret generic openai-secret --from-literal=OPENAI_KEY="sk-..."
# or from a file
# kubectl create secret generic openai-secret --from-file=OPENAI_KEY=/path/to/keyfile
```

2) Reference the Secret from `values.yaml` using `envFrom` (recommended when your secret contains multiple env keys):

```yaml
envFrom:
  - secretRef:
      name: openai-secret
```

This will inject all key/value pairs from the `openai-secret` Secret as environment variables in the container.

3) Or reference a single secret key via `env` (explicit mapping):

```yaml
env:
  - name: OPENAI_KEY
    valueFrom:
      secretKeyRef:
        name: openai-secret
        key: OPENAI_KEY
```

Notes:
- Avoid placing secret values into `config:` (the chart's `ConfigMap`) — `ConfigMap`s are visible to anyone who can read the namespace. Use `Secret` objects for any credentials/tokens.
- If you use a GitOps workflow, consider integrating an external secret operator (ExternalSecrets, SealedSecrets, etc.) so you don't store raw secrets in Git.

**Example `values-secret.yaml` to pass during `helm install`**

```yaml
image:
  repository: mintplexlabs/anythingllm
  tag: "1.11.2"

service:
  type: ClusterIP
  port: 3001

# Reference secret containing API keys
envFrom:
  - secretRef:
      name: openai-secret

# Optionally override other values
persistentVolume:
  size: 16Gi
  mountPath: /storage
```

Install with:

```
helm install my-anythingllm ./anythingllm -f values-secret.yaml
```

**Best practices & tips**

- Use `envFrom` for convenience when many environment variables are stored in a single `Secret` and use `env`/`valueFrom` for explicit single-key mappings.
- Use `kubectl create secret generic` or your secrets management solution. If you need to reference multiple different provider keys (OpenAI, Anthropic, etc.), create a single `Secret` with multiple keys or multiple Secrets and add multiple `envFrom` entries.
- Keep probe paths and `service.port` aligned. If your probes fail after deployment, check that the probe `port` matches the container port (or named port `http`) and that the `path` is valid.
- For storage, if you have a pre-existing PVC set `persistentVolume.existingClaim` to the PVC name; the chart will mount that claim (and will not attempt to create a new PVC).
- For production, provide resource `requests` and `limits` in `values.yaml` to prevent scheduler starvation and to control cost.

## Values

| Key | Type | Default | Description |
|-----|------|---------|-------------|
| affinity | object | `{}` |  |
| config.DISABLE_TELEMETRY | string | `"true"` |  |
| config.GID | string | `"1000"` |  |
| config.NODE_ENV | string | `"production"` |  |
| config.STORAGE_DIR | string | `"/storage"` |  |
| config.UID | string | `"1000"` |  |
| env | object | `{}` |  |
| envFrom | object | `{}` |  |
| fullnameOverride | string | `""` |  |
| image.pullPolicy | string | `"IfNotPresent"` |  |
| image.repository | string | `"mintplexlabs/anythingllm"` |  |
| image.tag | string | `"1.11.2"` |  |
| imagePullSecrets | list | `[]` |  |
| ingress.annotations | object | `{}` |  |
| ingress.className | string | `""` |  |
| ingress.enabled | bool | `false` |  |
| ingress.hosts[0].host | string | `"chart-example.local"` |  |
| ingress.hosts[0].paths[0].path | string | `"/"` |  |
| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` |  |
| ingress.tls | list | `[]` |  |
| initContainers | list | `[]` |  |
| livenessProbe.failureThreshold | int | `3` |  |
| livenessProbe.httpGet.path | string | `"/v1/api/health"` |  |
| livenessProbe.httpGet.port | int | `8888` |  |
| livenessProbe.initialDelaySeconds | int | `15` |  |
| livenessProbe.periodSeconds | int | `5` |  |
| nameOverride | string | `""` |  |
| nodeSelector | object | `{}` |  |
| persistentVolume.accessModes[0] | string | `"ReadWriteOnce"` |  |
| persistentVolume.annotations | object | `{}` |  |
| persistentVolume.existingClaim | string | `""` |  |
| persistentVolume.labels | object | `{}` |  |
| persistentVolume.mountPath | string | `"/storage"` |  |
| persistentVolume.size | string | `"8Gi"` |  |
| podAnnotations | object | `{}` |  |
| podLabels | object | `{}` |  |
| podSecurityContext.fsGroup | int | `1000` |  |
| readinessProbe.httpGet.path | string | `"/v1/api/health"` |  |
| readinessProbe.httpGet.port | int | `8888` |  |
| readinessProbe.initialDelaySeconds | int | `15` |  |
| readinessProbe.periodSeconds | int | `5` |  |
| readinessProbe.successThreshold | int | `2` |  |
| replicaCount | int | `1` |  |
| resources | object | `{}` |  |
| securityContext | object | `{}` |  |
| service.port | int | `3001` |  |
| service.type | string | `"ClusterIP"` |  |
| serviceAccount.annotations | object | `{}` |  |
| serviceAccount.automount | bool | `true` |  |
| serviceAccount.create | bool | `true` |  |
| serviceAccount.name | string | `""` |  |
| tolerations | list | `[]` |  |
| volumeMounts | list | `[]` |  |
| volumes | list | `[]` |  |

================================================
FILE: cloud-deployments/helm/charts/anythingllm/README.md.gotmpl
================================================
{{ template "chart.header" . }}
{{ template "chart.deprecationWarning" . }}

{{ template "chart.badgesSection" . }}

![AnythingLLM](https://raw.githubusercontent.com/Mintplex-Labs/anything-llm/master/images/wordmark.png)

[AnythingLLM](https://github.com/Mintplex-Labs/anything-llm)

{{ template "chart.description" . }}

{{ template "chart.homepageLine" . }}

{{ template "chart.maintainersSection" . }}

{{ template "chart.sourcesSection" . }}

{{ template "chart.requirementsSection" . }}

**Configuration & Usage**

- **Config vs Secrets:** This chart exposes application configuration via two mechanisms:
  - `config` (in `values.yaml`) — rendered into a `ConfigMap` and injected using `envFrom` in the pod. Do NOT place sensitive values (API keys, secrets) in `config` because `ConfigMap`s are not encrypted.
  - `env` / `envFrom` — the preferred way to inject secrets. Use Kubernetes `Secret` objects and reference them from `env` (with `valueFrom.secretKeyRef`) or `envFrom.secretRef`.

- **Storage & STORAGE_DIR mapping:** The chart creates (or mounts) a `PersistentVolumeClaim` using the `persistentVolume.*` settings. The container mount path is set from `persistentVolume.mountPath`. Ensure the container `STORAGE_DIR` config key matches that path (defaults are set in `values.yaml`).


**Providing API keys & secrets (recommended)**

Use Kubernetes Secrets. Below are example workflows and `values.yaml` snippets.

1) Create a Kubernetes Secret with API keys:

```
kubectl create secret generic openai-secret --from-literal=OPENAI_KEY="sk-..." 
# or from a file
# kubectl create secret generic openai-secret --from-file=OPENAI_KEY=/path/to/keyfile
```

2) Reference the Secret from `values.yaml` using `envFrom` (recommended when your secret contains multiple env keys):

```yaml
envFrom:
  - secretRef:
      name: openai-secret
```

This will inject all key/value pairs from the `openai-secret` Secret as environment variables in the container.

3) Or reference a single secret key via `env` (explicit mapping):

```yaml
env:
  - name: OPENAI_KEY
    valueFrom:
      secretKeyRef:
        name: openai-secret
        key: OPENAI_KEY
```

Notes:
- Avoid placing secret values into `config:` (the chart's `ConfigMap`) — `ConfigMap`s are visible to anyone who can read the namespace. Use `Secret` objects for any credentials/tokens.
- If you use a GitOps workflow, consider integrating an external secret operator (ExternalSecrets, SealedSecrets, etc.) so you don't store raw secrets in Git.


**Example `values-secret.yaml` to pass during `helm install`**

```yaml
image:
  repository: mintplexlabs/anythingllm
  tag: "1.11.2"

service:
  type: ClusterIP
  port: 3001

# Reference secret containing API keys
envFrom:
  - secretRef:
      name: openai-secret

# Optionally override other values
persistentVolume:
  size: 16Gi
  mountPath: /storage
```

Install with:

```
helm install my-anythingllm ./anythingllm -f values-secret.yaml
```

**Best practices & tips**

- Use `envFrom` for convenience when many environment variables are stored in a single `Secret` and use `env`/`valueFrom` for explicit single-key mappings.
- Use `kubectl create secret generic` or your secrets management solution. If you need to reference multiple different provider keys (OpenAI, Anthropic, etc.), create a single `Secret` with multiple keys or multiple Secrets and add multiple `envFrom` entries.
- Keep probe paths and `service.port` aligned. If your probes fail after deployment, check that the probe `port` matches the container port (or named port `http`) and that the `path` is valid.
- For storage, if you have a pre-existing PVC set `persistentVolume.existingClaim` to the PVC name; the chart will mount that claim (and will not attempt to create a new PVC).
- For production, provide resource `requests` and `limits` in `values.yaml` to prevent scheduler starvation and to control cost.

{{ template "chart.valuesSection" . }}

================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/NOTES.txt
================================================
1. Get the application URL by running these commands:

{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
  {{- range .paths }}
  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
  {{- end }}
{{- end }}

{{- else if contains "NodePort" .Values.service.type }}
  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "anythingllm.fullname" . }})
  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

{{- else if contains "LoadBalancer" .Values.service.type }}
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch its status by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "anythingllm.fullname" . }}'
  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "anythingllm.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
  echo http://$SERVICE_IP:{{ .Values.service.port }}

{{- else if contains "ClusterIP" .Values.service.type }}
  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "anythingllm.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "To access locally, run:"
  echo "  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT"
  echo "Then visit http://127.0.0.1:8080"

{{- end }}


================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/_helpers.tpl
================================================
{{/*
Expand the name of the chart.
*/}}
{{- define "anythingllm.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "anythingllm.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "anythingllm.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Common labels
*/}}
{{- define "anythingllm.labels" -}}
helm.sh/chart: {{ include "anythingllm.chart" . }}
{{ include "anythingllm.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels
*/}}
{{- define "anythingllm.selectorLabels" -}}
app.kubernetes.io/name: {{ include "anythingllm.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{/*
Create the name of the service account to use
*/}}
{{- define "anythingllm.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "anythingllm.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}


================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/configmap.yaml
================================================
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    {{- include "anythingllm.labels" . | nindent 4 }}
  name: {{ include "anythingllm.fullname" . }}-config
data:
{{- range $key, $value := .Values.config }}
  {{ $key }}: "{{ $value }}"
{{- end }}

================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/deployment.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "anythingllm.fullname" . }}
  labels:
    {{- include "anythingllm.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "anythingllm.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "anythingllm.labels" . | nindent 8 }}
        {{- with .Values.podLabels }}
        {{- toYaml . | nindent 8 }}
        {{- end }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      serviceAccountName: {{ include "anythingllm.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      {{- with .Values.initContainers }}
      initContainers:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.strategy }}
      strategy:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          {{- with .Values.env }}
          env:
            {{- toYaml . | nindent 12 }}
          {{- end }}
          envFrom:
            - configMapRef:
                name: {{ include "anythingllm.fullname" . }}-config
          {{- with .Values.envFrom }}
            {{- toYaml . | nindent 12 }}
          {{- end }}
          ports:
            - name: http
              containerPort: {{ .Values.service.port }}
              protocol: TCP
          livenessProbe:
            {{- toYaml .Values.livenessProbe | nindent 12 }}
          readinessProbe:
            {{- toYaml .Values.readinessProbe | nindent 12 }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
          volumeMounts:
            - name: storage
              mountPath: {{ .Values.persistentVolume.mountPath }}
      volumes:
        - name: storage
          persistentVolumeClaim:
            claimName: {{ include "anythingllm.fullname" . }}-storage-claim
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}


================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/extra-objects.yaml
================================================
{{ range .Values.extraObjects }}
---
{{ tpl (toYaml .) $ }}
{{ end }}


================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/ingress.yaml
================================================
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "anythingllm.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
  {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
  {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
  {{- end }}
{{- end }}
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
    {{- include "anythingllm.labels" . | nindent 4 }}
  {{- with .Values.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
  {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
  ingressClassName: {{ .Values.ingress.className }}
  {{- end }}
  {{- if .Values.ingress.tls }}
  tls:
    {{- range .Values.ingress.tls }}
    - hosts:
        {{- range .hosts }}
        - {{ . | quote }}
        {{- end }}
      secretName: {{ .secretName }}
    {{- end }}
  {{- end }}
  rules:
    {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
          {{- range .paths }}
          - path: {{ .path }}
            {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
            pathType: {{ .pathType }}
            {{- end }}
            backend:
              {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
              service:
                name: {{ $fullName }}
                port:
                  number: {{ $svcPort }}
              {{- else }}
              serviceName: {{ $fullName }}
              servicePort: {{ $svcPort }}
              {{- end }}
          {{- end }}
    {{- end }}
{{- end }}


================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/pvc.yaml
================================================
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  {{- if .Values.persistentVolume.annotations }}
  annotations:
{{ toYaml .Values.persistentVolume.annotations | indent 4 }}
  {{- end }}
  labels:
    {{- include "anythingllm.labels" . | nindent 4 }}
    {{- with .Values.persistentVolume.labels }}
       {{- toYaml . | nindent 4 }}
    {{- end }}
  name: {{ include "anythingllm.fullname" . }}-storage-claim
spec:
  accessModes:
    {{- toYaml .Values.persistentVolume.accessModes | nindent 4 }}
{{- if .Values.persistentVolume.storageClass }}
{{- if (eq "-" .Values.persistentVolume.storageClass) }}
  storageClassName: ""
{{- else }}
  storageClassName: "{{ .Values.persistentVolume.storageClass }}"
{{- end }}
{{- end }}
  resources:
    requests:
      storage: {{ .Values.persistentVolume.size }}
{{- if .Values.persistentVolume.volumeName }}
  volumeName: "{{ .Values.persistentVolume.volumeName }}"
{{- end -}}
  {{- with .Values.persistentVolume.selector }}
  selector:
    {{- toYaml . | nindent 4 }}
  {{- end }}

================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
  name: {{ include "anythingllm.fullname" . }}
  labels:
    {{- include "anythingllm.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    {{- include "anythingllm.selectorLabels" . | nindent 4 }}


================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/serviceaccount.yaml
================================================
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "anythingllm.serviceAccountName" . }}
  labels:
    {{- include "anythingllm.labels" . | nindent 4 }}
  {{- with .Values.serviceAccount.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
{{- end }}


================================================
FILE: cloud-deployments/helm/charts/anythingllm/templates/tests/test-connection.yaml
================================================
apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "anythingllm.fullname" . }}-test-connection"
  labels:
    {{- include "anythingllm.labels" . | nindent 4 }}
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: healthcheck
      image: curlimages/curl:8.1.2
      command: ["sh", "-c"]
      args:
        - "curl -fsS -o /dev/null http://{{ include "anythingllm.fullname" . }}:{{ .Values.service.port }}|| exit 1"
  restartPolicy: Never

================================================
FILE: cloud-deployments/helm/charts/anythingllm/values.yaml
================================================
replicaCount: 1

initContainers: []
  # - name: init-myservice
  #   image: busybox
  #   command: ['sh', '-c', 'chown -R 1000:1000 /storage']

image:
  repository: mintplexlabs/anythingllm
  pullPolicy: IfNotPresent
  tag: "1.11.2"

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

persistentVolume:
  # AnythingLLM storage data Persistent Volume access modes
  # Must match those of existing PV or dynamic provisioner
  # Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
  #
  accessModes:
    - ReadWriteOnce

  # AnythingLLM storage data Persistent Volume labels
  #
  labels: {}

  # AnythingLLM storage data Persistent Volume annotations
  #
  annotations: {}

  # AnythingLLM storage data Persistent Volume  existing claim name
  # If defined, PVC must be created manually before volume will be bound
  #
  existingClaim: ""

  # AnythingLLM storage data Persistent Volume size
  #
  size: 8Gi

  # AnythingLLM storage data Persistent Volume mount path
  # Must match the STORAGE_DIR config value
  #
  mountPath: /app/server/storage

  # AnythingLLM storage data Persistent Volume Storage Class
  # If defined, storageClassName: <storageClass>
  # If set to "-", storageClassName: "", which disables dynamic provisioning
  # If undefined (the default) or set to null, no storageClassName spec is
  #   set, choosing the default provisioner.  (gp2 on AWS, standard on
  #   GKE, AWS & OpenStack)
  #
  storageClass: ""

  # AnythingLLM storage data Persistent Volume Claim Selector
  # Useful if Persistent Volumes have been provisioned in advance
  # Ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#selector
  #
  selector: {}
  # selector:
  #  matchLabels:
  #    release: "stable"
  #  matchExpressions:
  #    - { key: environment, operator: In, values: [ dev ] }
  
  # AnythingLLM storage data Persistent Volume Name
  # Useful if Persistent Volumes have been provisioned in advance and you want to use a specific one
  #
  volumeName: ""

serviceAccount:
  # Specifies whether a service account should be created
  create: true
  # Automatically mount a ServiceAccount's API credentials?
  automount: true
  # Annotations to add to the service account
  annotations: {}
  # The name of the service account to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""

# The Anything LLM application  deployment strategy
# This is set to "Recreate" by default as AnythingLLM support is not yet
# production ready.  Once it is, this can be changed to "RollingUpdate"
# Ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
#
strategy:
  # Type of deployment. Can be "Recreate" or "RollingUpdate". Default is "Recreate"
  type: Recreate
  # If type is "RollingUpdate", the following values can be set:
  # rollingUpdate:
  #   maxUnavailable: 1
  #   maxSurge: 1

podAnnotations: {}
podLabels: {}

podSecurityContext:
  # fsGroup needs to be set as the same as the uid/gid used to run the application
  # in order to have the right permissions on mounted volumes
  fsGroup: 1000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

# AnythingLLM configuration options, these are stored in a ConfigMap and passed
# to the container as environment variables.
# See https://github.com/Mintplex-Labs/anything-llm/blob/render/docker/.env.example
# for all available environment variables to use as configuration options
#
config:
  DISABLE_TELEMETRY: "true"
  NODE_ENV: production
  STORAGE_DIR: /app/server/storage
  UID: "1000"
  GID: "1000"

# The preferred method for setting secret environment variables
# Ref: https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#define-a-container-environment-variable-with-data-from-a-single-secret
#
env: {}
# - name: OPEN_AI_KEY
#   valueFrom:
#     secretKeyRef:
#       name: openai-secret
#       key: openai_key

# Typically used to reference a pre existing Secret containing multiple environment variables
# Ref: https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#define-a-container-environment-variable-with-data-from-a-single-secret
#
envFrom: {}
  # - secretRef:
  #     name: mysecret

service:
  type: ClusterIP
  port: 3001

ingress:
  enabled: false
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

readinessProbe:
  httpGet:
    path: /v1/api/health
    port: 8888
  initialDelaySeconds: 15
  periodSeconds: 5
  successThreshold: 2
livenessProbe:
  httpGet:
    path: /v1/api/health
    port: 8888
  initialDelaySeconds: 15
  periodSeconds: 5
  failureThreshold: 3

# Additional volumes on the output Deployment definition.
#
volumes: []
# - name: foo
#   secret:
#     secretName: mysecret
#     optional: false

# Additional volumeMounts on the output Deployment definition.
#
volumeMounts: []
# - name: foo
#   mountPath: "/etc/foo"
#   readOnly: true

nodeSelector: {}

tolerations: []

affinity: {}

## Array of extra manifests/obhects to create
#
extraObjects: []
# - apiVersion: external-secrets.io/v1beta1
#   kind: ExternalSecret
#   metadata:
#     name: open-ai-api-key-external-secret
#     namespace: default
#   spec:
#     refreshInterval: 1h
#     secretStoreRef:
#       name: vault
#       kind: ClusterSecretStore
#     target:
#       name: open-ai-api-key-secret
#       template:
#         type: Opaque
#     data:
#       - secretKey: open_ai_key
#         remoteRef:
#           key: secret/data/anything-llm
#           property: open_ai_key



================================================
FILE: cloud-deployments/huggingface-spaces/Dockerfile
================================================
# With this dockerfile in a Huggingface space you will get an entire AnythingLLM instance running
# in your space with all features you would normally get from the docker based version of AnythingLLM.
#
# How to use
# - Login to https://huggingface.co/spaces
# - Click on "Create new Space"
# - Name the space and select "Docker" as the SDK w/ a blank template
# - The default 2vCPU/16GB machine is OK. The more the merrier.
# - Decide if you want your AnythingLLM Space public or private.
#   **You might want to stay private until you at least set a password or enable multi-user mode**
# - Click "Create Space"
# - Click on "Settings" on top of page (https://huggingface.co/spaces/<username>/<space-name>/settings)
# - Scroll to "Persistent Storage" and select the lowest tier of now - you can upgrade if you run out.
# - Confirm and continue storage upgrade
# - Go to "Files" Tab (https://huggingface.co/spaces/<username>/<space-name>/tree/main)
# - Click "Add Files"
# - Upload this file or create a file named `Dockerfile` and copy-paste this content into it. "Commit to main" and save.
# - Your container will build and boot. You now have AnythingLLM on HuggingFace. Your data is stored in the persistent storage attached.
# Have Fun 🤗 
# Have issues? Check the logs on HuggingFace for clues.
FROM mintplexlabs/anythingllm:render

USER root
RUN mkdir -p /data/storage
RUN ln -s /data/storage /storage
USER anythingllm

ENV STORAGE_DIR="/data/storage"
ENV SERVER_PORT=7860

ENTRYPOINT ["/bin/bash", "/usr/local/bin/render-entrypoint.sh"]

================================================
FILE: cloud-deployments/k8/manifest.yaml
================================================
---
apiVersion: v1                                                                                                                                           
kind: PersistentVolume                                                                                                                                   
metadata:                                                                                                                                                
  name: anything-llm-volume                                                                                                                              
  annotations:                                                                                                                                           
    pv.beta.kubernetes.io/uid: "1000"                                                                                                                    
    pv.beta.kubernetes.io/gid: "1000"                                                                                                                    
spec:                                                                                                                                                    
  storageClassName: gp2                                                                                                                                  
  capacity:                                                                                                                                              
    storage: 5Gi                                                                                                                                        
  accessModes:                                                                                                                                           
    - ReadWriteOnce                                                                                                                                      
  awsElasticBlockStore:    
    # This is the volume UUID from AWS EC2 EBS Volumes list.                                                                                                                              
    volumeID: "{{ anythingllm_awsElasticBlockStore_volumeID }}"                                                                                                                           
    fsType: ext4
  nodeAffinity:                                                                                                                                          
    required:                                                                                                                                            
      nodeSelectorTerms:                                                                                                                                 
      - matchExpressions:                                                                                                                                
        - key: topology.kubernetes.io/zone                                                                                                               
          operator: In                                                                                                                                   
          values:                                                                                                                                        
          - us-east-1c  
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: anything-llm-volume-claim
  namespace: "{{ namespace }}"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: anything-llm
  namespace: "{{ namespace }}"
  labels:
    anything-llm: "true"
spec:
  selector:
    matchLabels:
      k8s-app: anything-llm
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 0%
      maxUnavailable: 100%
  template:
    metadata:
      labels:
        anything-llm: "true"
        k8s-app: anything-llm
        app.kubernetes.io/name: anything-llm
        app.kubernetes.io/part-of: anything-llm
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/path: /metrics
        prometheus.io/port: "9090"
    spec:
      serviceAccountName: "default"
      terminationGracePeriodSeconds: 10
      securityContext:                                                                                                                                                              
        fsGroup: 1000
        runAsNonRoot: true                                                                                                                                                          
        runAsGroup: 1000
        runAsUser: 1000
      affinity:                                                                                                                                                                                                                                                                          
        nodeAffinity:                                                                                                                                                                                                                                                                    
          requiredDuringSchedulingIgnoredDuringExecution:                                                                                                                                                                                                                                
            nodeSelectorTerms:                                                                                                                                                                                                                                                           
            - matchExpressions:                                                                                                                                                                                                                                                          
              - key: topology.kubernetes.io/zone                                                                                                                                                                                                                                         
                operator: In                                                                                                                                                                                                                                                             
                values:                                                                                                                                                                                                                                                                  
                - us-east-1c  
      containers:
      - name: anything-llm
        resources:
          limits:
            memory: "1Gi"
            cpu: "500m"
          requests:
            memory: "512Mi"
            cpu: "250m"
        imagePullPolicy: IfNotPresent
        image: "mintplexlabs/anythingllm:render"
        securityContext:                     
          allowPrivilegeEscalation: true                                                                                                                                                                                                                                                 
          capabilities:                                                                                                                                                                                                                                                                  
            add:                                                                                                                                                                                                                                                                         
              - SYS_ADMIN                                                                                                                                                                                                                                                                
          runAsNonRoot: true                                                                                                                                                                                                                                                             
          runAsGroup: 1000                                                                                                                                                                                                                                                               
          runAsUser: 1000                                                                                                                                       
        command: 
          # Specify a command to override the Dockerfile's ENTRYPOINT.
          - /bin/bash
          - -c
          - |
            set -x -e
            sleep 3
            echo "AWS_REGION: $AWS_REGION"
            echo "SERVER_PORT: $SERVER_PORT"
            echo "NODE_ENV: $NODE_ENV"
            echo "STORAGE_DIR: $STORAGE_DIR"
            {
              cd /app/server/ &&
                npx prisma generate --schema=./prisma/schema.prisma &&
                npx prisma migrate deploy --schema=./prisma/schema.prisma &&
                node /app/server/index.js
              echo "Server process exited with status $?"
            } &
            { 
              node /app/collector/index.js
              echo "Collector process exited with status $?"
            } &
            wait -n
            exit $?
        readinessProbe:
          httpGet:
            path: /v1/api/health
            port: 8888
          initialDelaySeconds: 15
          periodSeconds: 5
          successThreshold: 2
        livenessProbe:
          httpGet:
            path: /v1/api/health
            port: 8888
          initialDelaySeconds: 15
          periodSeconds: 5
          failureThreshold: 3
        env:
          - name: AWS_REGION
            value: "{{ aws_region }}"
          - name: AWS_ACCESS_KEY_ID
            value: "{{ aws_access_id }}"
          - name: AWS_SECRET_ACCESS_KEY
            value: "{{ aws_access_secret }}"
          - name: SERVER_PORT
            value: "3001"
          - name: JWT_SECRET
            value: "my-random-string-for-seeding" # Please generate random string at least 12 chars long.
          - name: STORAGE_DIR
            value: "/storage"
          - name: NODE_ENV
            value: "production"
          - name: UID
            value: "1000"
          - name: GID
            value: "1000"
        volumeMounts: 
          - name: anything-llm-server-storage-volume-mount
            mountPath: /storage                                                                                                                                                  
      volumes:
        - name: anything-llm-server-storage-volume-mount
          persistentVolumeClaim:
            claimName: anything-llm-volume-claim
---
# This serves the UI and the backend.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: anything-llm-ingress
  namespace: "{{ namespace }}"
  annotations:
    external-dns.alpha.kubernetes.io/hostname: "{{ namespace }}-chat.{{ base_domain }}"
    kubernetes.io/ingress.class: "internal-ingress"
    nginx.ingress.kubernetes.io/rewrite-target: /
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: "{{ namespace }}-chat.{{ base_domain }}"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: anything-llm-svc
            port: 
              number: 3001
  tls: # < placing a host in the TLS config will indicate a cert should be created
    - hosts:
        - "{{ namespace }}-chat.{{ base_domain }}"
      secretName: letsencrypt-prod
---
apiVersion: v1
kind: Service
metadata:
  labels:
    kubernetes.io/name: anything-llm
  name: anything-llm-svc
  namespace: "{{ namespace }}"
spec:
  ports:
  # "port" is external port, and "targetPort" is internal.
  - port: 3301
    targetPort: 3001
    name: traffic
  - port: 9090
    targetPort: 9090
    name: metrics
  selector:
    k8s-app: anything-llm

================================================
FILE: collector/.env.example
================================================
# Placeholder .env file for collector runtime

# This enables HTTP request/response logging in development. Set value to truthy string to enable, leave empty value or comment out to disable
# ENABLE_HTTP_LOGGER=""
# This enables timestamps for the HTTP Logger. Set value to true to enable, leave empty or comment out to disable
# ENABLE_HTTP_LOGGER_TIMESTAMPS=""

================================================
FILE: collector/.gitignore
================================================
hotdir/*
!hotdir/__HOTDIR__.md
yarn-error.log
!yarn.lock
outputs
scripts
.env.development
.env.production
.env.test


================================================
FILE: collector/.nvmrc
================================================
v18.18.0

================================================
FILE: collector/__tests__/utils/WhisperProviders/ffmpeg/index.test.js
================================================
process.env.STORAGE_DIR = "test-storage";
const fs = require("fs");
const path = require("path");

// Mock fix-path as a noop to prevent SIGSEGV (segfault)
// Returns ESM-style default export for dynamic import()
jest.mock("fix-path", () => ({ default: jest.fn() }));

const { FFMPEGWrapper } = require("../../../../utils/WhisperProviders/ffmpeg");

const describeRunner = process.env.GITHUB_ACTIONS ? describe.skip : describe;

describeRunner("FFMPEGWrapper", () => {
  /** @type { import("../../../../utils/WhisperProviders/ffmpeg/index").FFMPEGWrapper } */
  let ffmpeg;
  const testDir = path.resolve(__dirname, "../../../../storage/tmp");
  const inputPath = path.resolve(testDir, "test-input.wav");
  const outputPath = path.resolve(testDir, "test-output.wav");

  beforeEach(() => {
    ffmpeg = new FFMPEGWrapper();
  });

  afterEach(() => {
    if (fs.existsSync(inputPath)) fs.rmSync(inputPath);
    if (fs.existsSync(outputPath)) fs.rmSync(outputPath);
  });

  it("should find ffmpeg executable", async () => {
    const knownPath = await ffmpeg.ffmpegPath();
    expect(knownPath).toBeDefined();
    expect(typeof knownPath).toBe("string");
    expect(knownPath.length).toBeGreaterThan(0);
  });

  it("should validate ffmpeg executable", async () => {
    const knownPath = await ffmpeg.ffmpegPath();
    expect(ffmpeg.isValidFFMPEG(knownPath)).toBe(true);
  });

  it("should return false for invalid ffmpeg path", () => {
    expect(ffmpeg.isValidFFMPEG("/invalid/path/to/ffmpeg")).toBe(false);
  });

  it("should convert audio file to wav format", async () => {
    if (!fs.existsSync(testDir)) fs.mkdirSync(testDir, { recursive: true });

    const sampleUrl =
      "https://github.com/ringcentral/ringcentral-api-docs/blob/main/resources/sample1.wav?raw=true";

    const response = await fetch(sampleUrl);
    if (!response.ok)
      throw new Error(
        `Failed to download sample file: ${response.statusText}`
      );

    const buffer = await response.arrayBuffer();
    fs.writeFileSync(inputPath, Buffer.from(buffer));

    const result = await ffmpeg.convertAudioToWav(inputPath, outputPath);

    expect(result).toBe(true);
    expect(fs.existsSync(outputPath)).toBe(true);

    const stats = fs.statSync(outputPath);
    expect(stats.size).toBeGreaterThan(0);
  }, 30000);

  it("should throw error when conversion fails", () => {
    const nonExistentFile = path.resolve(testDir, "non-existent-file.wav");
    const outputPath = path.resolve(testDir, "test-output-fail.wav");

    expect(async () => {
      return await ffmpeg.convertAudioToWav(nonExistentFile, outputPath);
    }).rejects.toThrow(`Input file ${nonExistentFile} does not exist.`);
  });
});


================================================
FILE: collector/__tests__/utils/url/index.test.js
================================================
process.env.STORAGE_DIR = "test-storage"; // needed for tests to run
const { validURL, validateURL, validYoutubeVideoUrl } = require("../../../utils/url");

// Mock the RuntimeSettings module
jest.mock("../../../utils/runtimeSettings", () => {
  const mockInstance = {
    get: jest.fn(),
    set: jest.fn(),
  };
  return jest.fn().mockImplementation(() => mockInstance);
});

describe("validURL", () => {
  let mockRuntimeSettings;

  beforeEach(() => {
    const RuntimeSettings = require("../../../utils/runtimeSettings");
    mockRuntimeSettings = new RuntimeSettings();
    jest.clearAllMocks();
  });

  it("should validate a valid URL", () => {
    mockRuntimeSettings.get.mockImplementation((key) => {
      if (key === "allowAnyIp") return false;
      if (key === "seenAnyIpWarning") return true; // silence the warning for tests
      return false;
    });

    expect(validURL("https://www.google.com")).toBe(true);
    expect(validURL("http://www.google.com")).toBe(true);

    // JS URL does not require extensions, so in theory
    // these should be valid
    expect(validURL("https://random")).toBe(true);
    expect(validURL("http://123")).toBe(true);

    // missing protocols
    expect(validURL("www.google.com")).toBe(false);
    expect(validURL("google.com")).toBe(false);

    // invalid protocols
    expect(validURL("ftp://www.google.com")).toBe(false);
    expect(validURL("mailto://www.google.com")).toBe(false);
    expect(validURL("tel://www.google.com")).toBe(false);
    expect(validURL("data://www.google.com")).toBe(false);
  });

  it("should block private/local IPs when allowAnyIp is false (default behavior)", () => {
    mockRuntimeSettings.get.mockImplementation((key) => {
      if (key === "allowAnyIp") return false;
      if (key === "seenAnyIpWarning") return true; // silence the warning for tests
      return false;
    });

    expect(validURL("http://192.168.1.1")).toBe(false);
    expect(validURL("http://10.0.0.1")).toBe(false);
    expect(validURL("http://172.16.0.1")).toBe(false);

    // But localhost should still be allowed
    expect(validURL("http://127.0.0.1")).toBe(true);
    expect(validURL("http://0.0.0.0")).toBe(true);
  });

  it("should allow any IP when allowAnyIp is true", () => {
    mockRuntimeSettings.get.mockImplementation((key) => {
      if (key === "allowAnyIp") return true;
      if (key === "seenAnyIpWarning") return true; // silence the warning for tests
      return false;
    });

    expect(validURL("http://192.168.1.1")).toBe(true);
    expect(validURL("http://10.0.0.1")).toBe(true);
    expect(validURL("http://172.16.0.1")).toBe(true);
  });
});

describe("validateURL", () => {
  it("should return the same URL if it's already valid", () => {
    expect(validateURL("https://www.google.com")).toBe(
      "https://www.google.com"
    );
    expect(validateURL("http://www.google.com")).toBe("http://www.google.com");
    expect(validateURL("https://random")).toBe("https://random");

    // With numbers as a url this will turn into an ip
    expect(validateURL("123")).toBe("https://0.0.0.123");
    expect(validateURL("123.123.123.123")).toBe("https://123.123.123.123");
    expect(validateURL("http://127.0.123.45")).toBe("http://127.0.123.45");
  });

  it("should assume https:// if the URL doesn't have a protocol", () => {
    expect(validateURL("www.google.com")).toBe("https://www.google.com");
    expect(validateURL("google.com")).toBe("https://google.com");
    expect(validateURL("EXAMPLE.com/ABCDEF/q1=UPPER")).toBe("https://example.com/ABCDEF/q1=UPPER");
    expect(validateURL("ftp://www.google.com")).toBe("ftp://www.google.com");
    expect(validateURL("mailto://www.google.com")).toBe(
      "mailto://www.google.com"
    );
    expect(validateURL("tel://www.google.com")).toBe("tel://www.google.com");
    expect(validateURL("data://www.google.com")).toBe("data://www.google.com");
  });

  it("should remove trailing slashes post-validation", () => {
    expect(validateURL("https://www.google.com/")).toBe(
      "https://www.google.com"
    );
    expect(validateURL("http://www.google.com/")).toBe("http://www.google.com");
    expect(validateURL("https://random/")).toBe("https://random");
    expect(validateURL("https://example.com/ABCDEF/")).toBe("https://example.com/ABCDEF");
  });

  it("should handle edge cases and bad data inputs", () => {
    expect(validateURL({})).toBe("");
    expect(validateURL(null)).toBe("");
    expect(validateURL(undefined)).toBe("");
    expect(validateURL(124512)).toBe("");
    expect(validateURL("")).toBe("");
    expect(validateURL(" ")).toBe("");
    expect(validateURL(" look here! ")).toBe("look here!");
  });

  it("should preserve case of characters in URL pathname", () => {
    expect(validateURL("https://example.com/To/ResOURce?q1=Value&qZ22=UPPE!R"))
      .toBe("https://example.com/To/ResOURce?q1=Value&qZ22=UPPE!R");
    expect(validateURL("https://sample.com/uPeRCaSe"))
      .toBe("https://sample.com/uPeRCaSe");
    expect(validateURL("Example.com/PATH/To/Resource?q2=Value&q1=UPPER"))
      .toBe("https://example.com/PATH/To/Resource?q2=Value&q1=UPPER");
  });
});


describe("validYoutubeVideoUrl", () => {
  const ID = "dQw4w9WgXcQ"; // 11-char valid video id

  it("returns true for youtube watch URLs with v param", () => {
    expect(validYoutubeVideoUrl(`https://www.youtube.com/watch?v=${ID}`)).toBe(
      true
    );
    expect(validYoutubeVideoUrl(`https://youtube.com/watch?v=${ID}&t=10s`)).toBe(
      true
    );
    expect(validYoutubeVideoUrl(`https://m.youtube.com/watch?v=${ID}`)).toBe(true);
    expect(validYoutubeVideoUrl(`youtube.com/watch?v=${ID}`)).toBe(true);
  });

  it("returns true for youtu.be short URLs", () => {
    expect(validYoutubeVideoUrl(`https://youtu.be/${ID}`)).toBe(true);
    expect(validYoutubeVideoUrl(`https://youtu.be/${ID}?si=abc`)).toBe(true);
    // extra path segments after id should still validate the id component
    expect(validYoutubeVideoUrl(`https://youtu.be/${ID}/extra`)).toBe(true);
  });

  it("returns true for embed and v path formats", () => {
    expect(validYoutubeVideoUrl(`https://www.youtube.com/embed/${ID}`)).toBe(true);
    expect(validYoutubeVideoUrl(`https://youtube.com/v/${ID}`)).toBe(true);
  });

  it("returns false for non-YouTube hosts", () => {
    expect(validYoutubeVideoUrl("https://example.com/watch?v=dQw4w9WgXcQ")).toBe(
      false
    );
    expect(validYoutubeVideoUrl("https://vimeo.com/123456")).toBe(false);
  });

  it("returns false for unrelated YouTube paths without a video id", () => {
    expect(validYoutubeVideoUrl("https://www.youtube.com/user/somechannel")).toBe(
      false
    );
    expect(validYoutubeVideoUrl("https://www.youtube.com/")).toBe(false);
  });

  it("returns false for empty or bad inputs", () => {
    expect(validYoutubeVideoUrl("")).toBe(false);
    expect(validYoutubeVideoUrl(null)).toBe(false);
    expect(validYoutubeVideoUrl(undefined)).toBe(false);
  });

  it("returns the video ID for valid YouTube video URLs", () => {
    expect(validYoutubeVideoUrl(`https://www.youtube.com/watch?v=${ID}`, true)).toBe(ID);
    expect(validYoutubeVideoUrl(`https://youtube.com/watch?v=${ID}&t=10s`, true)).toBe(ID);
    expect(validYoutubeVideoUrl(`https://m.youtube.com/watch?v=${ID}`, true)).toBe(ID);
    expect(validYoutubeVideoUrl(`youtube.com/watch?v=${ID}`, true)).toBe(ID);
    expect(validYoutubeVideoUrl(`https://youtu.be/${ID}`, true)).toBe(ID);
    expect(validYoutubeVideoUrl(`https://youtu.be/${ID}?si=abc`, true)).toBe(ID);
    expect(validYoutubeVideoUrl(`https://youtu.be/${ID}/extra`, true)).toBe(ID);
    expect(validYoutubeVideoUrl(`https://www.youtube.com/embed/${ID}`, true)).toBe(ID);
    expect(validYoutubeVideoUrl(`https://youtube.com/v/${ID}`, true)).toBe(ID);
    // invalid video IDs
    expect(validYoutubeVideoUrl(`https://www.youtube.com/watch?v=invalid`, true)).toBe(null);
    expect(validYoutubeVideoUrl(`https://youtube.com/watch?v=invalid`, true)).toBe(null);
    expect(validYoutubeVideoUrl(`https://m.youtube.com/watch?v=invalid`, true)).toBe(null);
    expect(validYoutubeVideoUrl(`youtube.com/watch`, true)).toBe(null);
    expect(validYoutubeVideoUrl(`https://youtu.be/invalid`, true)).toBe(null);
    expect(validYoutubeVideoUrl(`https://youtu.be/invalid?si=abc`, true)).toBe(null);
  });
});


================================================
FILE: collector/eslint.config.mjs
================================================
import js from "@eslint/js";
import globals from "globals";
import { defineConfig } from "eslint/config";
import pluginPrettier from "eslint-plugin-prettier";
import configPrettier from "eslint-config-prettier";
import unusedImports from "eslint-plugin-unused-imports";

export default defineConfig([
  { ignores: ["__tests__/**"] },
  {
    files: ["**/*.{js,mjs,cjs}"],
    plugins: { js, prettier: pluginPrettier, "unused-imports": unusedImports },
    extends: ["js/recommended"],
    languageOptions: { globals: { ...globals.node, ...globals.browser } },
    rules: {
      ...configPrettier.rules,
      "prettier/prettier": "error",
      "no-case-declarations": "off",
      "no-prototype-builtins": "off",
      "no-async-promise-executor": "off",
      "no-extra-boolean-cast": "off",
      "no-empty": "off",
      "no-unused-private-class-members": "warn",
      "no-unused-vars": "off",
      "unused-imports/no-unused-imports": "error",
      "unused-imports/no-unused-vars": [
        "error",
        {
          vars: "all",
          varsIgnorePattern: "^_",
          args: "after-used",
          argsIgnorePattern: "^_",
        },
      ],
    },
  },
  { files: ["**/*.js"], languageOptions: { sourceType: "commonjs" } },
]);


================================================
FILE: collector/extensions/index.js
================================================
const { setDataSigner } = require("../middleware/setDataSigner");
const { verifyPayloadIntegrity } = require("../middleware/verifyIntegrity");
const {
  resolveRepoLoader,
  resolveRepoLoaderFunction,
} = require("../utils/extensions/RepoLoader");
const { reqBody } = require("../utils/http");
const { validURL, validateURL } = require("../utils/url");
const RESYNC_METHODS = require("./resync");
const { loadObsidianVault } = require("../utils/extensions/ObsidianVault");

function extensions(app) {
  if (!app) return;

  app.post(
    "/ext/resync-source-document",
    [verifyPayloadIntegrity, setDataSigner],
    async function (request, response) {
      try {
        const { type, options } = reqBody(request);
        if (!RESYNC_METHODS.hasOwnProperty(type))
          throw new Error(`Type "${type}" is not a valid type to sync.`);
        return await RESYNC_METHODS[type](options, response);
      } catch (e) {
        console.error(e);
        response.status(200).json({
          success: false,
          content: null,
          reason: e.message || "A processing error occurred.",
        });
      }
      return;
    }
  );

  app.post(
    "/ext/:repo_platform-repo",
    [verifyPayloadIntegrity, setDataSigner],
    async function (request, response) {
      try {
        const loadRepo = resolveRepoLoaderFunction(
          request.params.repo_platform
        );
        const { success, reason, data } = await loadRepo(
          reqBody(request),
          response
        );
        response.status(200).json({
          success,
          reason,
          data,
        });
      } catch (e) {
        console.error(e);
        response.status(200).json({
          success: false,
          reason: e.message || "A processing error occurred.",
          data: {},
        });
      }
      return;
    }
  );

  // gets all branches for a specific repo
  app.post(
    "/ext/:repo_platform-repo/branches",
    [verifyPayloadIntegrity],
    async function (request, response) {
      try {
        const RepoLoader = resolveRepoLoader(request.params.repo_platform);
        const allBranches = await new RepoLoader(
          reqBody(request)
        ).getRepoBranches();
        response.status(200).json({
          success: true,
          reason: null,
          data: {
            branches: allBranches,
          },
        });
      } catch (e) {
        console.error(e);
        response.status(400).json({
          success: false,
          reason: e.message,
          data: {
            branches: [],
          },
        });
      }
      return;
    }
  );

  app.post(
    "/ext/youtube-transcript",
    [verifyPayloadIntegrity],
    async function (request, response) {
      try {
        const {
          loadYouTubeTranscript,
        } = require("../utils/extensions/YoutubeTranscript");
        const { success, reason, data } = await loadYouTubeTranscript(
          reqBody(request)
        );
        response.status(200).json({ success, reason, data });
      } catch (e) {
        console.error(e);
        response.status(400).json({
          success: false,
          reason: e.message,
          data: {
            title: null,
            author: null,
          },
        });
      }
      return;
    }
  );

  app.post(
    "/ext/website-depth",
    [verifyPayloadIntegrity],
    async function (request, response) {
      try {
        const websiteDepth = require("../utils/extensions/WebsiteDepth");
        const { url, depth = 1, maxLinks = 20 } = reqBody(request);
        const validatedUrl = validateURL(url);
        if (!validURL(validatedUrl)) throw new Error("Not a valid URL.");
        const scrapedData = await websiteDepth(validatedUrl, depth, maxLinks);
        response.status(200).json({ success: true, data: scrapedData });
      } catch (e) {
        console.error(e);
        response.status(400).json({ success: false, reason: e.message });
      }
      return;
    }
  );

  app.post(
    "/ext/confluence",
    [verifyPayloadIntegrity, setDataSigner],
    async function (request, response) {
      try {
        const { loadConfluence } = require("../utils/extensions/Confluence");
        const { success, reason, data } = await loadConfluence(
          reqBody(request),
          response
        );
        response.status(200).json({ success, reason, data });
      } catch (e) {
        console.error(e);
        response.status(400).json({
          success: false,
          reason: e.message,
          data: {
            title: null,
            author: null,
          },
        });
      }
      return;
    }
  );

  app.post(
    "/ext/drupalwiki",
    [verifyPayloadIntegrity, setDataSigner],
    async function (request, response) {
      try {
        const {
          loadAndStoreSpaces,
        } = require("../utils/extensions/DrupalWiki");
        const { success, reason, data } = await loadAndStoreSpaces(
          reqBody(request),
          response
        );
        response.status(200).json({ success, reason, data });
      } catch (e) {
        console.error(e);
        response.status(400).json({
          success: false,
          reason: e.message,
          data: {
            title: null,
            author: null,
          },
        });
      }
      return;
    }
  );

  app.post(
    "/ext/obsidian/vault",
    [verifyPayloadIntegrity, setDataSigner],
    async function (request, response) {
      try {
        const { files } = reqBody(request);
        const result = await loadObsidianVault({ files });
        response.status(200).json(result);
      } catch (e) {
        console.error(e);
        response.status(400).json({
          success: false,
          reason: e.message,
          data: null,
        });
      }
      return;
    }
  );

  app.post(
    "/ext/paperless-ngx",
    [verifyPayloadIntegrity, setDataSigner],
    async function (request, response) {
      try {
        const {
          loadPaperlessNgx,
        } = require("../utils/extensions/PaperlessNgx");
        const result = await loadPaperlessNgx(reqBody(request), response);
        response.status(200).json(result);
      } catch (e) {
        console.error(e);
        response.status(400).json({
          success: false,
          reason: e.message,
          data: null,
        });
      }
      return;
    }
  );
}

module.exports = extensions;


================================================
FILE: collector/extensions/resync/index.js
================================================
const { getLinkText } = require("../../processLink");

/**
 * Fetches the content of a raw link. Returns the content as a text string of the link in question.
 * @param {object} data - metadata from document (eg: link)
 * @param {import("../../middleware/setDataSigner").ResponseWithSigner} response
 */
async function resyncLink({ link }, response) {
  if (!link) throw new Error("Invalid link provided");
  try {
    const { success, content = null, reason } = await getLinkText(link);
    if (!success) throw new Error(`Failed to sync link content. ${reason}`);
    response.status(200).json({ success, content });
  } catch (e) {
    console.error(e);
    response.status(200).json({
      success: false,
      content: null,
    });
  }
}

/**
 * Fetches the content of a YouTube link. Returns the content as a text string of the video in question.
 * We offer this as there may be some videos where a transcription could be manually edited after initial scraping
 * but in general - transcriptions often never change.
 * @param {object} data - metadata from document (eg: link)
 * @param {import("../../middleware/setDataSigner").ResponseWithSigner} response
 */
async function resyncYouTube({ link }, response) {
  if (!link) throw new Error("Invalid link provided");
  try {
    const {
      fetchVideoTranscriptContent,
    } = require("../../utils/extensions/YoutubeTranscript");
    const { success, reason, content } = await fetchVideoTranscriptContent({
      url: link,
    });
    if (!success)
      throw new Error(`Failed to sync YouTube video transcript. ${reason}`);
    response.status(200).json({ success, content });
  } catch (e) {
    console.error(e);
    response.status(200).json({
      success: false,
      content: null,
    });
  }
}

/**
 * Fetches the content of a specific confluence page via its chunkSource.
 * Returns the content as a text string of the page in question and only that page.
 * @param {object} data - metadata from document (eg: chunkSource)
 * @param {import("../../middleware/setDataSigner").ResponseWithSigner} response
 */
async function resyncConfluence({ chunkSource }, response) {
  if (!chunkSource) throw new Error("Invalid source property provided");
  try {
    // Confluence data is `payload` encrypted. So we need to expand its
    // encrypted payload back into query params so we can reFetch the page with same access token/params.
    const source = response.locals.encryptionWorker.expandPayload(chunkSource);
    const {
      fetchConfluencePage,
    } = require("../../utils/extensions/Confluence");
    const { success, reason, content } = await fetchConfluencePage({
      pageUrl: `https:${source.pathname}`, // need to add back the real protocol
      baseUrl: source.searchParams.get("baseUrl"),
      spaceKey: source.searchParams.get("spaceKey"),
      accessToken: source.searchParams.get("token"),
      username: source.searchParams.get("username"),
      cloud: source.searchParams.get("cloud") === "true",
      bypassSSL: source.searchParams.get("bypassSSL") === "true",
    });

    if (!success)
      throw new Error(`Failed to sync Confluence page content. ${reason}`);
    response.status(200).json({ success, content });
  } catch (e) {
    console.error(e);
    response.status(200).json({
      success: false,
      content: null,
    });
  }
}

/**
 * Fetches the content of a specific confluence page via its chunkSource.
 * Returns the content as a text string of the page in question and only that page.
 * @param {object} data - metadata from document (eg: chunkSource)
 * @param {import("../../middleware/setDataSigner").ResponseWithSigner} response
 */
async function resyncGithub({ chunkSource }, response) {
  if (!chunkSource) throw new Error("Invalid source property provided");
  try {
    // Github file data is `payload` encrypted (might contain PAT). So we need to expand its
    // encrypted payload back into query params so we can reFetch the page with same access token/params.
    const source = response.locals.encryptionWorker.expandPayload(chunkSource);
    const {
      fetchGithubFile,
    } = require("../../utils/extensions/RepoLoader/GithubRepo");
    const { success, reason, content } = await fetchGithubFile({
      repoUrl: `https:${source.pathname}`, // need to add back the real protocol
      branch: source.searchParams.get("branch"),
      accessToken: source.searchParams.get("pat"),
      sourceFilePath: source.searchParams.get("path"),
    });

    if (!success)
      throw new Error(`Failed to sync GitHub file content. ${reason}`);
    response.status(200).json({ success, content });
  } catch (e) {
    console.error(e);
    response.status(200).json({
      success: false,
      content: null,
    });
  }
}

/**
 * Fetches the content of a specific DrupalWiki page via its chunkSource.
 * Returns the content as a text string of the page in question and only that page.
 * @param {object} data - metadata from document (eg: chunkSource)
 * @param {import("../../middleware/setDataSigner").ResponseWithSigner} response
 */
async function resyncDrupalWiki({ chunkSource }, response) {
  if (!chunkSource) throw new Error("Invalid source property provided");
  try {
    // DrupalWiki data is `payload` encrypted. So we need to expand its
    // encrypted payload back into query params so we can reFetch the page with same access token/params.
    const source = response.locals.encryptionWorker.expandPayload(chunkSource);
    const { loadPage } = require("../../utils/extensions/DrupalWiki");
    const { success, reason, content } = await loadPage({
      baseUrl: source.searchParams.get("baseUrl"),
      pageId: source.searchParams.get("pageId"),
      accessToken: source.searchParams.get("accessToken"),
    });

    if (!success) {
      console.error(`Failed to sync DrupalWiki page content. ${reason}`);
      response.status(200).json({
        success: false,
        content: null,
      });
    } else {
      response.status(200).json({ success, content });
    }
  } catch (e) {
    console.error(e);
    response.status(200).json({
      success: false,
      content: null,
    });
  }
}

/**
 * Fetches the content of a specific Paperless-ngx document via its chunkSource.
 * Returns the content as a text string of the document.
 * @param {object} data - metadata from document (eg: chunkSource)
 * @param {import("../../middleware/setDataSigner").ResponseWithSigner} response
 */
async function resyncPaperlessNgx({ chunkSource }, response) {
  if (!chunkSource) throw new Error("Invalid source property provided");
  try {
    const source = response.locals.encryptionWorker.expandPayload(chunkSource);
    const {
      PaperlessNgxLoader,
    } = require("../../utils/extensions/PaperlessNgx/PaperlessNgxLoader");
    const loader = new PaperlessNgxLoader({
      baseUrl: source.searchParams.get("baseUrl"),
      apiToken: source.searchParams.get("token"),
    });
    const documentId = source.pathname.split("//")[1];
    const content = await loader.fetchDocumentContent(documentId);

    if (!content) throw new Error("Failed to fetch document content");
    response.status(200).json({ success: true, content });
  } catch (e) {
    console.error(e);
    response.status(200).json({
      success: false,
      content: null,
    });
  }
}

module.exports = {
  link: resyncLink,
  youtube: resyncYouTube,
  confluence: resyncConfluence,
  github: resyncGithub,
  drupalwiki: resyncDrupalWiki,
  "paperless-ngx": resyncPaperlessNgx,
};


================================================
FILE: collector/hotdir/__HOTDIR__.md
================================================
### What is the "Hot directory"

This is a pre-set file location that documents will be written to when uploaded by AnythingLLM. There is really no need to touch it.

================================================
FILE: collector/index.js
================================================
process.env.NODE_ENV === "development"
  ? require("dotenv").config({ path: `.env.${process.env.NODE_ENV}` })
  : require("dotenv").config();

require("./utils/logger")();
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const path = require("path");
const { ACCEPTED_MIMES } = require("./utils/constants");
const { reqBody } = require("./utils/http");
const { processSingleFile } = require("./processSingleFile");
const { processLink, getLinkText } = require("./processLink");
const { wipeCollectorStorage } = require("./utils/files");
const extensions = require("./extensions");
const { processRawText } = require("./processRawText");
const { verifyPayloadIntegrity } = require("./middleware/verifyIntegrity");
const { httpLogger } = require("./middleware/httpLogger");
const app = express();
const FILE_LIMIT = "3GB";

// Only log HTTP requests in development mode and if the ENABLE_HTTP_LOGGER environment variable is set to true
if (
  process.env.NODE_ENV === "development" &&
  !!process.env.ENABLE_HTTP_LOGGER
) {
  app.use(
    httpLogger({
      enableTimestamps: !!process.env.ENABLE_HTTP_LOGGER_TIMESTAMPS,
    })
  );
}
app.use(cors({ origin: true }));
app.use(
  bodyParser.text({ limit: FILE_LIMIT }),
  bodyParser.json({ limit: FILE_LIMIT }),
  bodyParser.urlencoded({
    limit: FILE_LIMIT,
    extended: true,
  })
);

app.post(
  "/process",
  [verifyPayloadIntegrity],
  async function (request, response) {
    const { filename, options = {}, metadata = {} } = reqBody(request);
    try {
      const targetFilename = path
        .normalize(filename)
        .replace(/^(\.\.(\/|\\|$))+/, "");
      const {
        success,
        reason,
        documents = [],
      } = await processSingleFile(targetFilename, options, metadata);
      response
        .status(200)
        .json({ filename: targetFilename, success, reason, documents });
    } catch (e) {
      console.error(e);
      response.status(200).json({
        filename: filename,
        success: false,
        reason: "A processing error occurred.",
        documents: [],
      });
    }
    return;
  }
);

app.post(
  "/parse",
  [verifyPayloadIntegrity],
  async function (request, response) {
    const { filename, options = {} } = reqBody(request);
    try {
      const targetFilename = path
        .normalize(filename)
        .replace(/^(\.\.(\/|\\|$))+/, "");
      const {
        success,
        reason,
        documents = [],
      } = await processSingleFile(targetFilename, {
        ...options,
        parseOnly: true,
      });
      response
        .status(200)
        .json({ filename: targetFilename, success, reason, documents });
    } catch (e) {
      console.error(e);
      response.status(200).json({
        filename: filename,
        success: false,
        reason: "A processing error occurred.",
        documents: [],
      });
    }
    return;
  }
);

app.post(
  "/process-link",
  [verifyPayloadIntegrity],
  async function (request, response) {
    const { link, scraperHeaders = {}, metadata = {} } = reqBody(request);
    try {
      const {
        success,
        reason,
        documents = [],
      } = await processLink(link, scraperHeaders, metadata);
      response.status(200).json({ url: link, success, reason, documents });
    } catch (e) {
      console.error(e);
      response.status(200).json({
        url: link,
        success: false,
        reason: "A processing error occurred.",
        documents: [],
      });
    }
    return;
  }
);

app.post(
  "/util/get-link",
  [verifyPayloadIntegrity],
  async function (request, response) {
    const { link, captureAs = "text" } = reqBody(request);
    try {
      const { success, content = null } = await getLinkText(link, captureAs);
      response.status(200).json({ url: link, success, content });
    } catch (e) {
      console.error(e);
      response.status(200).json({
        url: link,
        success: false,
        content: null,
      });
    }
    return;
  }
);

app.post(
  "/process-raw-text",
  [verifyPayloadIntegrity],
  async function (request, response) {
    const { textContent, metadata } = reqBody(request);
    try {
      const {
        success,
        reason,
        documents = [],
      } = await processRawText(textContent, metadata);
      response
        .status(200)
        .json({ filename: metadata.title, success, reason, documents });
    } catch (e) {
      console.error(e);
      response.status(200).json({
        filename: metadata?.title || "Unknown-doc.txt",
        success: false,
        reason: "A processing error occurred.",
        documents: [],
      });
    }
    return;
  }
);

extensions(app);

app.get("/accepts", function (_, response) {
  response.status(200).json(ACCEPTED_MIMES);
});

app.all("*", function (_, response) {
  response.sendStatus(200);
});

app
  .listen(8888, async () => {
    await wipeCollectorStorage();
    console.log(`Document processor app listening on port 8888`);
  })
  .on("error", function (_) {
    process.once("SIGUSR2", function () {
      process.kill(process.pid, "SIGUSR2");
    });
    process.on("SIGINT", function () {
      process.kill(process.pid, "SIGINT");
    });
  });


================================================
FILE: collector/middleware/httpLogger.js
================================================
const httpLogger =
  ({ enableTimestamps = false }) =>
  (req, res, next) => {
    // Capture the original res.end to log response status
    const originalEnd = res.end;

    res.end = function (chunk, encoding) {
      // Log the request method, status code, and path
      const statusColor = res.statusCode >= 400 ? "\x1b[31m" : "\x1b[32m"; // Red for errors, green for success
      console.log(
        `\x1b[32m[HTTP]\x1b[0m ${statusColor}${res.statusCode}\x1b[0m ${
          req.method
        } -> ${req.path} ${
          enableTimestamps
            ? `@ ${new Date().toLocaleTimeString("en-US", { hour12: true })}`
            : ""
        }`.trim()
      );

      // Call the original end method
      return originalEnd.call(this, chunk, encoding);
    };

    next();
  };

module.exports = {
  httpLogger,
};


================================================
FILE: collector/middleware/setDataSigner.js
================================================
const { EncryptionWorker } = require("../utils/EncryptionWorker");
const { CommunicationKey } = require("../utils/comKey");

/**
 * Express Response Object interface with defined encryptionWorker attached to locals property.
 * @typedef {import("express").Response & import("express").Response['locals'] & {encryptionWorker: EncryptionWorker} } ResponseWithSigner
 */

// You can use this middleware to assign the EncryptionWorker to the response locals
// property so that if can be used to encrypt/decrypt arbitrary data via response object.
// eg: Encrypting API keys in chunk sources.

// The way this functions is that the rolling RSA Communication Key is used server-side to private-key encrypt the raw
// key of the persistent EncryptionManager credentials. Since EncryptionManager credentials do _not_ roll, we should not send them
// even between server<>collector in plaintext because if the user configured the server/collector to be public they could technically
// be exposing the key in transit via the X-Payload-Signer header. Even if this risk is minimal we should not do this.

// This middleware uses the CommunicationKey public key to first decrypt the base64 representation of the EncryptionManager credentials
// and then loads that in to the EncryptionWorker as a buffer so we can use the same credentials across the system. Should we ever break the
// collector out into its own service this would still work without SSL/TLS.

/**
 *
 * @param {import("express").Request} request
 * @param {import("express").Response} response
 * @param {import("express").NextFunction} next
 */
function setDataSigner(request, response, next) {
  const comKey = new CommunicationKey();
  const encryptedPayloadSigner = request.header("X-Payload-Signer");
  if (!encryptedPayloadSigner)
    console.log(
      "Failed to find signed-payload to set encryption worker! Encryption calls will fail."
    );

  const decryptedPayloadSignerKey = comKey.decrypt(encryptedPayloadSigner);
  const encryptionWorker = new EncryptionWorker(decryptedPayloadSignerKey);
  response.locals.encryptionWorker = encryptionWorker;
  next();
}

module.exports = {
  setDataSigner,
};


================================================
FILE: collector/middleware/verifyIntegrity.js
================================================
const { Communicatio
Download .txt
gitextract_5urqiqdy/

├── .devcontainer/
│   ├── README.md
│   └── devcontainer.json
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01_bug.yml
│   │   ├── 02_feature.yml
│   │   ├── 03_documentation.yml
│   │   └── config.yml
│   └── workflows/
│       ├── build-and-push-image-semver.yaml
│       ├── build-and-push-image.yaml
│       ├── build-qa-tag.yaml
│       ├── check-package-versions.yaml
│       ├── check-translations.yaml
│       ├── cleanup-qa-tag.yaml
│       ├── lint.yaml
│       ├── run-tests.yaml
│       └── sponsors.yaml
├── .gitignore
├── .gitmodules
├── .hadolint.yaml
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .vscode/
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── BARE_METAL.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── TERMS_SELF_HOSTED.md
├── cloud-deployments/
│   ├── aws/
│   │   └── cloudformation/
│   │       ├── DEPLOY.md
│   │       ├── aws_https_instructions.md
│   │       └── cloudformation_create_anythingllm.json
│   ├── digitalocean/
│   │   └── terraform/
│   │       ├── DEPLOY.md
│   │       ├── main.tf
│   │       ├── outputs.tf
│   │       └── user_data.tp1
│   ├── gcp/
│   │   └── deployment/
│   │       ├── DEPLOY.md
│   │       └── gcp_deploy_anything_llm.yaml
│   ├── helm/
│   │   └── charts/
│   │       └── anythingllm/
│   │           ├── .helmignore
│   │           ├── Chart.yaml
│   │           ├── README.md
│   │           ├── README.md.gotmpl
│   │           ├── templates/
│   │           │   ├── NOTES.txt
│   │           │   ├── _helpers.tpl
│   │           │   ├── configmap.yaml
│   │           │   ├── deployment.yaml
│   │           │   ├── extra-objects.yaml
│   │           │   ├── ingress.yaml
│   │           │   ├── pvc.yaml
│   │           │   ├── service.yaml
│   │           │   ├── serviceaccount.yaml
│   │           │   └── tests/
│   │           │       └── test-connection.yaml
│   │           └── values.yaml
│   ├── huggingface-spaces/
│   │   └── Dockerfile
│   └── k8/
│       └── manifest.yaml
├── collector/
│   ├── .env.example
│   ├── .gitignore
│   ├── .nvmrc
│   ├── __tests__/
│   │   └── utils/
│   │       ├── WhisperProviders/
│   │       │   └── ffmpeg/
│   │       │       └── index.test.js
│   │       └── url/
│   │           └── index.test.js
│   ├── eslint.config.mjs
│   ├── extensions/
│   │   ├── index.js
│   │   └── resync/
│   │       └── index.js
│   ├── hotdir/
│   │   └── __HOTDIR__.md
│   ├── index.js
│   ├── middleware/
│   │   ├── httpLogger.js
│   │   ├── setDataSigner.js
│   │   └── verifyIntegrity.js
│   ├── nodemon.json
│   ├── package.json
│   ├── processLink/
│   │   ├── convert/
│   │   │   └── generic.js
│   │   ├── helpers/
│   │   │   └── index.js
│   │   └── index.js
│   ├── processRawText/
│   │   └── index.js
│   ├── processSingleFile/
│   │   ├── convert/
│   │   │   ├── asAudio.js
│   │   │   ├── asDocx.js
│   │   │   ├── asEPub.js
│   │   │   ├── asImage.js
│   │   │   ├── asMbox.js
│   │   │   ├── asOfficeMime.js
│   │   │   ├── asPDF/
│   │   │   │   ├── PDFLoader/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── asTxt.js
│   │   │   └── asXlsx.js
│   │   └── index.js
│   ├── storage/
│   │   ├── .gitignore
│   │   └── tmp/
│   │       └── .placeholder
│   ├── utils/
│   │   ├── EncryptionWorker/
│   │   │   └── index.js
│   │   ├── OCRLoader/
│   │   │   ├── index.js
│   │   │   └── validLangs.js
│   │   ├── WhisperProviders/
│   │   │   ├── OpenAiWhisper.js
│   │   │   ├── ffmpeg/
│   │   │   │   └── index.js
│   │   │   └── localWhisper.js
│   │   ├── comKey/
│   │   │   └── index.js
│   │   ├── constants.js
│   │   ├── downloadURIToFile/
│   │   │   └── index.js
│   │   ├── extensions/
│   │   │   ├── Confluence/
│   │   │   │   ├── ConfluenceLoader/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── DrupalWiki/
│   │   │   │   ├── DrupalWiki/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── ObsidianVault/
│   │   │   │   └── index.js
│   │   │   ├── PaperlessNgx/
│   │   │   │   ├── PaperlessNgxLoader/
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── RepoLoader/
│   │   │   │   ├── GithubRepo/
│   │   │   │   │   ├── RepoLoader/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   └── index.js
│   │   │   │   ├── GitlabRepo/
│   │   │   │   │   ├── RepoLoader/
│   │   │   │   │   │   └── index.js
│   │   │   │   │   └── index.js
│   │   │   │   └── index.js
│   │   │   ├── WebsiteDepth/
│   │   │   │   └── index.js
│   │   │   └── YoutubeTranscript/
│   │   │       ├── YoutubeLoader/
│   │   │       │   ├── index.js
│   │   │       │   └── youtube-transcript.js
│   │   │       └── index.js
│   │   ├── files/
│   │   │   ├── index.js
│   │   │   └── mime.js
│   │   ├── http/
│   │   │   └── index.js
│   │   ├── logger/
│   │   │   └── index.js
│   │   ├── runtimeSettings/
│   │   │   └── index.js
│   │   ├── shell.js
│   │   ├── tokenizer/
│   │   │   └── index.js
│   │   └── url/
│   │       └── index.js
│   └── yarn.lock
├── docker/
│   ├── .env.example
│   ├── Dockerfile
│   ├── HOW_TO_USE_DOCKER.md
│   ├── docker-compose.yml
│   ├── docker-entrypoint.sh
│   ├── docker-healthcheck.sh
│   └── vex/
│       ├── CVE-2019-10790.vex.json
│       ├── CVE-2024-29415.vex.json
│       ├── CVE-2024-37890.vex.json
│       └── CVE-2024-4068.vex.json
├── eslint.config.js
├── extras/
│   ├── scripts/
│   │   └── verifyPackageVersions.mjs
│   ├── support/
│   │   └── announcements/
│   │       ├── 2025-04-08.json
│   │       ├── 2025-07-08.json
│   │       ├── 2026-01-12.json
│   │       └── list.txt
│   └── translator/
│       ├── .env.example
│       ├── README.md
│       └── index.mjs
├── frontend/
│   ├── .env.example
│   ├── .gitignore
│   ├── .nvmrc
│   ├── eslint.config.js
│   ├── index.html
│   ├── jsconfig.json
│   ├── package.json
│   ├── postcss.config.js
│   ├── public/
│   │   ├── manifest.json
│   │   ├── robots.txt
│   │   └── service-workers/
│   │       └── push-notifications.js
│   ├── scripts/
│   │   └── postbuild.js
│   ├── src/
│   │   ├── App.jsx
│   │   ├── AuthContext.jsx
│   │   ├── LogoContext.jsx
│   │   ├── PWAContext.jsx
│   │   ├── PfpContext.jsx
│   │   ├── ThemeContext.jsx
│   │   ├── components/
│   │   │   ├── CanViewChatHistory/
│   │   │   │   └── index.jsx
│   │   │   ├── ChangeWarning/
│   │   │   │   └── index.jsx
│   │   │   ├── ChatBubble/
│   │   │   │   └── index.jsx
│   │   │   ├── CommunityHub/
│   │   │   │   ├── PublishEntityModal/
│   │   │   │   │   ├── AgentFlows/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── SlashCommands/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── SystemPrompts/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   └── UnauthenticatedHubModal/
│   │   │   │       └── index.jsx
│   │   │   ├── ContextualSaveBar/
│   │   │   │   └── index.jsx
│   │   │   ├── DataConnectorOption/
│   │   │   │   └── media/
│   │   │   │       └── index.js
│   │   │   ├── DefaultChat/
│   │   │   │   └── index.jsx
│   │   │   ├── EmbeddingSelection/
│   │   │   │   ├── AzureAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── CohereOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── EmbedderItem/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GeminiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GenericOpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LMStudioOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LemonadeOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LiteLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LocalAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MistralAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── NativeEmbeddingOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OllamaOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenRouterOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── VoyageAiOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── ErrorBoundaryFallback/
│   │   │   │   └── index.jsx
│   │   │   ├── Footer/
│   │   │   │   └── index.jsx
│   │   │   ├── KeyboardShortcutsHelp/
│   │   │   │   └── index.jsx
│   │   │   ├── LLMSelection/
│   │   │   │   ├── AnthropicAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ApiPieOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── AwsBedrockLLMOptions/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── regions.js
│   │   │   │   ├── AzureAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── CohereAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── CometApiLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── DPAISOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── DeepSeekOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── DockerModelRunnerOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── FireworksAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── FoundryOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GeminiLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GenericOpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GiteeAIOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── GroqAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── HuggingFaceOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── KoboldCPPOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LLMItem/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LLMProviderOption/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LMStudioOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LemonadeOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LiteLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LocalAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MistralOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MoonshotAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── NovitaLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── NvidiaNimOptions/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   ├── managed.jsx
│   │   │   │   │   └── remote.jsx
│   │   │   │   ├── OllamaLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenRouterOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PPIOLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PerplexityOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PrivateModeOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── SambaNovaOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── TextGenWebUIOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── TogetherAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── XAiLLMOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── ZAiLLMOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── ModalWrapper/
│   │   │   │   └── index.jsx
│   │   │   ├── Modals/
│   │   │   │   ├── DisplayRecoveryCodeModal/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ManageWorkspace/
│   │   │   │   │   ├── DataConnectors/
│   │   │   │   │   │   ├── ConnectorOption/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── Connectors/
│   │   │   │   │   │   │   ├── Confluence/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── DrupalWiki/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── Github/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── Gitlab/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── Obsidian/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── PaperlessNgx/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── WebsiteDepth/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── Youtube/
│   │   │   │   │   │   │       └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Documents/
│   │   │   │   │   │   ├── Directory/
│   │   │   │   │   │   │   ├── ContextMenu/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── FileRow/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── FolderRow/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── FolderSelectionPopup/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── MoveToFolderIcon.jsx
│   │   │   │   │   │   │   ├── NewFolderModal/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   └── utils.js
│   │   │   │   │   │   ├── UploadFile/
│   │   │   │   │   │   │   ├── FileUploadProgress/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── WorkspaceDirectory/
│   │   │   │   │   │   │   ├── WorkspaceFileRow/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── NewWorkspace.jsx
│   │   │   │   └── Password/
│   │   │   │       ├── MultiUserAuth.jsx
│   │   │   │       ├── SingleUserAuth.jsx
│   │   │   │       └── index.jsx
│   │   │   ├── Preloader.jsx
│   │   │   ├── PrivateRoute/
│   │   │   │   └── index.jsx
│   │   │   ├── ProviderPrivacy/
│   │   │   │   ├── constants.js
│   │   │   │   └── index.jsx
│   │   │   ├── SettingsButton/
│   │   │   │   └── index.jsx
│   │   │   ├── SettingsSidebar/
│   │   │   │   ├── MenuOption/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── Sidebar/
│   │   │   │   ├── ActiveWorkspaces/
│   │   │   │   │   ├── ThreadContainer/
│   │   │   │   │   │   ├── ThreadItem/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── SearchBox/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── SidebarToggle/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── SpeechToText/
│   │   │   │   └── BrowserNative/
│   │   │   │       └── index.jsx
│   │   │   ├── TextToSpeech/
│   │   │   │   ├── BrowserNative/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ElevenLabsOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenAiGenericOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── OpenAiOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── PiperTTSOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── TranscriptionSelection/
│   │   │   │   ├── NativeTranscriptionOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── OpenAiOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── UserIcon/
│   │   │   │   └── index.jsx
│   │   │   ├── UserMenu/
│   │   │   │   ├── AccountModal/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── UserButton/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── VectorDBSelection/
│   │   │   │   ├── AstraDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ChromaCloudOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ChromaDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LanceDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MilvusDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PGVectorOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PineconeDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── QDrantDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── VectorDBItem/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── WeaviateDBOptions/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── ZillizCloudOptions/
│   │   │   │       └── index.jsx
│   │   │   ├── WorkspaceChat/
│   │   │   │   ├── ChatContainer/
│   │   │   │   │   ├── ChatHistory/
│   │   │   │   │   │   ├── Chartable/
│   │   │   │   │   │   │   ├── CustomCell.jsx
│   │   │   │   │   │   │   ├── CustomTooltip.jsx
│   │   │   │   │   │   │   ├── chart-utils.js
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── Citation/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── HistoricalMessage/
│   │   │   │   │   │   │   ├── Actions/
│   │   │   │   │   │   │   │   ├── ActionMenu/
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   ├── DeleteMessage/
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   ├── EditMessage/
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   ├── RenderMetrics/
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   ├── TTSButton/
│   │   │   │   │   │   │   │   │   ├── asyncTts.jsx
│   │   │   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   │   │   ├── native.jsx
│   │   │   │   │   │   │   │   │   └── piperTTS.jsx
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── PromptReply/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── StatusResponse/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── ThoughtContainer/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── ChatTooltips/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── DnDWrapper/
│   │   │   │   │   │   ├── FileUploadWarningModal/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── PromptInput/
│   │   │   │   │   │   ├── AgentMenu/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── AttachItem/
│   │   │   │   │   │   │   ├── ParsedFilesMenu/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── Attachments/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── LLMSelector/
│   │   │   │   │   │   │   ├── ChatModelSelection/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── LLMSelector/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── SetupProvider/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── action.jsx
│   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   └── utils.js
│   │   │   │   │   │   ├── SpeechToText/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── StopGenerationButton/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── TextSizeMenu/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── ToolsMenu/
│   │   │   │   │   │   │   ├── Tabs/
│   │   │   │   │   │   │   │   ├── AgentSkills/
│   │   │   │   │   │   │   │   │   ├── SkillRow/
│   │   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   │   └── SlashCommands/
│   │   │   │   │   │   │   │       ├── SlashCommandRow/
│   │   │   │   │   │   │   │       │   └── index.jsx
│   │   │   │   │   │   │   │       ├── SlashPresets/
│   │   │   │   │   │   │   │       │   ├── AddPresetModal.jsx
│   │   │   │   │   │   │   │       │   ├── EditPresetModal.jsx
│   │   │   │   │   │   │   │       │   └── constants.js
│   │   │   │   │   │   │   │       └── index.jsx
│   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   └── useToolsMenuItems.js
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── SourcesSidebar/
│   │   │   │   │   │   ├── MobileCitationModal/
│   │   │   │   │   │   │   ├── SourceDetailView/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── SourceItem/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── TextSizeMenu/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── WorkspaceModelPicker/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LoadingChat/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── contexts/
│   │   │   │   └── TTSProvider.jsx
│   │   │   └── lib/
│   │   │       ├── CTAButton/
│   │   │       │   └── index.jsx
│   │   │       ├── ModelTable/
│   │   │       │   ├── index.jsx
│   │   │       │   ├── layout.jsx
│   │   │       │   └── loading.jsx
│   │   │       ├── MonoProviderIcon/
│   │   │       │   └── index.jsx
│   │   │       ├── QuickActions/
│   │   │       │   └── index.jsx
│   │   │       ├── SuggestedMessages/
│   │   │       │   └── index.jsx
│   │   │       └── Toggle/
│   │   │           └── index.jsx
│   │   ├── hooks/
│   │   │   ├── useAppVersion.js
│   │   │   ├── useChatContainerQuickScroll.js
│   │   │   ├── useChatHistoryScrollHandle.js
│   │   │   ├── useCommunityHubAuth.js
│   │   │   ├── useCopyText.js
│   │   │   ├── useGetProvidersModels.js
│   │   │   ├── useLanguageOptions.js
│   │   │   ├── useLoginMode.js
│   │   │   ├── useLogo.js
│   │   │   ├── useModal.js
│   │   │   ├── useOnboardingComplete.js
│   │   │   ├── usePfp.js
│   │   │   ├── usePrefersDarkMode.js
│   │   │   ├── usePromptInputStorage.js
│   │   │   ├── useProviderEndpointAutoDiscovery.js
│   │   │   ├── useQuery.js
│   │   │   ├── useScrollActiveItemIntoView.js
│   │   │   ├── useSimpleSSO.js
│   │   │   ├── useTextSize.js
│   │   │   ├── useTheme.js
│   │   │   ├── useUser.js
│   │   │   └── useWebPushNotifications.js
│   │   ├── i18n.js
│   │   ├── index.css
│   │   ├── locales/
│   │   │   ├── ar/
│   │   │   │   └── common.js
│   │   │   ├── cs/
│   │   │   │   └── common.js
│   │   │   ├── da/
│   │   │   │   └── common.js
│   │   │   ├── de/
│   │   │   │   └── common.js
│   │   │   ├── dynamicKeyAllowlist.js
│   │   │   ├── en/
│   │   │   │   └── common.js
│   │   │   ├── es/
│   │   │   │   └── common.js
│   │   │   ├── et/
│   │   │   │   └── common.js
│   │   │   ├── fa/
│   │   │   │   └── common.js
│   │   │   ├── findUnusedTranslations.mjs
│   │   │   ├── fr/
│   │   │   │   └── common.js
│   │   │   ├── he/
│   │   │   │   └── common.js
│   │   │   ├── it/
│   │   │   │   └── common.js
│   │   │   ├── ja/
│   │   │   │   └── common.js
│   │   │   ├── ko/
│   │   │   │   └── common.js
│   │   │   ├── lv/
│   │   │   │   └── common.js
│   │   │   ├── nl/
│   │   │   │   └── common.js
│   │   │   ├── normalizeEn.mjs
│   │   │   ├── pl/
│   │   │   │   └── common.js
│   │   │   ├── pt_BR/
│   │   │   │   └── common.js
│   │   │   ├── resources.js
│   │   │   ├── ro/
│   │   │   │   └── common.js
│   │   │   ├── ru/
│   │   │   │   └── common.js
│   │   │   ├── tr/
│   │   │   │   └── common.js
│   │   │   ├── verifyTranslations.mjs
│   │   │   ├── vn/
│   │   │   │   └── common.js
│   │   │   ├── zh/
│   │   │   │   └── common.js
│   │   │   └── zh_TW/
│   │   │       └── common.js
│   │   ├── main.jsx
│   │   ├── media/
│   │   │   └── animations/
│   │   │       ├── agent-animation.webm
│   │   │       └── thinking-animation.webm
│   │   ├── models/
│   │   │   ├── admin.js
│   │   │   ├── agentFlows.js
│   │   │   ├── appearance.js
│   │   │   ├── browserExtensionApiKey.js
│   │   │   ├── communityHub.js
│   │   │   ├── dataConnector.js
│   │   │   ├── document.js
│   │   │   ├── embed.js
│   │   │   ├── experimental/
│   │   │   │   ├── agentPlugins.js
│   │   │   │   └── liveSync.js
│   │   │   ├── invite.js
│   │   │   ├── mcpServers.js
│   │   │   ├── mobile.js
│   │   │   ├── promptHistory.js
│   │   │   ├── system.js
│   │   │   ├── systemPromptVariable.js
│   │   │   ├── utils/
│   │   │   │   ├── dmrUtils.js
│   │   │   │   └── lemonadeUtils.js
│   │   │   ├── workspace.js
│   │   │   └── workspaceThread.js
│   │   ├── pages/
│   │   │   ├── 404.jsx
│   │   │   ├── Admin/
│   │   │   │   ├── AgentBuilder/
│   │   │   │   │   ├── AddBlockMenu/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── BlockList/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── HeaderMenu/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── nodes/
│   │   │   │   │       ├── ApiCallNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── CodeNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── FileNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── FinishNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── FlowInfoNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── LLMInstructionNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── StartNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── WebScrapingNode/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       └── WebsiteNode/
│   │   │   │   │           └── index.jsx
│   │   │   │   ├── Agents/
│   │   │   │   │   ├── AgentFlows/
│   │   │   │   │   │   ├── FlowPanel.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── AgentSkillSettings/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Badges/
│   │   │   │   │   │   └── default.jsx
│   │   │   │   │   ├── DefaultSkillPanel/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── GenericSkillPanel/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Imported/
│   │   │   │   │   │   ├── ImportedSkillConfig/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── SkillList/
│   │   │   │   │   │       └── index.jsx
│   │   │   │   │   ├── MCPServers/
│   │   │   │   │   │   ├── ServerPanel.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── SQLConnectorSelection/
│   │   │   │   │   │   ├── DBConnection.jsx
│   │   │   │   │   │   ├── SQLConnectionModal.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── WebSearchSelection/
│   │   │   │   │   │   ├── SearchProviderItem/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── SearchProviderOptions/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── skills.js
│   │   │   │   ├── DefaultSystemPrompt/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ExperimentalFeatures/
│   │   │   │   │   ├── Features/
│   │   │   │   │   │   └── LiveSync/
│   │   │   │   │   │       ├── manage/
│   │   │   │   │   │       │   ├── DocumentSyncQueueRow/
│   │   │   │   │   │       │   │   └── index.jsx
│   │   │   │   │   │       │   └── index.jsx
│   │   │   │   │   │       └── toggle.jsx
│   │   │   │   │   ├── features.js
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Invitations/
│   │   │   │   │   ├── InviteRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── NewInviteModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Logging/
│   │   │   │   │   ├── LogRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── SystemPromptVariables/
│   │   │   │   │   ├── AddVariableModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── VariableRow/
│   │   │   │   │   │   ├── EditVariableModal/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Users/
│   │   │   │   │   ├── NewUserModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── UserRow/
│   │   │   │   │   │   ├── EditUserModal/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   └── Workspaces/
│   │   │   │       ├── NewWorkspaceModal/
│   │   │   │       │   └── index.jsx
│   │   │   │       ├── WorkspaceRow/
│   │   │   │       │   └── index.jsx
│   │   │   │       └── index.jsx
│   │   │   ├── GeneralSettings/
│   │   │   │   ├── ApiKeys/
│   │   │   │   │   ├── ApiKeyRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── NewApiKeyModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── AudioPreference/
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   ├── stt.jsx
│   │   │   │   │   └── tts.jsx
│   │   │   │   ├── BrowserExtensionApiKey/
│   │   │   │   │   ├── BrowserExtensionApiKeyRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── NewBrowserExtensionApiKeyModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── ChatEmbedWidgets/
│   │   │   │   │   ├── EmbedChats/
│   │   │   │   │   │   ├── ChatRow/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── MarkdownRenderer.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── EmbedConfigs/
│   │   │   │   │   │   ├── EmbedRow/
│   │   │   │   │   │   │   ├── CodeSnippetModal/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── EditEmbedModal/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── NewEmbedModal/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Chats/
│   │   │   │   │   ├── ChatRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── MarkdownRenderer.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── CommunityHub/
│   │   │   │   │   ├── Authentication/
│   │   │   │   │   │   ├── UserItems/
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   └── useUserItems.js
│   │   │   │   │   ├── ImportItem/
│   │   │   │   │   │   ├── Steps/
│   │   │   │   │   │   │   ├── Completed/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── Introduction/
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── PullAndReview/
│   │   │   │   │   │   │   │   ├── HubItem/
│   │   │   │   │   │   │   │   │   ├── AgentFlow.jsx
│   │   │   │   │   │   │   │   │   ├── AgentSkill.jsx
│   │   │   │   │   │   │   │   │   ├── SlashCommand.jsx
│   │   │   │   │   │   │   │   │   ├── SystemPrompt.jsx
│   │   │   │   │   │   │   │   │   ├── Unknown.jsx
│   │   │   │   │   │   │   │   │   └── index.js
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Trending/
│   │   │   │   │   │   ├── HubItems/
│   │   │   │   │   │   │   ├── HubItemCard/
│   │   │   │   │   │   │   │   ├── agentFlow.jsx
│   │   │   │   │   │   │   │   ├── agentSkill.jsx
│   │   │   │   │   │   │   │   ├── generic.jsx
│   │   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   │   ├── slashCommand.jsx
│   │   │   │   │   │   │   │   └── systemPrompt.jsx
│   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── utils.js
│   │   │   │   ├── EmbeddingPreference/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── EmbeddingTextSplitterPreference/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── LLMPreference/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── MobileConnections/
│   │   │   │   │   ├── ConnectionModal/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── DeviceRow/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── PrivacyAndData/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Security/
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Settings/
│   │   │   │   │   ├── Branding/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Chat/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Interface/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── components/
│   │   │   │   │       ├── AutoSpeak/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── AutoSubmit/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── ChatRenderHTML/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── CustomAppName/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── CustomLogo/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── CustomSiteSettings/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── FooterCustomization/
│   │   │   │   │       │   ├── NewIconForm/
│   │   │   │   │       │   │   └── index.jsx
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── LanguagePreference/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── ShowScrollbar/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── SpellCheck/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       ├── SupportEmail/
│   │   │   │   │       │   └── index.jsx
│   │   │   │   │       └── ThemePreference/
│   │   │   │   │           └── index.jsx
│   │   │   │   ├── TranscriptionPreference/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── VectorDatabase/
│   │   │   │       └── index.jsx
│   │   │   ├── Invite/
│   │   │   │   ├── NewUserModal/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── Login/
│   │   │   │   ├── SSO/
│   │   │   │   │   └── simple.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── Main/
│   │   │   │   ├── Home/
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── OnboardingFlow/
│   │   │   │   ├── Steps/
│   │   │   │   │   ├── DataHandling/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Home/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── LLMPreference/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── Survey/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── UserSetup/
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   └── index.jsx
│   │   │   │   └── index.jsx
│   │   │   ├── WorkspaceChat/
│   │   │   │   └── index.jsx
│   │   │   └── WorkspaceSettings/
│   │   │       ├── AgentConfig/
│   │   │       │   ├── AgentLLMSelection/
│   │   │       │   │   ├── AgentLLMItem/
│   │   │       │   │   │   └── index.jsx
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── AgentModelSelection/
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       ├── ChatSettings/
│   │   │       │   ├── ChatHistorySettings/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ChatModeSelection/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ChatPromptSettings/
│   │   │       │   │   ├── ChatPromptHistory/
│   │   │       │   │   │   ├── PromptHistoryItem/
│   │   │       │   │   │   │   └── index.jsx
│   │   │       │   │   │   └── index.jsx
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ChatQueryRefusalResponse/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ChatTemperatureSettings/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── WorkspaceLLMSelection/
│   │   │       │   │   ├── ChatModelSelection/
│   │   │       │   │   │   └── index.jsx
│   │   │       │   │   ├── WorkspaceLLMItem/
│   │   │       │   │   │   └── index.jsx
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       ├── GeneralAppearance/
│   │   │       │   ├── DeleteWorkspace/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── SuggestedChatMessages/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── WorkspaceName/
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       ├── Members/
│   │   │       │   ├── AddMemberModal/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── WorkspaceMemberRow/
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       ├── VectorDatabase/
│   │   │       │   ├── DocumentSimilarityThreshold/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── MaxContextSnippets/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── ResetDatabase/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── VectorCount/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── VectorDBIdentifier/
│   │   │       │   │   └── index.jsx
│   │   │       │   ├── VectorSearchMode/
│   │   │       │   │   └── index.jsx
│   │   │       │   └── index.jsx
│   │   │       └── index.jsx
│   │   └── utils/
│   │       ├── chat/
│   │       │   ├── agent.js
│   │       │   ├── hljs-libraries/
│   │       │   │   └── svelte.js
│   │       │   ├── index.js
│   │       │   ├── markdown.js
│   │       │   ├── plugins/
│   │       │   │   └── markdown-katex.js
│   │       │   ├── purify.js
│   │       │   └── themes/
│   │       │       ├── github-dark.css
│   │       │       └── github.css
│   │       ├── constants.js
│   │       ├── directories.js
│   │       ├── keyboardShortcuts.js
│   │       ├── numbers.js
│   │       ├── paths.js
│   │       ├── piperTTS/
│   │       │   ├── index.js
│   │       │   └── worker.js
│   │       ├── request.js
│   │       ├── session.js
│   │       ├── toast.js
│   │       ├── types.js
│   │       └── username.js
│   ├── tailwind.config.js
│   └── vite.config.js
├── locales/
│   ├── README.fa-IR.md
│   ├── README.ja-JP.md
│   ├── README.tr-TR.md
│   └── README.zh-CN.md
├── package.json
├── pull_request_template.md
└── server/
    ├── .env.example
    ├── .flowconfig
    ├── .gitignore
    ├── .nvmrc
    ├── __tests__/
    │   ├── models/
    │   │   ├── systemPromptVariables.test.js
    │   │   └── user.test.js
    │   └── utils/
    │       ├── SQLConnectors/
    │       │   └── connectionParser.test.js
    │       ├── TextSplitter/
    │       │   └── index.test.js
    │       ├── agentFlows/
    │       │   └── executor.test.js
    │       ├── agents/
    │       │   ├── aibitat/
    │       │   │   └── providers/
    │       │   │       └── helpers/
    │       │   │           └── untooled.test.js
    │       │   └── defaults.test.js
    │       ├── chats/
    │       │   ├── openaiCompatible.test.js
    │       │   └── openaiHelpers.test.js
    │       ├── helpers/
    │       │   ├── azureOpenAiModelPref.test.js
    │       │   └── convertTo.test.js
    │       ├── safeJSONStringify/
    │       │   └── safeJSONStringify.test.js
    │       └── vectorDbProviders/
    │           └── pgvector/
    │               └── index.test.js
    ├── endpoints/
    │   ├── admin.js
    │   ├── agentFlows.js
    │   ├── agentWebsocket.js
    │   ├── api/
    │   │   ├── admin/
    │   │   │   └── index.js
    │   │   ├── auth/
    │   │   │   └── index.js
    │   │   ├── document/
    │   │   │   └── index.js
    │   │   ├── embed/
    │   │   │   └── index.js
    │   │   ├── index.js
    │   │   ├── openai/
    │   │   │   ├── compatibility-test-script.cjs
    │   │   │   ├── helpers.js
    │   │   │   └── index.js
    │   │   ├── system/
    │   │   │   └── index.js
    │   │   ├── userManagement/
    │   │   │   └── index.js
    │   │   ├── workspace/
    │   │   │   └── index.js
    │   │   └── workspaceThread/
    │   │       └── index.js
    │   ├── browserExtension.js
    │   ├── chat.js
    │   ├── communityHub.js
    │   ├── document.js
    │   ├── embed/
    │   │   └── index.js
    │   ├── embedManagement.js
    │   ├── experimental/
    │   │   ├── imported-agent-plugins.js
    │   │   ├── index.js
    │   │   └── liveSync.js
    │   ├── extensions/
    │   │   └── index.js
    │   ├── invite.js
    │   ├── mcpServers.js
    │   ├── mobile/
    │   │   ├── index.js
    │   │   ├── middleware/
    │   │   │   └── index.js
    │   │   └── utils/
    │   │       └── index.js
    │   ├── system.js
    │   ├── utils/
    │   │   ├── dockerModelRunnerUtils.js
    │   │   └── lemonadeUtilsEndpoints.js
    │   ├── utils.js
    │   ├── webPush.js
    │   ├── workspaceThreads.js
    │   ├── workspaces.js
    │   └── workspacesParsedFiles.js
    ├── eslint.config.mjs
    ├── index.js
    ├── jobs/
    │   ├── cleanup-orphan-documents.js
    │   ├── helpers/
    │   │   └── index.js
    │   └── sync-watched-documents.js
    ├── jsconfig.json
    ├── middleware/
    │   └── httpLogger.js
    ├── models/
    │   ├── apiKeys.js
    │   ├── browserExtensionApiKey.js
    │   ├── cacheData.js
    │   ├── communityHub.js
    │   ├── documentSyncQueue.js
    │   ├── documentSyncRun.js
    │   ├── documents.js
    │   ├── embedChats.js
    │   ├── embedConfig.js
    │   ├── eventLogs.js
    │   ├── invite.js
    │   ├── mobileDevice.js
    │   ├── passwordRecovery.js
    │   ├── promptHistory.js
    │   ├── slashCommandsPresets.js
    │   ├── systemPromptVariables.js
    │   ├── systemSettings.js
    │   ├── telemetry.js
    │   ├── temporaryAuthToken.js
    │   ├── user.js
    │   ├── vectors.js
    │   ├── workspace.js
    │   ├── workspaceAgentInvocation.js
    │   ├── workspaceChats.js
    │   ├── workspaceParsedFiles.js
    │   ├── workspaceThread.js
    │   ├── workspaceUsers.js
    │   └── workspacesSuggestedMessages.js
    ├── nodemon.json
    ├── package.json
    ├── prisma/
    │   ├── migrations/
    │   │   ├── 20230921191814_init/
    │   │   │   └── migration.sql
    │   │   ├── 20231101001441_init/
    │   │   │   └── migration.sql
    │   │   ├── 20231101195421_init/
    │   │   │   └── migration.sql
    │   │   ├── 20231129012019_add/
    │   │   │   └── migration.sql
    │   │   ├── 20240113013409_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240118201333_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240202002020_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240206181106_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240206211916_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240208224848_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240210004405_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240216214639_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240219211018_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240301002308_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240326231053_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240405015034_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240412183346_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240425004220_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240430230707_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240510032311_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240618224346_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240821215625_init/
    │   │   │   └── migration.sql
    │   │   ├── 20240824005054_init/
    │   │   │   └── migration.sql
    │   │   ├── 20241003192954_init/
    │   │   │   └── migration.sql
    │   │   ├── 20241029203722_init/
    │   │   │   └── migration.sql
    │   │   ├── 20241029233509_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250102204948_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250226005538_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250318154720_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250506214129_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250709230835_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250725194841_init/
    │   │   │   └── migration.sql
    │   │   ├── 20250808171557_init/
    │   │   │   └── migration.sql
    │   │   ├── 20260130040204_init/
    │   │   │   └── migration.sql
    │   │   ├── 20260313192859_init/
    │   │   │   └── migration.sql
    │   │   └── migration_lock.toml
    │   ├── schema.prisma
    │   └── seed.js
    ├── storage/
    │   ├── README.md
    │   └── models/
    │       ├── .gitignore
    │       ├── README.md
    │       └── downloaded/
    │           └── .placeholder
    ├── swagger/
    │   ├── dark-swagger.css
    │   ├── index.css
    │   ├── index.js
    │   ├── init.js
    │   ├── openapi.json
    │   └── utils.js
    └── utils/
        ├── AiProviders/
        │   ├── anthropic/
        │   │   └── index.js
        │   ├── apipie/
        │   │   └── index.js
        │   ├── azureOpenAi/
        │   │   └── index.js
        │   ├── bedrock/
        │   │   ├── index.js
        │   │   └── utils.js
        │   ├── cohere/
        │   │   └── index.js
        │   ├── cometapi/
        │   │   ├── constants.js
        │   │   └── index.js
        │   ├── deepseek/
        │   │   └── index.js
        │   ├── dellProAiStudio/
        │   │   └── index.js
        │   ├── dockerModelRunner/
        │   │   └── index.js
        │   ├── fireworksAi/
        │   │   └── index.js
        │   ├── foundry/
        │   │   └── index.js
        │   ├── gemini/
        │   │   ├── defaultModels.js
        │   │   ├── index.js
        │   │   └── syncStaticLists.mjs
        │   ├── genericOpenAi/
        │   │   └── index.js
        │   ├── giteeai/
        │   │   └── index.js
        │   ├── groq/
        │   │   └── index.js
        │   ├── huggingface/
        │   │   └── index.js
        │   ├── koboldCPP/
        │   │   └── index.js
        │   ├── lemonade/
        │   │   └── index.js
        │   ├── liteLLM/
        │   │   └── index.js
        │   ├── lmStudio/
        │   │   └── index.js
        │   ├── localAi/
        │   │   └── index.js
        │   ├── mistral/
        │   │   └── index.js
        │   ├── modelMap/
        │   │   ├── index.js
        │   │   └── legacy.js
        │   ├── moonshotAi/
        │   │   └── index.js
        │   ├── novita/
        │   │   └── index.js
        │   ├── nvidiaNim/
        │   │   └── index.js
        │   ├── ollama/
        │   │   └── index.js
        │   ├── openAi/
        │   │   └── index.js
        │   ├── openRouter/
        │   │   └── index.js
        │   ├── perplexity/
        │   │   ├── index.js
        │   │   ├── models.js
        │   │   └── scripts/
        │   │       ├── .gitignore
        │   │       ├── chat_models.txt
        │   │       └── parse.mjs
        │   ├── ppio/
        │   │   └── index.js
        │   ├── privatemode/
        │   │   └── index.js
        │   ├── sambanova/
        │   │   └── index.js
        │   ├── textGenWebUI/
        │   │   └── index.js
        │   ├── togetherAi/
        │   │   └── index.js
        │   ├── xai/
        │   │   └── index.js
        │   └── zai/
        │       └── index.js
        ├── BackgroundWorkers/
        │   └── index.js
        ├── DocumentManager/
        │   └── index.js
        ├── EmbeddingEngines/
        │   ├── azureOpenAi/
        │   │   └── index.js
        │   ├── cohere/
        │   │   └── index.js
        │   ├── gemini/
        │   │   └── index.js
        │   ├── genericOpenAi/
        │   │   └── index.js
        │   ├── lemonade/
        │   │   └── index.js
        │   ├── liteLLM/
        │   │   └── index.js
        │   ├── lmstudio/
        │   │   └── index.js
        │   ├── localAi/
        │   │   └── index.js
        │   ├── mistral/
        │   │   └── index.js
        │   ├── native/
        │   │   ├── constants.js
        │   │   └── index.js
        │   ├── ollama/
        │   │   └── index.js
        │   ├── openAi/
        │   │   └── index.js
        │   ├── openRouter/
        │   │   └── index.js
        │   └── voyageAi/
        │       └── index.js
        ├── EmbeddingRerankers/
        │   └── native/
        │       └── index.js
        ├── EncryptionManager/
        │   └── index.js
        ├── MCP/
        │   ├── hypervisor/
        │   │   └── index.js
        │   └── index.js
        ├── PasswordRecovery/
        │   └── index.js
        ├── PushNotifications/
        │   └── index.js
        ├── TextSplitter/
        │   └── index.js
        ├── TextToSpeech/
        │   ├── elevenLabs/
        │   │   └── index.js
        │   ├── index.js
        │   ├── openAi/
        │   │   └── index.js
        │   └── openAiGeneric/
        │       └── index.js
        ├── agentFlows/
        │   ├── executor.js
        │   ├── executors/
        │   │   ├── api-call.js
        │   │   ├── llm-instruction.js
        │   │   └── web-scraping.js
        │   ├── flowTypes.js
        │   └── index.js
        ├── agents/
        │   ├── aibitat/
        │   │   ├── error.js
        │   │   ├── example/
        │   │   │   ├── .gitignore
        │   │   │   ├── beginner-chat.js
        │   │   │   ├── blog-post-coding.js
        │   │   │   └── websocket/
        │   │   │       ├── index.html
        │   │   │       ├── websock-branding-collab.js
        │   │   │       └── websock-multi-turn-chat.js
        │   │   ├── index.js
        │   │   ├── plugins/
        │   │   │   ├── chat-history.js
        │   │   │   ├── cli.js
        │   │   │   ├── file-history.js
        │   │   │   ├── http-socket.js
        │   │   │   ├── index.js
        │   │   │   ├── memory.js
        │   │   │   ├── rechart.js
        │   │   │   ├── save-file-browser.js
        │   │   │   ├── sql-agent/
        │   │   │   │   ├── SQLConnectors/
        │   │   │   │   │   ├── MSSQL.js
        │   │   │   │   │   ├── MySQL.js
        │   │   │   │   │   ├── Postgresql.js
        │   │   │   │   │   ├── index.js
        │   │   │   │   │   └── utils.js
        │   │   │   │   ├── get-table-schema.js
        │   │   │   │   ├── index.js
        │   │   │   │   ├── list-database.js
        │   │   │   │   ├── list-table.js
        │   │   │   │   └── query.js
        │   │   │   ├── summarize.js
        │   │   │   ├── web-browsing.js
        │   │   │   ├── web-scraping.js
        │   │   │   └── websocket.js
        │   │   ├── providers/
        │   │   │   ├── ai-provider.js
        │   │   │   ├── anthropic.js
        │   │   │   ├── apipie.js
        │   │   │   ├── azure.js
        │   │   │   ├── bedrock.js
        │   │   │   ├── cohere.js
        │   │   │   ├── cometapi.js
        │   │   │   ├── deepseek.js
        │   │   │   ├── dellProAiStudio.js
        │   │   │   ├── dockerModelRunner.js
        │   │   │   ├── fireworksai.js
        │   │   │   ├── foundry.js
        │   │   │   ├── gemini.js
        │   │   │   ├── genericOpenAi.js
        │   │   │   ├── giteeai.js
        │   │   │   ├── groq.js
        │   │   │   ├── helpers/
        │   │   │   │   ├── classes.js
        │   │   │   │   ├── tooled.js
        │   │   │   │   └── untooled.js
        │   │   │   ├── index.js
        │   │   │   ├── koboldcpp.js
        │   │   │   ├── lemonade.js
        │   │   │   ├── litellm.js
        │   │   │   ├── lmstudio.js
        │   │   │   ├── localai.js
        │   │   │   ├── mistral.js
        │   │   │   ├── moonshotAi.js
        │   │   │   ├── novita.js
        │   │   │   ├── nvidiaNim.js
        │   │   │   ├── ollama.js
        │   │   │   ├── openai.js
        │   │   │   ├── openrouter.js
        │   │   │   ├── perplexity.js
        │   │   │   ├── ppio.js
        │   │   │   ├── privatemode.js
        │   │   │   ├── sambanova.js
        │   │   │   ├── textgenwebui.js
        │   │   │   ├── togetherai.js
        │   │   │   ├── xai.js
        │   │   │   └── zai.js
        │   │   └── utils/
        │   │       ├── dedupe.js
        │   │       ├── summarize.js
        │   │       └── toolReranker.js
        │   ├── defaults.js
        │   ├── ephemeral.js
        │   ├── imported-manifest.schema.json
        │   ├── imported.js
        │   └── index.js
        ├── boot/
        │   ├── MetaGenerator.js
        │   ├── eagerLoadContextWindows.js
        │   ├── index.js
        │   └── markOnboarded.js
        ├── chats/
        │   ├── agents.js
        │   ├── apiChatHandler.js
        │   ├── commands/
        │   │   └── reset.js
        │   ├── embed.js
        │   ├── index.js
        │   ├── openaiCompatible.js
        │   └── stream.js
        ├── collectorApi/
        │   └── index.js
        ├── comKey/
        │   └── index.js
        ├── database/
        │   └── index.js
        ├── files/
        │   ├── index.js
        │   ├── logo.js
        │   ├── multer.js
        │   ├── pfp.js
        │   └── purgeDocument.js
        ├── helpers/
        │   ├── admin/
        │   │   └── index.js
        │   ├── camelcase.js
        │   ├── chat/
        │   │   ├── LLMPerformanceMonitor.js
        │   │   ├── convertTo.js
        │   │   ├── index.js
        │   │   └── responses.js
        │   ├── customModels.js
        │   ├── index.js
        │   ├── portAvailabilityChecker.js
        │   ├── search.js
        │   ├── shell.js
        │   ├── tiktoken.js
        │   └── updateENV.js
        ├── http/
        │   └── index.js
        ├── logger/
        │   └── index.js
        ├── middleware/
        │   ├── chatHistoryViewable.js
        │   ├── communityHubDownloadsEnabled.js
        │   ├── embedMiddleware.js
        │   ├── featureFlagEnabled.js
        │   ├── isSupportedRepoProviders.js
        │   ├── multiUserProtected.js
        │   ├── simpleSSOEnabled.js
        │   ├── validApiKey.js
        │   ├── validBrowserExtensionApiKey.js
        │   ├── validWorkspace.js
        │   └── validatedRequest.js
        ├── prisma/
        │   ├── PRISMA.md
        │   └── index.js
        ├── telemetry/
        │   └── index.js
        ├── vectorDbProviders/
        │   ├── astra/
        │   │   ├── ASTRA_SETUP.md
        │   │   └── index.js
        │   ├── base.js
        │   ├── chroma/
        │   │   └── index.js
        │   ├── chromacloud/
        │   │   └── index.js
        │   ├── lance/
        │   │   └── index.js
        │   ├── milvus/
        │   │   ├── MILVUS_SETUP.md
        │   │   └── index.js
        │   ├── pgvector/
        │   │   ├── SETUP.md
        │   │   └── index.js
        │   ├── pinecone/
        │   │   ├── PINECONE_SETUP.md
        │   │   └── index.js
        │   ├── qdrant/
        │   │   ├── QDRANT_SETUP.md
        │   │   └── index.js
        │   ├── weaviate/
        │   │   ├── WEAVIATE_SETUP.md
        │   │   └── index.js
        │   └── zilliz/
        │       └── index.js
        └── vectorStore/
            └── resetAllVectorStores.js
Download .txt
Showing preview only (293K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3174 symbols across 756 files)

FILE: collector/extensions/index.js
  constant RESYNC_METHODS (line 9) | const RESYNC_METHODS = require("./resync");
  function extensions (line 12) | function extensions(app) {

FILE: collector/extensions/resync/index.js
  function resyncLink (line 8) | async function resyncLink({ link }, response) {
  function resyncYouTube (line 30) | async function resyncYouTube({ link }, response) {
  function resyncConfluence (line 57) | async function resyncConfluence({ chunkSource }, response) {
  function resyncGithub (line 94) | async function resyncGithub({ chunkSource }, response) {
  function resyncDrupalWiki (line 128) | async function resyncDrupalWiki({ chunkSource }, response) {
  function resyncPaperlessNgx (line 165) | async function resyncPaperlessNgx({ chunkSource }, response) {

FILE: collector/index.js
  constant FILE_LIMIT (line 20) | const FILE_LIMIT = "3GB";

FILE: collector/middleware/setDataSigner.js
  function setDataSigner (line 28) | function setDataSigner(request, response, next) {

FILE: collector/middleware/verifyIntegrity.js
  function verifyPayloadIntegrity (line 5) | function verifyPayloadIntegrity(request, response, next) {

FILE: collector/processLink/convert/generic.js
  function scrapeGenericUrl (line 28) | async function scrapeGenericUrl({
  function validatedHeaders (line 112) | function validatedHeaders(headers = {}) {
  function getPageContent (line 136) | async function getPageContent({ link, captureAs = "text", headers = {} }) {

FILE: collector/processLink/helpers/index.js
  function getContentTypeFromURL (line 14) | async function getContentTypeFromURL(url) {
  function returnResult (line 69) | function returnResult({
  function determineContentType (line 89) | async function determineContentType(uri) {
  function processAsFile (line 123) | async function processAsFile({ uri, saveAsDocument = true }) {

FILE: collector/processLink/index.js
  function processLink (line 13) | async function processLink(link, scraperHeaders = {}, metadata = {}) {
  function getLinkText (line 33) | async function getLinkText(link, captureAs = "text") {

FILE: collector/processRawText/index.js
  function stripAndSlug (line 8) | function stripAndSlug(input) {
  constant METADATA_KEYS (line 13) | const METADATA_KEYS = {
  function processRawText (line 49) | async function processRawText(textContent, metadata) {

FILE: collector/processSingleFile/convert/asAudio.js
  constant WHISPER_PROVIDERS (line 12) | const WHISPER_PROVIDERS = {
  function asAudio (line 17) | async function asAudio({

FILE: collector/processSingleFile/convert/asDocx.js
  function asDocX (line 11) | async function asDocX({

FILE: collector/processSingleFile/convert/asEPub.js
  function asEPub (line 11) | async function asEPub({

FILE: collector/processSingleFile/convert/asImage.js
  function asImage (line 11) | async function asImage({

FILE: collector/processSingleFile/convert/asMbox.js
  function asMbox (line 12) | async function asMbox({

FILE: collector/processSingleFile/convert/asOfficeMime.js
  function asOfficeMime (line 11) | async function asOfficeMime({

FILE: collector/processSingleFile/convert/asPDF/PDFLoader/index.js
  class PDFLoader (line 3) | class PDFLoader {
    method constructor (line 4) | constructor(filePath, { splitPages = true } = {}) {
    method load (line 9) | async load() {
    method getPdfJS (line 84) | async getPdfJS() {

FILE: collector/processSingleFile/convert/asPDF/index.js
  function asPdf (line 12) | async function asPdf({

FILE: collector/processSingleFile/convert/asTxt.js
  function asTxt (line 11) | async function asTxt({

FILE: collector/processSingleFile/convert/asXlsx.js
  function convertToCSV (line 14) | function convertToCSV(data) {
  function asXlsx (line 29) | async function asXlsx({
  function processSheet (line 171) | function processSheet(sheet) {

FILE: collector/processSingleFile/index.js
  constant RESERVED_FILES (line 13) | const RESERVED_FILES = ["__HOTDIR__.md"];
  function processSingleFile (line 23) | async function processSingleFile(targetFilename, options = {}, metadata ...

FILE: collector/utils/EncryptionWorker/index.js
  class EncryptionWorker (line 6) | class EncryptionWorker {
    method constructor (line 7) | constructor(presetKeyBase64 = "") {
    method log (line 13) | log(text, ...args) {
    method expandPayload (line 23) | expandPayload(chunkSource = "") {
    method encrypt (line 43) | encrypt(plainTextString = null) {
    method decrypt (line 60) | decrypt(encryptedString) {

FILE: collector/utils/OCRLoader/index.js
  class OCRLoader (line 6) | class OCRLoader {
    method constructor (line 23) | constructor({ targetLanguages = "eng" } = {}) {
    method parseLanguages (line 45) | parseLanguages(language = null) {
    method log (line 61) | log(text, ...args) {
    method ocrPDF (line 70) | async ocrPDF(
    method ocrImage (line 221) | async ocrImage(filePath, { maxExecutionTime = 300_000 } = {}) {
  class PDFSharp (line 283) | class PDFSharp {
    method constructor (line 284) | constructor({ validOps = [] } = {}) {
    method log (line 289) | log(text, ...args) {
    method init (line 293) | async init() {
    method pageToBuffer (line 303) | async pageToBuffer({ page }) {

FILE: collector/utils/OCRLoader/validLangs.js
  constant VALID_LANGUAGE_CODES (line 25) | const VALID_LANGUAGE_CODES = {

FILE: collector/utils/WhisperProviders/OpenAiWhisper.js
  class OpenAiWhisper (line 3) | class OpenAiWhisper {
    method constructor (line 4) | constructor({ options }) {
    method #log (line 16) | #log(text, ...args) {
    method processFile (line 20) | async processFile(fullFilePath) {

FILE: collector/utils/WhisperProviders/ffmpeg/index.js
  class FFMPEGWrapper (line 13) | class FFMPEGWrapper {
    method constructor (line 16) | constructor() {
    method log (line 22) | log(text, ...args) {
    method ffmpegPath (line 33) | async ffmpegPath() {
    method isValidFFMPEG (line 62) | isValidFFMPEG(pathToTest) {
    method convertAudioToWav (line 81) | async convertAudioToWav(inputPath, outputPath) {

FILE: collector/utils/WhisperProviders/localWhisper.js
  class LocalWhisper (line 10) | class LocalWhisper {
    method constructor (line 11) | constructor({ options }) {
    method #log (line 28) | #log(text, ...args) {
    method #validateAudioFile (line 32) | #validateAudioFile(wavFile) {
    method #convertToWavAudioData (line 63) | async #convertToWavAudioData(sourcePath) {
    method client (line 118) | async client() {
    method processFile (line 162) | async processFile(fullFilePath, filename) {

FILE: collector/utils/comKey/index.js
  class CommunicationKey (line 13) | class CommunicationKey {
    method constructor (line 17) | constructor() {}
    method log (line 19) | log(text, ...args) {
    method #readPublicKey (line 23) | #readPublicKey() {
    method verify (line 30) | verify(signature = "", textData = "") {
    method decrypt (line 47) | decrypt(base64String = "") {

FILE: collector/utils/constants.js
  constant WATCH_DIRECTORY (line 1) | const WATCH_DIRECTORY = require("path").resolve(__dirname, "../hotdir");
  constant ACCEPTED_MIMES (line 3) | const ACCEPTED_MIMES = {
  constant SUPPORTED_FILETYPE_CONVERTERS (line 40) | const SUPPORTED_FILETYPE_CONVERTERS = {

FILE: collector/utils/downloadURIToFile/index.js
  function downloadURIToFile (line 14) | async function downloadURIToFile(url, maxTimeout = 10_000) {

FILE: collector/utils/extensions/Confluence/ConfluenceLoader/index.js
  class ConfluencePagesLoader (line 7) | class ConfluencePagesLoader {
    method constructor (line 8) | constructor({
    method log (line 33) | log(message, ...args) {
    method authorizationHeader (line 37) | get authorizationHeader() {
    method load (line 49) | async load(options) {
    method fetchConfluenceData (line 62) | async fetchConfluenceData(url) {
    method fetchAllPagesInSpace (line 89) | async fetchAllPagesInSpace(start = 0, limit = this.limit) {
    method createDocumentFromPage (line 107) | createDocumentFromPage(page) {

FILE: collector/utils/extensions/Confluence/index.js
  function loadConfluence (line 15) | async function loadConfluence(
  function fetchConfluencePage (line 150) | async function fetchConfluencePage({
  function validBaseUrl (line 237) | function validBaseUrl(baseUrl) {
  function generateChunkSource (line 254) | function generateChunkSource(

FILE: collector/utils/extensions/DrupalWiki/DrupalWiki/index.js
  class Page (line 26) | class Page {
    method constructor (line 37) | constructor({ id, title, created, type, processedBody, url, spaceId }) {
  class DrupalWiki (line 48) | class DrupalWiki {
    method constructor (line 55) | constructor({ baseUrl, accessToken }) {
    method loadAndStoreAllPagesForSpace (line 69) | async loadAndStoreAllPagesForSpace(spaceId, encryptionWorker) {
    method loadPage (line 95) | async loadPage(pageId) {
    method #getPageIndexForSpace (line 104) | async #getPageIndexForSpace(spaceId) {
    method #getPagesForSpacePaginated (line 130) | async #getPagesForSpacePaginated(spaceId, pageNr) {
    method #fetchPage (line 158) | async #fetchPage(pageId) {
    method #storePage (line 182) | #storePage(page, encryptionWorker) {
    method #generateChunkSource (line 222) | #generateChunkSource(pageId, encryptionWorker) {
    method _doFetch (line 235) | async _doFetch(url) {
    method #getHeaders (line 245) | #getHeaders() {
    method #prepareStoragePath (line 253) | #prepareStoragePath(baseUrl) {
    method #processPageBody (line 269) | #processPageBody({ body, title }) {
    method #downloadAndProcessAttachments (line 293) | async #downloadAndProcessAttachments(pageId) {

FILE: collector/utils/extensions/DrupalWiki/index.js
  function loadAndStoreSpaces (line 11) | async function loadAndStoreSpaces(
  function loadPage (line 80) | async function loadPage({ baseUrl, pageId, accessToken }) {

FILE: collector/utils/extensions/ObsidianVault/index.js
  function parseObsidianVaultPath (line 11) | function parseObsidianVaultPath(files = []) {
  function loadObsidianVault (line 28) | async function loadObsidianVault({ files = [] }) {

FILE: collector/utils/extensions/PaperlessNgx/PaperlessNgxLoader/index.js
  class PaperlessNgxLoader (line 4) | class PaperlessNgxLoader {
    method constructor (line 5) | constructor({ baseUrl, apiToken }) {
    method load (line 13) | async load() {
    method fetchAllDocuments (line 27) | async fetchAllDocuments() {
    method fetchDocumentContent (line 92) | async fetchDocumentContent(documentId) {
    method parsePdfContent (line 123) | async parsePdfContent(buffer) {
    method createDocumentFromPage (line 133) | createDocumentFromPage(doc) {

FILE: collector/utils/extensions/PaperlessNgx/index.js
  function loadPaperlessNgx (line 20) | async function loadPaperlessNgx({ baseUrl = null, apiToken = null }, res...
  function generateChunkSource (line 116) | function generateChunkSource({ doc, baseUrl, apiToken }, encryptionWorke...

FILE: collector/utils/extensions/RepoLoader/GithubRepo/RepoLoader/index.js
  class GitHubRepoLoader (line 13) | class GitHubRepoLoader {
    method constructor (line 19) | constructor(args = {}) {
    method #processRepoUrl (line 38) | #processRepoUrl(repoUrl) {
    method #validGithubUrl (line 61) | #validGithubUrl() {
    method #validBranch (line 96) | async #validBranch() {
    method #validateAccessToken (line 108) | async #validateAccessToken() {
    method init (line 137) | async init() {
    method recursiveLoader (line 150) | async recursiveLoader() {
    method #branchPrefSort (line 176) | #branchPrefSort(branches = []) {
    method getRepoBranches (line 188) | async getRepoBranches() {
    method fetchSingleFile (line 234) | async fetchSingleFile(sourceFilePath) {

FILE: collector/utils/extensions/RepoLoader/GithubRepo/index.js
  function loadGithubRepo (line 15) | async function loadGithubRepo(args, response) {
  function fetchGithubFile (line 98) | async function fetchGithubFile({
  function generateChunkSource (line 146) | function generateChunkSource(repo, doc, encryptionWorker) {

FILE: collector/utils/extensions/RepoLoader/GitlabRepo/RepoLoader/index.js
  constant MAX_RETRIES (line 2) | const MAX_RETRIES = 3;
  class GitLabRepoLoader (line 27) | class GitLabRepoLoader {
    method constructor (line 33) | constructor(args = {}) {
    method #wait (line 50) | #wait(ms) {
    method #validGitlabUrl (line 54) | #validGitlabUrl() {
    method #validBranch (line 78) | async #validBranch() {
    method #validateAccessToken (line 90) | async #validateAccessToken() {
    method init (line 110) | async init() {
    method recursiveLoader (line 123) | async recursiveLoader() {
    method #branchPrefSort (line 186) | #branchPrefSort(branches = []) {
    method getRepoBranches (line 198) | async getRepoBranches() {
    method fetchFilesRecursive (line 219) | async fetchFilesRecursive() {
    method fetchIssues (line 261) | async fetchIssues() {
    method fetchWiki (line 313) | async fetchWiki() {
    method fetchSingleFileContents (line 332) | async fetchSingleFileContents(sourceFilePath, retries = 0) {
    method fetchNextPage (line 374) | async fetchNextPage(requestData, retries = 0) {

FILE: collector/utils/extensions/RepoLoader/GitlabRepo/index.js
  function loadGitlabRepo (line 15) | async function loadGitlabRepo(args, response) {
  function fetchGitlabFile (line 122) | async function fetchGitlabFile({
  function generateChunkSource (line 160) | function generateChunkSource(repo, doc, encryptionWorker) {
  function issueToMarkdown (line 172) | function issueToMarkdown(issue) {

FILE: collector/utils/extensions/RepoLoader/index.js
  function resolveRepoLoader (line 7) | function resolveRepoLoader(platform = "github") {
  function resolveRepoLoaderFunction (line 27) | function resolveRepoLoaderFunction(platform = "github") {

FILE: collector/utils/extensions/WebsiteDepth/index.js
  function discoverLinks (line 13) | async function discoverLinks(startUrl, maxDepth = 1, maxLinks = 20) {
  function getPageLinks (line 48) | async function getPageLinks(url, baseUrl) {
  function extractLinks (line 89) | function extractLinks(html, baseUrl) {
  function bulkScrapePages (line 111) | async function bulkScrapePages(links, outFolderPath) {
  function websiteScraper (line 192) | async function websiteScraper(startUrl, depth = 1, maxLinks = 20) {

FILE: collector/utils/extensions/YoutubeTranscript/YoutubeLoader/index.js
  class YoutubeLoader (line 10) | class YoutubeLoader {
    method constructor (line 15) | constructor({ videoId = null, language = null, addVideoInfo = false } ...
    method getVideoID (line 27) | static getVideoID(url) {
    method createFromUrl (line 40) | static createFromUrl(url, config = {}) {
    method load (line 51) | async load() {
    method #convertTranscriptSegmentsToText (line 88) | #convertTranscriptSegmentsToText(transcriptSegments) {

FILE: collector/utils/extensions/YoutubeTranscript/YoutubeLoader/youtube-transcript.js
  class YoutubeTranscriptError (line 3) | class YoutubeTranscriptError extends Error {
    method constructor (line 4) | constructor(message) {
  class YoutubeTranscript (line 12) | class YoutubeTranscript {
    method #encodeProtobufString (line 19) | static #encodeProtobufString(fieldNumber, str) {
    method #encodeVarint (line 36) | static #encodeVarint(value) {
    method #getBase64Protobuf (line 53) | static #getBase64Protobuf({ param1, param2 }) {
    method #extractTranscriptFromResponse (line 64) | static #extractTranscriptFromResponse(responseData) {
    method #calculatePreferenceScore (line 98) | static #calculatePreferenceScore(track, preferredLanguages) {
    method #findPreferredCaptionTrack (line 115) | static #findPreferredCaptionTrack(videoBody, preferredLanguages) {
    method #getPreferredCaptionTrack (line 148) | static async #getPreferredCaptionTrack(videoId, preferredLanguages) {
    method fetchTranscript (line 176) | static async fetchTranscript(videoId, config = {}) {
    method retrieveVideoId (line 233) | static retrieveVideoId(videoId) {

FILE: collector/utils/extensions/YoutubeTranscript/index.js
  function fetchVideoTranscriptContent (line 20) | async function fetchVideoTranscriptContent({ url }) {
  function loadYouTubeTranscript (line 101) | async function loadYouTubeTranscript({ url }, options = { parseOnly: fal...
  function buildTranscriptContentWithMetadata (line 203) | function buildTranscriptContentWithMetadata(content = "", metadata = {}) {

FILE: collector/utils/files/index.js
  function isTextType (line 31) | function isTextType(filepath) {
  function isKnownTextMime (line 44) | function isKnownTextMime(filepath) {
  function parseableAsText (line 66) | function parseableAsText(filepath) {
  function trashFile (line 86) | function trashFile(filepath) {
  function createdDate (line 100) | function createdDate(filepath) {
  function writeToServerDocuments (line 120) | function writeToServerDocuments({
  function wipeCollectorStorage (line 156) | async function wipeCollectorStorage() {
  function isWithin (line 198) | function isWithin(outer, inner) {
  function normalizePath (line 204) | function normalizePath(filepath = "") {
  function sanitizeFileName (line 213) | function sanitizeFileName(fileName) {

FILE: collector/utils/files/mime.js
  class MimeDetector (line 2) | class MimeDetector {
    method constructor (line 13) | constructor() {
    method setOverrides (line 18) | setOverrides() {
    method getType (line 55) | getType(filepath) {

FILE: collector/utils/http/index.js
  function reqBody (line 5) | function reqBody(request) {
  function queryParams (line 11) | function queryParams(request) {
  function validBaseUrl (line 22) | function validBaseUrl(baseUrl) {

FILE: collector/utils/logger/index.js
  class Logger (line 3) | class Logger {
    method constructor (line 6) | constructor() {
    method getWinstonLogger (line 13) | getWinstonLogger() {
  function setLogger (line 65) | function setLogger() {

FILE: collector/utils/runtimeSettings/index.js
  class RuntimeSettings (line 18) | class RuntimeSettings {
    method constructor (line 46) | constructor() {
    method parseOptionsFromRequest (line 58) | parseOptionsFromRequest(request = {}) {
    method get (line 74) | get(key) {
    method set (line 90) | set(key, value = null) {

FILE: collector/utils/shell.js
  function patchShellEnvironmentPath (line 8) | async function patchShellEnvironmentPath() {

FILE: collector/utils/tokenizer/index.js
  class TikTokenTokenizer (line 3) | class TikTokenTokenizer {
    method constructor (line 7) | constructor() {
    method log (line 20) | log(text, ...args) {
    method #isTooLong (line 32) | #isTooLong(input) {
    method tokenizeString (line 43) | tokenizeString(input = "") {

FILE: collector/utils/url/index.js
  constant VALID_PROTOCOLS (line 15) | const VALID_PROTOCOLS = ["https:", "http:"];
  constant INVALID_OCTETS (line 16) | const INVALID_OCTETS = [192, 172, 10, 127];
  function isInvalidIp (line 27) | function isInvalidIp({ hostname }) {
  function validURL (line 64) | function validURL(url) {
  function validateURL (line 81) | function validateURL(url) {
  function validYoutubeVideoUrl (line 112) | function validYoutubeVideoUrl(link, returnVideoId = false) {

FILE: extras/translator/index.mjs
  function getNestedValue (line 5) | function getNestedValue(obj, path) {
  function setNestedValue (line 15) | function setNestedValue(obj, path, value) {
  function extractPlaceholders (line 32) | function extractPlaceholders(text) {
  function restorePlaceholders (line 48) | function restorePlaceholders(text, placeholders) {
  function extractTransTags (line 60) | function extractTransTags(text) {
  function restoreTransTags (line 78) | function restoreTransTags(text, tags) {
  function validatePlaceholders (line 90) | function validatePlaceholders(sourceText, translatedText) {
  function validateTransTags (line 103) | function validateTransTags(sourceText, translatedText) {
  class Translator (line 110) | class Translator {
    method constructor (line 112) | constructor() {
    method getLanguageName (line 116) | getLanguageName(localeCode) {
    method #log (line 125) | #log(text, ...args) {
    method slog (line 129) | static slog(text, ...args) {
    method buildPrompt (line 133) | buildPrompt(text, sourceLangCode, targetLangCode, { hasPlaceholders = ...
    method cleanOutputText (line 159) | cleanOutputText(text) {
    method translate (line 163) | async translate(text, sourceLangCode, targetLangCode) {
    method writeTranslations (line 224) | writeTranslations(langCode, translations) {
  function traverseTranslations (line 247) | function traverseTranslations(translations, parentKey = '') {
  function translateAllLanguages (line 260) | async function translateAllLanguages() {
  function translateSingleLanguage (line 267) | async function translateSingleLanguage(langCode) {

FILE: frontend/public/service-workers/push-notifications.js
  function parseEventData (line 1) | function parseEventData(event) {

FILE: frontend/src/App.jsx
  function App (line 18) | function App() {

FILE: frontend/src/AuthContext.jsx
  function AuthProvider (line 13) | function AuthProvider(props) {

FILE: frontend/src/LogoContext.jsx
  constant REFETCH_LOGO_EVENT (line 8) | const REFETCH_LOGO_EVENT = "refetch-logo";
  function isLightMode (line 10) | function isLightMode() {
  function LogoProvider (line 15) | function LogoProvider({ children }) {

FILE: frontend/src/PWAContext.jsx
  function isStandalonePWA (line 13) | function isStandalonePWA() {
  function PWAModeProvider (line 33) | function PWAModeProvider({ children }) {
  function usePWAMode (line 91) | function usePWAMode() {

FILE: frontend/src/PfpContext.jsx
  function PfpProvider (line 7) | function PfpProvider({ children }) {

FILE: frontend/src/ThemeContext.jsx
  function ThemeProvider (line 6) | function ThemeProvider({ children }) {
  function useThemeContext (line 14) | function useThemeContext() {

FILE: frontend/src/components/CanViewChatHistory/index.jsx
  function CanViewChatHistory (line 11) | function CanViewChatHistory({ children }) {
  function CanViewChatHistoryProvider (line 26) | function CanViewChatHistoryProvider({ children }) {
  function useCanViewChatHistory (line 36) | function useCanViewChatHistory() {

FILE: frontend/src/components/ChangeWarning/index.jsx
  function ChangeWarningModal (line 3) | function ChangeWarningModal({

FILE: frontend/src/components/ChatBubble/index.jsx
  function ChatBubble (line 7) | function ChatBubble({ message, type }) {

FILE: frontend/src/components/CommunityHub/PublishEntityModal/AgentFlows/index.jsx
  function AgentFlows (line 10) | function AgentFlows({ entity }) {

FILE: frontend/src/components/CommunityHub/PublishEntityModal/SlashCommands/index.jsx
  function SlashCommands (line 9) | function SlashCommands({ entity }) {

FILE: frontend/src/components/CommunityHub/PublishEntityModal/SystemPrompts/index.jsx
  function SystemPrompts (line 9) | function SystemPrompts({ entity }) {

FILE: frontend/src/components/CommunityHub/PublishEntityModal/index.jsx
  function PublishEntityModal (line 9) | function PublishEntityModal({

FILE: frontend/src/components/CommunityHub/UnauthenticatedHubModal/index.jsx
  function UnauthenticatedHubModal (line 7) | function UnauthenticatedHubModal({ show, onClose }) {

FILE: frontend/src/components/ContextualSaveBar/index.jsx
  function ContextualSaveBar (line 3) | function ContextualSaveBar({

FILE: frontend/src/components/DefaultChat/index.jsx
  function DefaultChatContainer (line 13) | function DefaultChatContainer() {

FILE: frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx
  function AzureAiOptions (line 1) | function AzureAiOptions({ settings }) {

FILE: frontend/src/components/EmbeddingSelection/CohereOptions/index.jsx
  function CohereEmbeddingOptions (line 4) | function CohereEmbeddingOptions({ settings }) {
  function CohereModelSelection (line 34) | function CohereModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/EmbeddingSelection/EmbedderItem/index.jsx
  function EmbedderItem (line 1) | function EmbedderItem({

FILE: frontend/src/components/EmbeddingSelection/GeminiOptions/index.jsx
  constant DEFAULT_MODELS (line 4) | const DEFAULT_MODELS = [
  function GeminiOptions (line 11) | function GeminiOptions({ settings }) {

FILE: frontend/src/components/EmbeddingSelection/GenericOpenAiOptions/index.jsx
  function GenericOpenAiEmbeddingOptions (line 5) | function GenericOpenAiEmbeddingOptions({ settings }) {

FILE: frontend/src/components/EmbeddingSelection/LMStudioOptions/index.jsx
  function LMStudioEmbeddingOptions (line 14) | function LMStudioEmbeddingOptions({ settings }) {
  function LMStudioModelSelection (line 202) | function LMStudioModelSelection({ settings, basePath = null, apiKey = nu...

FILE: frontend/src/components/EmbeddingSelection/LemonadeOptions/index.jsx
  function LemonadeEmbeddingOptions (line 9) | function LemonadeEmbeddingOptions({ settings }) {
  function LemonadeModelSelection (line 146) | function LemonadeModelSelection({ settings, basePath = null }) {

FILE: frontend/src/components/EmbeddingSelection/LiteLLMOptions/index.jsx
  function LiteLLMOptions (line 6) | function LiteLLMOptions({ settings }) {
  function LiteLLMModelSelection (line 91) | function LiteLLMModelSelection({ settings, basePath = null, apiKey = nul...
  function EmbeddingModelTooltip (line 168) | function EmbeddingModelTooltip() {

FILE: frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx
  function LocalAiOptions (line 9) | function LocalAiOptions({ settings }) {
  function LocalAIModelSelection (line 213) | function LocalAIModelSelection({ settings, apiKey = null, basePath = nul...

FILE: frontend/src/components/EmbeddingSelection/MistralAiOptions/index.jsx
  function MistralAiOptions (line 1) | function MistralAiOptions({ settings }) {

FILE: frontend/src/components/EmbeddingSelection/NativeEmbeddingOptions/index.jsx
  function NativeEmbeddingOptions (line 5) | function NativeEmbeddingOptions({ settings }) {

FILE: frontend/src/components/EmbeddingSelection/OllamaOptions/index.jsx
  function OllamaEmbeddingOptions (line 9) | function OllamaEmbeddingOptions({ settings }) {
  function OllamaEmbeddingModelSelection (line 199) | function OllamaEmbeddingModelSelection({ settings, basePath = null }) {

FILE: frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx
  function OpenAiOptions (line 1) | function OpenAiOptions({ settings }) {

FILE: frontend/src/components/EmbeddingSelection/OpenRouterOptions/index.jsx
  function OpenRouterOptions (line 4) | function OpenRouterOptions({ settings }) {
  function OpenRouterEmbeddingModelSelection (line 29) | function OpenRouterEmbeddingModelSelection({ settings }) {

FILE: frontend/src/components/EmbeddingSelection/VoyageAiOptions/index.jsx
  function VoyageAiOptions (line 1) | function VoyageAiOptions({ settings }) {

FILE: frontend/src/components/ErrorBoundaryFallback/index.jsx
  function ErrorBoundaryFallback (line 5) | function ErrorBoundaryFallback({ error, resetErrorBoundary }) {

FILE: frontend/src/components/Footer/index.jsx
  constant MAX_ICONS (line 20) | const MAX_ICONS = 3;
  constant ICON_COMPONENTS (line 21) | const ICON_COMPONENTS = {
  function Footer (line 33) | function Footer() {

FILE: frontend/src/components/KeyboardShortcutsHelp/index.jsx
  function KeyboardShortcutsHelp (line 10) | function KeyboardShortcutsHelp() {

FILE: frontend/src/components/LLMSelection/AnthropicAiOptions/index.jsx
  function AnthropicAiOptions (line 5) | function AnthropicAiOptions({ settings }) {
  constant DEFAULT_MODELS (line 93) | const DEFAULT_MODELS = [
  function AnthropicModelSelection (line 132) | function AnthropicModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/ApiPieOptions/index.jsx
  function ApiPieLLMOptions (line 4) | function ApiPieLLMOptions({ settings }) {
  function APIPieModelSelection (line 31) | function APIPieModelSelection({ settings }) {

FILE: frontend/src/components/LLMSelection/AwsBedrockLLMOptions/index.jsx
  function AwsBedrockLLMOptions (line 5) | function AwsBedrockLLMOptions({ settings }) {

FILE: frontend/src/components/LLMSelection/AwsBedrockLLMOptions/regions.js
  constant AWS_REGIONS (line 1) | const AWS_REGIONS = [

FILE: frontend/src/components/LLMSelection/AzureAiOptions/index.jsx
  function AzureAiOptions (line 5) | function AzureAiOptions({ settings }) {

FILE: frontend/src/components/LLMSelection/CohereAiOptions/index.jsx
  function CohereAiOptions (line 4) | function CohereAiOptions({ settings }) {
  function CohereModelSelection (line 36) | function CohereModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/CometApiLLMOptions/index.jsx
  function CometApiLLMOptions (line 5) | function CometApiLLMOptions({ settings }) {
  function AdvancedControls (line 33) | function AdvancedControls({ settings }) {
  function CometApiModelSelection (line 77) | function CometApiModelSelection({ settings }) {

FILE: frontend/src/components/LLMSelection/DPAISOptions/index.jsx
  function DellProAIStudioOptions (line 8) | function DellProAIStudioOptions({ settings }) {
  function DellProAiStudioModelSelection (line 107) | function DellProAiStudioModelSelection({ settings, basePath = null }) {

FILE: frontend/src/components/LLMSelection/DeepSeekOptions/index.jsx
  function DeepSeekOptions (line 4) | function DeepSeekOptions({ settings }) {
  function DeepSeekModelSelection (line 36) | function DeepSeekModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/DockerModelRunnerOptions/index.jsx
  function DockerModelRunnerOptions (line 16) | function DockerModelRunnerOptions({ settings }) {
  function DockerModelRunnerModelSelection (line 182) | function DockerModelRunnerModelSelection({

FILE: frontend/src/components/LLMSelection/FireworksAiOptions/index.jsx
  function FireworksAiOptions (line 4) | function FireworksAiOptions({ settings }) {
  function FireworksAiModelSelection (line 38) | function FireworksAiModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/FoundryOptions/index.jsx
  function FoundryOptions (line 4) | function FoundryOptions({ settings }) {

FILE: frontend/src/components/LLMSelection/GeminiLLMOptions/index.jsx
  function GeminiLLMOptions (line 4) | function GeminiLLMOptions({ settings }) {
  function GeminiModelSelection (line 64) | function GeminiModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/GenericOpenAiOptions/index.jsx
  function GenericOpenAiOptions (line 1) | function GenericOpenAiOptions({ settings }) {

FILE: frontend/src/components/LLMSelection/GiteeAIOptions/index.jsx
  function GiteeAIOptions (line 4) | function GiteeAIOptions({ settings }) {
  function GiteeAIModelSelection (line 47) | function GiteeAIModelSelection({ settings }) {

FILE: frontend/src/components/LLMSelection/GroqAiOptions/index.jsx
  function GroqAiOptions (line 4) | function GroqAiOptions({ settings }) {
  function GroqAIModelSelection (line 35) | function GroqAIModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/HuggingFaceOptions/index.jsx
  function HuggingFaceOptions (line 1) | function HuggingFaceOptions({ settings }) {

FILE: frontend/src/components/LLMSelection/KoboldCPPOptions/index.jsx
  function KoboldCPPOptions (line 8) | function KoboldCPPOptions({ settings }) {
  function KoboldCPPModelSelection (line 146) | function KoboldCPPModelSelection({ settings, basePath = null }) {

FILE: frontend/src/components/LLMSelection/LLMItem/index.jsx
  function LLMItem (line 1) | function LLMItem({

FILE: frontend/src/components/LLMSelection/LLMProviderOption/index.jsx
  function LLMProviderOption (line 1) | function LLMProviderOption({

FILE: frontend/src/components/LLMSelection/LMStudioOptions/index.jsx
  function LMStudioOptions (line 15) | function LMStudioOptions({ settings, showAlert = false }) {
  function LMStudioModelSelection (line 227) | function LMStudioModelSelection({ settings, basePath = null, apiKey = nu...

FILE: frontend/src/components/LLMSelection/LemonadeOptions/index.jsx
  function cleanBasePath (line 16) | function cleanBasePath(basePath = "") {
  function LemonadeOptions (line 25) | function LemonadeOptions({ settings }) {
  function LemonadeModelSelection (line 172) | function LemonadeModelSelection({

FILE: frontend/src/components/LLMSelection/LiteLLMOptions/index.jsx
  function LiteLLMOptions (line 4) | function LiteLLMOptions({ settings }) {
  function LiteLLMModelSelection (line 76) | function LiteLLMModelSelection({ settings, basePath = null, apiKey = nul...

FILE: frontend/src/components/LLMSelection/LocalAiOptions/index.jsx
  function LocalAiOptions (line 9) | function LocalAiOptions({ settings, showAlert = false }) {
  function LocalAIModelSelection (line 147) | function LocalAIModelSelection({ settings, basePath = null, apiKey = nul...

FILE: frontend/src/components/LLMSelection/MistralOptions/index.jsx
  function MistralOptions (line 4) | function MistralOptions({ settings }) {
  function MistralModelSelection (line 34) | function MistralModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/MoonshotAiOptions/index.jsx
  function MoonshotAiOptions (line 4) | function MoonshotAiOptions({ settings }) {
  function MoonshotAiModelSelection (line 36) | function MoonshotAiModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/NovitaLLMOptions/index.jsx
  function NovitaLLMOptions (line 5) | function NovitaLLMOptions({ settings }) {
  function AdvancedControls (line 33) | function AdvancedControls({ settings }) {
  function NovitaModelSelection (line 77) | function NovitaModelSelection({ settings }) {

FILE: frontend/src/components/LLMSelection/NvidiaNimOptions/index.jsx
  function NvidiaNimOptions (line 4) | function NvidiaNimOptions({ settings }) {

FILE: frontend/src/components/LLMSelection/NvidiaNimOptions/managed.jsx
  function ManagedNvidiaNimOptions (line 5) | function ManagedNvidiaNimOptions({ settings: _settings }) {

FILE: frontend/src/components/LLMSelection/NvidiaNimOptions/remote.jsx
  function RemoteNvidiaNimOptions (line 12) | function RemoteNvidiaNimOptions({ settings }) {
  function NvidiaNimModelSelection (line 71) | function NvidiaNimModelSelection({ settings, basePath }) {

FILE: frontend/src/components/LLMSelection/OllamaLLMOptions/index.jsx
  function OllamaLLMOptions (line 9) | function OllamaLLMOptions({ settings }) {
  function OllamaLLMModelSelection (line 279) | function OllamaLLMModelSelection({

FILE: frontend/src/components/LLMSelection/OpenAiOptions/index.jsx
  function OpenAiOptions (line 4) | function OpenAiOptions({ settings }) {
  function OpenAIModelSelection (line 34) | function OpenAIModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/OpenRouterOptions/index.jsx
  function OpenRouterOptions (line 5) | function OpenRouterOptions({ settings }) {
  function AdvancedControls (line 33) | function AdvancedControls({ settings }) {
  function OpenRouterModelSelection (line 72) | function OpenRouterModelSelection({ settings }) {

FILE: frontend/src/components/LLMSelection/PPIOLLMOptions/index.jsx
  function PPIOLLMOptions (line 4) | function PPIOLLMOptions({ settings }) {
  function PPIOModelSelection (line 31) | function PPIOModelSelection({ settings }) {

FILE: frontend/src/components/LLMSelection/PerplexityOptions/index.jsx
  function PerplexityOptions (line 4) | function PerplexityOptions({ settings }) {
  function PerplexityModelSelection (line 29) | function PerplexityModelSelection({ settings }) {

FILE: frontend/src/components/LLMSelection/PrivateModeOptions/index.jsx
  function PrivateModeOptions (line 7) | function PrivateModeOptions({ settings }) {

FILE: frontend/src/components/LLMSelection/SambaNovaOptions/index.jsx
  function SambaNovaOptions (line 4) | function SambaNovaOptions({ settings }) {
  function SambaNovaModelSelection (line 34) | function SambaNovaModelSelection({ settings, apiKey }) {

FILE: frontend/src/components/LLMSelection/TextGenWebUIOptions/index.jsx
  function TextGenWebUIOptions (line 1) | function TextGenWebUIOptions({ settings }) {

FILE: frontend/src/components/LLMSelection/TogetherAiOptions/index.jsx
  function TogetherAiOptions (line 4) | function TogetherAiOptions({ settings }) {
  function TogetherAiModelSelection (line 34) | function TogetherAiModelSelection({ settings, apiKey }) {

FILE: frontend/src/components/LLMSelection/XAiLLMOptions/index.jsx
  function XAILLMOptions (line 4) | function XAILLMOptions({ settings }) {
  function XAIModelSelection (line 35) | function XAIModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/LLMSelection/ZAiLLMOptions/index.jsx
  function ZAiLLMOptions (line 4) | function ZAiLLMOptions({ settings }) {
  function ZAiModelSelection (line 35) | function ZAiModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/ModalWrapper/index.jsx
  function ModalWrapper (line 18) | function ModalWrapper({ children, isOpen, noPortal = false }) {

FILE: frontend/src/components/Modals/DisplayRecoveryCodeModal/index.jsx
  function RecoveryCodeModal (line 7) | function RecoveryCodeModal({

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/ConnectorOption/index.jsx
  function ConnectorOption (line 1) | function ConnectorOption({

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/Connectors/Confluence/index.jsx
  function ConfluenceOptions (line 9) | function ConfluenceOptions() {

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/Connectors/DrupalWiki/index.jsx
  function DrupalWikiOptions (line 14) | function DrupalWikiOptions() {

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/Connectors/Github/index.jsx
  constant DEFAULT_BRANCHES (line 10) | const DEFAULT_BRANCHES = ["main", "master"];
  function GithubOptions (line 11) | function GithubOptions() {
  function GitHubBranchSelection (line 172) | function GitHubBranchSelection({ repo, accessToken }) {
  function PATAlert (line 243) | function PATAlert({ accessToken }) {
  function PATTooltip (line 274) | function PATTooltip({ accessToken }) {

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/Connectors/Gitlab/index.jsx
  constant DEFAULT_BRANCHES (line 11) | const DEFAULT_BRANCHES = ["main", "master"];
  function GitlabOptions (line 12) | function GitlabOptions() {
  function GitLabBranchSelection (line 198) | function GitLabBranchSelection({ repo, accessToken }) {
  function PATAlert (line 271) | function PATAlert({ accessToken }) {
  function PATTooltip (line 301) | function PATTooltip({ accessToken }) {

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/Connectors/Obsidian/index.jsx
  function ObsidianOptions (line 7) | function ObsidianOptions() {

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/Connectors/PaperlessNgx/index.jsx
  function PaperlessNgxOptions (line 6) | function PaperlessNgxOptions() {

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/Connectors/WebsiteDepth/index.jsx
  function WebsiteDepthOptions (line 7) | function WebsiteDepthOptions() {

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/Connectors/Youtube/index.jsx
  function YoutubeOptions (line 6) | function YoutubeOptions() {

FILE: frontend/src/components/Modals/ManageWorkspace/DataConnectors/index.jsx
  function DataConnectors (line 66) | function DataConnectors() {

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/Directory/ContextMenu/index.jsx
  function ContextMenu (line 3) | function ContextMenu({

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/Directory/FileRow/index.jsx
  function FileRow (line 9) | function FileRow({ item, selected, toggleSelection }) {

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/Directory/FolderRow/index.jsx
  function FolderRow (line 6) | function FolderRow({

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/Directory/FolderSelectionPopup/index.jsx
  function FolderSelectionPopup (line 3) | function FolderSelectionPopup({ folders, onSelect, onClose }) {

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/Directory/MoveToFolderIcon.jsx
  function MoveToFolderIcon (line 1) | function MoveToFolderIcon({

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/Directory/NewFolderModal/index.jsx
  function NewFolderModal (line 5) | function NewFolderModal({ closeModal, files, setFiles }) {

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx
  function Directory (line 20) | function Directory({
  function DirectoryTooltips (line 359) | function DirectoryTooltips() {

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/Directory/utils.js
  constant LEVENSHTEIN_MIN (line 3) | const LEVENSHTEIN_MIN = 2;
  function filterFileSearchResults (line 18) | function filterFileSearchResults(files = [], searchTerm = "") {

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/UploadFile/FileUploadProgress/index.jsx
  function FileUploadProgressComponent (line 8) | function FileUploadProgressComponent({

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/UploadFile/index.jsx
  function UploadFile (line 12) | function UploadFile({

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx
  function WorkspaceFileRow (line 12) | function WorkspaceFileRow({

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx
  function WorkspaceDirectory (line 15) | function WorkspaceDirectory({
  function dismissAlert (line 270) | function dismissAlert() {
  function handlePinEvent (line 276) | function handlePinEvent() {
  function dismissAlert (line 335) | function dismissAlert() {
  function handlePinEvent (line 341) | function handlePinEvent() {
  function RenderFileRows (line 400) | function RenderFileRows({ files, movedItems, children, workspace }) {
  function WorkspaceDocumentTooltips (line 429) | function WorkspaceDocumentTooltips() {

FILE: frontend/src/components/Modals/ManageWorkspace/Documents/index.jsx
  constant MODEL_COSTS (line 12) | const MODEL_COSTS = {
  function DocumentSettings (line 18) | function DocumentSettings({ workspace, systemSettings }) {

FILE: frontend/src/components/Modals/ManageWorkspace/index.jsx
  function getSettings (line 23) | async function getSettings() {
  function fetchWorkspace (line 31) | async function fetchWorkspace() {
  function useManageWorkspaceModal (line 147) | function useManageWorkspaceModal() {

FILE: frontend/src/components/Modals/NewWorkspace.jsx
  function NewWorkspaceModal (line 9) | function NewWorkspaceModal({ hideModal = noop }) {
  function useNewWorkspaceModal (line 88) | function useNewWorkspaceModal() {

FILE: frontend/src/components/Modals/Password/MultiUserAuth.jsx
  function MultiUserAuth (line 173) | function MultiUserAuth() {

FILE: frontend/src/components/Modals/Password/SingleUserAuth.jsx
  function SingleUserAuth (line 10) | function SingleUserAuth() {

FILE: frontend/src/components/Modals/Password/index.jsx
  function PasswordModal (line 12) | function PasswordModal({ mode = "single" }) {
  function usePasswordModal (line 27) | function usePasswordModal(notry = false) {

FILE: frontend/src/components/Preloader.jsx
  function PreLoader (line 1) | function PreLoader({ size = "16" }) {
  function FullScreenLoader (line 9) | function FullScreenLoader() {

FILE: frontend/src/components/PrivateRoute/index.jsx
  function useIsAuthenticated (line 14) | function useIsAuthenticated() {
  function AdminRoute (line 79) | function AdminRoute({ Component, hideUserMenu = false }) {
  function ManagerRoute (line 108) | function ManagerRoute({ Component }) {
  function PrivateRoute (line 129) | function PrivateRoute({ Component }) {

FILE: frontend/src/components/ProviderPrivacy/constants.js
  constant LLM_PROVIDER_PRIVACY_MAP (line 49) | const LLM_PROVIDER_PRIVACY_MAP = {
  constant VECTOR_DB_PROVIDER_PRIVACY_MAP (line 257) | const VECTOR_DB_PROVIDER_PRIVACY_MAP = {
  constant EMBEDDING_ENGINE_PROVIDER_PRIVACY_MAP (line 320) | const EMBEDDING_ENGINE_PROVIDER_PRIVACY_MAP = {
  constant PROVIDER_PRIVACY_MAP (line 407) | const PROVIDER_PRIVACY_MAP = {

FILE: frontend/src/components/ProviderPrivacy/index.jsx
  function defaultProvider (line 9) | function defaultProvider(providerString) {
  function ProviderPrivacy (line 21) | function ProviderPrivacy() {
  function ProviderPrivacyItem (line 74) | function ProviderPrivacyItem({ title, provider, altText }) {

FILE: frontend/src/components/SettingsButton/index.jsx
  function SettingsButton (line 7) | function SettingsButton() {

FILE: frontend/src/components/SettingsSidebar/MenuOption/index.jsx
  function MenuOption (line 7) | function MenuOption({
  function useIsExpanded (line 132) | function useIsExpanded({
  function hasVisibleOptions (line 173) | function hasVisibleOptions(user = null, childOptions = []) {
  function generateStorageKey (line 193) | function generateStorageKey({ key = "" }) {

FILE: frontend/src/components/SettingsSidebar/index.jsx
  function SettingsSidebar (line 27) | function SettingsSidebar() {
  function SupportEmail (line 188) | function SupportEmail() {
  function HoldToReveal (line 434) | function HoldToReveal({ children, holdForMs = 3_000 }) {
  function AppVersion (line 483) | function AppVersion() {

FILE: frontend/src/components/Sidebar/ActiveWorkspaces/ThreadContainer/ThreadItem/index.jsx
  constant THREAD_CALLOUT_DETAIL_WIDTH (line 15) | const THREAD_CALLOUT_DETAIL_WIDTH = 26;
  function ThreadItem (line 16) | function ThreadItem({
  function OptionsMenu (line 168) | function OptionsMenu({

FILE: frontend/src/components/Sidebar/ActiveWorkspaces/ThreadContainer/index.jsx
  constant THREAD_RENAME_EVENT (line 8) | const THREAD_RENAME_EVENT = "renameThread";
  function ThreadContainer (line 10) | function ThreadContainer({
  function NewThreadButton (line 175) | function NewThreadButton({ workspace }) {
  function DeleteAllThreadButton (line 226) | function DeleteAllThreadButton({ ctrlPressed, threads, onDelete }) {

FILE: frontend/src/components/Sidebar/ActiveWorkspaces/index.jsx
  function ActiveWorkspaces (line 18) | function ActiveWorkspaces() {

FILE: frontend/src/components/Sidebar/SearchBox/index.jsx
  constant DEFAULT_SEARCH_RESULTS (line 11) | const DEFAULT_SEARCH_RESULTS = {
  constant SEARCH_RESULT_SELECTED (line 16) | const SEARCH_RESULT_SELECTED = "search-result-selected";
  function SearchBox (line 17) | function SearchBox({ user, showNewWsModal }) {
  function SearchResultWrapper (line 86) | function SearchResultWrapper({ children }) {
  function SearchResults (line 94) | function SearchResults({ searchResults, searchTerm, loading }) {
  function SearchResultCategory (line 150) | function SearchResultCategory({ items, name }) {
  function SearchResultItem (line 171) | function SearchResultItem({ to, name, hint }) {
  function ShortWidthNewWorkspaceButton (line 191) | function ShortWidthNewWorkspaceButton({ user, showNewWsModal }) {

FILE: frontend/src/components/Sidebar/SidebarToggle/index.jsx
  constant SIDEBAR_TOGGLE_STORAGE_KEY (line 5) | const SIDEBAR_TOGGLE_STORAGE_KEY = "anythingllm_sidebar_toggle";
  constant SIDEBAR_TOGGLE_EVENT (line 6) | const SIDEBAR_TOGGLE_EVENT = "sidebar-toggle";
  function previousSidebarState (line 15) | function previousSidebarState() {
  function useSidebarToggle (line 21) | function useSidebarToggle() {
  function ToggleSidebarButton (line 76) | function ToggleSidebarButton({ showSidebar, setShowSidebar }) {

FILE: frontend/src/components/Sidebar/index.jsx
  function Sidebar (line 19) | function Sidebar() {
  function SidebarMobileHeader (line 83) | function SidebarMobileHeader() {
  function NewWorkspaceButton (line 191) | function NewWorkspaceButton({ user, showNewWsModal }) {
  function WorkspaceAndThreadTooltips (line 210) | function WorkspaceAndThreadTooltips() {

FILE: frontend/src/components/SpeechToText/BrowserNative/index.jsx
  function BrowserNative (line 1) | function BrowserNative() {

FILE: frontend/src/components/TextToSpeech/BrowserNative/index.jsx
  function BrowserNative (line 1) | function BrowserNative() {

FILE: frontend/src/components/TextToSpeech/ElevenLabsOptions/index.jsx
  function ElevenLabsOptions (line 4) | function ElevenLabsOptions({ settings }) {
  function ElevenLabsModelSelection (line 36) | function ElevenLabsModelSelection({ apiKey, settings }) {

FILE: frontend/src/components/TextToSpeech/OpenAiGenericOptions/index.jsx
  function OpenAiGenericTextToSpeechOptions (line 3) | function OpenAiGenericTextToSpeechOptions({ settings }) {

FILE: frontend/src/components/TextToSpeech/OpenAiOptions/index.jsx
  function toProperCase (line 1) | function toProperCase(string) {
  function OpenAiTextToSpeechOptions (line 7) | function OpenAiTextToSpeechOptions({ settings }) {

FILE: frontend/src/components/TextToSpeech/PiperTTSOptions/index.jsx
  function PiperTTSOptions (line 8) | function PiperTTSOptions({ settings }) {
  function voicesByLanguage (line 22) | function voicesByLanguage(voices = []) {
  function voiceDisplayName (line 32) | function voiceDisplayName(voice) {
  function PiperTTSModelSelection (line 39) | function PiperTTSModelSelection({ settings }) {
  function DemoVoiceSample (line 134) | function DemoVoiceSample({ voiceId }) {

FILE: frontend/src/components/TranscriptionSelection/NativeTranscriptionOptions/index.jsx
  function NativeTranscriptionOptions (line 5) | function NativeTranscriptionOptions({ settings }) {
  function LocalWarning (line 39) | function LocalWarning({ model }) {
  function WhisperSmall (line 50) | function WhisperSmall() {
  function WhisperLarge (line 70) | function WhisperLarge() {

FILE: frontend/src/components/TranscriptionSelection/OpenAiOptions/index.jsx
  function OpenAiWhisperOptions (line 3) | function OpenAiWhisperOptions({ settings }) {

FILE: frontend/src/components/UserIcon/index.jsx
  function RenderUserPfp (line 23) | function RenderUserPfp({ pfp }) {

FILE: frontend/src/components/UserMenu/AccountModal/index.jsx
  function AccountModal (line 21) | function AccountModal({ user, hideModal }) {
  function LanguagePreference (line 228) | function LanguagePreference() {
  function ThemePreference (line 262) | function ThemePreference() {
  function AutoSubmitPreference (line 289) | function AutoSubmitPreference() {
  function AutoSpeakPreference (line 331) | function AutoSpeakPreference() {

FILE: frontend/src/components/UserMenu/UserButton/index.jsx
  function UserButton (line 19) | function UserButton() {
  function UserDisplay (line 122) | function UserDisplay() {

FILE: frontend/src/components/UserMenu/index.jsx
  function UserMenu (line 3) | function UserMenu({ children }) {

FILE: frontend/src/components/VectorDBSelection/AstraDBOptions/index.jsx
  function AstraDBOptions (line 1) | function AstraDBOptions({ settings }) {

FILE: frontend/src/components/VectorDBSelection/ChromaCloudOptions/index.jsx
  function ChromaCloudOptions (line 1) | function ChromaCloudOptions({ settings }) {

FILE: frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx
  function ChromaDBOptions (line 1) | function ChromaDBOptions({ settings }) {

FILE: frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx
  function LanceDBOptions (line 2) | function LanceDBOptions() {

FILE: frontend/src/components/VectorDBSelection/MilvusDBOptions/index.jsx
  function MilvusDBOptions (line 1) | function MilvusDBOptions({ settings }) {

FILE: frontend/src/components/VectorDBSelection/PGVectorOptions/index.jsx
  function PGVectorOptions (line 4) | function PGVectorOptions({ settings }) {

FILE: frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx
  function PineconeDBOptions (line 1) | function PineconeDBOptions({ settings }) {

FILE: frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx
  function QDrantDBOptions (line 1) | function QDrantDBOptions({ settings }) {

FILE: frontend/src/components/VectorDBSelection/VectorDBItem/index.jsx
  function VectorDBItem (line 1) | function VectorDBItem({

FILE: frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx
  function WeaviateDBOptions (line 1) | function WeaviateDBOptions({ settings }) {

FILE: frontend/src/components/VectorDBSelection/ZillizCloudOptions/index.jsx
  function ZillizCloudOptions (line 1) | function ZillizCloudOptions({ settings }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/Chartable/CustomCell.jsx
  function CustomCell (line 1) | function CustomCell({ ...props }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/Chartable/CustomTooltip.jsx
  function invertColor (line 6) | function invertColor(hex, bw) {
  function padZero (line 33) | function padZero(str, len) {
  function Tooltip (line 39) | function Tooltip({ legendColor, ...props }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/Chartable/chart-utils.js
  function getTremorColor (line 26) | function getTremorColor(color) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/Chartable/index.jsx
  function Chartable (line 43) | function Chartable({ props }) {
  function DownloadGraph (line 450) | function DownloadGraph({ onClick }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/Citation/index.jsx
  constant CIRCLE_ICONS (line 19) | const CIRCLE_ICONS = {
  function SourceTypeCircle (line 38) | function SourceTypeCircle({
  function combineLikeSources (line 81) | function combineLikeSources(sources) {
  function Citations (line 99) | function Citations({ sources = [] }) {
  function omitChunkHeader (line 161) | function omitChunkHeader(text) {
  function CitationDetailModal (line 166) | function CitationDetailModal({ source, onClose }) {
  function parseChunkSource (line 275) | function parseChunkSource({ title = "", chunks = [] }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/ActionMenu/index.jsx
  function ActionMenu (line 5) | function ActionMenu({ chatId, forkThread, isEditing, role }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/DeleteMessage/index.jsx
  constant DELETE_EVENT (line 5) | const DELETE_EVENT = "delete-message";
  function useWatchDeleteMessage (line 7) | function useWatchDeleteMessage({ chatId = null, role = "user" }) {
  function DeleteMessage (line 41) | function DeleteMessage({ chatId, isEditing, role }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/EditMessage/index.jsx
  constant EDIT_EVENT (line 6) | const EDIT_EVENT = "toggle-message-edit";
  function useEditMessage (line 8) | function useEditMessage({ chatId, role }) {
  function EditMessageAction (line 33) | function EditMessageAction({ chatId = null, role, isEditing }) {
  function EditMessageForm (line 65) | function EditMessageForm({
  function EditActionBar (line 152) | function EditActionBar({ onCancel, onSave, isUserMessage = false }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/RenderMetrics/index.jsx
  constant SHOW_METRICS_KEY (line 6) | const SHOW_METRICS_KEY = "anythingllm_show_chat_metrics";
  constant SHOW_METRICS_EVENT (line 7) | const SHOW_METRICS_EVENT = "anythingllm_show_metrics_change";
  function formatDuration (line 13) | function formatDuration(duration) {
  function formatTps (line 28) | function formatTps(outputTps) {
  function getAutoShowMetrics (line 42) | function getAutoShowMetrics() {
  function buildMetricsString (line 54) | function buildMetricsString(metrics = {}) {
  function toggleAutoShowMetrics (line 70) | function toggleAutoShowMetrics() {
  function MetricsProvider (line 87) | function MetricsProvider({ children }) {
  function RenderMetrics (line 116) | function RenderMetrics({ metrics = {} }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/TTSButton/asyncTts.jsx
  function AsyncTTSMessage (line 7) | function AsyncTTSMessage({ slug, chatId }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/TTSButton/index.jsx
  function WrapTTS (line 6) | function WrapTTS({ children }) {
  function TTSMessage (line 10) | function TTSMessage({ slug, chatId, message }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/TTSButton/native.jsx
  function NativeTTSMessage (line 4) | function NativeTTSMessage({ chatId, message }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/TTSButton/piperTTS.jsx
  function PiperTTS (line 5) | function PiperTTS({ chatId, voiceId = null, message }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/Actions/index.jsx
  function FeedbackButton (line 76) | function FeedbackButton({
  function CopyMessage (line 101) | function CopyMessage({ message }) {
  function RegenerateMessage (line 126) | function RegenerateMessage({ regenerateMessage, chatId }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/HistoricalMessage/index.jsx
  function ChatAttachments (line 205) | function ChatAttachments({ attachments = [] }) {
  function TruncatableContent (line 221) | function TruncatableContent({ children }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx
  function RenderAssistantChatContent (line 55) | function RenderAssistantChatContent({ message, messageId }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/StatusResponse/index.jsx
  function StatusResponse (line 7) | function StatusResponse({ messages = [], isThinking = false }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/ThoughtContainer/index.jsx
  function ThoughtExpansionProvider (line 23) | function ThoughtExpansionProvider({ children }) {
  function useThoughtExpansion (line 49) | function useThoughtExpansion(messageId) {
  constant THOUGHT_KEYWORDS (line 61) | const THOUGHT_KEYWORDS = ["thought", "thinking", "think", "thought_chain"];
  constant CLOSING_TAGS (line 62) | const CLOSING_TAGS = [...THOUGHT_KEYWORDS, "response", "answer"];
  constant THOUGHT_REGEX_OPEN (line 63) | const THOUGHT_REGEX_OPEN = new RegExp(
  constant THOUGHT_REGEX_CLOSE (line 66) | const THOUGHT_REGEX_CLOSE = new RegExp(
  constant THOUGHT_REGEX_COMPLETE (line 69) | const THOUGHT_REGEX_COMPLETE = new RegExp(
  constant THOUGHT_PREVIEW_LENGTH (line 75) | const THOUGHT_PREVIEW_LENGTH = isMobile ? 25 : 50;
  function contentIsNotEmpty (line 82) | function contentIsNotEmpty(content = "") {
  function handleExpandClick (line 138) | function handleExpandClick() {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/index.jsx
  function buildMessages (line 267) | function buildMessages({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/ChatTooltips/index.jsx
  function ChatTooltips (line 19) | function ChatTooltips() {
  function DocumentLevelTooltip (line 120) | function DocumentLevelTooltip() {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/DnDWrapper/FileUploadWarningModal/index.jsx
  function FileUploadWarningModal (line 10) | function FileUploadWarningModal({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/DnDWrapper/index.jsx
  constant REMOVE_ATTACHMENT_EVENT (line 12) | const REMOVE_ATTACHMENT_EVENT = "ATTACHMENT_REMOVE";
  constant CLEAR_ATTACHMENTS_EVENT (line 13) | const CLEAR_ATTACHMENTS_EVENT = "ATTACHMENT_CLEAR";
  constant PASTE_ATTACHMENT_EVENT (line 14) | const PASTE_ATTACHMENT_EVENT = "ATTACHMENT_PASTED";
  constant ATTACHMENTS_PROCESSING_EVENT (line 15) | const ATTACHMENTS_PROCESSING_EVENT = "ATTACHMENTS_PROCESSING";
  constant ATTACHMENTS_PROCESSED_EVENT (line 16) | const ATTACHMENTS_PROCESSED_EVENT = "ATTACHMENTS_PROCESSED";
  constant PARSED_FILE_ATTACHMENT_REMOVED_EVENT (line 17) | const PARSED_FILE_ATTACHMENT_REMOVED_EVENT =
  function DnDFileUploaderProvider (line 43) | function DnDFileUploaderProvider({
  function DnDFileUploaderWrapper (line 421) | function DnDFileUploaderWrapper({ children }) {
  function toBase64 (line 469) | async function toBase64(file) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/AgentMenu/index.jsx
  function AvailableAgentsButton (line 8) | function AvailableAgentsButton({ showing, setShowAgents }) {
  function AvailableAgents (line 37) | function AvailableAgents({
  function useAvailableAgents (line 113) | function useAvailableAgents() {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/AttachItem/ParsedFilesMenu/index.jsx
  function ParsedFilesMenu (line 10) | function ParsedFilesMenu({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/AttachItem/index.jsx
  function AttachItem (line 18) | function AttachItem({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/Attachments/index.jsx
  function AttachmentManager (line 19) | function AttachmentManager({ attachments }) {
  function AttachmentItem (line 33) | function AttachmentItem({ attachment }) {
  function displayFromFile (line 198) | function displayFromFile(file) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/LLMSelector/ChatModelSelection/index.jsx
  function ChatModelSelection (line 5) | function ChatModelSelection({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/LLMSelector/LLMSelector/index.jsx
  function LLMSelectorSidePanel (line 4) | function LLMSelectorSidePanel({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/LLMSelector/SetupProvider/index.jsx
  function SetupProvider (line 8) | function SetupProvider({
  function NoSetupWarning (line 91) | function NoSetupWarning({ showing, onSetupClick }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/LLMSelector/action.jsx
  constant TOGGLE_LLM_SELECTOR_EVENT (line 11) | const TOGGLE_LLM_SELECTOR_EVENT = "toggle_llm_selector";
  constant SAVE_LLM_SELECTOR_EVENT (line 12) | const SAVE_LLM_SELECTOR_EVENT = "save_llm_selector";
  constant PROVIDER_SETUP_EVENT (line 13) | const PROVIDER_SETUP_EVENT = "provider_setup_requested";
  function LLMSelectorAction (line 15) | function LLMSelectorAction({ workspaceSlug = null }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/LLMSelector/index.jsx
  function LLMSelectorModal (line 19) | function LLMSelectorModal({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/LLMSelector/utils.js
  function autoScrollToSelectedLLMProvider (line 4) | function autoScrollToSelectedLLMProvider(
  function validatedModelSelection (line 26) | function validatedModelSelection(model) {
  function hasMissingCredentials (line 46) | function hasMissingCredentials(settings, provider) {
  constant WORKSPACE_LLM_PROVIDERS (line 60) | const WORKSPACE_LLM_PROVIDERS = AVAILABLE_LLM_PROVIDERS.filter(

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/SpeechToText/index.jsx
  constant SILENCE_INTERVAL (line 13) | const SILENCE_INTERVAL = 3_200;
  function SpeechToText (line 21) | function SpeechToText({ sendCommand }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/StopGenerationButton/index.jsx
  function StopGenerationButton (line 5) | function StopGenerationButton() {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/TextSizeMenu/index.jsx
  function TextSizeButton (line 7) | function TextSizeButton() {
  function TextSizeMenu (line 55) | function TextSizeMenu({ tooltipRef }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/Tabs/AgentSkills/SkillRow/index.jsx
  function SkillRow (line 3) | function SkillRow({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/Tabs/AgentSkills/index.jsx
  function AgentSkillsTab (line 17) | function AgentSkillsTab({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/Tabs/SlashCommands/SlashCommandRow/index.jsx
  function SlashCommandRow (line 6) | function SlashCommandRow({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/Tabs/SlashCommands/SlashPresets/AddPresetModal.jsx
  function AddPresetModal (line 7) | function AddPresetModal({ isOpen, onClose, onSave }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/Tabs/SlashCommands/SlashPresets/EditPresetModal.jsx
  function EditPresetModal (line 6) | function EditPresetModal({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/Tabs/SlashCommands/SlashPresets/constants.js
  constant CMD_REGEX (line 1) | const CMD_REGEX = /[^a-zA-Z0-9_-]/g;

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/Tabs/SlashCommands/index.jsx
  function SlashCommandsTab (line 15) | function SlashCommandsTab({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/index.jsx
  constant TOOLS_MENU_KEYBOARD_EVENT (line 7) | const TOOLS_MENU_KEYBOARD_EVENT = "tools-menu-keyboard";
  function getTabs (line 8) | function getTabs(t, user) {
  function ToolsMenu (line 39) | function ToolsMenu({
  function TabButton (line 160) | function TabButton({ active, onClick, children }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/ToolsMenu/useToolsMenuItems.js
  function useToolsMenuItems (line 12) | function useToolsMenuItems({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/PromptInput/index.jsx
  constant PROMPT_INPUT_ID (line 22) | const PROMPT_INPUT_ID = "primary-prompt-input";
  constant PROMPT_INPUT_EVENT (line 23) | const PROMPT_INPUT_EVENT = "set_prompt_input";
  constant MAX_EDIT_STACK_SIZE (line 24) | const MAX_EDIT_STACK_SIZE = 100;
  function PromptInput (line 36) | function PromptInput({
  function AgentSessionButton (line 409) | function AgentSessionButton({
  function ToolsButton (line 452) | function ToolsButton({
  function SendPromptButton (line 488) | function SendPromptButton({ formRef, promptInput, isDisabled }) {
  function useIsDisabled (line 530) | function useIsDisabled() {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/SourcesSidebar/MobileCitationModal/SourceDetailView/index.jsx
  function SourceDetailView (line 9) | function SourceDetailView({ source, onBack, onClose }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/SourcesSidebar/MobileCitationModal/index.jsx
  function MobileCitationModal (line 8) | function MobileCitationModal({

FILE: frontend/src/components/WorkspaceChat/ChatContainer/SourcesSidebar/SourceItem/index.jsx
  function SourceItem (line 4) | function SourceItem({ source, onClick }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/SourcesSidebar/index.jsx
  function SourcesSidebarProvider (line 14) | function SourcesSidebarProvider({ children }) {
  function useSourcesSidebar (line 36) | function useSourcesSidebar() {
  function SourcesSidebar (line 40) | function SourcesSidebar() {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/TextSizeMenu/index.jsx
  function getTextSizes (line 6) | function getTextSizes(t) {
  function TextSizeMenu (line 14) | function TextSizeMenu() {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/WorkspaceModelPicker/index.jsx
  function fetchModelName (line 16) | function fetchModelName(slug, setModelName) {
  function WorkspaceModelPicker (line 26) | function WorkspaceModelPicker({ workspaceSlug = null }) {

FILE: frontend/src/components/WorkspaceChat/ChatContainer/index.jsx
  function ChatContainer (line 38) | function ChatContainer({ workspace, knownHistory = [] }) {

FILE: frontend/src/components/WorkspaceChat/LoadingChat/index.jsx
  function LoadingChat (line 5) | function LoadingChat() {

FILE: frontend/src/components/WorkspaceChat/index.jsx
  function WorkspaceChat (line 16) | function WorkspaceChat({ loading, workspace }) {
  function copyCodeSnippet (line 101) | function copyCodeSnippet(uuid) {
  function setEventDelegatorForCodeSnippets (line 124) | function setEventDelegatorForCodeSnippets() {

FILE: frontend/src/components/contexts/TTSProvider.jsx
  constant ASSISTANT_MESSAGE_COMPLETE_EVENT (line 5) | const ASSISTANT_MESSAGE_COMPLETE_EVENT = "ASSISTANT_MESSAGE_COMPLETE_EVE...
  function TTSProvider (line 19) | function TTSProvider({ children }) {
  function useTTSProvider (line 53) | function useTTSProvider() {
  function emitAssistantMessageCompleteEvent (line 68) | function emitAssistantMessageCompleteEvent(chatId) {
  function useWatchForAutoPlayAssistantTTSResponse (line 82) | function useWatchForAutoPlayAssistantTTSResponse() {

FILE: frontend/src/components/lib/CTAButton/index.jsx
  function CTAButton (line 1) | function CTAButton({

FILE: frontend/src/components/lib/ModelTable/index.jsx
  function ModelTable (line 36) | function ModelTable({
  function DeviceTypeTagWrapper (line 107) | function DeviceTypeTagWrapper({ text, bgClass, textClass }) {
  function DeviceTypeTag (line 124) | function DeviceTypeTag({ deviceType }) {
  function ModelRow (line 172) | function ModelRow({
  function RenderStatus (line 333) | function RenderStatus({ model, isActiveModel }) {

FILE: frontend/src/components/lib/ModelTable/layout.jsx
  function ModelTableLayout (line 8) | function ModelTableLayout({

FILE: frontend/src/components/lib/ModelTable/loading.jsx
  function ModelTableLoadingSkeleton (line 4) | function ModelTableLoadingSkeleton() {

FILE: frontend/src/components/lib/MonoProviderIcon/index.jsx
  function findIconByModelName (line 77) | function findIconByModelName(modelName) {
  function MonoProviderIcon (line 92) | function MonoProviderIcon({

FILE: frontend/src/components/lib/QuickActions/index.jsx
  function QuickActions (line 12) | function QuickActions({
  function QuickActionButton (line 46) | function QuickActionButton({ label, onClick, show = true }) {

FILE: frontend/src/components/lib/SuggestedMessages/index.jsx
  function SuggestedMessages (line 1) | function SuggestedMessages({

FILE: frontend/src/components/lib/Toggle/index.jsx
  constant TOGGLE_STYLES (line 3) | const TOGGLE_STYLES = {
  constant LABEL_STYLES (line 9) | const LABEL_STYLES = {
  function Toggle (line 41) | function Toggle({
  function ToggleSwitch (line 110) | function ToggleSwitch({ name, disabled, size, inputProps, value }) {
  function TextContent (line 136) | function TextContent({ label, description, labelStyles = {}, hint }) {
  function SimpleToggleSwitch (line 168) | function SimpleToggleSwitch({

FILE: frontend/src/hooks/useAppVersion.js
  function useAppVersion (line 10) | function useAppVersion() {

FILE: frontend/src/hooks/useChatContainerQuickScroll.js
  function useChatContainerQuickScroll (line 8) | function useChatContainerQuickScroll() {

FILE: frontend/src/hooks/useChatHistoryScrollHandle.js
  function useChatHistoryScrollHandle (line 14) | function useChatHistoryScrollHandle(

FILE: frontend/src/hooks/useCommunityHubAuth.js
  function useCommunityHubAuth (line 9) | function useCommunityHubAuth() {

FILE: frontend/src/hooks/useCopyText.js
  function useCopyText (line 4) | function useCopyText(delay = 2500) {

FILE: frontend/src/hooks/useGetProvidersModels.js
  constant DISABLED_PROVIDERS (line 5) | const DISABLED_PROVIDERS = [
  constant PROVIDER_DEFAULT_MODELS (line 11) | const PROVIDER_DEFAULT_MODELS = {
  function groupModels (line 40) | function groupModels(models) {
  function useGetProviderModels (line 58) | function useGetProviderModels(provider = null) {

FILE: frontend/src/hooks/useLanguageOptions.js
  function useLanguageOptions (line 4) | function useLanguageOptions() {

FILE: frontend/src/hooks/useLoginMode.js
  function useLoginMode (line 4) | function useLoginMode() {

FILE: frontend/src/hooks/useLogo.js
  function useLogo (line 4) | function useLogo() {

FILE: frontend/src/hooks/useModal.js
  function useModal (line 3) | function useModal() {

FILE: frontend/src/hooks/useOnboardingComplete.js
  function useRedirectToHomeOnOnboardingComplete (line 6) | function useRedirectToHomeOnOnboardingComplete() {

FILE: frontend/src/hooks/usePfp.js
  function usePfp (line 4) | function usePfp() {

FILE: frontend/src/hooks/usePrefersDarkMode.js
  function usePrefersDarkMode (line 1) | function usePrefersDarkMode() {

FILE: frontend/src/hooks/usePromptInputStorage.js
  function clearPromptInputDraft (line 33) | function clearPromptInputDraft(storageKey) {
  function usePromptInputStorage (line 41) | function usePromptInputStorage({ promptInput, setPromptInput }) {

FILE: frontend/src/hooks/useProviderEndpointAutoDiscovery.js
  function useProviderEndpointAutoDiscovery (line 4) | function useProviderEndpointAutoDiscovery({

FILE: frontend/src/hooks/useQuery.js
  function useQuery (line 1) | function useQuery() {

FILE: frontend/src/hooks/useScrollActiveItemIntoView.js
  function useScrollActiveItemIntoView (line 11) | function useScrollActiveItemIntoView({

FILE: frontend/src/hooks/useSimpleSSO.js
  function useSimpleSSO (line 8) | function useSimpleSSO() {

FILE: frontend/src/hooks/useTextSize.js
  function useTextSize (line 3) | function useTextSize() {

FILE: frontend/src/hooks/useTheme.js
  function useTheme (line 15) | function useTheme() {

FILE: frontend/src/hooks/useUser.js
  function useUser (line 14) | function useUser() {

FILE: frontend/src/hooks/useWebPushNotifications.js
  constant PUSH_PUBKEY_URL (line 5) | const PUSH_PUBKEY_URL = `${API_BASE}/web-push/pubkey`;
  constant PUSH_USER_SUBSCRIBE_URL (line 6) | const PUSH_USER_SUBSCRIBE_URL = `${API_BASE}/web-push/subscribe`;
  constant SW_VERSION (line 12) | const SW_VERSION = "1.0.0";
  function log (line 14) | function log(message, ...args) {
  function subscribeToPushNotifications (line 24) | async function subscribeToPushNotifications() {
  function useWebPushNotifications (line 110) | function useWebPushNotifications() {
  function urlBase64ToUint8Array (line 116) | function urlBase64ToUint8Array(base64String) {

FILE: frontend/src/locales/ar/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/cs/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/da/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/de/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/dynamicKeyAllowlist.js
  constant DYNAMIC_KEY_ALLOWLIST (line 6) | const DYNAMIC_KEY_ALLOWLIST = [

FILE: frontend/src/locales/en/common.js
  constant TRANSLATIONS (line 1) | const TRANSLATIONS = {

FILE: frontend/src/locales/es/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/et/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/fa/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/findUnusedTranslations.mjs
  constant FRONTEND_SRC (line 16) | const FRONTEND_SRC = path.resolve(__dirname, "..");
  function extractKeys (line 22) | function extractKeys(obj, prefix = "") {
  function collectFiles (line 40) | function collectFiles(dir, results = []) {
  constant PLURAL_SUFFIXES (line 103) | const PLURAL_SUFFIXES = ["_zero", "_one", "_two", "_few", "_many", "_oth...
  function isPluralFormOfReferencedKey (line 105) | function isPluralFormOfReferencedKey(key) {
  function deleteKey (line 145) | function deleteKey(obj, dotPath) {
  function pruneEmptyObjects (line 155) | function pruneEmptyObjects(obj) {

FILE: frontend/src/locales/fr/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/he/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/it/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/ja/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/ko/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/lv/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/nl/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/normalizeEn.mjs
  function langDisplayName (line 11) | function langDisplayName(lang) {
  function compareStructures (line 15) | function compareStructures(lang, a, b, subdir = null) {
  function normalizeTranslations (line 79) | function normalizeTranslations(lang, source, target, _subdir = null) {
  function ISOToFilename (line 106) | function ISOToFilename(lang) {
  constant TRANSLATIONS (line 116) | const TRANSLATIONS = {};
  constant PRIMARY (line 121) | const PRIMARY = { ...TRANSLATIONS["en"] };

FILE: frontend/src/locales/pl/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/pt_BR/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/ro/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/ru/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/tr/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/verifyTranslations.mjs
  function langDisplayName (line 7) | function langDisplayName(lang) {
  function compareStructures (line 11) | function compareStructures(lang, a, b, subdir = null) {
  constant TRANSLATIONS (line 76) | const TRANSLATIONS = {};
  constant PRIMARY (line 79) | const PRIMARY = { ...TRANSLATIONS["en"] };

FILE: frontend/src/locales/vn/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/zh/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/locales/zh_TW/common.js
  constant TRANSLATIONS (line 2) | const TRANSLATIONS = {

FILE: frontend/src/main.jsx
  constant REACTWRAP (line 15) | const REACTWRAP = isDev ? React.Fragment : React.StrictMode;

FILE: frontend/src/models/workspace.js
  method onopen (line 152) | async onopen(response) {
  method onmessage (line 183) | async onmessage(msg) {
  method onerror (line 187) | onerror(err) {

FILE: frontend/src/models/workspaceThread.js
  method onopen (line 115) | async onopen(response) {
  method onmessage (line 146) | async onmessage(msg) {
  method onerror (line 150) | onerror(err) {

FILE: frontend/src/pages/404.jsx
  function NotFound (line 4) | function NotFound() {

FILE: frontend/src/pages/Admin/AgentBuilder/AddBlockMenu/index.jsx
  function checkIfCanAddBlock (line 11) | function checkIfCanAddBlock(blocks) {
  function AddBlockMenu (line 20) | function AddBlockMenu({

FILE: frontend/src/pages/Admin/AgentBuilder/BlockList/index.jsx
  constant BLOCK_TYPES (line 25) | const BLOCK_TYPES = {
  constant BLOCK_INFO (line 37) | const BLOCK_INFO = {
  function BlockList (line 148) | function BlockList({

FILE: frontend/src/pages/Admin/AgentBuilder/HeaderMenu/index.jsx
  function HeaderMenu (line 8) | function HeaderMenu({

FILE: frontend/src/pages/Admin/AgentBuilder/index.jsx
  constant DEFAULT_BLOCKS (line 14) | const DEFAULT_BLOCKS = [
  function AgentBuilder (line 40) | function AgentBuilder() {

FILE: frontend/src/pages/Admin/AgentBuilder/nodes/ApiCallNode/index.jsx
  function ApiCallNode (line 5) | function ApiCallNode({

FILE: frontend/src/pages/Admin/AgentBuilder/nodes/CodeNode/index.jsx
  function CodeNode (line 3) | function CodeNode({

FILE: frontend/src/pages/Admin/AgentBuilder/nodes/FileNode/index.jsx
  function FileNode (line 3) | function FileNode({

FILE: frontend/src/pages/Admin/AgentBuilder/nodes/FinishNode/index.jsx
  function FinishNode (line 3) | function FinishNode() {

FILE: frontend/src/pages/Admin/AgentBuilder/nodes/LLMInstructionNode/index.jsx
  function LLMInstructionNode (line 3) | function LLMInstructionNode({

FILE: frontend/src/pages/Admin/AgentBuilder/nodes/StartNode/index.jsx
  function StartNode (line 4) | function StartNode({

FILE: frontend/src/pages/Admin/AgentBuilder/nodes/WebScrapingNode/index.jsx
  function WebScrapingNode (line 3) | function WebScrapingNode({

FILE: frontend/src/pages/Admin/AgentBuilder/nodes/WebsiteNode/index.jsx
  function WebsiteNode (line 3) | function WebsiteNode({

FILE: frontend/src/pages/Admin/Agents/AgentFlows/FlowPanel.jsx
  function ManageFlowMenu (line 9) | function ManageFlowMenu({ flow, onDelete }) {
  function FlowPanel (line 74) | function FlowPanel({ flow, toggleFlow, onDelete }) {

FILE: frontend/src/pages/Admin/Agents/AgentFlows/index.jsx
  function AgentFlowsList (line 4) | function AgentFlowsList({

FILE: frontend/src/pages/Admin/Agents/AgentSkillSettings/index.jsx
  function AgentSkillSettings (line 10) | function AgentSkillSettings() {
  function AgentSkillSettingsModal (line 26) | function AgentSkillSettingsModal({ isOpen, closeModal }) {
  function MaxToolCallStack (line 57) | function MaxToolCallStack() {
  function AgentSkillReranker (line 118) | function AgentSkillReranker() {

FILE: frontend/src/pages/Admin/Agents/Badges/default.jsx
  function DefaultBadge (line 1) | function DefaultBadge({ title: _title }) {

FILE: frontend/src/pages/Admin/Agents/DefaultSkillPanel/index.jsx
  function DefaultSkillPanel (line 6) | function DefaultSkillPanel({

FILE: frontend/src/pages/Admin/Agents/GenericSkillPanel/index.jsx
  function GenericSkillPanel (line 4) | function GenericSkillPanel({

FILE: frontend/src/pages/Admin/Agents/Imported/ImportedSkillConfig/index.jsx
  function inputsFromArgs (line 13) | function inputsFromArgs(setupArgs) {
  function ImportedSkillConfig (line 35) | function ImportedSkillConfig({
  function ManageSkillMenu (line 192) | function ManageSkillMenu({ config, setImportedSkills }) {

FILE: frontend/src/pages/Admin/Agents/Imported/SkillList/index.jsx
  function ImportedSkillList (line 4) | function ImportedSkillList({

FILE: frontend/src/pages/Admin/Agents/MCPServers/ServerPanel.jsx
  function ManageServerMenu (line 10) | function ManageServerMenu({ server, toggleServer, onDelete }) {
  function ServerPanel (line 107) | function ServerPanel({
  function ToolCountWarningBanner (line 161) | function ToolCountWarningBanner({ server, enabledToolCount }) {
  function RenderServerConfig (line 179) | function RenderServerConfig({ config = null }) {
  function RenderServerStatus (line 201) | function RenderServerStatus({ server }) {
  function RenderServerTools (line 216) | function RenderServerTools({
  function ServerTool (line 240) | function ServerTool({ serverName, tool, enabled, onToggle }) {

FILE: frontend/src/pages/Admin/Agents/MCPServers/index.jsx
  function MCPServerHeader (line 10) | function MCPServerHeader({
  function MCPServersList (line 89) | function MCPServersList({
  function MCPServerItem (line 151) | function MCPServerItem({ server, isFirst, isLast, isSelected, handleClic...

FILE: frontend/src/pages/Admin/Agents/SQLConnectorSelection/DBConnection.jsx
  constant DB_LOGOS (line 8) | const DB_LOGOS = {
  function DBConnection (line 14) | function DBConnection({

FILE: frontend/src/pages/Admin/Agents/SQLConnectorSelection/SQLConnectionModal.jsx
  function slugify (line 16) | function slugify(str) {
  function assembleConnectionString (line 37) | function assembleConnectionString({
  constant DEFAULT_ENGINE (line 60) | const DEFAULT_ENGINE = "postgresql";
  constant DEFAULT_CONFIG (line 61) | const DEFAULT_CONFIG = {
  function SQLConnectionModal (line 86) | function SQLConnectionModal({
  function DBEngine (line 490) | function DBEngine({ provider, active, onClick }) {

FILE: frontend/src/pages/Admin/Agents/SQLConnectorSelection/index.jsx
  function AgentSQLConnectorSelection (line 11) | function AgentSQLConnectorSelection({

FILE: frontend/src/pages/Admin/Agents/WebSearchSelection/SearchProviderItem/index.jsx
  function SearchProviderItem (line 1) | function SearchProviderItem({ provider, checked, onClick }) {

FILE: frontend/src/pages/Admin/Agents/WebSearchSelection/SearchProviderOptions/index.jsx
  function SerpApiOptions (line 13) | function SerpApiOptions({ settings }) {
  function SearchApiOptions (line 90) | function SearchApiOptions({ settings }) {
  function SerperDotDevOptions (line 152) | function SerperDotDevOptions({ settings }) {
  function BingSearchOptions (line 187) | function BingSearchOptions({ settings }) {
  function SerplySearchOptions (line 251) | function SerplySearchOptions({ settings }) {
  function SearXNGOptions (line 286) | function SearXNGOptions({ settings }) {
  function TavilySearchOptions (line 308) | function TavilySearchOptions({ settings }) {
  function DuckDuckGoOptions (line 343) | function DuckDuckGoOptions() {
  function ExaSearchOptions (line 353) | function ExaSearchOptions({ settings }) {
  function PerplexitySearchOptions (line 388) | function PerplexitySearchOptions({ settings }) {

FILE: frontend/src/pages/Admin/Agents/WebSearchSelection/index.jsx
  constant SEARCH_PROVIDERS (line 36) | const SEARCH_PROVIDERS = [
  function AgentWebSearchSelection (line 124) | function AgentWebSearchSelection({

FILE: frontend/src/pages/Admin/Agents/index.jsx
  constant IGNORE_CHANGE_SETTINGS (line 34) | const IGNORE_CHANGE_SETTINGS = [
  function AdminAgents (line 40) | function AdminAgents() {
  function SkillLayout (line 677) | function SkillLayout({ children, hasChanges, handleSubmit, handleCancel ...
  function SkillList (line 699) | function SkillList({

FILE: frontend/src/pages/Admin/DefaultSystemPrompt/index.jsx
  function DefaultSystemPrompt (line 13) | function DefaultSystemPrompt() {

FILE: frontend/src/pages/Admin/ExperimentalFeatures/Features/LiveSync/manage/DocumentSyncQueueRow/index.jsx
  function DocumentSyncQueueRow (line 7) | function DocumentSyncQueueRow({ queue }) {

FILE: frontend/src/pages/Admin/ExperimentalFeatures/Features/LiveSync/manage/index.jsx
  function LiveDocumentSyncManager (line 9) | function LiveDocumentSyncManager() {
  function fetchData (line 44) | async function fetchData() {

FILE: frontend/src/pages/Admin/ExperimentalFeatures/Features/LiveSync/toggle.jsx
  function LiveSyncToggle (line 9) | function LiveSyncToggle({ enabled = false, onToggle }) {

FILE: frontend/src/pages/Admin/ExperimentalFeatures/index.jsx
  function ExperimentalFeatures (line 12) | function ExperimentalFeatures() {
  function FeatureLayout (line 107) | function FeatureLayout({ children }) {
  function FeatureItem (line 124) | function FeatureItem({
  function SelectedFeatureComponent (line 168) | function SelectedFeatureComponent({ feature, settings, refresh }) {
  function FeatureVerification (line 179) | function FeatureVerification({ children }) {

FILE: frontend/src/pages/Admin/Invitations/InviteRow/index.jsx
  function InviteRow (line 6) | function InviteRow({ invite }) {

FILE: frontend/src/pages/Admin/Invitations/NewInviteModal/index.jsx
  function NewInviteModal (line 7) | function NewInviteModal({ closeModal, onSuccess }) {
  function WorkspaceOption (line 189) | function WorkspaceOption({ workspace, selected, toggleSelection }) {

FILE: frontend/src/pages/Admin/Logging/LogRow/index.jsx
  function LogRow (line 5) | function LogRow({ log }) {

FILE: frontend/src/pages/Admin/Logging/index.jsx
  function AdminLogs (line 12) | function AdminLogs() {

FILE: frontend/src/pages/Admin/SystemPromptVariables/AddVariableModal/index.jsx
  function AddVariableModal (line 6) | function AddVariableModal({ closeModal, onRefresh }) {

FILE: frontend/src/pages/Admin/SystemPromptVariables/VariableRow/EditVariableModal/index.jsx
  function EditVariableModal (line 6) | function EditVariableModal({ variable, closeModal, onRefresh }) {

FILE: frontend/src/pages/Admin/SystemPromptVariables/VariableRow/index.jsx
  function VariableRow (line 17) | function VariableRow({ variable, onRefresh }) {

FILE: frontend/src/pages/Admin/Users/NewUserModal/index.jsx
  function NewUserModal (line 13) | function NewUserModal({ closeModal }) {

FILE: frontend/src/pages/Admin/Users/UserRow/EditUserModal/index.jsx
  function EditUserModal (line 13) | function EditUserModal({ currentUser, user, closeModal }) {

FILE: frontend/src/pages/Admin/Users/UserRow/index.jsx
  function UserRow (line 15) | function UserRow({ currUser, user }) {

FILE: frontend/src/pages/Admin/Users/index.jsx
  function AdminUsers (line 16) | function AdminUsers() {
  function fetchUsers (line 65) | async function fetchUsers() {
  function RoleHintDisplay (line 130) | function RoleHintDisplay({ role }) {
  function MessageLimitInput (line 147) | function MessageLimitInput({ enabled, limit, updateState, role }) {

FILE: frontend/src/pages/Admin/Workspaces/NewWorkspaceModal/index.jsx
  function NewWorkspaceModal (line 6) | function NewWorkspaceModal({ closeModal }) {

FILE: frontend/src/pages/Admin/Workspaces/WorkspaceRow/index.jsx
  function WorkspaceRow (line 6) | function WorkspaceRow({ workspace, users: _users }) {

FILE: frontend/src/pages/Admin/Workspaces/index.jsx
  function AdminWorkspaces (line 14) | function AdminWorkspaces() {
  function fetchData (line 62) | async function fetchData() {

FILE: frontend/src/pages/GeneralSettings/ApiKeys/ApiKeyRow/index.jsx
  function ApiKeyRow (line 8) | function ApiKeyRow({ apiKey, removeApiKey }) {

FILE: frontend/src/pages/GeneralSettings/ApiKeys/NewApiKeyModal/index.jsx
  function NewApiKeyModal (line 9) | function NewApiKeyModal({ closeModal, onSuccess }) {

FILE: frontend/src/pages/GeneralSettings/AudioPreference/index.jsx
  function AudioPreference (line 9) | function AudioPreference() {

FILE: frontend/src/pages/GeneralSettings/AudioPreference/stt.jsx
  constant PROVIDERS (line 10) | const PROVIDERS = [
  function SpeechToTextProvider (line 20) | function SpeechToTextProvider({ settings }) {

FILE: frontend/src/pages/GeneralSettings/AudioPreference/tts.jsx
  constant PROVIDERS (line 19) | const PROVIDERS = [
  function TextToSpeechProvider (line 58) | function TextToSpeechProvider({ settings }) {

FILE: frontend/src/pages/GeneralSettings/BrowserExtensionApiKey/BrowserExtensionApiKeyRow/index.jsx
  function BrowserExtensionApiKeyRow (line 7) | function BrowserExtensionApiKeyRow({

FILE: frontend/src/pages/GeneralSettings/BrowserExtensionApiKey/NewBrowserExtensionApiKeyModal/index.jsx
  function NewBrowserExtensionApiKeyModal (line 6) | function NewBrowserExtensionApiKeyModal({

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/EmbedChats/ChatRow/index.jsx
  function ChatRow (line 10) | function ChatRow({ chat, onDelete }) {

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/EmbedChats/MarkdownRenderer.jsx
  function parseContent (line 53) | function parseContent(content) {
  function MarkdownRenderer (line 69) | function MarkdownRenderer({ content }) {

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/EmbedChats/index.jsx
  function handleClickOutside (line 77) | function handleClickOutside(event) {
  function fetchChats (line 94) | async function fetchChats() {

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/EmbedConfigs/EmbedRow/CodeSnippetModal/index.jsx
  function CodeSnippetModal (line 8) | function CodeSnippetModal({ embed, closeModal }) {
  function createScriptTagSnippet (line 46) | function createScriptTagSnippet(embed, scriptHost, serverHost) {

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/EmbedConfigs/EmbedRow/EditEmbedModal/index.jsx
  function EditEmbedModal (line 15) | function EditEmbedModal({ embed, closeModal }) {

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/EmbedConfigs/EmbedRow/index.jsx
  function EmbedRow (line 14) | function EmbedRow({ embed }) {
  function ActiveDomains (line 143) | function ActiveDomains({ domainList }) {

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/EmbedConfigs/NewEmbedModal/index.jsx
  function enforceSubmissionSchema (line 8) | function enforceSubmissionSchema(form) {
  function NewEmbedModal (line 28) | function NewEmbedModal({ closeModal }) {
  function fetchWorkspaces (line 131) | async function fetchWorkspaces() {

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/EmbedConfigs/index.jsx
  function fetchUsers (line 20) | async function fetchUsers() {

FILE: frontend/src/pages/GeneralSettings/ChatEmbedWidgets/index.jsx
  function ChatEmbedWidgets (line 8) | function ChatEmbedWidgets() {
  function WidgetLayout (line 99) | function WidgetLayout({ children }) {
  function WidgetList (line 116) | function WidgetList({ selectedView, handleClick }) {

FILE: frontend/src/pages/GeneralSettings/Chats/ChatRow/index.jsx
  function ChatRow (line 9) | function ChatRow({ chat, onDelete }) {

FILE: frontend/src/pages/GeneralSettings/Chats/MarkdownRenderer.jsx
  function parseContent (line 53) | function parseContent(content) {
  function MarkdownRenderer (line 69) | function MarkdownRenderer({ content }) {

FILE: frontend/src/pages/GeneralSettings/Chats/index.jsx
  function WorkspaceChats (line 50) | function WorkspaceChats() {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Authentication/UserItems/index.jsx
  function UserItems (line 7) | function UserItems({ connectionKey }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Authentication/index.jsx
  function useCommunityHubAuthentication (line 12) | function useCommunityHubAuthentication() {
  function CommunityHubAuthentication (line 97) | function CommunityHubAuthentication() {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Authentication/useUserItems.js
  constant DEFAULT_USER_ITEMS (line 4) | const DEFAULT_USER_ITEMS = {
  function useUserItems (line 14) | function useUserItems({ connectionKey }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/Completed/index.jsx
  function Completed (line 6) | function Completed({ settings, setSettings, setStep }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/Introduction/index.jsx
  function Introduction (line 7) | function Introduction({ settings, setSettings, setStep }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/PullAndReview/HubItem/AgentFlow.jsx
  function AgentFlow (line 10) | function AgentFlow({ item, setStep }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/PullAndReview/HubItem/AgentSkill.jsx
  function AgentSkill (line 17) | function AgentSkill({ item, settings, setStep }) {
  function FileReview (line 116) | function FileReview({ item }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/PullAndReview/HubItem/SlashCommand.jsx
  function SlashCommand (line 7) | function SlashCommand({ item, setStep }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/PullAndReview/HubItem/SystemPrompt.jsx
  function SystemPrompt (line 9) | function SystemPrompt({ item, setStep }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/PullAndReview/HubItem/Unknown.jsx
  function UnknownItem (line 5) | function UnknownItem({ item, setSettings, setStep }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/PullAndReview/index.jsx
  function useGetCommunityHubItem (line 7) | function useGetCommunityHubItem({ importId, updateSettings }) {
  function PullAndReview (line 29) | function PullAndReview({ settings, setSettings, setStep }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/Steps/index.jsx
  function CommunityHubImportItemLayout (line 47) | function CommunityHubImportItemLayout({ setStep, children }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/ImportItem/index.jsx
  function SideBarSelection (line 7) | function SideBarSelection({ setStep, currentStep }) {
  function CommunityHubImportItemFlow (line 70) | function CommunityHubImportItemFlow() {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Trending/HubItems/HubItemCard/agentFlow.jsx
  function AgentFlowHubCard (line 6) | function AgentFlowHubCard({ item }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Trending/HubItems/HubItemCard/agentSkill.jsx
  function AgentSkillHubCard (line 6) | function AgentSkillHubCard({ item }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Trending/HubItems/HubItemCard/generic.jsx
  function GenericHubCard (line 6) | function GenericHubCard({ item }) {
  function VisibilityIcon (line 26) | function VisibilityIcon({ visibility = "public" }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Trending/HubItems/HubItemCard/index.jsx
  function HubItemCard (line 7) | function HubItemCard({ type, item }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Trending/HubItems/HubItemCard/slashCommand.jsx
  function SlashCommandHubCard (line 6) | function SlashCommandHubCard({ item }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Trending/HubItems/HubItemCard/systemPrompt.jsx
  function SystemPromptHubCard (line 6) | function SystemPromptHubCard({ item }) {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Trending/HubItems/index.jsx
  constant DEFAULT_EXPLORE_ITEMS (line 9) | const DEFAULT_EXPLORE_ITEMS = {
  function useCommunityHubExploreItems (line 15) | function useCommunityHubExploreItems() {
  function HubItems (line 37) | function HubItems() {
  function HubCategory (line 54) | function HubCategory({ loading, exploreItems }) {
  function HubItemCardSkeleton (line 90) | function HubItemCardSkeleton() {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/Trending/index.jsx
  function CommunityHub (line 5) | function CommunityHub() {

FILE: frontend/src/pages/GeneralSettings/CommunityHub/utils.js
  function readableType (line 6) | function readableType(type) {
  function typeToPath (line 28) | function typeToPath(type) {

FILE: frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx
  constant EMBEDDERS (line 45) | const EMBEDDERS = [
  function GeneralEmbeddingPreference (line 151) | function GeneralEmbeddingPreference() {

FILE: frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx
  function isNullOrNaN (line 14) | function isNullOrNaN(value) {
  function EmbeddingTextSplitterPreference (line 19) | function EmbeddingTextSplitterPreference() {

FILE: frontend/src/pages/GeneralSettings/LLMPreference/index.jsx
  constant AVAILABLE_LLM_PROVIDERS (line 87) | const AVAILABLE_LLM_PROVIDERS = [
  constant LLM_PREFERENCE_CHANGED_EVENT (line 420) | const LLM_PREFERENCE_CHANGED_EVENT = "llm-preference-changed";
  function GeneralLLMPreference (line 421) | function GeneralLLMPreference() {

FILE: frontend/src/pages/GeneralSettings/MobileConnections/ConnectionModal/index.jsx
  function MobileConnectModal (line 13) | function MobileConnectModal({ isOpen, onClose }) {
  function processConnectionUrl (line 88) | function processConnectionUrl(url) {

FILE: frontend/src/pages/GeneralSettings/MobileConnections/DeviceRow/index.jsx
  function DeviceRow (line 9) | function DeviceRow({ device, removeDevice }) {

FILE: frontend/src/pages/GeneralSettings/PrivacyAndData/index.jsx
  function PrivacyAndDataHandling (line 11) | function PrivacyAndDataHandling() {
  function TelemetryLogs (line 61) | function TelemetryLogs({ settings }) {

FILE: frontend/src/pages/GeneralSettings/Security/index.jsx
  function GeneralSecurity (line 18) | function GeneralSecurity() {
  function MultiUserMode (line 39) | function MultiUserMode() {
  constant PW_REGEX (line 202) | const PW_REGEX = new RegExp(/^[a-zA-Z0-9_\-!@$%^&*();]+$/);
  function PasswordProtection (line 203) | function PasswordProtection() {

FILE: frontend/src/pages/GeneralSettings/Settings/Branding/index.jsx
  function BrandingSettings (line 10) | function BrandingSettings() {

FILE: frontend/src/pages/GeneralSettings/Settings/Chat/index.jsx
  function ChatSettings (line 10) | function ChatSettings() {

FILE: frontend/src/pages/GeneralSettings/Settings/Interface/index.jsx
  function InterfaceSettings (line 7) | function InterfaceSettings() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/AutoSpeak/index.jsx
  function AutoSpeak (line 6) | function AutoSpeak() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/AutoSubmit/index.jsx
  function AutoSubmit (line 6) | function AutoSubmit() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/ChatRenderHTML/index.jsx
  function ChatRenderHTML (line 6) | function ChatRenderHTML() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/CustomAppName/index.jsx
  function CustomAppName (line 7) | function CustomAppName() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/CustomLogo/index.jsx
  function CustomLogo (line 8) | function CustomLogo() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/CustomSiteSettings/index.jsx
  function CustomSiteSettings (line 6) | function CustomSiteSettings() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/FooterCustomization/NewIconForm/index.jsx
  function NewIconForm (line 5) | function NewIconForm({ icon, url, onSave, onRemove }) {

FILE: frontend/src/pages/GeneralSettings/Settings/components/FooterCustomization/index.jsx
  function FooterCustomization (line 9) | function FooterCustomization() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/LanguagePreference/index.jsx
  function LanguagePreference (line 4) | function LanguagePreference() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/ShowScrollbar/index.jsx
  function ShowScrollbar (line 6) | function ShowScrollbar() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/SpellCheck/index.jsx
  function SpellCheck (line 6) | function SpellCheck() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/SupportEmail/index.jsx
  function SupportEmail (line 8) | function SupportEmail() {

FILE: frontend/src/pages/GeneralSettings/Settings/components/ThemePreference/index.jsx
  function ThemePreference (line 4) | function ThemePreference() {

FILE: frontend/src/pages/GeneralSettings/TranscriptionPreference/index.jsx
  constant PROVIDERS (line 16) | const PROVIDERS = [
  function TranscriptionModelPreference (line 33) | function TranscriptionModelPreference() {

FILE: frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx
  constant VECTOR_DBS (line 36) | const VECTOR_DBS = [
  function GeneralVectorDatabase (line 114) | function GeneralVectorDatabase() {

FILE: frontend/src/pages/Invite/NewUserModal/index.jsx
  function NewUserModal (line 14) | function NewUserModal() {

FILE: frontend/src/pages/Invite/index.jsx
  function InvitePage (line 8) | function InvitePage() {

FILE: frontend/src/pages/Login/SSO/simple.jsx
  function SimpleSSOPassthrough (line 8) | function SimpleSSOPassthrough() {

FILE: frontend/src/pages/Login/index.jsx
  function Login (line 17) | function Login() {

FILE: frontend/src/pages/Main/Home/index.jsx
  function getTargetWorkspace (line 30) | async function getTargetWorkspace() {
  function createDefaultWorkspace (line 43) | async function createDefaultWorkspace(workspaceName = "My Workspace") {
  function Home (line 54) | function Home() {
  function HomeContent (line 183) | function HomeContent({ workspace, setWorkspace, threadSlug, setThreadSlu...
  function NoWorkspacesAssigned (line 325) | function NoWorkspacesAssigned() {

FILE: frontend/src/pages/Main/index.jsx
  function Main (line 8) | function Main() {

FILE: frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx
  function DataHandling (line 7) | function DataHandling({ setHeader, setForwardBtn, setBackBtn }) {

FILE: frontend/src/pages/OnboardingFlow/Steps/Home/index.jsx
  constant IMG_SRCSET (line 12) | const IMG_SRCSET = {
  function OnboardingHome (line 23) | function OnboardingHome() {

FILE: frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx
  constant LLMS (line 82) | const LLMS = [
  function LLMPreference (line 341) | function LLMPreference({

FILE: frontend/src/pages/OnboardingFlow/Steps/Survey/index.jsx
  function sendQuestionnaire (line 12) | async function sendQuestionnaire({ email, useCase, comment }) {
  function Survey (line 45) | function Survey({ setHeader, setForwardBtn, setBackBtn }) {

FILE: frontend/src/pages/OnboardingFlow/Steps/UserSetup/index.jsx
  function UserSetup (line 12) | function UserSetup({ setHeader, setForwardBtn, setBackBtn }) {
  function handleYes (line 160) | function handleYes() {
  function handleNo (line 165) | function handleNo() {

FILE: frontend/src/pages/OnboardingFlow/Steps/index.jsx
  function OnboardingLayout (line 21) | function OnboardingLayout({ children }) {

FILE: frontend/src/pages/OnboardingFlow/index.jsx
  function OnboardingFlow (line 5) | function OnboardingFlow() {

FILE: frontend/src/pages/WorkspaceChat/index.jsx
  function WorkspaceChat (line 11) | function WorkspaceChat() {
  function ShowWorkspaceChat (line 22) | function ShowWorkspaceChat() {

FILE: frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/AgentLLMItem/index.jsx
  constant NO_SETTINGS_NEEDED (line 12) | const NO_SETTINGS_NEEDED = ["default", "none"];
  function AgentLLMItem (line 13) | function AgentLLMItem({
  function SetupProvider (line 105) | function SetupProvider({

FILE: frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx
  constant ENABLED_PROVIDERS (line 9) | const ENABLED_PROVIDERS = [
  constant WARN_PERFORMANCE (line 47) | const WARN_PERFORMANCE = [
  constant LLM_DEFAULT (line 56) | const LLM_DEFAULT = {
  constant LLMS (line 66) | const LLMS = [
  function AgentLLMSelection (line 73) | function AgentLLMSelection({

FILE: frontend/src/pages/WorkspaceSettings/AgentConfig/AgentModelSelection/index.jsx
  function supportedModel (line 16) | function supportedModel(provider, model = "") {
  function AgentModelSelection (line 36) | function AgentModelSelection({

FILE: frontend/src/pages/WorkspaceSettings/AgentConfig/index.jsx
  function WorkspaceAgentConfiguration (line 13) | function WorkspaceAgentConfiguration({ workspace }) {
  function LoadingSkeleton (line 122) | function LoadingSkeleton() {

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/ChatHistorySettings/index.jsx
  function ChatHistorySettings (line 2) | function ChatHistorySettings({ workspace, setHasChanges }) {

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/ChatModeSelection/index.jsx
  function ChatModeSelection (line 4) | function ChatModeSelection({ workspace, setHasChanges }) {
  function ChatModeExplanation (line 64) | function ChatModeExplanation({ chatMode = "chat" }) {

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/ChatPromptSettings/ChatPromptHistory/PromptHistoryItem/index.jsx
  constant MAX_PROMPT_LENGTH (line 8) | const MAX_PROMPT_LENGTH = 200;
  function PromptHistoryItem (line 10) | function PromptHistoryItem({

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/ChatPromptSettings/ChatPromptHistory/index.jsx
  function loadHistory (line 17) | function loadHistory() {
  function handleClearAll (line 32) | function handleClearAll() {
  function LoaderSkeleton (line 105) | function LoaderSkeleton() {

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/ChatPromptSettings/index.jsx
  function ChatPromptSettings (line 13) | function ChatPromptSettings({
  function PublishPromptCTA (line 254) | function PublishPromptCTA({ hidden = false, onClick }) {

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/ChatQueryRefusalResponse/index.jsx
  function ChatQueryRefusalResponse (line 3) | function ChatQueryRefusalResponse({ workspace, setHasChanges }) {

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/ChatTemperatureSettings/index.jsx
  function recommendedSettings (line 2) | function recommendedSettings(provider = null) {
  function ChatTemperatureSettings (line 11) | function ChatTemperatureSettings({

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/WorkspaceLLMSelection/ChatModelSelection/index.jsx
  function ChatModelSelection (line 6) | function ChatModelSelection({

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/WorkspaceLLMSelection/WorkspaceLLMItem/index.jsx
  constant NO_SETTINGS_NEEDED (line 12) | const NO_SETTINGS_NEEDED = ["default"];
  function WorkspaceLLM (line 13) | function WorkspaceLLM({
  function SetupProvider (line 103) | function SetupProvider({

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/WorkspaceLLMSelection/index.jsx
  constant FREE_FORM_LLM_SELECTION (line 14) | const FREE_FORM_LLM_SELECTION = ["bedrock", "azure", "generic-openai"];
  constant NO_MODEL_SELECTION (line 18) | const NO_MODEL_SELECTION = ["default", "huggingface"];
  constant DISABLED_PROVIDERS (line 21) | const DISABLED_PROVIDERS = [];
  constant LLM_DEFAULT (line 23) | const LLM_DEFAULT = {
  constant LLMS (line 32) | const LLMS = [LLM_DEFAULT, ...AVAILABLE_LLM_PROVIDERS].filter(
  function WorkspaceLLMSelection (line 36) | function WorkspaceLLMSelection({
  function ModelSelector (line 171) | function ModelSelector({ selectedLLM, workspace, setHasChanges }) {
  function FreeFormLLMInput (line 205) | function FreeFormLLMInput({ workspace, setHasChanges }) {

FILE: frontend/src/pages/WorkspaceSettings/ChatSettings/index.jsx
  function ChatSettings (line 14) | function ChatSettings({ workspace }) {

FILE: frontend/src/pages/WorkspaceSettings/GeneralAppearance/DeleteWorkspace/index.jsx
  function DeleteWorkspace (line 8) | function DeleteWorkspace({ workspace }) {

FILE: frontend/src/pages/WorkspaceSettings/GeneralAppearance/SuggestedChatMessages/index.jsx
  function SuggestedChatMessages (line 8) | function SuggestedChatMessages({ slug }) {

FILE: frontend/src/pages/WorkspaceSettings/GeneralAppearance/WorkspaceName/index.jsx
  function WorkspaceName (line 3) | function WorkspaceName({ workspace, setHasChanges }) {

FILE: frontend/src/pages/WorkspaceSettings/GeneralAppearance/index.jsx
  function GeneralInfo (line 10) | function GeneralInfo({ slug }) {

FILE: frontend/src/pages/WorkspaceSettings/Members/AddMemberModal/index.jsx
  function AddMemberModal (line 6) | function AddMemberModal({ closeModal, workspace, users }) {

FILE: frontend/src/pages/WorkspaceSettings/Members/WorkspaceMemberRow/index.jsx
  function WorkspaceMemberRow (line 3) | function WorkspaceMemberRow({ user }) {

FILE: frontend/src/pages/WorkspaceSettings/Members/index.jsx
  function fetchData (line 18) | async function fetchData() {

FILE: frontend/src/pages/WorkspaceSettings/VectorDatabase/DocumentSimilarityThreshold/index.jsx
  function DocumentSimilarityThreshold (line 3) | function DocumentSimilarityThreshold({

FILE: frontend/src/pages/WorkspaceSettings/VectorDatabase/MaxContextSnippets/index.jsx
  function MaxContextSnippets (line 3) | function MaxContextSnippets({ workspace, setHasChanges }) {

FILE: frontend/src/pages/WorkspaceSettings/VectorDatabase/ResetDatabase/index.jsx
  function ResetDatabase (line 6) | function ResetDatabase({ workspace }) {

FILE: frontend/src/pages/WorkspaceSettings/VectorDatabase/VectorCount/index.jsx
  function VectorCount (line 6) | function VectorCount({ reload, workspace }) {

FILE: frontend/src/pages/WorkspaceSettings/VectorDatabase/VectorDBIdentifier/index.jsx
  function VectorDBIdentifier (line 3) | function VectorDBIdentifier({ workspace }) {

FILE: frontend/src/pages/WorkspaceSettings/VectorDatabase/VectorSearchMode/index.jsx
  function VectorSearchMode (line 19) | function VectorSearchMode({ workspace, setHasChanges }) {

FILE: frontend/src/pages/WorkspaceSettings/VectorDatabase/index.jsx
  function VectorDatabase (line 13) | function VectorDatabase({ workspace }) {

FILE: frontend/src/pages/WorkspaceSettings/index.jsx
  constant TABS (line 28) | const TABS = {
  function WorkspaceSettings (line 36) | function WorkspaceSettings() {
  function ShowWorkspaceChat (line 47) | function ShowWorkspaceChat() {
  function TabItem (line 127) | function TabItem({ title, icon, to, visible = true }) {

FILE: frontend/src/utils/chat/agent.js
  constant AGENT_SESSION_START (line 7) | const AGENT_SESSION_START = "agentSessionStart";
  constant AGENT_SESSION_END (line 8) | const AGENT_SESSION_END = "agentSessionEnd";
  function websocketURI (line 19) | function websocketURI() {
  function handleSocketResponse (line 25) | function handleSocketResponse(socket, event, setChatHistory) {
  function setAgentSessionActive (line 243) | function setAgentSessionActive(value) {
  function getAgentSessionActive (line 246) | function getAgentSessionActive() {
  function useIsAgentSessionActive (line 250) | function useIsAgentSessionActive() {

FILE: frontend/src/utils/chat/hljs-libraries/svelte.js
  function hljsDefineSvelte (line 1) | function hljsDefineSvelte(hljs) {

FILE: frontend/src/utils/chat/index.js
  constant ABORT_STREAM_EVENT (line 3) | const ABORT_STREAM_EVENT = "abort-chat-stream";
  function handleChat (line 6) | function handleChat(
  function getWorkspaceSystemPrompt (line 179) | function getWorkspaceSystemPrompt(workspace) {
  function chatQueryRefusalResponse (line 186) | function chatQueryRefusalResponse(workspace) {

FILE: frontend/src/utils/chat/markdown.js
  function renderMarkdown (line 81) | function renderMarkdown(text = "") {

FILE: frontend/src/utils/chat/plugins/markdown-katex.js
  function isValidDelim (line 5) | function isValidDelim(state, pos) {
  function math_inline (line 35) | function math_inline(state, silent) {
  function math_block (line 147) | function math_block(state, start, end, silent) {
  function math_plugin (line 229) | function math_plugin(md, options) {

FILE: frontend/src/utils/constants.js
  constant API_BASE (line 1) | const API_BASE = import.meta.env.VITE_API_BASE || "/api";
  constant ONBOARDING_SURVEY_URL (line 2) | const ONBOARDING_SURVEY_URL = "https://onboarding.anythingllm.com";
  constant AUTH_USER (line 4) | const AUTH_USER = "anythingllm_user";
  constant AUTH_TOKEN (line 5) | const AUTH_TOKEN = "anythingllm_authToken";
  constant AUTH_TIMESTAMP (line 6) | const AUTH_TIMESTAMP = "anythingllm_authTimestamp";
  constant COMPLETE_QUESTIONNAIRE (line 7) | const COMPLETE_QUESTIONNAIRE = "anythingllm_completed_questionnaire";
  constant SEEN_DOC_PIN_ALERT (line 8) | const SEEN_DOC_PIN_ALERT = "anythingllm_pinned_document_alert";
  constant SEEN_WATCH_ALERT (line 9) | const SEEN_WATCH_ALERT = "anythingllm_watched_document_alert";
  constant LAST_VISITED_WORKSPACE (line 10) | const LAST_VISITED_WORKSPACE = "anythingllm_last_visited_workspace";
  constant USER_PROMPT_INPUT_MAP (line 11) | const USER_PROMPT_INPUT_MAP = "anythingllm_user_prompt_input_map";
  constant PENDING_HOME_MESSAGE (line 12) | const PENDING_HOME_MESSAGE = "anythingllm_pending_home_message";
  constant APPEARANCE_SETTINGS (line 14) | const APPEARANCE_SETTINGS = "anythingllm_appearance_settings";
  constant OLLAMA_COMMON_URLS (line 16) | const OLLAMA_COMMON_URLS = [
  constant LMSTUDIO_COMMON_URLS (line 22) | const LMSTUDIO_COMMON_URLS = [
  constant KOBOLDCPP_COMMON_URLS (line 29) | const KOBOLDCPP_COMMON_URLS = [
  constant LOCALAI_COMMON_URLS (line 36) | const LOCALAI_COMMON_URLS = [
  constant DPAIS_COMMON_URLS (line 43) | const DPAIS_COMMON_URLS = [
  constant NVIDIA_NIM_COMMON_URLS (line 50) | const NVIDIA_NIM_COMMON_URLS = [
  constant DOCKER_MODEL_RUNNER_COMMON_URLS (line 57) | const DOCKER_MODEL_RUNNER_COMMON_URLS = [
  constant LEMONADE_COMMON_URLS (line 65) | const LEMONADE_COMMON_URLS = [
  function fullApiUrl (line 72) | function fullApiUrl() {
  constant POPUP_BROWSER_EXTENSION_EVENT (line 77) | const POPUP_BROWSER_EXTENSION_EVENT = "NEW_BROWSER_EXTENSION_CONNECTION";

FILE: frontend/src/utils/directories.js
  function formatDate (line 3) | function formatDate(dateString) {
  function formatDateTimeAsMoment (line 12) | function formatDateTimeAsMoment(dateString, format = "LLL") {
  function getFileExtension (line 21) | function getFileExtension(path) {
  function middleTruncate (line 28) | function middleTruncate(str, n) {

FILE: frontend/src/utils/keyboardShortcuts.js
  constant KEYBOARD_SHORTCUTS_HELP_EVENT (line 6) | const KEYBOARD_SHORTCUTS_HELP_EVENT = "keyboard-shortcuts-help";
  constant SHORTCUTS (line 8) | const SHORTCUTS = {
  constant LISTENERS (line 73) | const LISTENERS = {};
  function getShortcutKey (line 84) | function getShortcutKey(event) {
  function initKeyboardShortcuts (line 103) | function initKeyboardShortcuts() {
  function useKeyboardShortcuts (line 119) | function useKeyboardShortcuts() {
  function KeyboardShortcutWrapper (line 132) | function KeyboardShortcutWrapper({ children }) {

FILE: frontend/src/utils/numbers.js
  function numberWithCommas (line 3) | function numberWithCommas(input) {
  function nFormatter (line 7) | function nFormatter(input) {
  function dollarFormat (line 11) | function dollarFormat(input) {
  function toPercentString (line 18) | function toPercentString(input = null, decimals = 0) {
  function humanFileSize (line 26) | function humanFileSize(bytes, si = false, dp = 1) {
  function milliToHms (line 50) | function milliToHms(milli = 0) {

FILE: frontend/src/utils/paths.js
  function applyOptions (line 3) | function applyOptions(path, options = {}) {

FILE: frontend/src/utils/piperTTS/index.js
  class PiperTTSClient (line 3) | class PiperTTSClient {
    method constructor (line 8) | constructor({ voiceId } = { voiceId: null }) {
    method #getWorker (line 19) | #getWorker() {
    method voices (line 31) | static async voices() {
    method flush (line 56) | static async flush() {
    method waitForBlobResponse (line 85) | async waitForBlobResponse() {
    method getAudioBlobForText (line 114) | async getAudioBlobForText(textToSpeak, voiceId = null) {

FILE: frontend/src/utils/piperTTS/worker.js
  constant PIPER_SESSION (line 4) | let PIPER_SESSION = null;
  function main (line 45) | async function main(event) {

FILE: frontend/src/utils/request.js
  function userFromStorage (line 5) | function userFromStorage() {
  function baseHeaders (line 11) | function baseHeaders(providedToken = null) {
  function safeJsonParse (line 18) | function safeJsonParse(jsonString, fallback = null) {

FILE: frontend/src/utils/session.js
  function validateSessionTokenForUser (line 5) | async function validateSessionTokenForUser() {

FILE: frontend/src/utils/types.js
  function castToType (line 1) | function castToType(key, value) {

FILE: frontend/src/utils/username.js
  constant USERNAME_REGEX (line 10) | const USERNAME_REGEX = /^[a-z][a-z0-9._@-]*$/;
  constant USERNAME_MIN_LENGTH (line 11) | const USERNAME_MIN_LENGTH = 2;
  constant USERNAME_MAX_LENGTH (line 12) | const USERNAME_MAX_LENGTH = 32;
  constant USERNAME_PATTERN (line 17) | const USERNAME_PATTERN = "[a-z][a-z0-9._@-]*";

FILE: server/__tests__/utils/chats/openaiCompatible.test.js
  method constructor (line 12) | constructor() {

FILE: server/endpoints/admin.js
  function adminEndpoints (line 32) | function adminEndpoints(app) {

FILE: server/endpoints/agentFlows.js
  function agentFlowEndpoints (line 9) | function agentFlowEndpoints(app) {

FILE: server/endpoints/agentWebsocket.js
  function relayToSocket (line 12) | function relayToSocket(message) {
  function agentWebsocket (line 17) | function agentWebsocket(app) {

FILE: server/endpoints/api/admin/index.js
  function apiAdminEndpoints (line 12) | function apiAdminEndpoints(app) {

FILE: server/endpoints/api/auth/index.js
  function apiAuthEndpoints (line 3) | function apiAuthEndpoints(app) {

FILE: server/endpoints/api/document/index.js
  function validateWorkspaceSlugQuery (line 30) | function validateWorkspaceSlugQuery(request, response, next) {
  function apiDocumentEndpoints (line 45) | function apiDocumentEndpoints(app) {

FILE: server/endpoints/api/embed/index.js
  function apiEmbedEndpoints (line 7) | function apiEmbedEndpoints(app) {

FILE: server/endpoints/api/index.js
  function developerEndpoints (line 15) | function developerEndpoints(app, router) {

FILE: server/endpoints/api/openai/helpers.js
  function extractTextContent (line 7) | function extractTextContent(content) {
  function getMimeTypeFromDataUrl (line 20) | function getMimeTypeFromDataUrl(dataUrl) {
  function extractAttachments (line 36) | function extractAttachments(content) {

FILE: server/endpoints/api/openai/index.js
  function apiOpenAICompatibleEndpoints (line 18) | function apiOpenAICompatibleEndpoints(app) {

FILE: server/endpoints/api/system/index.js
  function apiSystemEndpoints (line 10) | function apiSystemEndpoints(app) {

FILE: server/endpoints/api/userManagement/index.js
  function apiUserManagementEndpoints (line 9) | function apiUserManagementEndpoints(app) {

FILE: server/endpoints/api/workspace/index.js
  function apiWorkspaceEndpoints (line 19) | function apiWorkspaceEndpoints(app) {

FILE: server/endpoints/api/workspaceThread/index.js
  function apiWorkspaceThreadEndpoints (line 18) | function apiWorkspaceThreadEndpoints(app) {

FILE: server/endpoints/browserExtension.js
  function browserExtensionEndpoints (line 16) | function browserExtensionEndpoints(app) {

FILE: server/endpoints/chat.js
  function chatEndpoints (line 21) | function chatEndpoints(app) {

FILE: server/endpoints/communityHub.js
  function communityHubEndpoints (line 16) | function communityHubEndpoints(app) {

FILE: server/endpoints/document.js
  function documentEndpoints (line 12) | function documentEndpoints(app) {

FILE: server/endpoints/embed/index.js
  function embeddedEndpoints (line 16) | function embeddedEndpoints(app) {

FILE: server/endpoints/embedManagement.js
  function embedManagementEndpoints (line 15) | function embedManagementEndpoints(app) {

FILE: server/endpoints/experimental/imported-agent-plugins.js
  function importedAgentPluginEndpoints (line 9) | function importedAgentPluginEndpoints(app) {

FILE: server/endpoints/experimental/index.js
  function experimentalEndpoints (line 7) | function experimentalEndpoints(router) {

FILE: server/endpoints/experimental/liveSync.js
  function liveSyncEndpoints (line 17) | function liveSyncEndpoints(app) {

FILE: server/endpoints/extensions/index.js
  function extensionEndpoints (line 12) | function extensionEndpoints(app) {

FILE: server/endpoints/invite.js
  function inviteEndpoints (line 9) | function inviteEndpoints(app) {

FILE: server/endpoints/mcpServers.js
  function mcpServersEndpoints (line 9) | function mcpServersEndpoints(app) {

FILE: server/endpoints/mobile/index.js
  function mobileEndpoints (line 11) | function mobileEndpoints(app) {

FILE: server/endpoints/mobile/middleware/index.js
  function validDeviceToken (line 12) | async function validDeviceToken(request, response, next) {
  function validRegistrationToken (line 52) | async function validRegistrationToken(request, response, next) {

FILE: server/endpoints/mobile/utils/index.js
  function handleMobileCommand (line 16) | async function handleMobileCommand(request, response) {

FILE: server/endpoints/system.js
  function systemEndpoints (line 64) | function systemEndpoints(app) {

FILE: server/endpoints/utils.js
  function utilEndpoints (line 3) | function utilEndpoints(app) {
  function getGitVersion (line 34) | function getGitVersion() {
  function byteToGigaByte (line 47) | function byteToGigaByte(n) {
  function getDiskStorage (line 51) | async function getDiskStorage() {
  function getModelTag (line 76) | function getModelTag() {
  function getDeploymentVersion (line 192) | function getDeploymentVersion() {
  function getAnythingLLMUserAgent (line 203) | function getAnythingLLMUserAgent() {

FILE: server/endpoints/utils/dockerModelRunnerUtils.js
  function dockerModelRunnerUtilsEndpoints (line 9) | function dockerModelRunnerUtilsEndpoints(app) {

FILE: server/endpoints/utils/lemonadeUtilsEndpoints.js
  function lemonadeUtilsEndpoints (line 12) | function lemonadeUtilsEndpoints(app) {

FILE: server/endpoints/webPush.js
  function webPushEndpoints (line 5) | function webPushEndpoints(app) {

FILE: server/endpoints/workspaceThreads.js
  function workspaceThreadEndpoints (line 23) | function workspaceThreadEndpoints(app) {

FILE: server/endpoints/workspaces.js
  function workspaceEndpoints (line 42) | function workspaceEndpoints(app) {

FILE: server/endpoints/workspacesParsedFiles.js
  function workspaceParsedFilesEndpoints (line 15) | function workspaceParsedFilesEndpoints(app) {

FILE: server/index.js
  constant FILE_LIMIT (line 36) | const FILE_LIMIT = "3GB";

FILE: server/jobs/cleanup-orphan-documents.js
  function batchDeleteFiles (line 8) | async function batchDeleteFiles(filesToDelete, batchSize = 500) {

FILE: server/jobs/helpers/index.js
  function log (line 9) | function log(stringContent = "") {
  function conclude (line 18) | function conclude() {
  function updateSourceDocument (line 23) | function updateSourceDocument(docPath = null, jsonContent = {}) {

FILE: server/models/embedConfig.js
  constant BOOLEAN_KEYS (line 187) | const BOOLEAN_KEYS = [
  constant NUMBER_KEYS (line 194) | const NUMBER_KEYS = [
  function validatedCreationData (line 202) | function validatedCreationData(value, field) {

FILE: server/models/slashCommandsPresets.js
  constant CMD_REGEX (line 3) | const CMD_REGEX = new RegExp(/[^a-zA-Z0-9_-]/g);

FILE: server/models/systemSettings.js
  function isNullOrNaN (line 16) | function isNullOrNaN(value) {
  function mergeConnections (line 794) | function mergeConnections(existingConnections = [], updates = []) {

FILE: server/models/workspace.js
  function isNullOrNaN (line 11) | function isNullOrNaN(value) {
  method _getCurrentContextTokenCount (line 314) | async _getCurrentContextTokenCount(workspaceId, threadId = null) {

FILE: server/prisma/migrations/20230921191814_init/migration.sql
  type "api_keys" (line 2) | CREATE TABLE "api_keys" (
  type "workspace_documents" (line 11) | CREATE TABLE "workspace_documents" (
  type "invites" (line 24) | CREATE TABLE "invites" (
  type "system_settings" (line 35) | CREATE TABLE "system_settings" (
  type "users" (line 44) | CREATE TABLE "users" (
  type "document_vectors" (line 55) | CREATE TABLE "document_vectors" (
  type "welcome_messages" (line 64) | CREATE TABLE "welcome_messages" (
  type "workspaces" (line 73) | CREATE TABLE "workspaces" (
  type "workspace_chats" (line 86) | CREATE TABLE "workspace_chats" (
  type "workspace_users" (line 99) | CREATE TABLE "workspace_users" (
  type "api_keys" (line 110) | CREATE UNIQUE INDEX "api_keys_secret_key" ON "api_keys"("secret")
  type "workspace_documents" (line 113) | CREATE UNIQUE INDEX "workspace_documents_docId_key" ON "workspace_docume...
  type "invites" (line 116) | CREATE UNIQUE INDEX "invites_code_key" ON "invites"("code")
  type "system_settings" (line 119) | CREATE UNIQUE INDEX "system_settings_label_key" ON "system_settings"("la...
  type "users" (line 122) | CREATE UNIQUE INDEX "users_username_key" ON "users"("username")
  type "workspaces" (line 125) | CREATE UNIQUE INDEX "workspaces_slug_key" ON "workspaces"("slug")

FILE: server/prisma/migrations/20231101195421_init/migration.sql
  type "cache_data" (line 2) | CREATE TABLE "cache_data" (

FILE: server/prisma/migrations/20240202002020_init/migration.sql
  type "embed_configs" (line 2) | CREATE TABLE "embed_configs" (
  type "embed_chats" (line 22) | CREATE TABLE "embed_chats" (
  type "embed_configs" (line 37) | CREATE UNIQUE INDEX "embed_configs_uuid_key" ON "embed_configs"("uuid")

FILE: server/prisma/migrations/20240206181106_init/migration.sql
  type "workspace_suggested_messages" (line 2) | CREATE TABLE "workspace_suggested_messages" (
  type "workspace_suggested_messages" (line 13) | CREATE INDEX "workspace_suggested_messages_workspaceId_idx" ON "workspac...

FILE: server/prisma/migrations/20240206211916_init/migration.sql
  type "event_logs" (line 2) | CREATE TABLE "event_logs" (
  type "event_logs" (line 11) | CREATE INDEX "event_logs_event_idx" ON "event_logs"("event")

FILE: server/prisma/migrations/20240208224848_init/migration.sql
  type "workspace_threads" (line 5) | CREATE TABLE "workspace_threads" (
  type "workspace_threads" (line 18) | CREATE UNIQUE INDEX "workspace_threads_slug_key" ON "workspace_threads"(...
  type "workspace_threads" (line 21) | CREATE INDEX "workspace_threads_workspace_id_idx" ON "workspace_threads"...
  type "workspace_threads" (line 24) | CREATE INDEX "workspace_threads_user_id_idx" ON "workspace_threads"("use...

FILE: server/prisma/migrations/20240412183346_init/migration.sql
  type "workspace_agent_invocations" (line 6) | CREATE TABLE "workspace_agent_invocations" (
  type "workspace_agent_invocations" (line 21) | CREATE UNIQUE INDEX "workspace_agent_invocations_uuid_key" ON "workspace...
  type "workspace_agent_invocations" (line 24) | CREATE INDEX "workspace_agent_invocations_uuid_idx" ON "workspace_agent_...

FILE: server/prisma/migrations/20240425004220_init/migration.sql
  type "recovery_codes" (line 5) | CREATE TABLE "recovery_codes" (
  type "password_reset_tokens" (line 14) | CREATE TABLE "password_reset_tokens" (
  type "recovery_codes" (line 24) | CREATE INDEX "recovery_codes_user_id_idx" ON "recovery_codes"("user_id")
  type "password_reset_tokens" (line 27) | CREATE UNIQUE INDEX "password_reset_tokens_token_key" ON "password_reset...
  type "password_reset_tokens" (line 30) | CREATE INDEX "password_reset_tokens_user_id_idx" ON "password_reset_toke...

FILE: server/prisma/migrations/20240510032311_init/migration.sql
  type "slash_command_presets" (line 2) | CREATE TABLE "slash_command_presets" (
  type "slash_command_presets" (line 15) | CREATE UNIQUE INDEX "slash_command_presets_uid_command_key" ON "slash_co...

FILE: server/prisma/migrations/20240618224346_init/migration.sql
  type "document_sync_queues" (line 5) | CREATE TABLE "document_sync_queues" (
  type "document_sync_executions" (line 16) | CREATE TABLE "document_sync_executions" (
  type "document_sync_queues" (line 26) | CREATE UNIQUE INDEX "document_sync_queues_workspaceDocId_key" ON "docume...

FILE: server/prisma/migrations/20240824005054_init/migration.sql
  type "browser_extension_api_keys" (line 2) | CREATE TABLE "browser_extension_api_keys" (
  type "browser_extension_api_keys" (line 12) | CREATE UNIQUE INDEX "browser_extension_api_keys_key_key" ON "browser_ext...
  type "browser_extension_api_keys" (line 15) | CREATE INDEX "browser_extension_api_keys_user_id_idx" ON "browser_extens...

FILE: server/prisma/migrations/20241029203722_init/migration.sql
  type "temporary_auth_tokens" (line 2) | CREATE TABLE "temporary_auth_tokens" (
  type "temporary_auth_tokens" (line 12) | CREATE UNIQUE INDEX "temporary_auth_tokens_token_key" ON "temporary_auth...

FILE: server/prisma/migrations/20241029233509_init/migration.sql
  type "temporary_auth_tokens" (line 2) | CREATE INDEX "temporary_auth_tokens_token_idx" ON "temporary_auth_tokens...
  type "temporary_auth_tokens" (line 5) | CREATE INDEX "temporary_auth_tokens_userId_idx" ON "temporary_auth_token...

FILE: server/prisma/migrations/20250318154720_init/migration.sql
  type "system_prompt_variables" (line 2) | CREATE TABLE "system_prompt_variables" (
  type "system_prompt_variables" (line 15) | CREATE UNIQUE INDEX "system_prompt_variables_key_key" ON "system_prompt_...
  type "system_prompt_variables" (line 18) | CREATE INDEX "system_prompt_variables_userId_idx" ON "system_prompt_vari...

FILE: server/prisma/migrations/20250506214129_init/migration.sql
  type "prompt_history" (line 2) | CREATE TABLE "prompt_history" (
  type "prompt_history" (line 13) | CREATE INDEX "prompt_history_workspaceId_idx" ON "prompt_history"("works...

FILE: server/prisma/migrations/20250725194841_init/migration.sql
  type "desktop_mobile_devices" (line 2) | CREATE TABLE "desktop_mobile_devices" (
  type "desktop_mobile_devices" (line 14) | CREATE UNIQUE INDEX "desktop_mobile_devices_token_key" ON "desktop_mobil...
  type "desktop_mobile_devices" (line 17) | CREATE INDEX "desktop_mobile_devices_userId_idx" ON "desktop_mobile_devi...

FILE: server/prisma/migrations/20250808171557_init/migration.sql
  type "workspace_parsed_files" (line 2) | CREATE TABLE "workspace_parsed_files" (
  type "workspace_parsed_files" (line 17) | CREATE UNIQUE INDEX "workspace_parsed_files_filename_key" ON "workspace_...
  type "workspace_parsed_files" (line 20) | CREATE INDEX "workspace_parsed_files_workspaceId_idx" ON "workspace_pars...
  type "workspace_parsed_files" (line 23) | CREATE INDEX "workspace_parsed_files_userId_idx" ON "workspace_parsed_fi...

FILE: server/prisma/seed.js
  function main (line 4) | async function main() {

FILE: server/swagger/index.js
  function waitForElm (line 1) | function waitForElm(selector) {

FILE: server/swagger/utils.js
  function faviconUrl (line 5) | function faviconUrl() {
  function useSwagger (line 11) | function useSwagger(app) {

FILE: server/utils/AiProviders/anthropic/index.js
  class AnthropicLLM (line 13) | class AnthropicLLM {
    method constructor (line 14) | constructor(embedder = null, modelPreference = null) {
    method log (line 42) | log(text, ...args) {
    method streamingEnabled (line 46) | streamingEnabled() {
    method promptWindowLimit (line 50) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 54) | promptWindowLimit() {
    method isValidChatCompletionModel (line 58) | isValidChatCompletionModel(_modelName = "") {
    method cacheControl (line 73) | get cacheControl() {
    method #buildSystemPrompt (line 93) | #buildSystemPrompt(systemContent) {
    method #generateContent (line 109) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 128) | constructPrompt({
    method getChatCompletion (line 150) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 185) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 211) | handleStream(response, stream, responseProps) {
    method #appendContext (line 298) | #appendContext(contextTexts = []) {
    method compressMessages (line 310) | async compressMessages(promptArgs = {}, rawHistory = []) {
    method embedTextInput (line 321) | async embedTextInput(textInput) {
    method embedChunks (line 324) | async embedChunks(textChunks = []) {

FILE: server/utils/AiProviders/apipie/index.js
  class ApiPieLLM (line 21) | class ApiPieLLM {
    method constructor (line 22) | constructor(embedder = null, modelPreference = null) {
    method log (line 52) | log(text, ...args) {
    method #cacheIsStale (line 59) | #cacheIsStale() {
    method #syncModels (line 73) | async #syncModels() {
    method #appendContext (line 82) | #appendContext(contextTexts = []) {
    method models (line 94) | models() {
    method chatModels (line 102) | chatModels() {
    method streamingEnabled (line 120) | streamingEnabled() {
    method promptWindowLimit (line 124) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 135) | promptWindowLimit() {
    method isValidChatCompletionModel (line 140) | async isValidChatCompletionModel(model = "") {
    method #generateContent (line 151) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 169) | constructPrompt({
    method getChatCompletion (line 190) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 230) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 251) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 321) | async embedTextInput(textInput) {
    method embedChunks (line 324) | async embedChunks(textChunks = []) {
    method compressMessages (line 328) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function fetchApiPieModels (line 335) | async function fetchApiPieModels(providedApiKey = null) {

FILE: server/utils/AiProviders/azureOpenAi/index.js
  class AzureOpenAiLLM (line 10) | class AzureOpenAiLLM {
    method constructor (line 11) | constructor(embedder = null, modelPreference = null) {
    method formatBaseUrl (line 53) | static formatBaseUrl(azureOpenAiEndpoint) {
    method #log (line 68) | #log(text, ...args) {
    method #appendContext (line 72) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 84) | streamingEnabled() {
    method promptWindowLimit (line 88) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 97) | promptWindowLimit() {
    method isValidChatCompletionModel (line 103) | isValidChatCompletionModel(_modelName = "") {
    method #generateContent (line 115) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 132) | constructPrompt({
    method getChatCompletion (line 153) | async getChatCompletion(messages = [], { temperature = 0.7 }) {
    method streamGetChatCompletion (line 188) | async streamGetChatCompletion(messages = [], { temperature = 0.7 }) {
    method handleStream (line 211) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 216) | async embedTextInput(textInput) {
    method embedChunks (line 219) | async embedChunks(textChunks = []) {
    method compressMessages (line 223) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/bedrock/index.js
  class AWSBedrockLLM (line 24) | class AWSBedrockLLM {
    method constructor (line 44) | constructor(embedder = null, modelPreference = null) {
    method credentials (line 102) | get credentials() {
    method authMethod (line 111) | get authMethod() {
    method #appendContext (line 121) | #appendContext(contextTexts = []) {
    method #log (line 137) | #log(text, ...args) {
    method #slog (line 145) | static #slog(text, ...args) {
    method streamingEnabled (line 155) | streamingEnabled() {
    method promptWindowLimit (line 166) | static promptWindowLimit() {
    method promptWindowLimit (line 184) | promptWindowLimit() {
    method getMaxOutputTokens (line 194) | getMaxOutputTokens() {
    method isValidChatCompletionModel (line 215) | async isValidChatCompletionModel(_modelName = "") {
    method #validateAttachments (line 225) | #validateAttachments(attachments = []) {
    method #generateContent (line 278) | #generateContent({ userPrompt = "", attachments = [] }) {
    method constructPrompt (line 302) | constructPrompt({
    method #parseReasoningFromResponse (line 364) | #parseReasoningFromResponse({ content = [] }) {
    method getChatCompletion (line 392) | async getChatCompletion(messages = null, { temperature }) {
    method streamGetChatCompletion (line 466) | async streamGetChatCompletion(messages = null, { temperature }) {
    method handleStream (line 525) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 719) | async embedTextInput(textInput) {
    method embedChunks (line 722) | async embedChunks(textChunks = []) {
    method compressMessages (line 726) | async compressMessages(promptArgs = {}, rawHistory = []) {
    method errorToHumanReadable (line 732) | static errorToHumanReadable(

FILE: server/utils/AiProviders/bedrock/utils.js
  constant SUPPORTED_BEDROCK_IMAGE_FORMATS (line 6) | const SUPPORTED_BEDROCK_IMAGE_FORMATS = ["jpeg", "png", "gif", "webp"];
  constant DEFAULT_MAX_OUTPUT_TOKENS (line 9) | const DEFAULT_MAX_OUTPUT_TOKENS = 4096;
  constant DEFAULT_CONTEXT_WINDOW_TOKENS (line 12) | const DEFAULT_CONTEXT_WINDOW_TOKENS = 8191;
  constant SUPPORTED_CONNECTION_METHODS (line 15) | const SUPPORTED_CONNECTION_METHODS = [
  function getBedrockAuthMethod (line 26) | function getBedrockAuthMethod() {
  function createBedrockCredentials (line 36) | function createBedrockCredentials(authMethod) {
  function createBedrockRuntimeClient (line 69) | function createBedrockRuntimeClient(authMethod, credentials) {
  function createBedrockChatClient (line 95) | function createBedrockChatClient(config = {}, authMethod, credentials, m...
  function getImageFormatFromMime (line 114) | function getImageFormatFromMime(mimeType = "") {
  function base64ToUint8Array (line 140) | function base64ToUint8Array(base64String) {

FILE: server/utils/AiProviders/cohere/index.js
  class CohereLLM (line 9) | class CohereLLM {
    method constructor (line 10) | constructor(embedder = null) {
    method #log (line 34) | #log(text, ...args) {
    method #appendContext (line 38) | #appendContext(contextTexts = []) {
    method #convertChatHistoryCohere (line 50) | #convertChatHistoryCohere(chatHistory = []) {
    method streamingEnabled (line 69) | streamingEnabled() {
    method promptWindowLimit (line 73) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 77) | promptWindowLimit() {
    method isValidChatCompletionModel (line 81) | async isValidChatCompletionModel() {
    method constructPrompt (line 85) | constructPrompt({
    method getChatCompletion (line 98) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 134) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 160) | async handleStream(response, stream, responseProps) {
    method embedTextInput (line 235) | async embedTextInput(textInput) {
    method embedChunks (line 238) | async embedChunks(textChunks = []) {
    method compressMessages (line 242) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/cometapi/index.js
  class CometApiLLM (line 21) | class CometApiLLM {
    method constructor (line 23) | constructor(embedder = null, modelPreference = null) {
    method log (line 58) | log(text, ...args) {
    method #parseTimeout (line 68) | #parseTimeout() {
    method #cacheIsStale (line 82) | #cacheIsStale() {
    method #syncModels (line 95) | async #syncModels() {
    method #appendContext (line 106) | #appendContext(contextTexts = []) {
    method models (line 118) | models() {
    method streamingEnabled (line 126) | streamingEnabled() {
    method promptWindowLimit (line 130) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 141) | promptWindowLimit() {
    method isValidChatCompletionModel (line 146) | async isValidChatCompletionModel(model = "") {
    method #generateContent (line 157) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 175) | constructPrompt({
    method getChatCompletion (line 196) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 235) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 263) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 369) | async embedTextInput(textInput) {
    method embedChunks (line 372) | async embedChunks(textChunks = []) {
    method compressMessages (line 376) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function fetchCometApiModels (line 387) | async function fetchCometApiModels() {

FILE: server/utils/AiProviders/deepseek/index.js
  class DeepSeekLLM (line 12) | class DeepSeekLLM {
    method constructor (line 13) | constructor(embedder = null, modelPreference = null) {
    method log (line 38) | log(text, ...args) {
    method #appendContext (line 42) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 54) | streamingEnabled() {
    method promptWindowLimit (line 58) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 62) | promptWindowLimit() {
    method isValidChatCompletionModel (line 66) | async isValidChatCompletionModel(modelName = "") {
    method constructPrompt (line 71) | constructPrompt({
    method #parseReasoningFromResponse (line 89) | #parseReasoningFromResponse({ message }) {
    method getChatCompletion (line 99) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 140) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 165) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 301) | async embedTextInput(textInput) {
    method embedChunks (line 304) | async embedChunks(textChunks = []) {
    method compressMessages (line 308) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/dellProAiStudio/index.js
  class DellProAiStudioLLM (line 11) | class DellProAiStudioLLM {
    method constructor (line 12) | constructor(embedder = null, modelPreference = null) {
    method parseBasePath (line 43) | static parseBasePath(providedBasePath = process.env.DPAIS_LLM_BASE_PAT...
    method log (line 53) | log(text, ...args) {
    method #appendContext (line 57) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 69) | streamingEnabled() {
    method promptWindowLimit (line 73) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 82) | promptWindowLimit() {
    method isValidChatCompletionModel (line 89) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 98) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 119) | constructPrompt({
    method getChatCompletion (line 140) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 175) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 196) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 201) | async embedTextInput(textInput) {
    method embedChunks (line 204) | async embedChunks(textChunks = []) {
    method compressMessages (line 208) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/dockerModelRunner/index.js
  class DockerModelRunnerLLM (line 15) | class DockerModelRunnerLLM {
    method constructor (line 23) | constructor(embedder = null, modelPreference = null) {
    method #log (line 51) | #log(text, ...args) {
    method slog (line 55) | static slog(text, ...args) {
    method assertModelContextLimits (line 59) | async assertModelContextLimits() {
    method #appendContext (line 68) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 80) | streamingEnabled() {
    method promptWindowLimit (line 85) | static promptWindowLimit(_) {
    method promptWindowLimit (line 91) | promptWindowLimit() {
    method isValidChatCompletionModel (line 95) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 104) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 127) | constructPrompt({
    method getChatCompletion (line 148) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 183) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 204) | handleStream(response, stream, responseProps) {
    method getModelCapabilities (line 215) | async getModelCapabilities() {
    method embedTextInput (line 250) | async embedTextInput(textInput) {
    method embedChunks (line 253) | async embedChunks(textChunks = []) {
    method compressMessages (line 257) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function parseDockerModelRunnerEndpoint (line 271) | function parseDockerModelRunnerEndpoint(basePath = null, to = "openai") {
  function filterByTask (line 301) | function filterByTask(task = "chat", models = {}) {
  function fetchRemoteModels (line 323) | async function fetchRemoteModels(task = "chat") {
  function getDockerModels (line 445) | async function getDockerModels(basePath = null, task = "chat") {

FILE: server/utils/AiProviders/fireworksAi/index.js
  class FireworksAiLLM (line 18) | class FireworksAiLLM {
    method constructor (line 19) | constructor(embedder = null, modelPreference = null) {
    method log (line 45) | log(text, ...args) {
    method #cacheIsStale (line 52) | #cacheIsStale() {
    method #syncModels (line 66) | async #syncModels() {
    method models (line 77) | models() {
    method #appendContext (line 85) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 97) | streamingEnabled() {
    method promptWindowLimit (line 101) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 114) | promptWindowLimit() {
    method isValidChatCompletionModel (line 119) | async isValidChatCompletionModel(model = "") {
    method constructPrompt (line 125) | constructPrompt({
    method getChatCompletion (line 138) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 173) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 194) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 199) | async embedTextInput(textInput) {
    method embedChunks (line 202) | async embedChunks(textChunks = []) {
    method compressMessages (line 206) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function fireworksAiModels (line 213) | async function fireworksAiModels(providedApiKey = null) {

FILE: server/utils/AiProviders/foundry/index.js
  class FoundryLLM (line 14) | class FoundryLLM {
    method constructor (line 18) | constructor(embedder = null, modelPreference = null) {
    method #slog (line 36) | static #slog(text, ...args) {
    method #log (line 40) | #log(text, ...args) {
    method assertModelContextLimits (line 44) | async assertModelContextLimits() {
    method #appendContext (line 54) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 66) | streamingEnabled() {
    method cacheContextWindows (line 81) | static async cacheContextWindows(force = false) {
    method unloadModelFromEngine (line 113) | static async unloadModelFromEngine(modelName) {
    method promptWindowLimit (line 123) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 149) | promptWindowLimit() {
    method isValidChatCompletionModel (line 153) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 162) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 185) | constructPrompt({
    method getChatCompletion (line 206) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 246) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method timeout (line 273) | get timeout() {
    method handleStream (line 284) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 441) | async embedTextInput(textInput) {
    method embedChunks (line 444) | async embedChunks(textChunks = []) {
    method compressMessages (line 448) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function parseFoundryBasePath (line 462) | function parseFoundryBasePath(providedBasePath = "") {

FILE: server/utils/AiProviders/gemini/index.js
  constant NO_SYSTEM_PROMPT_MODELS (line 20) | const NO_SYSTEM_PROMPT_MODELS = [
  class GeminiLLM (line 27) | class GeminiLLM {
    method constructor (line 28) | constructor(embedder = null, modelPreference = null) {
    method supportsSystemPrompt (line 70) | get supportsSystemPrompt() {
    method #log (line 74) | #log(text, ...args) {
    method cacheIsStale (line 81) | static cacheIsStale() {
    method #appendContext (line 91) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 103) | streamingEnabled() {
    method promptWindowLimit (line 107) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 126) | promptWindowLimit() {
    method isExperimentalModel (line 149) | isExperimentalModel(modelName) {
    method fetchModels (line 172) | static async fetchModels(apiKey, limit = 1_000, pageToken = null) {
    method isValidChatCompletionModel (line 310) | async isValidChatCompletionModel(modelName = "") {
    method #generateContent (line 320) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 341) | constructPrompt({
    method getChatCompletion (line 380) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 415) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 435) | handleStream(response, stream, responseProps) {
    method compressMessages (line 439) | async compressMessages(promptArgs = {}, rawHistory = []) {
    method embedTextInput (line 446) | async embedTextInput(textInput) {
    method embedChunks (line 449) | async embedChunks(textChunks = []) {

FILE: server/utils/AiProviders/gemini/syncStaticLists.mjs
  function updateDefaultModelsFile (line 27) | function updateDefaultModelsFile(models) {

FILE: server/utils/AiProviders/genericOpenAi/index.js
  class GenericOpenAiLLM (line 14) | class GenericOpenAiLLM {
    method constructor (line 15) | constructor(embedder = null, modelPreference = null) {
    method log (line 50) | log(text, ...args) {
    method parseCustomHeaders (line 59) | static parseCustomHeaders() {
    method #appendContext (line 79) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 91) | streamingEnabled() {
    method promptWindowLimit (line 96) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 105) | promptWindowLimit() {
    method isValidChatCompletionModel (line 114) | isValidChatCompletionModel(_modelName = "") {
    method #generateContent (line 135) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 158) | constructPrompt({
    method #extractLlamaCppTimings (line 186) | #extractLlamaCppTimings(response, usage) {
    method #parseReasoningFromResponse (line 201) | #parseReasoningFromResponse({ message }) {
    method getChatCompletion (line 211) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 251) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 271) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 408) | async embedTextInput(textInput) {
    method embedChunks (line 411) | async embedChunks(textChunks = []) {
    method compressMessages (line 415) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/giteeai/index.js
  constant LEGACY_MODEL_MAP (line 5) | const LEGACY_MODEL_MAP = require("../modelMap/legacy");
  class GiteeAILLM (line 20) | class GiteeAILLM {
    method constructor (line 21) | constructor(embedder = null, modelPreference = null) {
    method log (line 48) | log(text, ...args) {
    method models (line 52) | models() {
    method #appendContext (line 60) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 72) | streamingEnabled() {
    method promptWindowLimit (line 76) | static promptWindowLimit(model) {
    method promptWindowLimit (line 84) | promptWindowLimit() {
    method isValidChatCompletionModel (line 92) | async isValidChatCompletionModel(_modelName = "") {
    method constructPrompt (line 96) | constructPrompt({
    method #parseReasoningFromResponse (line 114) | #parseReasoningFromResponse({ message }) {
    method getChatCompletion (line 124) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 160) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 180) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 316) | async embedTextInput(textInput) {
    method embedChunks (line 320) | async embedChunks(textChunks = []) {
    method compressMessages (line 324) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function giteeAiModels (line 331) | async function giteeAiModels() {

FILE: server/utils/AiProviders/groq/index.js
  class GroqLLM (line 10) | class GroqLLM {
    method constructor (line 11) | constructor(embedder = null, modelPreference = null) {
    method #appendContext (line 32) | #appendContext(contextTexts = []) {
    method #log (line 44) | #log(text, ...args) {
    method streamingEnabled (line 48) | streamingEnabled() {
    method promptWindowLimit (line 52) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 56) | promptWindowLimit() {
    method isValidChatCompletionModel (line 60) | async isValidChatCompletionModel(modelName = "") {
    method #generateContent (line 69) | #generateContent({ userPrompt, attachments = [] }) {
    method #conditionalPromptStruct (line 96) | #conditionalPromptStruct({
    method constructPrompt (line 156) | constructPrompt({
    method getChatCompletion (line 173) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 214) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 236) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 241) | async embedTextInput(textInput) {
    method embedChunks (line 244) | async embedChunks(textChunks = []) {
    method compressMessages (line 248) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/huggingface/index.js
  class HuggingFaceLLM (line 9) | class HuggingFaceLLM {
    method constructor (line 10) | constructor(embedder = null, _modelPreference = null) {
    method #appendContext (line 36) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 48) | streamingEnabled() {
    method promptWindowLimit (line 52) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 59) | promptWindowLimit() {
    method isValidChatCompletionModel (line 66) | async isValidChatCompletionModel(_ = "") {
    method constructPrompt (line 70) | constructPrompt({
    method getChatCompletion (line 93) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 128) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 144) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 149) | async embedTextInput(textInput) {
    method embedChunks (line 152) | async embedChunks(textChunks = []) {
    method compressMessages (line 156) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/koboldCPP/index.js
  class KoboldCPPLLM (line 12) | class KoboldCPPLLM {
    method constructor (line 13) | constructor(embedder = null, modelPreference = null) {
    method log (line 40) | log(text, ...args) {
    method #appendContext (line 44) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 56) | streamingEnabled() {
    method promptWindowLimit (line 60) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 69) | promptWindowLimit() {
    method isValidChatCompletionModel (line 78) | isValidChatCompletionModel(_modelName = "") {
    method #generateContent (line 87) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 109) | constructPrompt({
    method getChatCompletion (line 130) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 170) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 187) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 248) | async embedTextInput(textInput) {
    method embedChunks (line 251) | async embedChunks(textChunks = []) {
    method compressMessages (line 255) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/lemonade/index.js
  class LemonadeLLM (line 12) | class LemonadeLLM {
    method constructor (line 13) | constructor(embedder = null, modelPreference = null) {
    method #log (line 41) | #log(text, ...args) {
    method slog (line 45) | static slog(text, ...args) {
    method assertModelContextLimits (line 49) | async assertModelContextLimits() {
    method #appendContext (line 61) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 73) | streamingEnabled() {
    method promptWindowLimit (line 78) | static promptWindowLimit(_) {
    method promptWindowLimit (line 82) | promptWindowLimit() {
    method isValidChatCompletionModel (line 86) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 95) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 118) | constructPrompt({
    method getChatCompletion (line 139) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 170) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 187) | handleStream(response, stream, responseProps) {
    method getModelCapabilities (line 198) | async getModelCapabilities() {
    method loadModel (line 231) | static async loadModel(model, basePath = process.env.LEMONADE_LLM_BASE...
    method embedTextInput (line 268) | async embedTextInput(textInput) {
    method embedChunks (line 271) | async embedChunks(textChunks = []) {
    method compressMessages (line 275) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function extractModelOrganization (line 293) | function extractModelOrganization(modelId) {
  function parseLemonadeServerEndpoint (line 304) | function parseLemonadeServerEndpoint(basePath = null, to = "openai") {
  function getAllLemonadeModels (line 323) | async function getAllLemonadeModels(basePath = null, task = "chat") {

FILE: server/utils/AiProviders/liteLLM/index.js
  class LiteLLM (line 10) | class LiteLLM {
    method constructor (line 11) | constructor(embedder = null, modelPreference = null) {
    method log (line 38) | log(text, ...args) {
    method #appendContext (line 42) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 54) | streamingEnabled() {
    method promptWindowLimit (line 58) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 67) | promptWindowLimit() {
    method isValidChatCompletionModel (line 76) | isValidChatCompletionModel(_modelName = "") {
    method #generateContent (line 85) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 107) | constructPrompt({
    method getChatCompletion (line 128) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 163) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 180) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 185) | async embedTextInput(textInput) {
    method embedChunks (line 188) | async embedChunks(textChunks = []) {
    method compressMessages (line 192) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/lmStudio/index.js
  class LMStudioLLM (line 12) | class LMStudioLLM {
    method constructor (line 16) | constructor(embedder = null, modelPreference = null) {
    method #log (line 46) | #log(text, ...args) {
    method #slog (line 50) | static #slog(text, ...args) {
    method assertModelContextLimits (line 54) | async assertModelContextLimits() {
    method cacheContextWindows (line 73) | static async cacheContextWindows(force = false) {
    method #appendContext (line 114) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 126) | streamingEnabled() {
    method promptWindowLimit (line 130) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 156) | promptWindowLimit() {
    method isValidChatCompletionModel (line 160) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 171) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 194) | constructPrompt({
    method getChatCompletion (line 215) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 250) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 271) | handleStream(response, stream, responseProps) {
    method getModelCapabilities (line 280) | async getModelCapabilities() {
    method embedTextInput (line 330) | async embedTextInput(textInput) {
    method embedChunks (line 333) | async embedChunks(textChunks = []) {
    method compressMessages (line 337) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function parseLMStudioBasePath (line 352) | function parseLMStudioBasePath(providedBasePath = "", apiVersion = "lega...

FILE: server/utils/AiProviders/localAi/index.js
  class LocalAiLLM (line 10) | class LocalAiLLM {
    method constructor (line 11) | constructor(embedder = null, modelPreference = null) {
    method #appendContext (line 32) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 44) | streamingEnabled() {
    method promptWindowLimit (line 48) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 57) | promptWindowLimit() {
    method isValidChatCompletionModel (line 64) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 73) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 95) | constructPrompt({
    method getChatCompletion (line 116) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 156) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 177) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 182) | async embedTextInput(textInput) {
    method embedChunks (line 185) | async embedChunks(textChunks = []) {
    method compressMessages (line 189) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/mistral/index.js
  class MistralLLM (line 10) | class MistralLLM {
    method constructor (line 11) | constructor(embedder = null, modelPreference = null) {
    method log (line 34) | log(text, ...args) {
    method #appendContext (line 38) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 50) | streamingEnabled() {
    method promptWindowLimit (line 54) | static promptWindowLimit() {
    method promptWindowLimit (line 58) | promptWindowLimit() {
    method isValidChatCompletionModel (line 62) | async isValidChatCompletionModel(_modelName = "") {
    method #generateContent (line 71) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 89) | constructPrompt({
    method getChatCompletion (line 110) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 149) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 170) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 175) | async embedTextInput(textInput) {
    method embedChunks (line 178) | async embedChunks(textChunks = []) {
    method compressMessages (line 182) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/modelMap/index.js
  constant LEGACY_MODEL_MAP (line 3) | const LEGACY_MODEL_MAP = require("./legacy");
  class ContextWindowFinder (line 5) | class ContextWindowFinder {
    method constructor (line 38) | constructor() {
    method log (line 52) | log(text, ...args) {
    method isCacheStale (line 60) | get isCacheStale() {
    method cachedModelMap (line 73) | get cachedModelMap() {
    method #pullRemoteModelMap (line 101) | async #pullRemoteModelMap() {
    method #validateModelMap (line 129) | #validateModelMap(modelMap = {}) {
    method #formatModelMap (line 159) | #formatModelMap(modelMap = {}) {
    method get (line 193) | get(provider = null, model = null) {

FILE: server/utils/AiProviders/modelMap/legacy.js
  constant LEGACY_MODEL_MAP (line 1) | const LEGACY_MODEL_MAP = {

FILE: server/utils/AiProviders/moonshotAi/index.js
  class MoonshotAiLLM (line 11) | class MoonshotAiLLM {
    method constructor (line 12) | constructor(embedder = null, modelPreference = null) {
    method log (line 39) | log(text, ...args) {
    method #appendContext (line 43) | #appendContext(contextTexts = []) {
    method #generateContent (line 60) | #generateContent({ userPrompt, attachments = [] }) {
    method streamingEnabled (line 77) | streamingEnabled() {
    method promptWindowLimit (line 81) | promptWindowLimit() {
    method constructPrompt (line 85) | constructPrompt({
    method compressMessages (line 106) | async compressMessages(promptArgs = {}, rawHistory = []) {
    method getChatCompletion (line 112) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 146) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 163) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 168) | async embedTextInput(textInput) {
    method embedChunks (line 171) | async embedChunks(textChunks = []) {

FILE: server/utils/AiProviders/novita/index.js
  class NovitaLLM (line 20) | class NovitaLLM {
    method constructor (line 23) | constructor(embedder = null, modelPreference = null) {
    method log (line 60) | log(text, ...args) {
    method #parseTimeout (line 70) | #parseTimeout() {
    method #cacheIsStale (line 84) | #cacheIsStale() {
    method #syncModels (line 97) | async #syncModels() {
    method #appendContext (line 106) | #appendContext(contextTexts = []) {
    method models (line 118) | models() {
    method streamingEnabled (line 126) | streamingEnabled() {
    method promptWindowLimit (line 130) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 141) | promptWindowLimit() {
    method getModelCapabilities (line 150) | async getModelCapabilities() {
    method isValidChatCompletionModel (line 172) | async isValidChatCompletionModel(model = "") {
    method #generateContent (line 183) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 201) | constructPrompt({
    method getChatCompletion (line 222) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 261) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 289) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 395) | async embedTextInput(textInput) {
    method embedChunks (line 398) | async embedChunks(textChunks = []) {
    method compressMessages (line 402) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function fetchNovitaModels (line 409) | async function fetchNovitaModels() {

FILE: server/utils/AiProviders/nvidiaNim/index.js
  class NvidiaNimLLM (line 10) | class NvidiaNimLLM {
    method constructor (line 11) | constructor(embedder = null, modelPreference = null) {
    method #log (line 36) | #log(text, ...args) {
    method #appendContext (line 40) | #appendContext(contextTexts = []) {
    method setModelTokenLimit (line 58) | static async setModelTokenLimit(modelId, basePath = null) {
    method streamingEnabled (line 82) | streamingEnabled() {
    method promptWindowLimit (line 86) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 95) | promptWindowLimit() {
    method isValidChatCompletionModel (line 102) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 111) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 134) | constructPrompt({
    method getChatCompletion (line 155) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 194) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 215) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 220) | async embedTextInput(textInput) {
    method embedChunks (line 223) | async embedChunks(textChunks = []) {
    method compressMessages (line 227) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function parseNvidiaNimBasePath (line 240) | function parseNvidiaNimBasePath(providedBasePath = "") {

FILE: server/utils/AiProviders/ollama/index.js
  class OllamaAILLM (line 14) | class OllamaAILLM {
    method constructor (line 18) | constructor(embedder = null, modelPreference = null) {
    method #log (line 48) | #log(text, ...args) {
    method #slog (line 52) | static #slog(text, ...args) {
    method assertModelContextLimits (line 56) | async assertModelContextLimits() {
    method cacheContextWindows (line 78) | static async cacheContextWindows(force = false) {
    method #appendContext (line 117) | #appendContext(contextTexts = []) {
    method applyOllamaFetch (line 135) | static applyOllamaFetch() {
    method streamingEnabled (line 169) | streamingEnabled() {
    method promptWindowLimit (line 173) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 202) | promptWindowLimit() {
    method maxContextWindow (line 206) | static maxContextWindow(modelName = null) {
    method isValidChatCompletionModel (line 212) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 221) | #generateContent({ userPrompt, attachments = [] }) {
    method #errorHandler (line 233) | #errorHandler(e) {
    method constructPrompt (line 249) | constructPrompt({
    method getChatCompletion (line 270) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 323) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 352) | handleStream(response, stream, responseProps) {
    method getModelCapabilities (line 476) | async getModelCapabilities() {
    method embedTextInput (line 499) | async embedTextInput(textInput) {
    method embedChunks (line 502) | async embedChunks(textChunks = []) {
    method compressMessages (line 506) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/openAi/index.js
  class OpenAiLLM (line 13) | class OpenAiLLM {
    method constructor (line 14) | constructor(embedder = null, modelPreference = null) {
    method log (line 36) | log(text, ...args) {
    method #appendContext (line 40) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 52) | streamingEnabled() {
    method promptWindowLimit (line 56) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 60) | promptWindowLimit() {
    method isValidChatCompletionModel (line 69) | async isValidChatCompletionModel(modelName = "") {
    method #generateContent (line 87) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 107) | constructPrompt({
    method #temperature (line 134) | #temperature(modelName, temperature) {
    method getChatCompletion (line 146) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 185) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 208) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 285) | async embedTextInput(textInput) {
    method embedChunks (line 288) | async embedChunks(textChunks = []) {
    method compressMessages (line 292) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/openRouter/index.js
  class OpenRouterLLM (line 20) | class OpenRouterLLM {
    method constructor (line 31) | constructor(embedder = null, modelPreference = null) {
    method isPerplexityModel (line 71) | get isPerplexityModel() {
    method enrichToken (line 81) | enrichToken({ token, citations = [] }) {
    method log (line 91) | log(text, ...args) {
    method #parseTimeout (line 101) | #parseTimeout() {
    method #cacheIsStale (line 115) | #cacheIsStale() {
    method #syncModels (line 128) | async #syncModels() {
    method #appendContext (line 139) | #appendContext(contextTexts = []) {
    method models (line 151) | models() {
    method streamingEnabled (line 159) | streamingEnabled() {
    method promptWindowLimit (line 163) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 174) | promptWindowLimit() {
    method isValidChatCompletionModel (line 179) | async isValidChatCompletionModel(model = "") {
    method #generateContent (line 190) | #generateContent({ userPrompt, attachments = [] }) {
    method #parseReasoningFromResponse (line 213) | #parseReasoningFromResponse({ message }) {
    method constructPrompt (line 220) | constructPrompt({
    method getChatCompletion (line 241) | async getChatCompletion(messages = null, { temperature = 0.7, user = n...
    method streamGetChatCompletion (line 286) | async streamGetChatCompletion(
    method handleStream (line 326) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 503) | async embedTextInput(textInput) {
    method embedChunks (line 506) | async embedChunks(textChunks = []) {
    method compressMessages (line 510) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function fetchOpenRouterModels (line 517) | async function fetchOpenRouterModels() {

FILE: server/utils/AiProviders/perplexity/index.js
  function perplexityModels (line 11) | function perplexityModels() {
  class PerplexityLLM (line 16) | class PerplexityLLM {
    method constructor (line 17) | constructor(embedder = null, modelPreference = null) {
    method #appendContext (line 41) | #appendContext(contextTexts = []) {
    method allModelInformation (line 53) | allModelInformation() {
    method streamingEnabled (line 57) | streamingEnabled() {
    method promptWindowLimit (line 61) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 66) | promptWindowLimit() {
    method isValidChatCompletionModel (line 71) | async isValidChatCompletionModel(model = "") {
    method constructPrompt (line 76) | constructPrompt({
    method getChatCompletion (line 89) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 128) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method enrichToken (line 155) | enrichToken(token, citations) {
    method handleStream (line 165) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 287) | async embedTextInput(textInput) {
    method embedChunks (line 290) | async embedChunks(textChunks = []) {
    method compressMessages (line 294) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/perplexity/models.js
  constant MODELS (line 1) | const MODELS = {

FILE: server/utils/AiProviders/perplexity/scripts/parse.mjs
  function parseChatModels (line 20) | function parseChatModels() {

FILE: server/utils/AiProviders/ppio/index.js
  class PPIOLLM (line 17) | class PPIOLLM {
    method constructor (line 18) | constructor(embedder = null, modelPreference = null) {
    method log (line 53) | log(text, ...args) {
    method #syncModels (line 57) | async #syncModels() {
    method #cacheIsStale (line 66) | #cacheIsStale() {
    method #appendContext (line 74) | #appendContext(contextTexts = []) {
    method models (line 86) | models() {
    method streamingEnabled (line 94) | streamingEnabled() {
    method promptWindowLimit (line 98) | promptWindowLimit() {
    method isValidChatCompletionModel (line 104) | async isValidChatCompletionModel(model = "") {
    method #generateContent (line 116) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 134) | constructPrompt({
    method getChatCompletion (line 148) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 187) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 208) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 212) | async embedTextInput(textInput) {
    method embedChunks (line 215) | async embedChunks(textChunks = []) {
    method compressMessages (line 219) | async compressMessages(promptArgs = {}, rawHistory = []) {
  function fetchPPIOModels (line 226) | async function fetchPPIOModels() {

FILE: server/utils/AiProviders/privatemode/index.js
  class PrivatemodeLLM (line 10) | class PrivatemodeLLM {
    method constructor (line 19) | constructor(embedder = null, modelPreference = null) {
    method parseBasePath (line 50) | static parseBasePath(
    method log (line 62) | log(text, ...args) {
    method #appendContext (line 66) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 78) | streamingEnabled() {
    method promptWindowLimit (line 82) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 87) | promptWindowLimit() {
    method isValidChatCompletionModel (line 92) | async isValidChatCompletionModel(_ = "") {
    method #generateContent (line 101) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 122) | constructPrompt({
    method getChatCompletion (line 143) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 178) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 199) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 204) | async embedTextInput(textInput) {
    method embedChunks (line 207) | async embedChunks(textChunks = []) {
    method compressMessages (line 211) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/sambanova/index.js
  class SambaNovaLLM (line 12) | class SambaNovaLLM {
    method constructor (line 13) | constructor(embedder = null, modelPreference = null) {
    method log (line 37) | log(text, ...args) {
    method #appendContext (line 41) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 53) | streamingEnabled() {
    method promptWindowLimit (line 57) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 61) | promptWindowLimit() {
    method isValidChatCompletionModel (line 65) | async isValidChatCompletionModel(modelName = "") {
    method #generateContent (line 74) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 94) | constructPrompt({
    method getChatCompletion (line 115) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 149) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 169) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 257) | async embedTextInput(textInput) {
    method embedChunks (line 260) | async embedChunks(textChunks = []) {
    method compressMessages (line 264) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/textGenWebUI/index.js
  class TextGenWebUILLM (line 10) | class TextGenWebUILLM {
    method constructor (line 11) | constructor(embedder = null) {
    method log (line 36) | log(text, ...args) {
    method #appendContext (line 40) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 52) | streamingEnabled() {
    method promptWindowLimit (line 56) | static promptWindowLimit(_modelName) {
    method promptWindowLimit (line 65) | promptWindowLimit() {
    method isValidChatCompletionModel (line 74) | isValidChatCompletionModel(_modelName = "") {
    method #generateContent (line 83) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 105) | constructPrompt({
    method getChatCompletion (line 126) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 160) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 176) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 181) | async embedTextInput(textInput) {
    method embedChunks (line 184) | async embedChunks(textChunks = []) {
    method compressMessages (line 188) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/togetherAi/index.js
  function togetherAiModels (line 18) | async function togetherAiModels(apiKey = null) {
  class TogetherAiLLM (line 80) | class TogetherAiLLM {
    method constructor (line 81) | constructor(embedder = null, modelPreference = null) {
    method #appendContext (line 101) | #appendContext(contextTexts = []) {
    method #generateContent (line 113) | #generateContent({ userPrompt, attachments = [] }) {
    method allModelInformation (line 130) | async allModelInformation() {
    method streamingEnabled (line 138) | streamingEnabled() {
    method promptWindowLimit (line 142) | static async promptWindowLimit(modelName) {
    method promptWindowLimit (line 148) | async promptWindowLimit() {
    method isValidChatCompletionModel (line 154) | async isValidChatCompletionModel(model = "") {
    method constructPrompt (line 160) | constructPrompt({
    method getChatCompletion (line 181) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 220) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 241) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 246) | async embedTextInput(textInput) {
    method embedChunks (line 249) | async embedChunks(textChunks = []) {
    method compressMessages (line 253) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/xai/index.js
  class XAiLLM (line 11) | class XAiLLM {
    method constructor (line 12) | constructor(embedder = null, modelPreference = null) {
    method log (line 37) | log(text, ...args) {
    method #appendContext (line 41) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 53) | streamingEnabled() {
    method promptWindowLimit (line 57) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 61) | promptWindowLimit() {
    method isValidChatCompletionModel (line 65) | isValidChatCompletionModel(_modelName = "") {
    method #generateContent (line 74) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 97) | constructPrompt({
    method getChatCompletion (line 118) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 157) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 179) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 184) | async embedTextInput(textInput) {
    method embedChunks (line 187) | async embedChunks(textChunks = []) {
    method compressMessages (line 191) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/AiProviders/zai/index.js
  class ZAiLLM (line 10) | class ZAiLLM {
    method constructor (line 11) | constructor(embedder = null, modelPreference = null) {
    method log (line 34) | log(text, ...args) {
    method #appendContext (line 38) | #appendContext(contextTexts = []) {
    method streamingEnabled (line 50) | streamingEnabled() {
    method promptWindowLimit (line 54) | static promptWindowLimit(modelName) {
    method promptWindowLimit (line 58) | promptWindowLimit() {
    method isValidChatCompletionModel (line 62) | async isValidChatCompletionModel(modelName = "") {
    method #generateContent (line 71) | #generateContent({ userPrompt, attachments = [] }) {
    method constructPrompt (line 91) | constructPrompt({
    method getChatCompletion (line 112) | async getChatCompletion(messages = null, { temperature = 0.7 }) {
    method streamGetChatCompletion (line 146) | async streamGetChatCompletion(messages = null, { temperature = 0.7 }) {
    method handleStream (line 163) | handleStream(response, stream, responseProps) {
    method embedTextInput (line 168) | async embedTextInput(textInput) {
    method embedChunks (line 171) | async embedChunks(textChunks = []) {
    method compressMessages (line 175) | async compressMessages(promptArgs = {}, rawHistory = []) {

FILE: server/utils/BackgroundWorkers/index.js
  class BackgroundService (line 6) | class BackgroundService {
    method constructor (line 29) | constructor() {
    method #log (line 39) | #log(text, ...args) {
    method boot (line 43) | async boot() {
    method stop (line 66) | async stop() {
    method jobs (line 75) | jobs() {
    method onError (line 81) | onError(error, _workerMetadata) {
    method onWorkerMessageHandler (line 88) | onWorkerMessageHandler(message, _workerMetadata) {

FILE: server/utils/DocumentManager/index.js
  class DocumentManager (line 9) | class DocumentManager {
    method constructor (line 10) | constructor({ workspace = null, maxTokens = null }) {
    method log (line 16) | log(text, ...args) {
    method pinnedDocuments (line 20) | async pinnedDocuments() {
    method pinnedDocs (line 29) | async pinnedDocs() {

FILE: server/utils/EmbeddingEngines/azureOpenAi/index.js
  class AzureOpenAiEmbedder (line 3) | class AzureOpenAiEmbedder {
    method constructor (line 4) | constructor() {
    method log (line 32) | log(text, ...args) {
    method embedTextInput (line 36) | async embedTextInput(textInput) {
    method embedChunks (line 43) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/cohere/index.js
  class CohereEmbedder (line 3) | class CohereEmbedder {
    method constructor (line 4) | constructor() {
    method embedTextInput (line 22) | async embedTextInput(textInput) {
    method embedChunks (line 28) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/gemini/index.js
  constant MODEL_MAP (line 3) | const MODEL_MAP = {
  class GeminiEmbedder (line 7) | class GeminiEmbedder {
    method constructor (line 8) | constructor() {
    method log (line 33) | log(text, ...args) {
    method outputDimensions (line 37) | get outputDimensions() {
    method embedTextInput (line 52) | async embedTextInput(textInput) {
    method embedChunks (line 64) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/genericOpenAi/index.js
  class GenericOpenAiEmbedder (line 3) | class GenericOpenAiEmbedder {
    method constructor (line 4) | constructor() {
    method log (line 28) | log(text, ...args) {
    method apiRequestDelay (line 40) | get apiRequestDelay() {
    method runDelay (line 55) | async runDelay() {
    method maxConcurrentChunks (line 66) | get maxConcurrentChunks() {
    method embedTextInput (line 76) | async embedTextInput(textInput) {
    method embedChunks (line 83) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/lemonade/index.js
  class LemonadeEmbedder (line 3) | class LemonadeEmbedder {
    method constructor (line 4) | constructor() {
    method log (line 24) | log(text, ...args) {
    method embedTextInput (line 28) | async embedTextInput(textInput) {
    method embedChunks (line 42) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/liteLLM/index.js
  class LiteLLMEmbedder (line 3) | class LiteLLMEmbedder {
    method constructor (line 4) | constructor() {
    method embedTextInput (line 22) | async embedTextInput(textInput) {
    method embedChunks (line 29) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/lmstudio/index.js
  class LMStudioEmbedder (line 4) | class LMStudioEmbedder {
    method constructor (line 5) | constructor() {
    method log (line 25) | log(text, ...args) {
    method #isAlive (line 29) | async #isAlive() {
    method embedTextInput (line 39) | async embedTextInput(textInput) {
    method embedChunks (line 46) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/localAi/index.js
  class LocalAiEmbedder (line 3) | class LocalAiEmbedder {
    method constructor (line 4) | constructor() {
    method log (line 30) | log(text, ...args) {
    method outputDimensions (line 34) | get outputDimensions() {
    method embedTextInput (line 44) | async embedTextInput(textInput) {
    method embedChunks (line 51) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/mistral/index.js
  class MistralEmbedder (line 1) | class MistralEmbedder {
    method constructor (line 2) | constructor() {
    method embedTextInput (line 14) | async embedTextInput(textInput) {
    method embedChunks (line 27) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/native/constants.js
  constant SUPPORTED_NATIVE_EMBEDDING_MODELS (line 1) | const SUPPORTED_NATIVE_EMBEDDING_MODELS = {

FILE: server/utils/EmbeddingEngines/native/index.js
  class NativeEmbedder (line 7) | class NativeEmbedder {
    method constructor (line 32) | constructor() {
    method log (line 53) | log(text, ...args) {
    method _getEmbeddingModel (line 61) | static _getEmbeddingModel() {
    method embeddingPrefix (line 68) | get embeddingPrefix() {
    method queryPrefix (line 72) | get queryPrefix() {
    method availableModels (line 81) | static availableModels() {
    method getEmbeddingModel (line 96) | getEmbeddingModel() {
    method getEmbedderInfo (line 109) | getEmbedderInfo() {
    method #tempfilePath (line 114) | #tempfilePath() {
    method #writeToTempfile (line 123) | async #writeToTempfile(filePath, data) {
    method #fetchWithHost (line 131) | async #fetchWithHost(hostOverride = null) {
    method embedderClient (line 180) | async embedderClient() {
    method #applyQueryPrefix (line 211) | #applyQueryPrefix(textInput) {
    method embedTextInput (line 224) | async embedTextInput(textInput) {
    method embedChunks (line 243) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/ollama/index.js
  class OllamaEmbedder (line 5) | class OllamaEmbedder {
    method constructor (line 6) | constructor() {
    method log (line 34) | log(text, ...args) {
    method #isAlive (line 42) | async #isAlive() {
    method embedTextInput (line 51) | async embedTextInput(textInput) {
    method embedChunks (line 72) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/openAi/index.js
  class OpenAiEmbedder (line 3) | class OpenAiEmbedder {
    method constructor (line 4) | constructor() {
    method log (line 20) | log(text, ...args) {
    method embedTextInput (line 24) | async embedTextInput(textInput) {
    method embedChunks (line 31) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingEngines/openRouter/index.js
  class OpenRouterEmbedder (line 3) | class OpenRouterEmbedder {
    method constructor (line 4) | constructor() {
    method log (line 26) | log(text, ...args) {
    method embedTextInput (line 30) | async embedTextInput(textInput) {
    method embedChunks (line 37) | async embedChunks(textChunks = []) {
  function fetchOpenRouterEmbeddingModels (line 97) | async function fetchOpenRouterEmbeddingModels() {

FILE: server/utils/EmbeddingEngines/voyageAi/index.js
  class VoyageAiEmbedder (line 1) | class VoyageAiEmbedder {
    method constructor (line 2) | constructor() {
    method #getMaxEmbeddingLength (line 21) | #getMaxEmbeddingLength() {
    method embedTextInput (line 42) | async embedTextInput(textInput) {
    method embedChunks (line 52) | async embedChunks(textChunks = []) {

FILE: server/utils/EmbeddingRerankers/native/index.js
  class NativeEmbeddingReranker (line 4) | class NativeEmbeddingReranker {
    method constructor (line 15) | constructor() {
    method log (line 34) | log(text, ...args) {
    method host (line 43) | get host() {
    method preload (line 57) | async preload() {
    method initClient (line 74) | async initClient() {
    method #getPreTrainedModel (line 120) | async #getPreTrainedModel() {
    method #getPreTrainedTokenizer (line 171) | async #getPreTrainedTokenizer() {
    method rerank (line 224) | async rerank(query, documents, options = { topK: 4 }) {

FILE: server/utils/EncryptionManager/index.js
  class EncryptionManager (line 6) | class EncryptionManager {
    method constructor (line 12) | constructor({ key = null, salt = null } = {}) {
    method log (line 24) | log(text, ...args) {
    method #loadOrCreateKeySalt (line 28) | #loadOrCreateKeySalt(_key = null, _salt = null) {
    method encrypt (line 51) | encrypt(plainTextString = null) {
    method decrypt (line 68) | decrypt(encryptedString) {

FILE: server/utils/MCP/hypervisor/index.js
  class MCPHypervisor (line 35) | class MCPHypervisor {
    method constructor (line 54) | constructor() {
    method #setupConfigFile (line 67) | #setupConfigFile() {
    method log (line 92) | log(text, ...args) {
    method mcpServerConfigs (line 100) | get mcpServerConfigs() {
    method removeMCPServerFromConfig (line 116) | removeMCPServerFromConfig(name) {
    method updateSuppressedTools (line 140) | updateSuppressedTools(serverName, toolName, enabled) {
    method getSuppressedTools (line 188) | getSuppressedTools(serverName) {
    method reloadMCPServers (line 197) | async reloadMCPServers() {
    method startMCPServer (line 207) | async startMCPServer(name) {
    method pruneMCPServer (line 252) | pruneMCPServer(name) {
    method pruneMCPServers (line 274) | pruneMCPServers() {
    method #buildMCPServerENV (line 300) | async #buildMCPServerENV(server) {
    method #parseServerType (line 344) | #parseServerType(server) {
    method #validateServerDefinitionByType (line 364) | #validateServerDefinitionByType(name, server, type) {
    method #setupServerTransport (line 406) | async #setupServerTransport(server, type) {
    method createHttpTransport (line 422) | createHttpTransport(server) {
    method #startMCPServer (line 449) | async #startMCPServer({ name, server }) {
    method bootMCPServers (line 494) | async bootMCPServers() {

FILE: server/utils/MCP/index.js
  class MCPCompatibilityLayer (line 3) | class MCPCompatibilityLayer extends MCPHypervisor {
    method constructor (line 6) | constructor() {
    method activeMCPServers (line 17) | async activeMCPServers() {
    method convertServerToolsToPlugins (line 28) | async convertServerToolsToPlugins(name, _aibitat = null) {
    method servers (line 140) | async servers() {
    method togg
Condensed preview — 997 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,410K chars).
[
  {
    "path": ".devcontainer/README.md",
    "chars": 6581,
    "preview": "# AnythingLLM Development Container Setup\n\nWelcome to the AnythingLLM development container configuration, designed to c"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 7542,
    "preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.co"
  },
  {
    "path": ".dockerignore",
    "chars": 361,
    "preview": "**/server/utils/agents/aibitat/example/**\n**/server/storage/documents/**\n**/server/storage/vector-cache/**\n**/server/sto"
  },
  {
    "path": ".editorconfig",
    "chars": 372,
    "preview": "# EditorConfig is awesome: https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n[*]\n# Non-configurable Pr"
  },
  {
    "path": ".gitattributes",
    "chars": 18,
    "preview": "* text=auto eol=lf"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 21,
    "preview": "github: Mintplex-Labs"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/01_bug.yml",
    "chars": 1267,
    "preview": "name: 🐛 Bug Report\ndescription: File a bug report for AnythingLLM\ntitle: \"[BUG]: \"\nlabels: [possible bug]\nbody:\n  - type"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/02_feature.yml",
    "chars": 568,
    "preview": "name: ✨ New Feature suggestion\ndescription: Suggest a new feature for AnythingLLM!\ntitle: \"[FEAT]: \"\nlabels: [enhancemen"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/03_documentation.yml",
    "chars": 375,
    "preview": "name: 📚 Documentation improvement\ntitle: \"[DOCS]: \"\ndescription: Report an issue or problem with the documentation.\nlabe"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 214,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: 🧑‍🤝‍🧑 Community Discord\n    url: https://discord.gg/6UyHPeGZAC\n    a"
  },
  {
    "path": ".github/workflows/build-and-push-image-semver.yaml",
    "chars": 4240,
    "preview": "name: Publish AnythingLLM Docker image on Release (amd64 & arm64)\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ gith"
  },
  {
    "path": ".github/workflows/build-and-push-image.yaml",
    "chars": 5307,
    "preview": "# This GitHub action is for publishing of the primary image for AnythingLLM\n# It will publish a linux/amd64 and linux/ar"
  },
  {
    "path": ".github/workflows/build-qa-tag.yaml",
    "chars": 2013,
    "preview": "# Builds a QA GHCR image for a PR when the \"PR: Ready for QA\" label is present.\n# Triggers on:\n#   - \"PR: Ready for QA\" "
  },
  {
    "path": ".github/workflows/check-package-versions.yaml",
    "chars": 928,
    "preview": "# This GitHub action is for checking the versions of the packages in the project.\n# Any package that is present in both "
  },
  {
    "path": ".github/workflows/check-translations.yaml",
    "chars": 1007,
    "preview": "# This GitHub action is for validation of all languages which translations are offered for\n# in the locales folder in `f"
  },
  {
    "path": ".github/workflows/cleanup-qa-tag.yaml",
    "chars": 3207,
    "preview": "# Cleans up the GHCR image tag when the PR is closed or the \"PR: Ready for QA\" label is removed.\nname: Cleanup QA GHCR I"
  },
  {
    "path": ".github/workflows/lint.yaml",
    "chars": 2081,
    "preview": "name: Lint\n\nconcurrency:\n  group: lint-${{ github.ref }}\n  cancel-in-progress: true\n\non:\n  pull_request:\n    types: [ope"
  },
  {
    "path": ".github/workflows/run-tests.yaml",
    "chars": 2200,
    "preview": "name: Run backend tests\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\non:\n"
  },
  {
    "path": ".github/workflows/sponsors.yaml",
    "chars": 1259,
    "preview": "name: Generate Sponsors README\n\non:\n  schedule:\n    - cron: \"0 12 * * 3\" # Run every Wednesday at 12:00 PM UTC\n\npermissi"
  },
  {
    "path": ".gitignore",
    "chars": 121,
    "preview": "v-env\n.env\n!.env.example\n\nnode_modules\n__pycache__\nv-env\n.DS_Store\naws_cf_deploy_anything_llm.json\nyarn.lock\n*.bak\n.idea"
  },
  {
    "path": ".gitmodules",
    "chars": 235,
    "preview": "[submodule \"browser-extension\"]\n\tpath = browser-extension\n\turl = https://github.com/Mintplex-Labs/anythingllm-extension."
  },
  {
    "path": ".hadolint.yaml",
    "chars": 114,
    "preview": "failure-threshold: warning\nignored:\n  - DL3008\n  - DL3013\nformat: tty\ntrustedRegistries:\n  - docker.io\n  - gcr.io\n"
  },
  {
    "path": ".nvmrc",
    "chars": 9,
    "preview": "v18.18.0\n"
  },
  {
    "path": ".prettierignore",
    "chars": 202,
    "preview": "# defaults\n**/.git\n**/.svn\n**/.hg\n**/node_modules\n\n#frontend\nfrontend/bundleinspector.html\n**/dist\n\n#server\nserver/swagg"
  },
  {
    "path": ".prettierrc",
    "chars": 694,
    "preview": "{\n  \"tabWidth\": 2,\n  \"useTabs\": false,\n  \"endOfLine\": \"lf\",\n  \"semi\": true,\n  \"singleQuote\": false,\n  \"printWidth\": 80,\n"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 1887,
    "preview": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  //"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 1055,
    "preview": "{\n  \"cSpell.words\": [\n    \"adoc\",\n    \"aibitat\",\n    \"AIbitat\",\n    \"allm\",\n    \"anythingllm\",\n    \"Apipie\",\n    \"Astra\""
  },
  {
    "path": ".vscode/tasks.json",
    "chars": 2607,
    "preview": "{\n  // See https://go.microsoft.com/fwlink/?LinkId=733558\n  // for the documentation about the tasks.json format\n  \"vers"
  },
  {
    "path": "BARE_METAL.md",
    "chars": 5700,
    "preview": "# Run AnythingLLM in production without Docker\n\n> [!WARNING]\n> This method of deployment is **not supported** by the cor"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 6518,
    "preview": "# Contributing to AnythingLLM\n\nAnythingLLM is an open-source project and we welcome contributions from the community.\n\n#"
  },
  {
    "path": "LICENSE",
    "chars": 1073,
    "preview": "The MIT License\n\nCopyright (c) Mintplex Labs Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "README.md",
    "chars": 23591,
    "preview": "<a name=\"readme-top\"></a>\n\n<p align=\"center\">\n  <a href=\"https://anythingllm.com\"><img src=\"https://github.com/Mintplex-"
  },
  {
    "path": "SECURITY.md",
    "chars": 513,
    "preview": "# Security Policy\n\n## Supported Versions\n\nUse this section to tell people about which versions of your project are\ncurre"
  },
  {
    "path": "TERMS_SELF_HOSTED.md",
    "chars": 3869,
    "preview": "# AnythingLLM Self-Hosted: Data Privacy & Terms of Service\n\nThis document outlines the privacy standards, data handling "
  },
  {
    "path": "cloud-deployments/aws/cloudformation/DEPLOY.md",
    "chars": 2332,
    "preview": "# How to deploy a private AnythingLLM instance on AWS\n\nWith an AWS account you can easily deploy a private AnythingLLM i"
  },
  {
    "path": "cloud-deployments/aws/cloudformation/aws_https_instructions.md",
    "chars": 6032,
    "preview": "# How to Configure HTTPS for Anything LLM AWS private deployment\nInstructions for manual https configuration after gener"
  },
  {
    "path": "cloud-deployments/aws/cloudformation/cloudformation_create_anythingllm.json",
    "chars": 6873,
    "preview": "{\n  \"AWSTemplateFormatVersion\": \"2010-09-09\",\n  \"Description\": \"Create a stack that runs AnythingLLM on a single instanc"
  },
  {
    "path": "cloud-deployments/digitalocean/terraform/DEPLOY.md",
    "chars": 2402,
    "preview": "# How to deploy a private AnythingLLM instance on DigitalOcean using Terraform\n\nWith a DigitalOcean account, you can eas"
  },
  {
    "path": "cloud-deployments/digitalocean/terraform/main.tf",
    "chars": 1053,
    "preview": "terraform {\n  required_version = \">= 1.0.0\"\n\n  required_providers {\n    digitalocean = {\n      source  = \"digitalocean/d"
  },
  {
    "path": "cloud-deployments/digitalocean/terraform/outputs.tf",
    "chars": 158,
    "preview": "output \"ip_address\" {\n  value = digitalocean_droplet.anything_llm_instance.ipv4_address\n  description = \"The public IP a"
  },
  {
    "path": "cloud-deployments/digitalocean/terraform/user_data.tp1",
    "chars": 819,
    "preview": "#!/bin/bash  \n# check output of userdata script with sudo tail -f /var/log/cloud-init-output.log \n  \nsudo apt-get update"
  },
  {
    "path": "cloud-deployments/gcp/deployment/DEPLOY.md",
    "chars": 2222,
    "preview": "# How to deploy a private AnythingLLM instance on GCP\n\nWith a GCP account you can easily deploy a private AnythingLLM in"
  },
  {
    "path": "cloud-deployments/gcp/deployment/gcp_deploy_anything_llm.yaml",
    "chars": 1803,
    "preview": "resources:  \n  - name: anything-llm-instance  \n    type: compute.v1.instance  \n    properties:  \n      zone: us-central1"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/.helmignore",
    "chars": 349,
    "preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/Chart.yaml",
    "chars": 341,
    "preview": "apiVersion: v2\nname: anythingllm\ndescription: The all-in-one Desktop & Docker AI application with built-in RAG, AI agent"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/README.md",
    "chars": 6557,
    "preview": "# anythingllm\n\n![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![Type: app"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/README.md.gotmpl",
    "chars": 3934,
    "preview": "{{ template \"chart.header\" . }}\n{{ template \"chart.deprecationWarning\" . }}\n\n{{ template \"chart.badgesSection\" . }}\n\n![A"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/NOTES.txt",
    "chars": 1782,
    "preview": "1. Get the application URL by running these commands:\n\n{{- if .Values.ingress.enabled }}\n{{- range $host := .Values.ingr"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/_helpers.tpl",
    "chars": 1822,
    "preview": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"anythingllm.name\" -}}\n{{- default .Chart.Name .Values.nameOverride |"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/configmap.yaml",
    "chars": 248,
    "preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  labels:\n    {{- include \"anythingllm.labels\" . | nindent 4 }}\n  name: {{ incl"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/deployment.yaml",
    "chars": 2707,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: {{ include \"anythingllm.fullname\" . }}\n  labels:\n    {{- include "
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/extra-objects.yaml",
    "chars": 70,
    "preview": "{{ range .Values.extraObjects }}\n---\n{{ tpl (toYaml .) $ }}\n{{ end }}\n"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/ingress.yaml",
    "chars": 2087,
    "preview": "{{- if .Values.ingress.enabled -}}\n{{- $fullName := include \"anythingllm.fullname\" . -}}\n{{- $svcPort := .Values.service"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/pvc.yaml",
    "chars": 1028,
    "preview": "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  {{- if .Values.persistentVolume.annotations }}\n  annotations:\n{{ "
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/service.yaml",
    "chars": 373,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"anythingllm.fullname\" . }}\n  labels:\n    {{- include \"anythin"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/serviceaccount.yaml",
    "chars": 397,
    "preview": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"anythingllm.s"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/templates/tests/test-connection.yaml",
    "chars": 462,
    "preview": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"anythingllm.fullname\" . }}-test-connection\"\n  labels:\n    {{- in"
  },
  {
    "path": "cloud-deployments/helm/charts/anythingllm/values.yaml",
    "chars": 6352,
    "preview": "replicaCount: 1\n\ninitContainers: []\n  # - name: init-myservice\n  #   image: busybox\n  #   command: ['sh', '-c', 'chown -"
  },
  {
    "path": "cloud-deployments/huggingface-spaces/Dockerfile",
    "chars": 1543,
    "preview": "# With this dockerfile in a Huggingface space you will get an entire AnythingLLM instance running\n# in your space with a"
  },
  {
    "path": "cloud-deployments/k8/manifest.yaml",
    "chars": 12855,
    "preview": "---\napiVersion: v1                                                                                                      "
  },
  {
    "path": "collector/.env.example",
    "chars": 362,
    "preview": "# Placeholder .env file for collector runtime\n\n# This enables HTTP request/response logging in development. Set value to"
  },
  {
    "path": "collector/.gitignore",
    "chars": 116,
    "preview": "hotdir/*\n!hotdir/__HOTDIR__.md\nyarn-error.log\n!yarn.lock\noutputs\nscripts\n.env.development\n.env.production\n.env.test\n"
  },
  {
    "path": "collector/.nvmrc",
    "chars": 8,
    "preview": "v18.18.0"
  },
  {
    "path": "collector/__tests__/utils/WhisperProviders/ffmpeg/index.test.js",
    "chars": 2696,
    "preview": "process.env.STORAGE_DIR = \"test-storage\";\nconst fs = require(\"fs\");\nconst path = require(\"path\");\n\n// Mock fix-path as a"
  },
  {
    "path": "collector/__tests__/utils/url/index.test.js",
    "chars": 8344,
    "preview": "process.env.STORAGE_DIR = \"test-storage\"; // needed for tests to run\nconst { validURL, validateURL, validYoutubeVideoUrl"
  },
  {
    "path": "collector/eslint.config.mjs",
    "chars": 1249,
    "preview": "import js from \"@eslint/js\";\nimport globals from \"globals\";\nimport { defineConfig } from \"eslint/config\";\nimport pluginP"
  },
  {
    "path": "collector/extensions/index.js",
    "chars": 6398,
    "preview": "const { setDataSigner } = require(\"../middleware/setDataSigner\");\nconst { verifyPayloadIntegrity } = require(\"../middlew"
  },
  {
    "path": "collector/extensions/resync/index.js",
    "chars": 7515,
    "preview": "const { getLinkText } = require(\"../../processLink\");\n\n/**\n * Fetches the content of a raw link. Returns the content as "
  },
  {
    "path": "collector/hotdir/__HOTDIR__.md",
    "chars": 165,
    "preview": "### What is the \"Hot directory\"\n\nThis is a pre-set file location that documents will be written to when uploaded by Anyt"
  },
  {
    "path": "collector/index.js",
    "chars": 5255,
    "preview": "process.env.NODE_ENV === \"development\"\n  ? require(\"dotenv\").config({ path: `.env.${process.env.NODE_ENV}` })\n  : requir"
  },
  {
    "path": "collector/middleware/httpLogger.js",
    "chars": 827,
    "preview": "const httpLogger =\n  ({ enableTimestamps = false }) =>\n  (req, res, next) => {\n    // Capture the original res.end to lo"
  },
  {
    "path": "collector/middleware/setDataSigner.js",
    "chars": 2170,
    "preview": "const { EncryptionWorker } = require(\"../utils/EncryptionWorker\");\nconst { CommunicationKey } = require(\"../utils/comKey"
  },
  {
    "path": "collector/middleware/verifyIntegrity.js",
    "chars": 942,
    "preview": "const { CommunicationKey } = require(\"../utils/comKey\");\nconst RuntimeSettings = require(\"../utils/runtimeSettings\");\nco"
  },
  {
    "path": "collector/nodemon.json",
    "chars": 18,
    "preview": "{\n  \"events\": {}\n}"
  },
  {
    "path": "collector/package.json",
    "chars": 1892,
    "preview": "{\n  \"name\": \"anything-llm-document-collector\",\n  \"version\": \"1.11.1\",\n  \"description\": \"Document collector server endpoi"
  },
  {
    "path": "collector/processLink/convert/generic.js",
    "chars": 8483,
    "preview": "const { v4 } = require(\"uuid\");\nconst {\n  PuppeteerWebBaseLoader,\n} = require(\"langchain/document_loaders/web/puppeteer\""
  },
  {
    "path": "collector/processLink/helpers/index.js",
    "chars": 6145,
    "preview": "const path = require(\"path\");\nconst { validURL } = require(\"../../utils/url\");\nconst { processSingleFile } = require(\".."
  },
  {
    "path": "collector/processLink/index.js",
    "chars": 1706,
    "preview": "const { validURL } = require(\"../utils/url\");\nconst { scrapeGenericUrl } = require(\"./convert/generic\");\nconst { validat"
  },
  {
    "path": "collector/processRawText/index.js",
    "chars": 2785,
    "preview": "const { v4 } = require(\"uuid\");\nconst { writeToServerDocuments } = require(\"../utils/files\");\nconst { tokenizeString } ="
  },
  {
    "path": "collector/processSingleFile/convert/asAudio.js",
    "chars": 2271,
    "preview": "const { v4 } = require(\"uuid\");\nconst {\n  createdDate,\n  trashFile,\n  writeToServerDocuments,\n} = require(\"../../utils/f"
  },
  {
    "path": "collector/processSingleFile/convert/asDocx.js",
    "chars": 1889,
    "preview": "const { v4 } = require(\"uuid\");\nconst { DocxLoader } = require(\"langchain/document_loaders/fs/docx\");\nconst {\n  createdD"
  },
  {
    "path": "collector/processSingleFile/convert/asEPub.js",
    "chars": 1818,
    "preview": "const { v4 } = require(\"uuid\");\nconst { EPubLoader } = require(\"langchain/document_loaders/fs/epub\");\nconst { tokenizeSt"
  },
  {
    "path": "collector/processSingleFile/convert/asImage.js",
    "chars": 1642,
    "preview": "const { v4 } = require(\"uuid\");\nconst { tokenizeString } = require(\"../../utils/tokenizer\");\nconst {\n  createdDate,\n  tr"
  },
  {
    "path": "collector/processSingleFile/convert/asMbox.js",
    "chars": 2279,
    "preview": "const { v4 } = require(\"uuid\");\nconst fs = require(\"fs\");\nconst { mboxParser } = require(\"mbox-parser\");\nconst {\n  creat"
  },
  {
    "path": "collector/processSingleFile/convert/asOfficeMime.js",
    "chars": 1745,
    "preview": "const { v4 } = require(\"uuid\");\nconst officeParser = require(\"officeparser\");\nconst {\n  createdDate,\n  trashFile,\n  writ"
  },
  {
    "path": "collector/processSingleFile/convert/asPDF/PDFLoader/index.js",
    "chars": 2331,
    "preview": "const fs = require(\"fs\").promises;\n\nclass PDFLoader {\n  constructor(filePath, { splitPages = true } = {}) {\n    this.fil"
  },
  {
    "path": "collector/processSingleFile/convert/asPDF/index.js",
    "chars": 2409,
    "preview": "const { v4 } = require(\"uuid\");\nconst {\n  createdDate,\n  trashFile,\n  writeToServerDocuments,\n} = require(\"../../../util"
  },
  {
    "path": "collector/processSingleFile/convert/asTxt.js",
    "chars": 1652,
    "preview": "const { v4 } = require(\"uuid\");\nconst fs = require(\"fs\");\nconst { tokenizeString } = require(\"../../utils/tokenizer\");\nc"
  },
  {
    "path": "collector/processSingleFile/convert/asXlsx.js",
    "chars": 5930,
    "preview": "const { v4 } = require(\"uuid\");\nconst xlsx = require(\"node-xlsx\").default;\nconst path = require(\"path\");\nconst fs = requ"
  },
  {
    "path": "collector/processSingleFile/index.js",
    "chars": 2646,
    "preview": "const path = require(\"path\");\nconst fs = require(\"fs\");\nconst {\n  WATCH_DIRECTORY,\n  SUPPORTED_FILETYPE_CONVERTERS,\n} = "
  },
  {
    "path": "collector/storage/.gitignore",
    "chars": 23,
    "preview": "tmp/*\n!tmp/.placeholder"
  },
  {
    "path": "collector/storage/tmp/.placeholder",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "collector/utils/EncryptionWorker/index.js",
    "chars": 2539,
    "preview": "const crypto = require(\"crypto\");\n\n// Differs from EncryptionManager in that is does not set or define the keys that wil"
  },
  {
    "path": "collector/utils/OCRLoader/index.js",
    "chars": 11204,
    "preview": "const fs = require(\"fs\");\nconst os = require(\"os\");\nconst path = require(\"path\");\nconst { VALID_LANGUAGE_CODES } = requi"
  },
  {
    "path": "collector/utils/OCRLoader/validLangs.js",
    "chars": 3805,
    "preview": "/*\n\nTo get the list of valid language codes - do the following:\nOpen the following URL in your browser: https://tesserac"
  },
  {
    "path": "collector/utils/WhisperProviders/OpenAiWhisper.js",
    "chars": 1194,
    "preview": "const fs = require(\"fs\");\n\nclass OpenAiWhisper {\n  constructor({ options }) {\n    const { OpenAI: OpenAIApi } = require("
  },
  {
    "path": "collector/utils/WhisperProviders/ffmpeg/index.js",
    "chars": 3503,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { execSync, spawnSync } = require(\"child_process\");\nconst "
  },
  {
    "path": "collector/utils/WhisperProviders/localWhisper.js",
    "chars": 6459,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { v4 } = require(\"uuid\");\nconst defaultWhisper = \"Xenova/w"
  },
  {
    "path": "collector/utils/comKey/index.js",
    "chars": 1778,
    "preview": "const crypto = require(\"crypto\");\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst keyPath =\n  process.env."
  },
  {
    "path": "collector/utils/constants.js",
    "chars": 2136,
    "preview": "const WATCH_DIRECTORY = require(\"path\").resolve(__dirname, \"../hotdir\");\n\nconst ACCEPTED_MIMES = {\n  \"text/plain\": [\".tx"
  },
  {
    "path": "collector/utils/downloadURIToFile/index.js",
    "chars": 1952,
    "preview": "const { WATCH_DIRECTORY } = require(\"../constants\");\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst { pip"
  },
  {
    "path": "collector/utils/extensions/Confluence/ConfluenceLoader/index.js",
    "chars": 4747,
    "preview": "/*\n * This is a custom implementation of the Confluence langchain loader. There was an issue where\n * code blocks were n"
  },
  {
    "path": "collector/utils/extensions/Confluence/index.js",
    "chars": 6636,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { default: slugify } = require(\"slugify\");\nconst { v4 } = "
  },
  {
    "path": "collector/utils/extensions/DrupalWiki/DrupalWiki/index.js",
    "chars": 9425,
    "preview": "/**\n * Copyright 2024\n *\n * Authors:\n *  - Eugen Mayer (KontextWork)\n */\n\nconst { htmlToText } = require(\"html-to-text\")"
  },
  {
    "path": "collector/utils/extensions/DrupalWiki/index.js",
    "chars": 2350,
    "preview": "/**\n * Copyright 2024\n *\n * Authors:\n *  - Eugen Mayer (KontextWork)\n */\n\nconst { DrupalWiki } = require(\"./DrupalWiki\")"
  },
  {
    "path": "collector/utils/extensions/ObsidianVault/index.js",
    "chars": 2862,
    "preview": "const { v4 } = require(\"uuid\");\nconst { default: slugify } = require(\"slugify\");\nconst path = require(\"path\");\nconst fs "
  },
  {
    "path": "collector/utils/extensions/PaperlessNgx/PaperlessNgxLoader/index.js",
    "chars": 4252,
    "preview": "const { htmlToText } = require(\"html-to-text\");\nconst pdf = require(\"pdf-parse\");\n\nclass PaperlessNgxLoader {\n  construc"
  },
  {
    "path": "collector/utils/extensions/PaperlessNgx/index.js",
    "chars": 3543,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { default: slugify } = require(\"slugify\");\nconst { v4 } = "
  },
  {
    "path": "collector/utils/extensions/RepoLoader/GithubRepo/RepoLoader/index.js",
    "chars": 8332,
    "preview": "/**\n * @typedef {Object} RepoLoaderArgs\n * @property {string} repo - The GitHub repository URL.\n * @property {string} [b"
  },
  {
    "path": "collector/utils/extensions/RepoLoader/GithubRepo/index.js",
    "chars": 4487,
    "preview": "const RepoLoader = require(\"./RepoLoader\");\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst { default: slu"
  },
  {
    "path": "collector/utils/extensions/RepoLoader/GitlabRepo/RepoLoader/index.js",
    "chars": 13932,
    "preview": "const ignore = require(\"ignore\");\nconst MAX_RETRIES = 3;\n\n/**\n * @typedef {Object} RepoLoaderArgs\n * @property {string} "
  },
  {
    "path": "collector/utils/extensions/RepoLoader/GitlabRepo/index.js",
    "chars": 6637,
    "preview": "const RepoLoader = require(\"./RepoLoader\");\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst { default: slu"
  },
  {
    "path": "collector/utils/extensions/RepoLoader/index.js",
    "chars": 1539,
    "preview": "/**\n * Dynamically load the correct repository loader from a specific platform\n * by default will return GitHub.\n * @par"
  },
  {
    "path": "collector/utils/extensions/WebsiteDepth/index.js",
    "chars": 7092,
    "preview": "const { v4 } = require(\"uuid\");\nconst {\n  PuppeteerWebBaseLoader,\n} = require(\"langchain/document_loaders/web/puppeteer\""
  },
  {
    "path": "collector/utils/extensions/YoutubeTranscript/YoutubeLoader/index.js",
    "chars": 3333,
    "preview": "const { validYoutubeVideoUrl } = require(\"../../../url\");\n\n/*\n * This is just a custom implementation of the Langchain J"
  },
  {
    "path": "collector/utils/extensions/YoutubeTranscript/YoutubeLoader/youtube-transcript.js",
    "chars": 8053,
    "preview": "const { validYoutubeVideoUrl } = require(\"../../../url\");\n\nclass YoutubeTranscriptError extends Error {\n  constructor(me"
  },
  {
    "path": "collector/utils/extensions/YoutubeTranscript/index.js",
    "chars": 7111,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { default: slugify } = require(\"slugify\");\nconst { v4 } = "
  },
  {
    "path": "collector/utils/files/index.js",
    "chars": 7733,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { MimeDetector } = require(\"./mime\");\n\n/**\n * The folder w"
  },
  {
    "path": "collector/utils/files/mime.js",
    "chars": 1519,
    "preview": "const MimeLib = require(\"mime\");\nclass MimeDetector {\n  nonTextTypes = [\"multipart\", \"model\", \"audio\", \"video\", \"font\"];"
  },
  {
    "path": "collector/utils/http/index.js",
    "chars": 777,
    "preview": "process.env.NODE_ENV === \"development\"\n  ? require(\"dotenv\").config({ path: `.env.${process.env.NODE_ENV}` })\n  : requir"
  },
  {
    "path": "collector/utils/logger/index.js",
    "chars": 1908,
    "preview": "const winston = require(\"winston\");\n\nclass Logger {\n  logger = console;\n  static _instance;\n  constructor() {\n    if (Lo"
  },
  {
    "path": "collector/utils/runtimeSettings/index.js",
    "chars": 3307,
    "preview": "const { reqBody } = require(\"../http\");\n\n/**\n * Runtime settings are used to configure the collector per-request.\n * The"
  },
  {
    "path": "collector/utils/shell.js",
    "chars": 1050,
    "preview": "/**\n * Patch the shell environment path to ensure the PATH is properly set for the current platform.\n * On Docker, we ar"
  },
  {
    "path": "collector/utils/tokenizer/index.js",
    "chars": 1880,
    "preview": "const { getEncoding } = require(\"js-tiktoken\");\n\nclass TikTokenTokenizer {\n  static MAX_KB_ESTIMATE = 10;\n  static DIVIS"
  },
  {
    "path": "collector/utils/url/index.js",
    "chars": 5258,
    "preview": "const RuntimeSettings = require(\"../runtimeSettings\");\n/**  ATTN: SECURITY RESEARCHERS\n * To Security researchers about "
  },
  {
    "path": "collector/yarn.lock",
    "chars": 200837,
    "preview": "# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n\n\"@anthropic-ai/sdk@^0.9.1\":\n  vers"
  },
  {
    "path": "docker/.env.example",
    "chars": 16328,
    "preview": "SERVER_PORT=3001\nSTORAGE_DIR=\"/app/server/storage\"\nUID='1000'\nGID='1000'\n# SIG_KEY='passphrase' # Please generate random"
  },
  {
    "path": "docker/Dockerfile",
    "chars": 8338,
    "preview": "# Setup base image\nFROM ubuntu:noble-20251013 AS base\n\n# Build arguments\nARG ARG_UID=1000\nARG ARG_GID=1000\n\nFROM base AS"
  },
  {
    "path": "docker/HOW_TO_USE_DOCKER.md",
    "chars": 7219,
    "preview": "# How to use Dockerized Anything LLM\n\nUse the Dockerized version of AnythingLLM for a much faster and complete startup o"
  },
  {
    "path": "docker/docker-compose.yml",
    "chars": 690,
    "preview": "name: anythingllm\n\nnetworks:\n  anything-llm:\n    driver: bridge\n\nservices:\n  anything-llm:\n    container_name: anythingl"
  },
  {
    "path": "docker/docker-entrypoint.sh",
    "chars": 1206,
    "preview": "#!/bin/bash\n\n# Check if STORAGE_DIR is set\nif [ -z \"$STORAGE_DIR\" ]; then\n    echo \"===================================="
  },
  {
    "path": "docker/docker-healthcheck.sh",
    "chars": 318,
    "preview": "#!/bin/bash\n\n# Send a request to the specified URL\nresponse=$(curl --write-out '%{http_code}' --silent --output /dev/nul"
  },
  {
    "path": "docker/vex/CVE-2019-10790.vex.json",
    "chars": 605,
    "preview": "{\n  \"@context\": \"https://openvex.dev/ns/v0.2.0\",\n  \"@id\": \"https://openvex.dev/docs/public/vex-6750d79bb005487e11d10f81d"
  },
  {
    "path": "docker/vex/CVE-2024-29415.vex.json",
    "chars": 592,
    "preview": "{\n  \"@context\": \"https://openvex.dev/ns/v0.2.0\",\n  \"@id\": \"https://openvex.dev/docs/public/vex-939548c125c5bfebd3fd91e64"
  },
  {
    "path": "docker/vex/CVE-2024-37890.vex.json",
    "chars": 601,
    "preview": "{\n  \"@context\": \"https://openvex.dev/ns/v0.2.0\",\n  \"@id\": \"https://openvex.dev/docs/public/vex-939548c125c5bfebd3fd91e64"
  },
  {
    "path": "docker/vex/CVE-2024-4068.vex.json",
    "chars": 595,
    "preview": "{\n  \"@context\": \"https://openvex.dev/ns/v0.2.0\",\n  \"@id\": \"https://openvex.dev/docs/public/vex-939548c125c5bfebd3fd91e64"
  },
  {
    "path": "eslint.config.js",
    "chars": 2512,
    "preview": "import globals from \"./server/node_modules/globals/index.js\"\nimport eslintRecommended from \"./server/node_modules/@eslin"
  },
  {
    "path": "extras/scripts/verifyPackageVersions.mjs",
    "chars": 1737,
    "preview": "import serverPackageJson from '../../server/package.json' assert { type: 'json' };\nimport collectorPackageJson from '../"
  },
  {
    "path": "extras/support/announcements/2025-04-08.json",
    "chars": 1045,
    "preview": "[\n  {\n    \"thumbnail_url\": \"https://cdn.anythingllm.com/support/announcements/assets/mcp.jpg\",\n    \"title\": \"MCP Support"
  },
  {
    "path": "extras/support/announcements/2025-07-08.json",
    "chars": 1062,
    "preview": "[\n  {\n    \"thumbnail_url\": \"https://cdn.anythingllm.com/support/announcements/assets/private-browsing.png\",\n    \"title\":"
  },
  {
    "path": "extras/support/announcements/2026-01-12.json",
    "chars": 973,
    "preview": "[\n  {\n    \"thumbnail_url\": \"https://cdn.anythingllm.com/support/announcements/assets/meeting-assistant.png\",\n    \"title\""
  },
  {
    "path": "extras/support/announcements/list.txt",
    "chars": 47,
    "preview": "2026-01-12.json\n2025-07-08.json\n2025-04-08.json"
  },
  {
    "path": "extras/translator/.env.example",
    "chars": 124,
    "preview": "DOCKER_MODEL_RUNNER_BASE_PATH='http://127.0.0.1:12434/engines/llama.cpp/v1'\nDOCKER_MODEL_RUNNER_LLM_MODEL_TOKEN_LIMIT=12"
  },
  {
    "path": "extras/translator/README.md",
    "chars": 1345,
    "preview": "# AnythingLLM Auto-translater\n\nThe AnythingLLM Auto-translator is a way for us to translate our locales but at no cost o"
  },
  {
    "path": "extras/translator/index.mjs",
    "chars": 12435,
    "preview": "import fs from 'fs';\nimport {resources} from '../../frontend/src/locales/resources.js';\nimport \"../../server/node_module"
  },
  {
    "path": "frontend/.env.example",
    "chars": 285,
    "preview": "VITE_API_BASE='http://localhost:3001/api' # Use this URL when developing locally\n# VITE_API_BASE=\"https://$CODESPACE_NAM"
  },
  {
    "path": "frontend/.gitignore",
    "chars": 301,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
  },
  {
    "path": "frontend/.nvmrc",
    "chars": 8,
    "preview": "v18.18.0"
  },
  {
    "path": "frontend/eslint.config.js",
    "chars": 2336,
    "preview": "import js from \"@eslint/js\"\nimport globals from \"globals\"\nimport pluginReact from \"eslint-plugin-react\"\nimport pluginRea"
  },
  {
    "path": "frontend/index.html",
    "chars": 1862,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\""
  },
  {
    "path": "frontend/jsconfig.json",
    "chars": 162,
    "preview": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"esnext\",\n    \"jsx\": \"react\",\n    \"paths\": {\n      \"@/*"
  },
  {
    "path": "frontend/package.json",
    "chars": 2608,
    "preview": "{\n  \"name\": \"anything-llm-frontend\",\n  \"private\": false,\n  \"license\": \"MIT\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"sta"
  },
  {
    "path": "frontend/postcss.config.js",
    "chars": 197,
    "preview": "import tailwind from 'tailwindcss'\nimport autoprefixer from 'autoprefixer'\nimport tailwindConfig from './tailwind.config"
  },
  {
    "path": "frontend/public/manifest.json",
    "chars": 214,
    "preview": "{\n  \"name\": \"AnythingLLM\",\n  \"short_name\": \"AnythingLLM\",\n  \"display\": \"standalone\",\n  \"orientation\": \"portrait\",\n  \"sta"
  },
  {
    "path": "frontend/public/robots.txt",
    "chars": 25,
    "preview": "User-agent: *\nDisallow: /"
  },
  {
    "path": "frontend/public/service-workers/push-notifications.js",
    "chars": 848,
    "preview": "function parseEventData(event) {\n    try {\n      return event.data.json();\n    } catch (e) {\n      console.error('Failed"
  },
  {
    "path": "frontend/scripts/postbuild.js",
    "chars": 410,
    "preview": "import { renameSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport path from 'path';\nconst __dirname = path.di"
  },
  {
    "path": "frontend/src/App.jsx",
    "chars": 1556,
    "preview": "import React, { Suspense } from \"react\";\nimport { Outlet, useLocation } from \"react-router-dom\";\nimport { I18nextProvide"
  },
  {
    "path": "frontend/src/AuthContext.jsx",
    "chars": 2725,
    "preview": "import React, { useState, createContext, useEffect } from \"react\";\nimport {\n  AUTH_TIMESTAMP,\n  AUTH_TOKEN,\n  AUTH_USER,"
  },
  {
    "path": "frontend/src/LogoContext.jsx",
    "chars": 1889,
    "preview": "import { createContext, useEffect, useState } from \"react\";\nimport AnythingLLM from \"./media/logo/anything-llm.png\";\nimp"
  },
  {
    "path": "frontend/src/PWAContext.jsx",
    "chars": 2571,
    "preview": "import React, {\n  createContext,\n  useContext,\n  useEffect,\n  useMemo,\n  useState,\n} from \"react\";\n\n/**\n * Detects if th"
  },
  {
    "path": "frontend/src/PfpContext.jsx",
    "chars": 733,
    "preview": "import React, { createContext, useState, useEffect } from \"react\";\nimport useUser from \"./hooks/useUser\";\nimport System "
  },
  {
    "path": "frontend/src/ThemeContext.jsx",
    "chars": 396,
    "preview": "import React, { createContext, useContext } from \"react\";\nimport { useTheme } from \"./hooks/useTheme\";\n\nconst ThemeConte"
  },
  {
    "path": "frontend/src/components/CanViewChatHistory/index.jsx",
    "chars": 1488,
    "preview": "import { useEffect, useState } from \"react\";\nimport { FullScreenLoader } from \"@/components/Preloader\";\nimport System fr"
  },
  {
    "path": "frontend/src/components/ChangeWarning/index.jsx",
    "chars": 2304,
    "preview": "import { Warning, X } from \"@phosphor-icons/react\";\n\nexport default function ChangeWarningModal({\n  warningText = \"\",\n  "
  },
  {
    "path": "frontend/src/components/ChatBubble/index.jsx",
    "chars": 980,
    "preview": "import React from \"react\";\nimport UserIcon from \"../UserIcon\";\nimport { userFromStorage } from \"@/utils/request\";\nimport"
  },
  {
    "path": "frontend/src/components/CommunityHub/PublishEntityModal/AgentFlows/index.jsx",
    "chars": 10756,
    "preview": "import { useState, useRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport CommunityHub from \"@/mo"
  },
  {
    "path": "frontend/src/components/CommunityHub/PublishEntityModal/SlashCommands/index.jsx",
    "chars": 10731,
    "preview": "import { useState, useRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport CommunityHub from \"@/mo"
  },
  {
    "path": "frontend/src/components/CommunityHub/PublishEntityModal/SystemPrompts/index.jsx",
    "chars": 10404,
    "preview": "import { useState, useRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport CommunityHub from \"@/mo"
  },
  {
    "path": "frontend/src/components/CommunityHub/PublishEntityModal/index.jsx",
    "chars": 1711,
    "preview": "import { X } from \"@phosphor-icons/react\";\nimport { useCommunityHubAuth } from \"@/hooks/useCommunityHubAuth\";\nimport Una"
  },
  {
    "path": "frontend/src/components/CommunityHub/UnauthenticatedHubModal/index.jsx",
    "chars": 1817,
    "preview": "import { X } from \"@phosphor-icons/react\";\nimport { useTranslation } from \"react-i18next\";\nimport paths from \"@/utils/pa"
  },
  {
    "path": "frontend/src/components/ContextualSaveBar/index.jsx",
    "chars": 1122,
    "preview": "import { Warning } from \"@phosphor-icons/react\";\n\nexport default function ContextualSaveBar({\n  showing = false,\n  onSav"
  },
  {
    "path": "frontend/src/components/DataConnectorOption/media/index.js",
    "chars": 558,
    "preview": "import GitHub from \"./github.svg\";\nimport GitLab from \"./gitlab.svg\";\nimport YouTube from \"./youtube.svg\";\nimport Link f"
  },
  {
    "path": "frontend/src/components/DefaultChat/index.jsx",
    "chars": 4439,
    "preview": "import React, { useEffect, useState } from \"react\";\nimport paths from \"@/utils/paths\";\nimport { isMobile } from \"react-d"
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx",
    "chars": 2404,
    "preview": "export default function AzureAiOptions({ settings }) {\n  return (\n    <div className=\"w-full flex flex-col gap-y-4\">\n   "
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/CohereOptions/index.jsx",
    "chars": 3117,
    "preview": "import { useState, useEffect } from \"react\";\nimport System from \"@/models/system\";\n\nexport default function CohereEmbedd"
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/EmbedderItem/index.jsx",
    "chars": 905,
    "preview": "export default function EmbedderItem({\n  name,\n  value,\n  image,\n  description,\n  checked,\n  onClick,\n}) {\n  return (\n  "
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/GeminiOptions/index.jsx",
    "chars": 3778,
    "preview": "import { Info } from \"@phosphor-icons/react\";\nimport { Tooltip } from \"react-tooltip\";\n\nconst DEFAULT_MODELS = [\n  {\n   "
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/GenericOpenAiOptions/index.jsx",
    "chars": 5780,
    "preview": "import React, { useState } from \"react\";\nimport { CaretDown, CaretUp, Info } from \"@phosphor-icons/react\";\nimport { Tool"
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/LMStudioOptions/index.jsx",
    "chars": 11049,
    "preview": "import React, { useEffect, useState } from \"react\";\nimport System from \"@/models/system\";\nimport { LMSTUDIO_COMMON_URLS "
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/LemonadeOptions/index.jsx",
    "chars": 8037,
    "preview": "import React, { useEffect, useState } from \"react\";\nimport System from \"@/models/system\";\nimport { LEMONADE_COMMON_URLS "
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/LiteLLMOptions/index.jsx",
    "chars": 7022,
    "preview": "import { useEffect, useState } from \"react\";\nimport System from \"@/models/system\";\nimport { Warning, Info } from \"@phosp"
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx",
    "chars": 10440,
    "preview": "import React, { useEffect, useState } from \"react\";\nimport { CaretDown, CaretUp, Info } from \"@phosphor-icons/react\";\nim"
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/MistralAiOptions/index.jsx",
    "chars": 1708,
    "preview": "export default function MistralAiOptions({ settings }) {\n  return (\n    <div className=\"w-full flex flex-col gap-y-4\">\n "
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/NativeEmbeddingOptions/index.jsx",
    "chars": 3486,
    "preview": "import { useEffect, useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport System from \"@/models/syste"
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/OllamaOptions/index.jsx",
    "chars": 10391,
    "preview": "import React, { useEffect, useState } from \"react\";\nimport System from \"@/models/system\";\nimport PreLoader from \"@/compo"
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx",
    "chars": 1892,
    "preview": "export default function OpenAiOptions({ settings }) {\n  return (\n    <div className=\"w-full flex flex-col gap-y-4\">\n    "
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/OpenRouterOptions/index.jsx",
    "chars": 3136,
    "preview": "import { useState, useEffect } from \"react\";\nimport System from \"@/models/system\";\n\nexport default function OpenRouterOp"
  },
  {
    "path": "frontend/src/components/EmbeddingSelection/VoyageAiOptions/index.jsx",
    "chars": 2083,
    "preview": "export default function VoyageAiOptions({ settings }) {\n  return (\n    <div className=\"w-full flex flex-col gap-y-4\">\n  "
  },
  {
    "path": "frontend/src/components/ErrorBoundaryFallback/index.jsx",
    "chars": 3384,
    "preview": "import { NavLink } from \"react-router-dom\";\nimport { House, ArrowClockwise, Copy, Check } from \"@phosphor-icons/react\";\n"
  },
  {
    "path": "frontend/src/components/Footer/index.jsx",
    "chars": 4417,
    "preview": "import System from \"@/models/system\";\nimport paths from \"@/utils/paths\";\nimport {\n  BookOpen,\n  DiscordLogo,\n  GithubLog"
  },
  {
    "path": "frontend/src/components/KeyboardShortcutsHelp/index.jsx",
    "chars": 1978,
    "preview": "import React, { useEffect, useState } from \"react\";\nimport { X } from \"@phosphor-icons/react\";\nimport { useTranslation }"
  },
  {
    "path": "frontend/src/components/LLMSelection/AnthropicAiOptions/index.jsx",
    "chars": 5780,
    "preview": "import { useState, useEffect } from \"react\";\nimport System from \"@/models/system\";\nimport { CaretDown, CaretUp } from \"@"
  },
  {
    "path": "frontend/src/components/LLMSelection/ApiPieOptions/index.jsx",
    "chars": 3500,
    "preview": "import System from \"@/models/system\";\nimport { useState, useEffect } from \"react\";\n\nexport default function ApiPieLLMOpt"
  },
  {
    "path": "frontend/src/components/LLMSelection/AwsBedrockLLMOptions/index.jsx",
    "chars": 9621,
    "preview": "import { ArrowSquareOut, Info } from \"@phosphor-icons/react\";\nimport { AWS_REGIONS } from \"./regions\";\nimport { useState"
  },
  {
    "path": "frontend/src/components/LLMSelection/AwsBedrockLLMOptions/regions.js",
    "chars": 4957,
    "preview": "export const AWS_REGIONS = [\n  {\n    name: \"N. Virginia\",\n    full_name: \"US East (N. Virginia)\",\n    code: \"us-east-1\","
  },
  {
    "path": "frontend/src/components/LLMSelection/AzureAiOptions/index.jsx",
    "chars": 5659,
    "preview": "import { Info } from \"@phosphor-icons/react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Tooltip } from \"r"
  },
  {
    "path": "frontend/src/components/LLMSelection/CohereAiOptions/index.jsx",
    "chars": 3153,
    "preview": "import { useState, useEffect } from \"react\";\nimport System from \"@/models/system\";\n\nexport default function CohereAiOpti"
  },
  {
    "path": "frontend/src/components/LLMSelection/CometApiLLMOptions/index.jsx",
    "chars": 5821,
    "preview": "import System from \"@/models/system\";\nimport { CaretDown, CaretUp } from \"@phosphor-icons/react\";\nimport { useState, use"
  },
  {
    "path": "frontend/src/components/LLMSelection/DPAISOptions/index.jsx",
    "chars": 6139,
    "preview": "import React, { useEffect, useState } from \"react\";\nimport { CaretDown, CaretUp } from \"@phosphor-icons/react\";\nimport S"
  }
]

// ... and 797 more files (download for full content)

About this extraction

This page contains the full source code of the Mintplex-Labs/anything-llm GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 997 files (5.8 MB), approximately 1.6M tokens, and a symbol index with 3174 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!