Full Code of n4ze3m/page-assist for AI

main 8011bb28586f cached
580 files
2.3 MB
637.7k tokens
729 symbols
1 requests
Download .txt
Showing preview only (2,537K chars total). Download the full file or copy to clipboard to get everything.
Repository: n4ze3m/page-assist
Branch: main
Commit: 8011bb28586f
Files: 580
Total size: 2.3 MB

Directory structure:
gitextract_4dq_zncw/

├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .prettierrc.cjs
├── CONTRIBUTING.md
├── LICENCE
├── PRIVACY.md
├── README.md
├── bun.lockb
├── docs/
│   ├── .vitepress/
│   │   └── config.mts
│   ├── browser-support.md
│   ├── connection-issue.md
│   ├── extensions-causing-issue-other-websites.md
│   ├── features/
│   │   ├── internet-search.md
│   │   ├── knowledge-base.md
│   │   ├── mcp.md
│   │   ├── ollama.md
│   │   ├── other.md
│   │   ├── page-share.md
│   │   └── prompts.md
│   ├── index.md
│   ├── markdown-examples.md
│   ├── package.json
│   ├── postcss.config.js
│   ├── privacy.md
│   ├── prompt.md
│   ├── providers/
│   │   ├── llamacpp.md
│   │   ├── lmstudio.md
│   │   ├── ollama.md
│   │   └── openai.md
│   ├── shortcuts.md
│   └── sidebar/
│       ├── chat-with-website.md
│       ├── copilot.md
│       ├── index.md
│       └── vision.md
├── package.json
├── page-share.md
├── postcss.config.js
├── src/
│   ├── assets/
│   │   ├── locale/
│   │   │   ├── ar/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── da/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── de/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── en/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── es/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── fa/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── fr/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── it/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── ja-JP/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── ko/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── ml/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── no/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── pt-BR/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── ru/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── sv/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── uk/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── zh/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   └── zh-TW/
│   │   │       ├── chrome.json
│   │   │       ├── common.json
│   │   │       ├── knowledge.json
│   │   │       ├── openai.json
│   │   │       ├── option.json
│   │   │       ├── playground.json
│   │   │       ├── settings.json
│   │   │       └── sidepanel.json
│   │   └── tailwind.css
│   ├── chain/
│   │   ├── chat-with-website.ts
│   │   └── chat-with-x.ts
│   ├── components/
│   │   ├── Common/
│   │   │   ├── Beta.tsx
│   │   │   ├── CodeBlock.tsx
│   │   │   ├── DocumentCard.tsx
│   │   │   ├── ImageExport.tsx
│   │   │   ├── Markdown.tsx
│   │   │   ├── McpServerToggle.tsx
│   │   │   ├── Mermaid.tsx
│   │   │   ├── Message/
│   │   │   │   └── ReasoningSection.tsx
│   │   │   ├── ModelSelect.tsx
│   │   │   ├── PageAssistLoader.tsx
│   │   │   ├── PageAssistProvider.tsx
│   │   │   ├── Playground/
│   │   │   │   ├── ActionInfo.tsx
│   │   │   │   ├── DocumentChip.tsx
│   │   │   │   ├── DocumentFile.tsx
│   │   │   │   ├── EditMessageForm.tsx
│   │   │   │   ├── GenerationInfo.tsx
│   │   │   │   ├── HumanMessge.tsx
│   │   │   │   ├── McpInvocationBlock.tsx
│   │   │   │   ├── Message.tsx
│   │   │   │   ├── MessageSource.tsx
│   │   │   │   ├── MessageSourcePopup.tsx
│   │   │   │   ├── PlaygroundUserMessage.tsx
│   │   │   │   └── message-groups.ts
│   │   │   ├── PromptSelect.tsx
│   │   │   ├── ProviderIcon.tsx
│   │   │   ├── QueuedMessagesList.tsx
│   │   │   ├── SaveButton.tsx
│   │   │   ├── Settings/
│   │   │   │   ├── AdvanceOllamaSettings.tsx
│   │   │   │   └── CurrentChatModelSettings.tsx
│   │   │   ├── ShareModal.tsx
│   │   │   └── TableBlock.tsx
│   │   ├── Icons/
│   │   │   ├── AliBaBaCloud.tsx
│   │   │   ├── AnthropicIcon.tsx
│   │   │   ├── BigModelZhipuIcon.tsx
│   │   │   ├── CSVIcon.tsx
│   │   │   ├── CanopyWaveIcon.tsx
│   │   │   ├── ChatSettings.tsx
│   │   │   ├── ChutesIcon.tsx
│   │   │   ├── DeepSeek.tsx
│   │   │   ├── Fireworks.tsx
│   │   │   ├── GeminiIcon.tsx
│   │   │   ├── Groq.tsx
│   │   │   ├── HuggingFaceIcon.tsx
│   │   │   ├── InfinigenceAI.tsx
│   │   │   ├── LMStudio.tsx
│   │   │   ├── LlamacppLogo.tsx
│   │   │   ├── Llamafile.tsx
│   │   │   ├── MCPIcon.tsx
│   │   │   ├── MiniMaxIcon.tsx
│   │   │   ├── Mistral.tsx
│   │   │   ├── Moonshot.tsx
│   │   │   ├── Novita.tsx
│   │   │   ├── Ollama.tsx
│   │   │   ├── OpenAI.tsx
│   │   │   ├── OpenRouter.tsx
│   │   │   ├── PDFIcon.tsx
│   │   │   ├── SiliconFlow.tsx
│   │   │   ├── TXTIcon.tsx
│   │   │   ├── TencentCloud.tsx
│   │   │   ├── Togther.tsx
│   │   │   ├── VercelIcon.tsx
│   │   │   ├── VllmLogo.tsx
│   │   │   ├── VolcEngine.tsx
│   │   │   └── XAI.tsx
│   │   ├── Layouts/
│   │   │   ├── Header.tsx
│   │   │   ├── Layout.tsx
│   │   │   ├── LinkComponent.tsx
│   │   │   ├── MoreOptions.tsx
│   │   │   ├── NewChat.tsx
│   │   │   ├── SettingsOptionLayout.tsx
│   │   │   └── SidePanelSettingsLayout.tsx
│   │   ├── Option/
│   │   │   ├── Knowledge/
│   │   │   │   ├── AddKnowledge.tsx
│   │   │   │   ├── EditKnowledgeSettings.tsx
│   │   │   │   ├── KnowledgeIcon.tsx
│   │   │   │   ├── KnowledgeSelect.tsx
│   │   │   │   ├── SelectedKnowledge.tsx
│   │   │   │   ├── UpdateKnowledge.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   └── utils/
│   │   │   │       └── unsupported-types.ts
│   │   │   ├── Models/
│   │   │   │   ├── AddCustomModelModal.tsx
│   │   │   │   ├── AddOllamaModelModal.tsx
│   │   │   │   ├── AddUpdateModelSettings.tsx
│   │   │   │   ├── AddUpdateOAIModelSettings.tsx
│   │   │   │   ├── CancelPullingModel.tsx
│   │   │   │   ├── CustomModelsTable.tsx
│   │   │   │   ├── ModelNicknameModal.tsx
│   │   │   │   ├── OllamaModelsTable.tsx
│   │   │   │   └── index.tsx
│   │   │   ├── Playground/
│   │   │   │   ├── DocumentChip.tsx
│   │   │   │   ├── MentionHighlighter.tsx
│   │   │   │   ├── MentionsDropdown.tsx
│   │   │   │   ├── Playground.tsx
│   │   │   │   ├── PlaygroundChat.tsx
│   │   │   │   ├── PlaygroundEmpty.tsx
│   │   │   │   ├── PlaygroundFile.tsx
│   │   │   │   ├── PlaygroundForm.tsx
│   │   │   │   ├── PlaygroundNewChat.tsx
│   │   │   │   └── PlaygroundSettings.tsx
│   │   │   ├── Prompt/
│   │   │   │   └── index.tsx
│   │   │   ├── Settings/
│   │   │   │   ├── about.tsx
│   │   │   │   ├── chrome.tsx
│   │   │   │   ├── general-settings.tsx
│   │   │   │   ├── mcp.tsx
│   │   │   │   ├── memory.tsx
│   │   │   │   ├── model-settings.tsx
│   │   │   │   ├── ollama.tsx
│   │   │   │   ├── openai-fetch-model.tsx
│   │   │   │   ├── openai.tsx
│   │   │   │   ├── prompt.tsx
│   │   │   │   ├── rag.tsx
│   │   │   │   ├── search-mode.tsx
│   │   │   │   ├── sidepanel-rag.tsx
│   │   │   │   ├── sst-settings.tsx
│   │   │   │   ├── system-settings.tsx
│   │   │   │   ├── title.tsx
│   │   │   │   └── tts-mode.tsx
│   │   │   ├── Share/
│   │   │   │   └── index.tsx
│   │   │   └── Sidebar.tsx
│   │   ├── Select/
│   │   │   ├── LoadingIndicator.tsx
│   │   │   └── index.tsx
│   │   ├── ShortcutConfig.tsx
│   │   └── Sidepanel/
│   │       ├── Chat/
│   │       │   ├── body.tsx
│   │       │   ├── empty.tsx
│   │       │   ├── form.tsx
│   │       │   └── header.tsx
│   │       └── Settings/
│   │           ├── body.tsx
│   │           └── header.tsx
│   ├── context/
│   │   ├── FontSizeProvider.tsx
│   │   └── index.tsx
│   ├── data/
│   │   └── ocr-language.ts
│   ├── db/
│   │   ├── dexie/
│   │   │   ├── branch.ts
│   │   │   ├── chat.ts
│   │   │   ├── firefox-sync.ts
│   │   │   ├── helpers.ts
│   │   │   ├── knowledge.ts
│   │   │   ├── mcp.ts
│   │   │   ├── memory.ts
│   │   │   ├── migration.ts
│   │   │   ├── modelState.ts
│   │   │   ├── models.ts
│   │   │   ├── nickname.ts
│   │   │   ├── openai.ts
│   │   │   ├── providerState.ts
│   │   │   ├── schema.ts
│   │   │   ├── types.ts
│   │   │   └── vector.ts
│   │   ├── document.ts
│   │   ├── index.ts
│   │   ├── knowledge.ts
│   │   ├── models.ts
│   │   ├── nickname.ts
│   │   ├── openai.ts
│   │   └── vector.ts
│   ├── entries/
│   │   ├── background.ts
│   │   ├── hf-pull.content.ts
│   │   ├── ollama-pull.content.ts
│   │   ├── options/
│   │   │   ├── App.tsx
│   │   │   ├── index.html
│   │   │   └── main.tsx
│   │   ├── sidepanel/
│   │   │   ├── App.tsx
│   │   │   ├── index.html
│   │   │   └── main.tsx
│   │   └── youtube-summarize.content.ts
│   ├── entries-firefox/
│   │   ├── background.ts
│   │   ├── hf-pull.content.ts
│   │   ├── ollama-pull.content.ts
│   │   ├── options/
│   │   │   ├── App.tsx
│   │   │   ├── index.html
│   │   │   └── main.tsx
│   │   ├── sidepanel/
│   │   │   ├── App.tsx
│   │   │   ├── index.html
│   │   │   └── main.tsx
│   │   └── youtube-summarize.content.ts
│   ├── hooks/
│   │   ├── chat-helper/
│   │   │   └── index.ts
│   │   ├── chat-modes/
│   │   │   ├── continueChatMode.ts
│   │   │   ├── documentChatMode.ts
│   │   │   ├── normalChatMode.ts
│   │   │   ├── ragMode.ts
│   │   │   ├── searchChatMode.ts
│   │   │   └── tabChatMode.ts
│   │   ├── handlers/
│   │   │   └── messageHandlers.ts
│   │   ├── keyboard/
│   │   │   ├── index.ts
│   │   │   ├── useKeyboardShortcuts.ts
│   │   │   └── useShortcutConfig.ts
│   │   ├── useBackgroundMessage.tsx
│   │   ├── useDarkmode.tsx
│   │   ├── useDebounce.tsx
│   │   ├── useDynamicTextareaSize.tsx
│   │   ├── useI18n.tsx
│   │   ├── useLocal.tsx
│   │   ├── useMessage.tsx
│   │   ├── useMessageOption.tsx
│   │   ├── useMessageQueue.ts
│   │   ├── useMigration.tsx
│   │   ├── useSmartScroll.tsx
│   │   ├── useSmartScroll2.tsx
│   │   ├── useSpeechRecognition.tsx
│   │   ├── useTTS.tsx
│   │   ├── useTabMentions.ts
│   │   └── utils/
│   │       └── messageHelpers.ts
│   ├── i18n/
│   │   ├── index.ts
│   │   ├── lang/
│   │   │   ├── ar.ts
│   │   │   ├── da.ts
│   │   │   ├── de.ts
│   │   │   ├── en.ts
│   │   │   ├── es.ts
│   │   │   ├── fa.ts
│   │   │   ├── fr.ts
│   │   │   ├── it.ts
│   │   │   ├── ja.ts
│   │   │   ├── ko.ts
│   │   │   ├── ml.ts
│   │   │   ├── no.ts
│   │   │   ├── pt.ts
│   │   │   ├── ru.ts
│   │   │   ├── sv.ts
│   │   │   ├── uk.ts
│   │   │   ├── zh-TW.ts
│   │   │   └── zh.ts
│   │   └── support-language.ts
│   ├── libs/
│   │   ├── PAMemoryVectorStore.ts
│   │   ├── PageAssistVectorStore.ts
│   │   ├── byte-formater.ts
│   │   ├── class-name.tsx
│   │   ├── clean-url.ts
│   │   ├── export-import.ts
│   │   ├── fetcher.ts
│   │   ├── get-html.ts
│   │   ├── get-screenshot.ts
│   │   ├── get-tab-contents.ts
│   │   ├── mcp/
│   │   │   ├── client.ts
│   │   │   ├── errors.ts
│   │   │   ├── http-client.ts
│   │   │   ├── normal-chat.ts
│   │   │   ├── oauth-flow.ts
│   │   │   ├── oauth.ts
│   │   │   ├── remote-tools.ts
│   │   │   ├── tool-schema.ts
│   │   │   ├── types.ts
│   │   │   └── utils.ts
│   │   ├── model-utils.ts
│   │   ├── openai.ts
│   │   ├── pdf.ts
│   │   ├── pdfjs.ts
│   │   ├── process-knowledge.ts
│   │   ├── process-source.ts
│   │   ├── reasoning.ts
│   │   ├── runtime.ts
│   │   ├── send-notification.ts
│   │   └── to-base64.ts
│   ├── loader/
│   │   ├── csv.ts
│   │   ├── docx.ts
│   │   ├── html.ts
│   │   ├── pdf-url.ts
│   │   ├── pdf.ts
│   │   └── txt.ts
│   ├── models/
│   │   ├── ChatChromeAi.ts
│   │   ├── ChatGoogleAI.ts
│   │   ├── ChatOllama.ts
│   │   ├── ChatTypes.ts
│   │   ├── CustomAIMessageChunk.ts
│   │   ├── CustomChatAnthropic.ts
│   │   ├── CustomChatOpenAI.ts
│   │   ├── OAIEmbedding.ts
│   │   ├── OllamaEmbedding.ts
│   │   ├── embedding.ts
│   │   ├── index.ts
│   │   ├── types.ts
│   │   └── utils/
│   │       ├── chrome.ts
│   │       ├── ollama.ts
│   │       └── openai.ts
│   ├── parser/
│   │   ├── amazon.ts
│   │   ├── default.ts
│   │   ├── google-docs.ts
│   │   ├── google-sheets.ts
│   │   ├── reader.ts
│   │   ├── twitter.ts
│   │   └── wiki.ts
│   ├── public/
│   │   ├── _locales/
│   │   │   ├── da/
│   │   │   │   └── messages.json
│   │   │   ├── de/
│   │   │   │   └── messages.json
│   │   │   ├── en/
│   │   │   │   └── messages.json
│   │   │   ├── es/
│   │   │   │   └── messages.json
│   │   │   ├── fa/
│   │   │   │   └── messages.json
│   │   │   ├── fr/
│   │   │   │   └── messages.json
│   │   │   ├── it/
│   │   │   │   └── messages.json
│   │   │   ├── ja/
│   │   │   │   └── messages.json
│   │   │   ├── ml/
│   │   │   │   └── messages.json
│   │   │   ├── no/
│   │   │   │   └── messages.json
│   │   │   ├── ru/
│   │   │   │   └── messages.json
│   │   │   ├── sv/
│   │   │   │   └── messages.json
│   │   │   ├── zh_CN/
│   │   │   │   └── messages.json
│   │   │   └── zh_TW/
│   │   │       └── messages.json
│   │   └── ocr/
│   │       ├── tesseract-core-simd.js
│   │       └── tesseract-core-simd.wasm
│   ├── queue/
│   │   └── index.ts
│   ├── routes/
│   │   ├── chrome-route.tsx
│   │   ├── chrome.tsx
│   │   ├── firefox-route.tsx
│   │   ├── firefox.tsx
│   │   ├── option-index.tsx
│   │   ├── option-rag.tsx
│   │   ├── option-settings-about.tsx
│   │   ├── option-settings-chrome.tsx
│   │   ├── option-settings-knowledge.tsx
│   │   ├── option-settings-mcp.tsx
│   │   ├── option-settings-model.tsx
│   │   ├── option-settings-openai.tsx
│   │   ├── option-settings-prompt.tsx
│   │   ├── option-settings-share.tsx
│   │   ├── option-settings.tsx
│   │   ├── options-settings-ollama.tsx
│   │   ├── sidepanel-chat.tsx
│   │   ├── sidepanel-settings-model.tsx
│   │   ├── sidepanel-settings-openai.tsx
│   │   └── sidepanel-settings.tsx
│   ├── services/
│   │   ├── action.ts
│   │   ├── app.ts
│   │   ├── application.ts
│   │   ├── chrome.ts
│   │   ├── elevenlabs.ts
│   │   ├── kb.ts
│   │   ├── model-settings.ts
│   │   ├── ocr.ts
│   │   ├── ollama.ts
│   │   ├── openai-tts.ts
│   │   ├── search.ts
│   │   ├── title.ts
│   │   └── tts.ts
│   ├── store/
│   │   ├── index.tsx
│   │   ├── model.tsx
│   │   ├── option.tsx
│   │   └── webui.tsx
│   ├── types/
│   │   ├── index.ts
│   │   └── message.ts
│   ├── utils/
│   │   ├── action.ts
│   │   ├── chrome-download.ts
│   │   ├── chrome.ts
│   │   ├── clean-headers.ts
│   │   ├── clean.ts
│   │   ├── clipboard.ts
│   │   ├── color.ts
│   │   ├── compress.ts
│   │   ├── constant.ts
│   │   ├── ff-error.ts
│   │   ├── file-processor.ts
│   │   ├── format-file-size.ts
│   │   ├── generate-history.ts
│   │   ├── google-domains.ts
│   │   ├── human-message.tsx
│   │   ├── humanize-milliseconds.ts
│   │   ├── is-private-mode.ts
│   │   ├── is-youtube.ts
│   │   ├── key-down.tsx
│   │   ├── langauge-extension.ts
│   │   ├── latex.ts
│   │   ├── markdown-to-ssml.ts
│   │   ├── markdown-to-text.ts
│   │   ├── marked/
│   │   │   └── katex.tsx
│   │   ├── math-delimiter.ts
│   │   ├── memory-embeddings.ts
│   │   ├── model.ts
│   │   ├── oai-api-providers.ts
│   │   ├── ocr.ts
│   │   ├── ollama-pull-inject.ts
│   │   ├── pull-ollama.ts
│   │   ├── rerank.ts
│   │   ├── search-provider.ts
│   │   ├── select-variable.ts
│   │   ├── supported-languages.ts
│   │   ├── system-message.ts
│   │   ├── text-splitter.ts
│   │   ├── to-source.ts
│   │   ├── tts.ts
│   │   ├── update-page-title.ts
│   │   └── verify-page-share.ts
│   └── web/
│       ├── search-engines/
│       │   ├── baidu.ts
│       │   ├── bing.ts
│       │   ├── brave-api.ts
│       │   ├── brave.ts
│       │   ├── duckduckgo.ts
│       │   ├── exa.ts
│       │   ├── firecrawl.ts
│       │   ├── google.ts
│       │   ├── kagi-api.ts
│       │   ├── ollama.ts
│       │   ├── perplexity-api.ts
│       │   ├── searxng.ts
│       │   ├── sogou.ts
│       │   ├── startpage.ts
│       │   ├── stract.ts
│       │   └── tavily-api.ts
│       ├── web.ts
│       └── website/
│           └── index.ts
├── tailwind.config.js
├── tsconfig.json
└── wxt.config.ts

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

================================================
FILE: .github/FUNDING.yml
================================================
github: n4ze3m
ko_fi: n4ze3m

================================================
FILE: .gitignore
================================================

# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# settings
.vscode

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

#cache
.turbo
.next
.vercel

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*


# local env files
.env*

out/
build/
dist/

# plasmo - https://www.plasmo.com
.plasmo

# bpp - http://bpp.browser.market/
keys.json

# typescript
.tsbuildinfo
# WXT
.wxt
# WebStorm
.idea 

/docs/.vitepress/cache/
package-lock.json

================================================
FILE: .prettierrc.cjs
================================================
/**
 * @type {import('prettier').Options}
 */
module.exports = {
  printWidth: 80,
  tabWidth: 2,
  useTabs: false,
  semi: false,
  singleQuote: false,
  trailingComma: "none",
  bracketSpacing: true,
  bracketSameLine: true,
  plugins: [require.resolve("@plasmohq/prettier-plugin-sort-imports")],
  importOrder: ["^@plasmohq/(.*)$", "^~(.*)$", "^[./]"],
  importOrderSeparation: true,
  importOrderSortSpecifiers: true
}


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Page Assist

Thank you for your interest in contributing to Page Assist! We welcome contributions from anyone, whether it's reporting bugs, suggesting improvements, or submitting code changes.

## Getting Started

1. **Fork the repository**

   To start contributing, you'll need to fork the [Page Assist repository](https://github.com/n4ze3m/page-assist) by clicking the "Fork" button at the top right of the page.

2. **Clone your forked repository**

   Once you have your own fork, clone it to your local machine:

   ```
   git clone https://github.com/YOUR-USERNAME/page-assist.git
   ```

3. **Install dependencies**

   Page Assist uses [Bun](https://bun.sh/) for dependency management. Install the required dependencies by running the following command in the project root directory:

   ```
   bun install
   ```

   If you face any issues with Bun, you can use `npm` instead.

4. **Start the development server**

   To run the extension in development mode, use the following command:

   ```
   bun dev
   ```

   This will open a  chrome browser window with the extension loaded.

   for firefox:

   ```
   bun dev:firefox
   ```

5. **Install Ollama locally**

   Page Assist requires [Ollama](https://ollama.ai) to be installed locally. Follow the installation instructions provided in the Ollama repository.

## Making Changes

Once you have the project set up locally, you can start making changes. We recommend creating a new branch for your changes:

```
git checkout -b my-feature-branch
```

Make your desired changes, and don't forget to add or update tests if necessary.

## Submitting a Pull Request

1. **Commit your changes**

   Once you've made your changes, commit them with a descriptive commit message:

   ```
   git commit -m "Add a brief description of your changes"
   ```

2. **Push your changes**

   Push your changes to your forked repository:

   ```
   git push origin my-feature-branch
   ```

3. **Open a Pull Request**

   Go to the original repository on GitHub and click the "New Pull Request" button. Select your forked repository and the branch you just pushed as the source, and the main repository's `main` branch as the destination.

4. **Describe your changes**

   Provide a clear and concise description of the changes you've made, including any relevant issue numbers or other context.

5. **Review and merge**

   The maintainers of the project will review your pull request and provide feedback or merge it if everything looks good.

## Code Style and Guidelines

To ensure consistency and maintainability, we follow certain code style guidelines. Please ensure your code adheres to these guidelines before submitting a pull request.

- Use proper indentation and code formatting
- Write clear and concise comments when necessary
- Follow best practices for TypeScript and React development

## Need Help?

If you have any questions or need further assistance, feel free to open an issue or reach out to the maintainers.

Thank you for your contribution!


================================================
FILE: LICENCE
================================================
MIT License

Copyright (c) 2023 Muhammed Nazeem

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: PRIVACY.md
================================================
# Privacy Policy

## Data Collection
Page Assist is committed to user privacy and does not collect any user data. All operations and data storage occur locally within your browser.

## Browser Permissions
The extension requires the following permissions to function:

- **Notifications**: To provide system notifications
- **Website Content Access**: Required for the chat-with-webpage functionality
- **Unlimited Storage**: Used to store chat history locally in your browser
- **Active Tab**: To ensure the extension is active on the current tab and get screenshots etc
- **Scripting**: For the chat-with-webpage functionality
- **Web Requests**: To modify headers of the local server to avoid CORS issues

## Page Share Feature
When using the Page Share feature:

- Data sharing only occurs when explicitly connecting to external sources
- Self-hosting option is available for complete data control
- Shared chats can be permanently deleted from the server at any time
- No data is retained after deletion

## Data Storage
- All chat history and settings are stored locally in your browser
- No data is transmitted to external servers unless explicitly initiated by the user
- Users maintain full control over their data

## Third-Party Services
Page Assist does not integrate with any third-party analytics or tracking services.

## Changes to Privacy Policy
We reserve the right to update this privacy policy as needed. Users will be notified of any significant changes.

## Contact
For privacy-related questions or concerns, please open an issue on our GitHub repository or mail me at me@n4ze3m.com

================================================
FILE: README.md
================================================
<p align="center">
    <h1 align="center">Page Assist</h1>
</p>


<p align="center">
<a href="https://discord.gg/bu54382uBd" aria-label="Join dialoqbase #welcome"><img src="https://img.shields.io/badge/discord-join%20chat-blue.svg" alt="Join dialoqbase #welcome"></a>  <a href="https://twitter.com/page_assist" aria-label="Follow @page_assist on Twitter"><img src="https://img.shields.io/twitter/follow/page_assist?style=social" alt="Follow @page_assist on Twitter"></a> 
</p>

<p align="center">
    <a href="https://docs.pageassist.xyz">
        Documentation
    </a>

</p>


Page Assist is an open-source browser extension that provides a sidebar and web UI for your local AI model. It allows you to interact with your model from any webpage.

## Installation

Page Assist supports Chromium-based browsers like Chrome, Brave, and Edge, as well as Firefox.

[![Chrome Web Store](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/UV4C4ybeBTsZt43U4xis.png)](https://chromewebstore.google.com/detail/page-assist/jfgfiigpkhlkbnfnbobbkinehhfdhndo)
[![Firefox Add-on](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/get-the-addon.png)](https://addons.mozilla.org/en-US/firefox/addon/page-assist/)
[![Edge Add-on](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/edge-addon.png)](https://microsoftedge.microsoft.com/addons/detail/page-assist-a-web-ui-fo/ogkogooadflifpmmidmhjedogicnhooa)

Checkout the Demo (v1.0.0):

<div align="center">

[![Page Assist Demo](https://img.youtube.com/vi/8VTjlLGXA4s/0.jpg)](https://www.youtube.com/watch?v=8VTjlLGXA4s)

</div>

## Features

- **Sidebar**: A sidebar that can be opened on any webpage. It allows you to interact with your model and see the results.

- **Web UI**: A web UI that allows you to interact with your model like a ChatGPT Website.

- **Chat With Webpage**: You can chat with the webpage and ask questions about the content.

want more features? Create an issue and let me know.

### Manual Installation

#### Pre-requisites

- Bun - [Installation Guide](https://bun.sh/)
- Ollama (Local AI Provider) - [Installation Guide](https://ollama.com)
- Any OpenAI API Compatible Endpoint (like LM Studio, llamafile etc.)

1. Clone the repository

```bash
git clone https://github.com/n4ze3m/page-assist.git
cd page-assist
```

2. Install the dependencies

```bash
bun install
```

3. Build the extension (by default it will build for Chrome, Edge and Firefox)

```bash
bun run build
```

_Note: If you face any issues with Bun, use `npm` instead of `bun`._

4. Load the extension (chrome)

- Open the Extension Management page by navigating to `chrome://extensions`.

- Enable Developer Mode by clicking the toggle switch next to Developer mode.

- Click the `Load unpacked` button and select the `build` directory.

5. Load the extension (firefox)

- Open the Add-ons page by navigating to `about:addons`.
- Click the `Extensions` tab.
- Click the `Manage Your Extensions` button.
- Click the `Load Temporary Add-on` button and select the `manifest.json` file from the `build` directory.

## Usage

### Sidebar

Once the extension is installed, you can open the sidebar via context menu or keyboard shortcut.

Default Keyboard Shortcut: `Ctrl+Shift+Y`

### Web UI

You can open the Web UI by clicking on the extension icon which will open a new tab with the Web UI.

Default Keyboard Shortcut: `Ctrl+Shift+L`

Note: You can change the keyboard shortcuts from the extension settings on the Chrome Extension Management page.

## Keyboard Shortcuts

Page Assist supports various keyboard shortcuts to enhance your productivity:

### Extension Shortcuts

| Action | Shortcut | Description |
|--------|----------|-------------|
| Open Sidebar | `Ctrl+Shift+Y` | Opens the sidebar on any webpage |
| Open Web UI | `Ctrl+Shift+L` | Opens the Web UI in a new tab |

**Note**: You can customize extension shortcuts from your browser's extension management page .

### Application Shortcuts

| Action | Shortcut | Description |
|--------|----------|-------------|
| New Chat | `Ctrl+Shift+O` | Starts a new chat conversation |
| Toggle Sidebar | `Ctrl+B` | Opens/closes the chat history sidebar |
| Focus Textarea | `Shift+Esc` | Focuses the message input field |
| Toggle Chat Mode | `Ctrl+E` | Toggles between normal chat and chat with current page |



## Development

You can run the extension in development mode to make changes and test them.

```bash
bun dev
```

This will start a development server and watch for changes in the source files. You can load the extension in your browser and test the changes.

## Browser Support

| Browser     | Sidebar | Chat With Webpage | Web UI |
| ----------- | ------- | ----------------- | ------ |
| Chrome      | ✅      | ✅                | ✅     |
| Brave       | ✅      | ✅                | ✅     |
| Firefox     | ✅      | ✅                | ✅     |
| Vivaldi     | ✅      | ✅                | ✅     |
| Edge        | ✅      | ✅                | ✅     |
| LibreWolf   | ✅      | ✅                | ✅     |
| Zen Browser | ✅      | ✅                | ✅     |
| Opera       | ❌      | ❌                | ✅     |
| Arc         | ❌      | ❌                | ✅     |

## Local AI Provider

- [Ollama](https://github.com/ollama/ollama)

- Chrome AI (Gemini Nano)

- OpenAI API Compatible endpoints (like LM Studio, llamafile etc.)

## Roadmap

- [x] Firefox Support
- [x] More Local AI Providers
- [ ] More Customization Options
- [ ] Better UI/UX

## Privacy

Page Assist does not collect any personal data. The only time the extension communicates with the server is when you are using the share feature, which can be disabled from the settings.

All the data is stored locally in the browser storage. You can view the source code and verify it yourself.

You learn more about the privacy policy [here](PRIVACY.md).

## Contributing

Contributions are welcome. If you have any feature requests, bug reports, or questions, feel free to create an issue.

## Support

If you like the project and want to support it, you can buy me a coffee. It will help me to keep working on the project.

<a href='https://ko-fi.com/M4M3EMCLL' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi2.png?v=3' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>

or you can sponsor me on GitHub.

## Blogs and Videos About Page Assist

This are some of the blogs and videos about Page Assist. If you have written a blog or made a video about Page Assist, feel free to create a PR and add it here.

- [OllamaをChromeAddonのPage Assistで簡単操作](https://note.com/lucas_san/n/nf00d01a02c3a) by [LucasChatGPT](https://twitter.com/LucasChatGPT)

- [This Chrome Extension Surprised Me](https://www.youtube.com/watch?v=IvLTlDy9G8c) by [Matt Williams](https://www.youtube.com/@technovangelist)

- [Ollama With 1 Click](https://www.youtube.com/watch?v=61uN5jtj2wo) by [Yaron Been From EcomXFactor](https://www.youtube.com/@ecomxfactor-YaronBeen)

- [Page Assist 介绍合集](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzk2NDUxNDQ3Nw==&action=getalbum&album_id=3845692786608553984#wechat_redirect) by 百工智用公众号


- [Eine KI auf dem eigenen Rechner laufen lassen, 10 Minuten Installation](https://www.johannesholstein.de/gsCMS/index.php?id=sonstige-video-tutorials) by [Johannes Holstein](https://www.johannesholstein.de)

## License

MIT

## Last but not least

Made in [Alappuzha](https://en.wikipedia.org/wiki/Alappuzha) with ❤️


================================================
FILE: docs/.vitepress/config.mts
================================================
import { defineConfig } from 'vitepress'

// https://vitepress.dev/reference/site-config
export default defineConfig({
  title: "Page Assist",
  description: "Page Assist is an open-source Chrome Extension that provides a Sidebar and Web UI for your Local AI model. It allows you to interact with your model from any webpage.",
  lastUpdated: true,
  themeConfig: {
    // https://vitepress.dev/reference/default-theme-config
    search: {
      provider: "local",
    },
    editLink: {
      pattern: "https://github.com/n4ze3m/page-assist/edit/main/docs/:path",
      text: "Edit this page on GitHub"
    },
    nav: [
      { text: 'Home', link: '/' },
    ],

    sidebar: [
      {
        text: 'Guide',
        items: [
          { text: 'Welcome to Page Assist', link: '/' },
          {
            text: "Browser Support",
            link: "/browser-support"
          },
          {
            text: "Keyboard Shortcuts",
            link: "/shortcuts"
          }
        ],
      },
      {
        text: "Sidebar",
        items: [
          {
            text: "Sidebar Settings",
            link: "/sidebar"
          },
          {
            text: "Sidebar Copilot",
            link: "/sidebar/copilot"
          },
          {
            text: "Chat With Website",
            link: "/sidebar/chat-with-website"
          },
          {
            text: "Sidebar Vision (🧪)",
            link: "/sidebar/vision"
          }
        ],
      },
      {
        text: "Features",
        items: [
          {
            text: "Internet Search",
            link: "/features/internet-search"
          },
          {
            text: "Prompts",
            link: "/features/prompts"
          },
          {
            text: "Knowledge Base",
            link: "/features/knowledge-base"
          },
          {
            text: "Page Share",
            link: "/features/page-share"
          },
          {
            text: "MCP",
            link: "/features/mcp"
          },
          {
            text: "Ollama",
            link: "/features/ollama"
          },
          {
            text: "Other",
            link: "/features/other"
          }
        ]
      },
      {
        text: "Providers",
        collapsed: true,
        items: [
          {
            text: "Ollama",
            link: "/providers/ollama"
          },
          {
            text: "LM Studio",
            link: "/providers/lmstudio"
          },
          {
            text: "OpenAI Compatible API",
            link: "/providers/openai"
          }
        ]
      },
      {
        text: "Troubleshooting",
        items: [
          {
            text: "Ollama Connection Issue",
            link: "/connection-issue"
          },
          {
            text: "Extensions Causing Issue with Other Websites",
            link: "/extensions-causing-issue-other-websites"
          }
        ]
      }],

    socialLinks: [
      { icon: 'github', link: 'https://github.com/n4ze3m/page-assist' },
      { icon: 'x', link: 'https://x.com/page_assist' },
      { icon: 'discord', link: 'https://discord.gg/bu54382uBd' },
    ],
    footer: {
      message: "MIT Licensed Open Source Project",
      copyright: "Copyright © 2025 Muhammed Nazeem  & Page Assist Contributors",
    },
  },
  ignoreDeadLinks: true
})


================================================
FILE: docs/browser-support.md
================================================
# Browser Support

For the best experience, we recommend using Page Assist with the latest versions of Google Chrome, Microsoft Edge, or Firefox.


## Supported Browsers

| Browser     | Sidebar | Chat With Webpage | Web UI |
| ----------- | ------- | ----------------- | ------ |
| Chrome      | ✅      | ✅                | ✅     |
| Brave       | ✅      | ✅                | ✅     |
| Firefox     | ✅      | ✅                | ✅     |
| Vivaldi     | ✅      | ✅                | ✅     |
| Edge        | ✅      | ✅                | ✅     |
| LibreWolf   | ✅      | ✅                | ✅     |
| Zen Browser | ✅      | ✅                | ✅     |
| Opera       | ❌      | ❌                | ✅     |
| Arc         | ❌      | ❌                | ✅     |


================================================
FILE: docs/connection-issue.md
================================================
# Ollama Connection Issues

Connection issues can be caused by a number of reasons. Here are some common issues and how to resolve them on Page Assist. You will see the following error message if there is a connection issue:

### 1. Direct Connection Error
![Direct connection error](https://image.pageassist.xyz/Screenshot%202024-05-13%20001742.png)

### 2. `403` Error When Sending a Message
![403 error when sending a message](https://image.pageassist.xyz/Screenshot%202024-05-13%20001940.png)

This issue because of CORS (Cross-Origin Resource Sharing) issues. Since Page Assist is a browser extension, it needs to communicate with the server through the browser. However, the browser restricts communication between different origins. To resolve this issue, you can try the following solutions:   

## 1. Solutions 

Since Ollama has connection issues when directly accessed from the browser extension, Page Assist rewrites the request headers to make it work. However, automatic rewriting of headers only works on `http://127.0.0.1:*` and `http://localhost:*` URLs. To resolve the connection issue, you can try the following solutions:

1. Go to Page Assist and click on the `Settings` icon.

2. Click on the `Ollama Settings` tab.

3. There you will see the `Advance Ollama URL Configuration` option. You need to expand it.

![Advance Ollama URL Configuration](https://image.pageassist.xyz/Screenshot%202024-05-13%20003123.png)

4. Enable the `Enable or Disable Custom Origin URL` option.

![Enable or Disable Custom Origin URL](https://image.pageassist.xyz/Screenshot%202024-05-13%20003225.png)

:::tip
If Ollama is running on a different port, then change the URL in the `Custom Origin URL` field; otherwise, leave it as it is. Do not change the URL to the Ollama server URL like
:::

5. Make sure click on the `Save` button to save the changes.

_This will resolve the connection issue, and you will be able to use Ollama without any issues on Page Assist_

## 2. Solution

You can set OLLAMA_ORIGINS=* to allow connections from any origin. Here's how to do it on different operating systems:

### Windows
1. Open Start menu and search for "Environment Variables"
2. Click "Edit the system environment variables"
3. Click "Environment Variables" button
4. Under "System Variables" click "New"
5. Set Variable name: `OLLAMA_ORIGINS` and Variable value: `*`
6. Click OK to save
7. Restart Ollama service


### MacOS

1. Open Terminal
2. Run the following command:

```bash
launchctl setenv OLLAMA_ORIGINS "*"
```
3. Restart Ollama service

### Linux
1. Open Terminal
2. Run the following command:

```bash
export OLLAMA_ORIGINS="*"
```
3. Restart Ollama service

_This will allow connections from any origin. Hopefully, this will resolve the connection issue._



If you still face any issues, feel free to contact us [here](https://github.com/n4ze3m/page-assist/issues/new), and we will be happy to help you out.


================================================
FILE: docs/extensions-causing-issue-other-websites.md
================================================
# Extensions Causing Issue with Other Websites

Since Page Assist rewrites the Origin header to avoid CORS issues on the Ollama API, this feature causes issues for some users or websites.

Current known issues:

- Breaks Intel® Driver & Support Assistant
- Box Tools Website

For this reason, we have added a setting to disable the feature.

## How to disable the feature

1. Click on the Page Assist icon in the browser toolbar.
2. Click on the settings icon.
3. Click on the "Ollama Settings" tab.
4. Expand the "Advanced Ollama URL Configuration"
5. Turn off the "Enable or Disable Automatic Ollama CORS Fix" option.
6. Click on the "Save" button.

![image](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-17%20185214.png)

This will disable the feature and prevent Page Assist from rewriting the Origin header.

However, your Ollama may start throwing 403 errors. To fix that, you need to add the following line to your Ollama config file.

## How to fix 403 error

You can set OLLAMA_ORIGIN=* to allow connections from any origin. Here's how to do it on different operating systems:

### Windows
1. Open Start menu and search for "Environment Variables"
2. Click "Edit the system environment variables"
3. Click "Environment Variables" button
4. Under "System Variables" click "New"
5. Set Variable name: `OLLAMA_ORIGIN` and Variable value: `*`
6. Click OK to save
7. Restart Ollama service

### MacOS

1. Open Terminal
2. Run the following command:

```bash
launchctl setenv OLLAMA_ORIGIN "*"
```

3. Restart Ollama service

### Linux
1. Open Terminal
2. Run the following command:

```bash
export OLLAMA_ORIGIN="*"
```

3. Restart Ollama service

For Linux systems using systemd, you can also add the environment variable to your service file. Here's an example of a systemd unit file (credit: Axel Schwarzer):

```bash
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
#  - see docker.serice for an example
#
# EnvironmentFile=/etc/sysconfig/ollama
Environment="OLLAMA_HOST=192.168.4.67:11434"
Environment="OLLAMA_MAX_LOADED_MODELS=4"
# Environment="OLLAMA_ORIGINS=*"
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/sbin:/usr/sbin:/root/bin:/usr/local/bin:/bin:/usr/bin:"

[Install]
WantedBy=default.target
```

To use this configuration, uncomment the `Environment="OLLAMA_ORIGINS=*"` line.

_This will allow connections from any origin. Hopefully, this will resolve the connection issue._


================================================
FILE: docs/features/internet-search.md
================================================
# Internet Search

Page Assist supports internet search which can be used with your LLM. It works similarly to ChatGPT's internet search.

## Supported Search Engines

- Google (with region support)
- DuckDuckGo
- Sogou
- Baidu
- Brave
- Searxng
- Brave Search API
- Tavily Search API
- Bing
- Stract
- Startpage
- Exa
- Firecrawl
- Ollama Web search
- Kagi Search API (Private Beta - requires API access)
- Perplexity Search API

## How to use Internet Search

Both Sidebar and Web UI support internet search. You can use it by toggling the switch on the right side with the globe icon.

![Internet Search](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20203546.png)

## Update Search Prompt

You can update the search prompt by going to Settings > RAG Settings. Scroll down and you will find the option `Configure RAG Prompt`. Select the `Web` tab and update the prompt.

![Update Search Prompt](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20204314.png)

- `{search_results}` - This will be replaced with search results. (do not remove this)
- `{current_date_time}` - This will be replaced with current date and time.
- `{query}` - This will be replaced with the search query.

## Visit websites from messages

This feature is enabled by default. If you want to disable it, you can do it from the settings.

### How it works?

When you enable internet search and input a webpage URL into the input box and send it, Page Assist will visit the website and extract the text from it. Then it will send the text to the LLM.

## Deep Search Mode

By default, `Perform Simple Internet Search` is enabled. If you want to use Deep Search Mode, you need to disable it.

Deep Search Mode will visit the website and extract the text from it. Then it will send the text to the LLM.

::: warning
The current Deep Search is not similar to ChatGPT's DeepSearch. It is a very basic implementation.
:::


## Enable Internet Search by Default

You can enable Internet Search by default by following these steps:

1. Go to Settings
2. Under the `General Settings` section
3. Scroll down to `Manage Web Search`
4. Enable `Internet Search ON by default`
5. Click on `Save Settings`

================================================
FILE: docs/features/knowledge-base.md
================================================
# Knowledge Base

Page Assist supports Knowledge Base which is useful for chatting with your own data. You can use it to chat with your own data.

::: warning
Use this feature with caution. Due to no server-side storage, the data will be processed and embeddings will be stored in browser storage. This may cause performance issues.
:::

## Supported File Types

- PDF
- Docx
- Txt
- CSV
- MD

## How to use Knowledge Base  

In order to use knowledge base, you need to set an embedding model from the RAG Settings. We recommend using `nomic-embed-text` or any embedding model that supports text. Do not use text to text model for this. 

1. Go to Settings
2. Go to Manage Knowledge
![Knowledge Base](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20210054.png)
3. You can upload your files by clicking `Add New Knowledge`

It will take some time to process the files. Once it is done, when you check the input box, you will see a block icon which is knowledge base. You can click on it and select the knowledge you want to use.

![Knowledge Base](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20210300.png)

================================================
FILE: docs/features/mcp.md
================================================
# MCP (Model Context Protocol)

Page Assist supports MCP which allows your LLM to use external tools like search, databases, and more. You can connect to any MCP server that supports Streamable HTTP or SSE transport.

## Supported Transport Types

- Streamable HTTP

## Connecting to a Remote MCP Server

1. Go to Settings
2. Go to `MCP Settings`
3. Click `Add MCP Server`
4. Enter a name and the server URL
5. Select Auth Type (None, Bearer Token, or OAuth 2.1)
6. Click `Save`

Once added, the server tools will be automatically fetched and cached.

## Using STDIO MCP Servers

Page Assist is a browser extension, so it can't run STDIO-based MCP servers directly. You can use [supergateway](https://github.com/supercorp-ai/supergateway) to convert any STDIO MCP server to HTTP.

For example, to use Playwright MCP:

```bash
npx -y supergateway --stdio "npx @playwright/mcp@latest" --port 8808 --cors --outputTransport streamableHttp
```

Then add `http://localhost:8808/mcp` as the server URL in MCP Settings.

## Authentication

Page Assist supports two authentication methods for MCP servers.

### API Key / Bearer Token

If your MCP server requires an API key or bearer token:

1. Go to MCP Settings
2. Click `Add Custom Server`
3. Select `Bearer Token` as the auth type
4. Enter your token
5. Click `Save`

The token will be sent as `Authorization: Bearer <token>` with every request.

### OAuth 2.1

Some MCP servers (like Notion) require OAuth 2.1 authorization. Page Assist supports this using your Page Share URL as the OAuth redirect endpoint.

#### Setup

1. Make sure you have a Page Share URL configured (go to Settings > Manage Share)
2. Go to MCP Settings
3. Click `Add Custom Server`
4. Enter the server name and URL (e.g. `https://mcp.notion.com/mcp`)
5. Select `OAuth 2.1` as the auth type
6. Click `Save`
7. Click the key icon in the actions column to start the OAuth flow
8. Complete the authorization in the browser tab that opens

::: tip
Page Assist does not log or store any OAuth data on the server. The Page Share app only serves as a redirect endpoint. All tokens are stored locally in your browser.
:::

#### Self-Hosting Page Share

If you prefer not to use the default Page Share server for OAuth redirects, you can self-host it. See the [Page Share](/features/page-share) docs for instructions.

Once deployed, update your Page Share URL in Settings > Manage Share.

## Enable/Disable Servers Per Chat

You can temporarily enable or disable MCP servers per chat using the MCP icon button in the chat input. This lets you control which tools are available without changing global settings.

## Custom Headers

If your MCP server requires custom headers, you can add them when creating or editing a server in MCP Settings.


================================================
FILE: docs/features/ollama.md
================================================
# Ollama

Page Assist is designed to work with Ollama. Following are a few things you can do with Page Assist for your Ollama instance.

## Manage Ollama Models

You can manage Ollama models from the `Manage Models` section in the settings.

1. Go to `Settings`
2. Go to `Manage Models`
3. You will see all the models you have pulled
4. You can delete models from there

![Manage Models](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20230330.png)

## Pull Ollama Models

You can pull models for Ollama without going to terminal using three methods.

### Method 1: From Web UI

1. Go to `Settings`
2. Go to `Manage Models`
3. Click on the `Add New Model` button
4. Add the model name and click on `Pull Model`

![Pull Model](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20225356.png)

### Method 2: From Ollama.com

When you are browsing Ollama.com, you can pull models directly from the website.

1. Go to Ollama.com
2. Go to any model page
3. There will be a Pull icon beside the copy icon
4. Once you click on it, it will ask for confirmation
5. Download progress can be seen in the Page Assist icon

![Pull Model](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/brave_vczba7pnUo.gif)

### Method 3: From huggingface.com

You can pull `gguf` models from huggingface.com.

1. Go to huggingface.com
2. Go to any model page
3. On the right side there will be `Use this model` and select `Ollama`
![Pull Model](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20225915.png)
4. In the Huggingface popup there will be a button `Pull from Page Assist`, click on it
![Pull Model](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20230049.png)
5. Rest of the process is same as Method 2


================================================
FILE: docs/features/other.md
================================================
# Other Features

These are small utility features that Page Assist has.

## Wide Mode

For larger screens, you can enable wide mode from settings.

1. Go to settings
2. Under the `General Settings` section
3. Enable `Enable wide screen mode` option

![Wide Mode](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20212707.png)

Thanks to [@yz778](https://github.com/yz778) for this feature. 

## Restore last used model for previous chats

As the title says, you can restore the last used model for previous chats. This is useful if you want to use the same model when you switch to an old chat.

1. Go to settings
2. Under the `General Settings` section
3. Enable `Restore last used model for previous chats` option


## Resume the last chat when opening the Web UI

You can resume the last chat when opening the Web UI. This is useful if you want to continue the chat from where you left off.

1. Go to settings
2. Under the `General Settings` section
3. Enable `Resume the last chat when opening the Web UI` option

## Resume the last chat when opening the SidePanel (Copilot)

You can resume the last chat when opening the SidePanel (Copilot). This is useful if you want to continue the chat from where you left off.

1. Go to settings
2. Under the `General Settings` section
3. Enable `Resume the last chat when opening the SidePanel (Copilot)` option


## Generate Title using AI

Title generation is a feature that generates a title for the chat based on the conversation. This is useful if you want to generate a title for the chat.

1. Go to settings
2. Under the `General Settings` section
3. Enable `Generate Title using AI` option


================================================
FILE: docs/features/page-share.md
================================================
# Page Share 

Page Share is a feature that allows you to share your chat with others like the share feature of ChatGPT. This feature interacts with the internet by default, and you can use the page assist server to share your chat.

But for privacy, it's better to self-host the page share server. You can do this by following the steps below.


## Self-Host

You can self-host Page Share using two methods:

- Railway
- Docker

### Railway

Click the button below to deploy the code to Railway.

[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/VbiS2Q?referralCode=olbszX)

### Docker

1. Clone the repository


git clone https://github.com/n4ze3m/page-share-app.git
cd page-share-app


2. Run the server


docker-compose up


3. Open the app

Navigate to [http://localhost:3000](http://localhost:3000) in your browser.


Once you have deployed the server, you can change the Page Share by going to the settings and manage share.

![Page Share](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20210635.png)

================================================
FILE: docs/features/prompts.md
================================================
# Prompts

Page Assist offers three types of prompts to enhance your AI interaction experience:

1. **Custom Prompts** - For use within the chat interface
2. **Copilot Prompts** - Built-in context menu actions (See [Copilot Prompts](/sidebar/copilot.md))
3. **Custom Copilot Prompts** - Create your own context menu actions (See [Custom Copilot Prompts](/sidebar/copilot.md#custom-copilot-prompts))

## Custom Prompts

Custom Prompts are prompts that you can create and use within the Page Assist chat interface. These are different from Copilot prompts, which appear in the browser's context menu.

You can create custom prompts by going to `Settings` → `Manage Prompts` → `Custom` tab.

![Custom Prompts](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20205135.png)

There are two types of custom prompts:

1. System Prompts
2. Quick Prompts


### System Prompts

System prompts will be set as the `system` type of prompt in the LLM. This means that the prompt will be sent to the LLM as a system prompt. This is useful for setting the context of the conversation.

#### Supported System Prompt Variables

You can use the following variables in your system prompts:

- `{current_date_time}` - The current date and time in local format
- `{current_year}` - The current year
- `{current_month}` - The current month (0-11)
- `{current_day}` - The current day of the month
- `{current_hour}` - The current hour (0-23)
- `{current_minute}` - The current minute (0-59)

These variables will be automatically replaced with their respective values when the prompt is sent to the LLM.

### Quick Prompts

Quick prompts are quick prompts that you can use to quickly send a prompt to the LLM. You can use quick prompts by clicking on the `Quick Prompts` button in the input box.

If you put variables in the `{}` brackets, they will be selected automatically.

================================================
FILE: docs/index.md
================================================
# Welcome to Page Assist

Welcome to Page Assist, the browser companion for your Local AI model! With Page Assist, your web browsing experience enters a new dimension of intelligence and efficiency.

## What is Page Assist?

Page Assist makes AI interaction effortless! Simply:

- Chat with your AI from any webpage using our sleek Sidebar
- Access the powerful Web UI Control Center
- Connect to your favorite local AI models

## Installation

Download for your preferred browser:

[![Chrome Web Store](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/UV4C4ybeBTsZt43U4xis.png)](https://chromewebstore.google.com/detail/page-assist/jfgfiigpkhlkbnfnbobbkinehhfdhndo)

[![Firefox Add-on](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/get-the-addon.png)](https://addons.mozilla.org/en-US/firefox/addon/page-assist/)

[![Edge Add-on](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/edge-addon.png)](https://microsoftedge.microsoft.com/addons/detail/page-assist-a-web-ui-fo/ogkogooadflifpmmidmhjedogicnhooa)

## Privacy

Cheeck out our [Privacy Policy](/privacy) to understand how we handle your data.

## Sponsors

Page Assist is an open-source project. If you enjoy our work, please consider supporting us by becoming a sponsor. Your contribution will help us maintain and enhance Page Assist for everyone.

You can sponsor us on GitHub: [https://github.com/sponsors/n4ze3m](https://github.com/sponsors/n4ze3m)

Support us on Ko-fi: [https://ko-fi.com/n4ze3m](https://ko-fi.com/n4ze3m)

## Team

Page Assist is maintained by [@n4ze3m](https://x.com/n4ze3m) and our wonderful community of contributors.

![Contributors](https://contrib.rocks/image?repo=n4ze3m/page-assist)

================================================
FILE: docs/markdown-examples.md
================================================
# Markdown Extension Examples

This page demonstrates some of the built-in markdown extensions provided by VitePress.

## Syntax Highlighting

VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting:

**Input**

````md
```js{4}
export default {
  data () {
    return {
      msg: 'Highlighted!'
    }
  }
}
```
````

**Output**

```js{4}
export default {
  data () {
    return {
      msg: 'Highlighted!'
    }
  }
}
```

## Custom Containers

**Input**

```md
::: info
This is an info box.
:::

::: tip
This is a tip.
:::

::: warning
This is a warning.
:::

::: danger
This is a dangerous warning.
:::

::: details
This is a details block.
:::
```

**Output**

::: info
This is an info box.
:::

::: tip
This is a tip.
:::

::: warning
This is a warning.
:::

::: danger
This is a dangerous warning.
:::

::: details
This is a details block.
:::

## More

Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown).


================================================
FILE: docs/package.json
================================================
{
  "name": "page-assist-docs",
  "private": true,
  "scripts": {
    "build": "vitepress build",
    "dev": "vitepress dev",
    "preview": "vitepress preview"
  },
  "devDependencies": {
    "vitepress": "^1.6.3"
  }
}


================================================
FILE: docs/postcss.config.js
================================================
module.exports = {}


================================================
FILE: docs/privacy.md
================================================
# Privacy Policy

## Data Collection
Page Assist is committed to user privacy and does not collect any user data. All operations and data storage occur locally within your browser.

## Browser Permissions
The extension requires the following permissions to function:

- **Notifications**: To provide system notifications
- **Website Content Access**: Required for the chat-with-webpage functionality
- **Unlimited Storage**: Used to store chat history locally in your browser
- **Active Tab**: To ensure the extension is active on the current tab and get screenshots etc
- **Scripting**: For the chat-with-webpage functionality
- **Web Requests**: To modify headers of the local server to avoid CORS issues

## Page Share Feature
When using the Page Share feature:

- Data sharing only occurs when explicitly connecting to external sources
- Self-hosting option is available for complete data control
- Shared chats can be permanently deleted from the server at any time
- No data is retained after deletion

## Data Storage
- All chat history and settings are stored locally in your browser
- No data is transmitted to external servers unless explicitly initiated by the user
- Users maintain full control over their data

## Third-Party Services
Page Assist does not integrate with any third-party analytics or tracking services.

## Changes to Privacy Policy
We reserve the right to update this privacy policy as needed. Users will be notified of any significant changes.

## Contact
For privacy-related questions or concerns, please open an issue on our GitHub repository or mail me at me@n4ze3m.com

================================================
FILE: docs/prompt.md
================================================
# Prompt 


================================================
FILE: docs/providers/llamacpp.md
================================================
# LLaMA.cpp

Page Assist supports LLaMA.cpp API endpoints. You can use any LLaMA.cpp API endpoint with Page Assist.

## Adding LLaMA.cpp API

1. Click on the Page Assist icon on the browser toolbar.

2. Click on the `Settings` icon.

3. Go to the `OpenAI Compatible API` tab.

4. Click on the `Add Provider` button.

5. Select `LLaMA.cpp` from the dropdown.

6. Enter the `LLaMA.cpp URL`. (by default it is `http://localhost:8080/v1`)

7. Click on the `Save` button.


::: info
You don't need to add any models since Page Assist will automatically fetch them from the LLaMA.cpp instance you have configured.

The model must be loaded in LLaMA.cpp before Page Assist can fetch it.
:::

================================================
FILE: docs/providers/lmstudio.md
================================================
# LM Studio

You can add LMStudio's API to Page Assist. Here's how you can do it:

1. Click on the Page Assist icon on the browser toolbar.

2. Click on the `Settings` icon.

3. Go to the `OpenAI Compatible API` tab.

4. Click on the `Add Provider` button.

5. Select `LMStudio` from the dropdown.

6. Enter the `LMStudio URL`. (by default it is `http://localhost:1234/v1`)

7. Click on the `Save` button.


::: info
You don't need to add any models since Page Assist will automatically fetch them from the LMStudio instance you have configured.

The model must be loaded in LMStudio before Page Assist can fetch it.
:::

================================================
FILE: docs/providers/ollama.md
================================================
# Ollama 

Ollama lets you run large language models locally on your machine.

Page Assist supports Ollama by default. You don't need to configure anything if you are using Ollama on `localhost:11434`. Page Assist will automatically detect it.

If you face any issues with Ollama, please check the [Ollama Connection Issues](/connection-issue.md) guide.


## Multiple Ollama Instances

You can configure multiple Ollama instances by following these steps:


1. Click on the Page Assist icon on the browser toolbar.

2. Click on the `Settings` icon.

3. Go to the `OpenAI Compatible API` tab.

4. Click on the `Add Provider` button.

5. Select `Ollama` from the dropdown.

6. Enter the `Ollama URL`.

7. Click on the `Save` button.

You don't need to add any models since Page Assist will automatically fetch them from the Ollama instance you have configured.

================================================
FILE: docs/providers/openai.md
================================================
# OpenAI Compatible API

Page Assist supports OpenAI Compatible API endpoints. You can use any OpenAI Compatible API endpoint with Page Assist.

By default, Page Assist supports the following OpenAI Compatible API endpoints:

- LLaMA.cpp
- LM Studio
- Llamafile
- Ollama
- OpenAI
- DeepSeek
- Fireworks
- Novita AI
- Hugging Face
- Groq
- Together
- OpenRouter
- Google AI
- Mistral
- Infinigence AI
- SiliconFlow
- VolcEngine
- TencentCloud
- AlibabaCloud
- vLLM
- Moonshot
- xAI
- Vercel AI Gateway
- Chutes
- Anthropic (Claude)
- CanopyWave
- BigModel (Zhipu)
- MiniMax


## Adding OpenAI Compatible API


1. Click on the Page Assist icon on the browser toolbar.

2. Click on the `Settings` icon.

3. Go to the `OpenAI Compatible API` tab.

4. Click on the `Add Provider` button.

5. Select the API from the dropdown. In case it is not listed in the default list, select `Custom` and enter the API URL and API Key.

6. Add API key if required.

7. Click on the `Save` button.


::: info
For Ollama, LM Studio, and Llamafile, you don't need to add any models since Page Assist will automatically fetch them from the API.
:::

================================================
FILE: docs/shortcuts.md
================================================
# Shortcut Keys

Page Assist supports the following shortcut keys:

| Action       | Shortcut       |
| ------------ | -------------- |
| Open Sidebar | `Ctrl+Shift+Y` |
| Open Web UI  | `Ctrl+Shift+L` |

You can change the keyboard shortcuts from the extension settings on the Chrome Extension Management page.

## Application Shortcuts

| Action | Shortcut | Description |
|--------|----------|-------------|
| New Chat | `Ctrl+Shift+O` | Starts a new chat conversation |
| Toggle Sidebar | `Ctrl+B` | Opens/closes the chat history sidebar |
| Focus Textarea | `Shift+Esc` | Focuses the message input field |
| Toggle Chat Mode | `Ctrl+E` | Toggles between normal chat and chat with current page |

## Changing Keyboard Shortcuts (Browser Specific)

To change the keyboard shortcuts, follow these steps:

### Chrome

1. Go to the Extension Settings page by navigating to `chrome://extensions/shortcuts`.

2. Find the Page Assist extension.

3. Change the shortcut keys for the desired action.

_*Note*: This works with Chromium-based browsers like Edge, Brave, etc._

### Firefox

1. Go to the Add-ons page by navigating to `about:addons`.

2. Click on the `Settings` icon.

3. Click on the `Manage Extension Shortcuts` button.

![Manage Extension Shortcuts](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-15%20114332.png)

4. Find the Page Assist extension.

5. Change the shortcut keys for the desired action.

_*Note*: This works with Firefox-based browsers like Zen, Librewolf, etc._


================================================
FILE: docs/sidebar/chat-with-website.md
================================================
# Sidebar Chat with Website

This is one of the features of Page Assist that allows you to chat with your AI model from any webpage using the sleek Sidebar.


## How to chat with the website

1. Open the Sidebar
2. Enable the `Chat with Website` option
3. Start chatting with the current website


## How to disable RAG for Chat With Website

By default, Chat With Website needs to have an embedding model. You can disable the RAG model by following the steps below:

1. Open the Sidebar
2. Click on the `Settings` icon
3. There will be an option `Copilot Chat With Website Settings`
4. By default, `Chat with website using vector embeddings` is enabled. Disable it.
5. You can increase the `Normal mode website content size` to increase the amount of content that will be sent to the AI model.

![Disable RAG](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20104323.png)

That's it! Now you can chat with your AI model from any webpage without using RAG.

## Enable Chat with Website by Default

You can enable Chat with Website by default by following these steps:

1. Open the Sidebar
2. Click on the `Settings` icon
3. Look for the option `Enable Chat with Website by default (Copilot)`

================================================
FILE: docs/sidebar/copilot.md
================================================
# Copilot

Sidebar Copilot is a feature that allows you to select text from any webpage and perform AI-powered actions on it.

## Built-in Copilot Prompts

Page Assist comes with 5 built-in copilot prompts:

- **Summarize** - Get a concise summary of selected text
- **Rephrase** - Rewrite text with alternative vocabulary
- **Translate** - Translate text to English
- **Explain** - Get a detailed explanation of the text
- **Custom** - Use a custom prompt template

::: warning Deprecation Notice
The built-in "Custom" prompt will be removed in a future version. Please migrate to **Custom Copilot Prompts** (see below) for better flexibility and multiple custom prompts.
:::

### Disabling Built-in Prompts

You can now disable any built-in copilot prompt to reduce context menu clutter:

1. Go to `Settings` → `Manage Prompts` → `Copilot` tab
2. Toggle the switch next to any prompt to enable/disable it
3. Disabled prompts will not appear in the context menu

![Built-in Copilot Prompts with Enable/Disable Toggle](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-15%20120628.png)

## Custom Copilot Prompts

::: tip New Feature
You can now create unlimited custom copilot prompts! This is the recommended way to create your own prompts instead of using the built-in "Custom" prompt.
:::

Custom Copilot Prompts allow you to create your own AI-powered actions that appear in the context menu when you select text.

### Creating Custom Copilot Prompts

1. Go to `Settings` → `Manage Prompts` → `Custom Copilot` tab
2. Click the `Add` button
3. Fill in the form:
   - **Title**: The name that will appear in the context menu (e.g., "Simplify Text", "Find Grammar Errors")
   - **Prompt Template**: Your prompt with `{text}` as a placeholder for selected text

4. Click `Save`

### How to Use Custom Copilot Prompts

1. Select text on any webpage
2. Right-click on the selected text
3. Find your custom prompt in the `Page Assist` context menu
4. Click it to process the selected text

### Writing Good Prompts

::: tip Prompt Writing Best Practices
The quality of your results depends heavily on how well you write your prompts. Follow these guidelines:
:::

#### 1. **Be Specific and Clear**
```
❌ Bad: Make this better
✅ Good: Rewrite the following text to be more professional and formal:

{text}
```

#### 2. **Provide Context**
```
❌ Bad: {text}
✅ Good: You are a technical writing expert. Review the following text and suggest improvements for clarity and conciseness:

{text}
```

#### 3. **Specify the Output Format**
```
❌ Bad: Check grammar: {text}
✅ Good: Review the following text for grammar and spelling errors.
List each error with:
- Original text
- Corrected text
- Explanation

Text:
{text}
```

#### 4. **Use the {text} Placeholder**
Always include `{text}` in your prompt. This will be replaced with the selected text.

```
Example: Analyze the sentiment of the following text and classify it as Positive, Negative, or Neutral. Provide reasoning for your classification.

Text:
{text}
```

#### 5. **Set Constraints When Needed**
```
Summarize the following article in exactly 3 bullet points. Each bullet point should be no more than 20 words.

Article:
{text}
```

### Example Custom Copilot Prompts

Here are some useful custom prompts you can create:

#### Grammar and Style
```
Title: Fix Grammar
Prompt: Review the following text for grammar, spelling, and punctuation errors. Provide the corrected version.

{text}
```

#### Simplification
```
Title: Simplify Text
Prompt: Rewrite the following text to be understood by a 10-year-old. Use simple words and short sentences.

{text}
```

#### Code Review
```
Title: Review Code
Prompt: Review the following code for:
- Potential bugs
- Performance issues
- Best practices
- Readability improvements

Code:
{text}
```

#### Tone Adjustment
```
Title: Make Professional
Prompt: Rewrite the following text in a professional, formal tone suitable for business communication.

{text}
```

#### Fact Checking
```
Title: Extract Facts
Prompt: Extract all factual claims from the following text. List each claim and note if it needs verification.

{text}
```

### Managing Custom Copilot Prompts

- **Edit**: Click the edit icon to modify the title or prompt
- **Delete**: Click the delete icon to remove a prompt
- **Enable/Disable**: Toggle the switch to show/hide a prompt in the context menu

Changes are applied immediately without requiring a browser restart!

## How to Update Built-in Prompts

You can customize the default built-in prompts:

1. Go to `Settings` → `Manage Prompts` → `Copilot` tab
2. Click the edit icon next to the prompt you want to change
3. Modify the prompt template (must include `{text}` placeholder)
4. Click `Save`

::: warning
Editing built-in prompts changes them for all future uses. Consider creating a Custom Copilot Prompt instead if you want to keep the original.
:::

================================================
FILE: docs/sidebar/index.md
================================================
# Page Assist Sidebar 

Sidebar is a really good feature of the extension. It allows you to chat with your AI model from any webpage. Rather than opening a new tab and navigating to the website, you can simply open the sidebar and chat with your AI model or ask any question about the current page.


Some browser not support the sidebar feature. You can check the [Browser Support](/browser-support.md) page to see if your browser is supported.



## How to open the Sidebar


There are 3 ways to open the sidebar:

### From the browser toolbar

1. Right-click on the Page Assist icon in the browser toolbar and select `Open Sidebar`.
2. Click on the Page Assist icon in the browser toolbar and select `Open Sidebar`.

![Open Sidebar](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-15%20115612.png)


### From the context menu

1. Right-click on any webpage and select `Open Page Assist Sidebar`.
![Open Sidebar](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-15%20115734.png)


### Using the keyboard shortcut

The default keyboard shortcut to open the sidebar is `Ctrl+Shift+Y`. You can change the keyboard shortcuts from the extension settings on the Chrome Extension Management page. Check the [Shortcut Keys](/shortcuts.md) page for more information.

================================================
FILE: docs/sidebar/vision.md
================================================
# Sidebar Vision (🧪)

The vision feature of the sidebar allows LLM to see the current webpage. This is similar to [Chat with Website](/sidebar/chat-with-website.md) but it is not like RAG.

## How to use Sidebar Vision with LLM with vision capabilities

1. Open the Sidebar
2. Select a model with vision capabilities
3. Enable the `Vision` option from the input box eye icon
4. Start chatting with the current website

![Vision](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20104826.png)

## How to use Sidebar Vision with LLM without vision capabilities

Page Assist converts the current webpage to text using Tesseract OCR. This is a very basic OCR and it is not very accurate, but it is good enough to get the basic idea of the webpage.

1. Open the Sidebar
2. Select a model 
3. Enable the `Vision` option from the input box eye icon
4. Expand the `Submit` button dropdown and enable `Extract Text From Image (OCR)`
5. Start chatting with the current website

![Vision](https://pub-35424b4473484be483c0afa08c69e7da.r2.dev/Screenshot%202025-02-19%20105123.png)

================================================
FILE: package.json
================================================
{
  "name": "pageassist",
  "displayName": "Page Assist - A Web UI for Local AI Models",
  "version": "1.0.9",
  "description": "Use your locally running AI models to assist you in your web browsing.",
  "author": "n4ze3m",
  "scripts": {
    "dev": "cross-env TARGET=chrome wxt",
    "dev:firefox": "cross-env TARGET=firefox wxt -b firefox",
    "dev:edge": "cross-env TARGET=chrome wxt -b edge",
    "build": "bun build:chrome; bun build:firefox; bun build:edge",
    "build:chrome": "cross-env TARGET=chrome wxt build",
    "build:firefox": "cross-env TARGET=firefox wxt build -b firefox",
    "build:edge": "cross-env TARGET=chrome wxt build -b edge",
    "zip": "cross-env TARGET=chrome wxt zip",
    "zip:firefox": "cross-env TARGET=firefox wxt zip -b firefox",
    "compile": "tsc --noEmit",
    "docs:dev": "vitepress dev docs",
    "docs:build": "vitepress build docs",
    "docs:preview": "vitepress preview docs",
    "postinstall": "wxt prepare"
  },
  "dependencies": {
    "@cfworker/json-schema": "^4.1.1",
    "@ant-design/cssinjs": "^1.18.4",
    "@headlessui/react": "^1.7.18",
    "@heroicons/react": "^2.1.1",
    "@langchain/community": "^1.1.22",
    "@langchain/core": "^1.1.31",
    "@langchain/openai": "^1.2.12",
    "@mantine/form": "^7.5.0",
    "@mantine/hooks": "^7.5.3",
    "@modelcontextprotocol/sdk": "^1.27.1",
    "@mozilla/readability": "^0.5.0",
    "@plasmohq/storage": "^1.9.0",
    "@tailwindcss/forms": "^0.5.7",
    "@tailwindcss/typography": "^0.5.10",
    "@tanstack/react-query": "^5.17.19",
    "@tanstack/react-virtual": "^3.13.6",
    "@vitejs/plugin-react": "^4.2.1",
    "antd": "^5.13.3",
    "axios": "^1.6.7",
    "caniuse-lite": "^1.0.30001716",
    "cheerio": "^1.0.0-rc.12",
    "d3-dsv": "2",
    "dayjs": "^1.11.10",
    "dexie": "^4.0.11",
    "dexie-react-hooks": "^1.1.7",
    "html-to-text": "^9.0.5",
    "html2canvas": "^1.4.1",
    "i18next": "^23.10.1",
    "i18next-browser-languagedetector": "^7.2.0",
    "langchain": "^1.2.30",
    "lucide-react": "^0.350.0",
    "mammoth": "^1.7.2",
    "marked": "^15.0.12",
    "mermaid": "^11.4.1",
    "ml-distance": "^4.0.1",
    "ollama": "^0.5.17",
    "openai": "^4.95.1",
    "pa-tesseract.js": "^5.1.1",
    "pdfjs-dist": "4.0.379",
    "property-information": "^6.4.1",
    "pubsub-js": "^1.9.4",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "react-i18next": "^14.1.0",
    "react-icons": "^5.2.1",
    "react-markdown": "8.0.0",
    "react-router-dom": "6.10.0",
    "react-syntax-highlighter": "^15.5.0",
    "react-toastify": "^10.0.4",
    "rehype-katex": "6.0.3",
    "rehype-mathjax": "4.0.3",
    "remark-gfm": "3.0.1",
    "remark-math": "5.1.1",
    "turndown": "^7.1.3",
    "unist-util-visit": "^5.0.0",
    "yt-transcript": "^0.0.2",
    "zustand": "^4.5.0"
  },
  "devDependencies": {
    "@plasmohq/prettier-plugin-sort-imports": "4.0.1",
    "@types/chrome": "^0.0.280",
    "@types/d3-dsv": "^3.0.7",
    "@types/html-to-text": "^9.0.4",
    "@types/node": "20.11.9",
    "@types/pubsub-js": "^1.8.6",
    "@types/react": "18.2.48",
    "@types/react-dom": "18.2.18",
    "@types/react-speech-recognition": "^3.9.5",
    "@types/react-syntax-highlighter": "^15.5.11",
    "@types/turndown": "^5.0.4",
    "autoprefixer": "^10.4.17",
    "cross-env": "^7.0.3",
    "postcss": "^8.4.33",
    "prettier": "3.2.4",
    "tailwindcss": "^3.4.1",
    "typescript": "5.3.3",
    "vite-plugin-top-level-await": "^1.4.1",
    "vitepress": "^1.6.3",
    "wxt": "^0.19.6"
  },
  "resolutions": {
    "@langchain/core": "^1.1.31"
  }
}


================================================
FILE: page-share.md
================================================
# Page Share

Page Share allows you to share the chat publicly, similar to ChatGPT Share. You can self-host Page Share for privacy and security.

The default Page Share is hosted at [https://pageassist.xyz](https://pageassist.xyz).

## Self-Host

You can self-host Page Share using two methods:

- Railway
- Docker

### Railway

Click the button below to deploy the code to Railway.

[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/VbiS2Q?referralCode=olbszX)

### Docker

1. Clone the repository

```bash
git clone https://github.com/n4ze3m/page-share-app.git
cd page-share-app
```

2. Run the server

```bash
docker-compose up
```

3. Open the app

Navigate to [http://localhost:3000](http://localhost:3000) in your browser.


================================================
FILE: postcss.config.js
================================================
/**
 * @type {import('postcss').ProcessOptions}
 */
module.exports = {
    plugins: {
      tailwindcss: {},
      autoprefixer: {}
    }
  }

================================================
FILE: src/assets/locale/ar/chrome.json
================================================
{
    "heading": "إعداد Chrome AI",
    "status": {
        "label": "تمكين أو تعطيل دعم Chrome AI في مساعد الصفحة"
    },
    "error": {
        "browser_not_supported": "هذا الإصدار من Chrome غير مدعوم من نموذج Gemini Nano. يرجى التحديث إلى الإصدار 127 أو أحدث",
        "ai_not_supported": "الإعداد chrome://flags/#prompt-api-for-gemini-nano غير مفعل. يرجى تفعيله.",
        "ai_not_ready": "Gemini Nano غير جاهز بعد؛ تحتاج إلى التحقق مرة أخرى من إعدادات Chrome.",
        "internal_error": "حدث خطأ داخلي. يرجى المحاولة مرة أخرى لاحقاً."
    },
    "errorDescription": "لاستخدام Chrome AI، تحتاج إلى إصدار Chrome 138 أو أحدث. اتبع الخطوات التالية:\n\n1. انتقل إلى `chrome://flags/#prompt-api-for-gemini-nano` وقم بتمكين \"Prompt API for Gemini Nano\".\n2. أعد تشغيل Chrome لتطبيق الإعداد.\n3. عد إلى هذه الصفحة وانقر على \"تحميل النموذج\" — سيؤدي ذلك إلى تنزيل نموذج بحجم 4 جيجابايت لأول مرة.\n4. بمجرد اكتمال التنزيل، يمكن تمكين Gemini Nano من خلال مساعد الصفحة.",
    "downloadModel": "تحميل النموذج",
    "modelDownloadWarning": "سيتم تنزيل نموذج بحجم تقريبي يتراوح بين 1.5 جيجابايت و2.4 جيجابايت. تأكد من توفر مساحة كافية على القرص."
}

================================================
FILE: src/assets/locale/ar/common.json
================================================
{
    "pageAssist": "مساعد الصفحة",
    "selectAModel": "اختر نموذجًا",
    "save": "حفظ",
    "saved": "تم الحفظ",
    "cancel": "إلغاء",
    "retry": "إعادة المحاولة",
    "share": {
        "tooltip": {
            "share": "مشاركة"
        },
        "modal": {
            "title": "مشاركة رابط المحادثة"
        },
        "form": {
            "defaultValue": {
                "name": "مجهول",
                "title": "محادثة بدون عنوان"
            },
            "title": {
                "label": "عنوان المحادثة",
                "placeholder": "أدخل عنوان المحادثة",
                "required": "عنوان المحادثة مطلوب"
            },
            "name": {
                "label": "اسمك",
                "placeholder": "أدخل اسمك",
                "required": "اسمك مطلوب"
            },
            "btn": {
                "save": "إنشاء رابط",
                "saving": "جاري إنشاء الرابط..."
            }
        },
        "notification": {
            "successGenerate": "تم نسخ الرابط إلى الحافظة",
            "failGenerate": "فشل في إنشاء الرابط"
        }
    },
    "copyToClipboard": "نسخ إلى الحافظة",
    "webSearch": "البحث في الويب",
    "regenerate": "إعادة التوليد",
    "continue": "متابعة الرد",
    "edit": "تعديل",
    "delete": "حذف",
    "saveAndSubmit": "حفظ وإرسال",
    "editMessage": {
        "placeholder": "اكتب رسالة..."
    },
    "submit": "إرسال",
    "noData": "لا توجد بيانات",
    "noHistory": "لا يوجد سجل محادثات",
    "chatWithCurrentPage": "الدردشة مع الصفحة الحالية",
    "beta": "تجريبي",
    "tts": "قراءة بصوت عالٍ",
    "currentChatModelSettings": "إعدادات نموذج المحادثة الحالي",
    "modelSettings": {
        "label": "إعدادات النموذج",
        "description": "تعيين خيارات النموذج عالمياً لجميع المحادثات",
        "form": {
            "keepAlive": {
                "label": "الإبقاء نشطاً",
                "help": "يتحكم في المدة التي سيظل فيها النموذج محملاً في الذاكرة بعد الطلب (الافتراضي: 5 دقائق)",
                "placeholder": "أدخل مدة البقاء نشطاً (مثال: 5م، 10م، 1س)"
            },
            "temperature": {
                "label": "درجة الحرارة",
                "placeholder": "أدخل قيمة درجة الحرارة (مثال: 0.7، 1.0)"
            },
            "numCtx": {
                "label": "حجم نافذة السياق (num_ctx)",
                "placeholder": "أدخل قيمة حجم نافذة السياق (الافتراضي: 2048)"
            },
            "numPredict": {
                "label": "الحد الأقصى للرموز",
                "placeholder": "أدخل قيمة الحد الأقصى للرموز (مثال: 2048، 4096)"
            },
            "seed": {
                "label": "البذرة",
                "placeholder": "أدخل قيمة البذرة (مثال: 1234)",
                "help": "إمكانية تكرار مخرجات النموذج"
            },
            "topK": {
                "label": "أعلى K",
                "placeholder": "أدخل قيمة أعلى K (مثال: 40، 100)"
            },
            "topP": {
                "label": "أعلى P",
                "placeholder": "أدخل قيمة أعلى P (مثال: 0.9، 0.95)"
            },
            "useMMap": {
                "label": "استخدام MMap"
            },
            "numGpu": {
                "label": "عدد وحدات معالجة الرسومات",
                "placeholder": "أدخل عدد الطبقات لإرسالها إلى وحدة/وحدات معالجة الرسومات"
            },
            "systemPrompt": {
                "label": "موجه النظام المؤقت",
                "placeholder": "أدخل موجه النظام",
                "help": "هذه طريقة سريعة لتعيين موجه النظام في المحادثة الحالية، والذي سيتجاوز موجه النظام المحدد إذا كان موجوداً."
            }
        },
        "advanced": "المزيد من إعدادات النموذج"
    },
    "copilot": {
        "summary": "تلخيص",
        "explain": "شرح",
        "rephrase": "إعادة صياغة",
        "translate": "ترجمة",
        "custom": "مخصص"
    },
    "citations": "الاقتباسات",
    "segmented": {
        "ollama": "نماذج Ollama",
        "custom": "نماذج مخصصة"
    },
    "downloadCode": "تنزيل الكود",
    "date": {
        "pinned": "مثبت",
        "today": "اليوم",
        "yesterday": "الأمس",
        "last7Days": "آخر 7 أيام",
        "older": "أقدم"
    },
    "range": {
        "deleteConfirm": {
            "pinned": "هل أنت متأكد أنك تريد حذف جميع الرسائل المثبتة؟",
            "today": "هل أنت متأكد أنك تريد حذف جميع رسائل اليوم؟",
            "yesterday": "هل أنت متأكد أنك تريد حذف جميع رسائل الأمس؟",
            "last7Days": "هل أنت متأكد أنك تريد حذف جميع رسائل آخر 7 أيام؟",
            "older": "هل أنت متأكد أنك تريد حذف جميع الرسائل القديمة؟"
        },
        "tooltip": {
            "pinned": "حذف جميع الرسائل المثبتة",
            "today": "حذف جميع رسائل اليوم",
            "yesterday": "حذف جميع رسائل الأمس",
            "last7Days": "حذف جميع رسائل آخر 7 أيام",
            "older": "حذف جميع الرسائل القديمة"
        }
    },
    "pin": "تثبيت",
    "unpin": "إلغاء التثبيت",
    "generationInfo": "معلومات التوليد",
    "sidebarChat": "دردشة الشريط الجانبي",
    "reasoning": {
        "thinking": "جاري التفكير....",
        "thought": "فكر لمدة {{time}}"
    },
    "embeddingGen": "إنشاء تمثيلات، قد يستغرق هذا وقتًا",
    "semanticSearch": "جاري البحث الدلالي",
    "downloading": "جاري التنزيل",
    "cancelPullingModel": {
        "confirm": "هل أنت متأكد أنك تريد إلغاء التنزيل؟ سيؤدي ذلك إلى إيقاف عملية التنزيل. وفقًا لتوثيق Ollama، يمكنك المتابعة من حيث توقفت."
    }
}

================================================
FILE: src/assets/locale/ar/knowledge.json
================================================
{ 
    "addBtn": "إضافة معرفة جديدة",
    "columns": {
        "title": "العنوان",
        "status": "الحالة",
        "embeddings": "نموذج التضمين",
        "createdAt": "تاريخ الإنشاء",
        "action": "الإجراءات"
    },
    "expandedColumns": {
        "name": "الاسم"
    },
    "confirm": {
        "delete": "هل أنت متأكد أنك تريد حذف هذه المعرفة؟"
    },
    "deleteSuccess": "تم حذف المعرفة بنجاح",
    "status": {
        "pending": "قيد الانتظار",
        "finished": "مكتمل",
        "processing": "قيد المعالجة",
        "failed": "فشل"
    },
    "addKnowledge": "إضافة معرفة",
    "updateKnowledge": "تحديث المعرفة",
    "form": {
        "title": {
            "label": "عنوان المعرفة",
            "placeholder": "أدخل عنوان المعرفة",
            "required": "عنوان المعرفة مطلوب"
        },
        "uploadFile": {
            "label": "رفع ملف",
            "uploadText": "اسحب وأفلت ملفًا هنا أو انقر للرفع",
            "uploadHint": "أنواع الملفات المدعومة: .pdf, .csv, .txt, .md, .docx",
            "required": "الملف مطلوب"
        },
        "submit": "إرسال",
        "success": "تمت إضافة المعرفة بنجاح"
    },
    "noEmbeddingModel": "يرجى إضافة نموذج تضمين من صفحة إعدادات RAG أولاً"
}

================================================
FILE: src/assets/locale/ar/openai.json
================================================
{
    "settings": "واجهة برمجة التطبيقات المتوافقة مع OpenAI",
    "heading": "واجهة برمجة التطبيقات المتوافقة مع OpenAI",
    "subheading": "إدارة وتكوين مزودي واجهة برمجة التطبيقات المتوافقة مع OpenAI هنا.",
    "addBtn": "إضافة مزود",
    "table": {
        "name": "اسم المزود",
        "baseUrl": "عنوان URL الأساسي",
        "actions": "إجراء"
    },
    "modal": {
        "titleAdd": "إضافة مزود جديد",
        "name": {
            "label": "اسم المزود",
            "required": "اسم المزود مطلوب.",
            "placeholder": "أدخل اسم المزود"
        },
        "baseUrl": {
            "label": "عنوان URL الأساسي",
            "help": "عنوان URL الأساسي لمزود واجهة برمجة التطبيقات OpenAI. مثال (http://localhost:1234/v1)",
            "required": "عنوان URL الأساسي مطلوب.",
            "placeholder": "أدخل عنوان URL الأساسي"
        },
        "apiKey": {
            "label": "مفتاح API",
            "required": "مفتاح API مطلوب.",
            "placeholder": "أدخل مفتاح API"
        },
        "submit": "حفظ",
        "update": "تحديث",
        "deleteConfirm": "هل أنت متأكد أنك تريد حذف هذا المزود؟",
        "model": {
            "title": "قائمة النماذج",
            "subheading": "يرجى تحديد نماذج المحادثة التي تريد استخدامها مع هذا المزود.",
            "success": "تمت إضافة نماذج جديدة بنجاح."
        },
        "tipLMStudio": "سيقوم Page Assist تلقائيًا بجلب النماذج التي قمت بتحميلها على LM Studio. لست بحاجة إلى إضافتها يدويًا."
    },
    "addSuccess": "تمت إضافة المزود بنجاح.",
    "deleteSuccess": "تم حذف المزود بنجاح.",
    "updateSuccess": "تم تحديث المزود بنجاح.",
    "delete": "حذف",
    "edit": "تعديل",
    "newModel": "إضافة نماذج للمزود",
    "noNewModel": "بالنسبة لـ LMStudio و Ollama و Llamafile، نقوم بالجلب ديناميكيًا. لا حاجة للإضافة اليدوية.",
    "searchModel": "بحث عن نموذج",
    "selectAll": "تحديد الكل",
    "save": "حفظ",
    "saving": "جاري الحفظ...",
    "manageModels": {
        "columns": {
            "name": "اسم النموذج",
            "model_type": "نوع النموذج",
            "model_id": "معرف النموذج",
            "provider": "اسم المزود",
            "actions": "إجراء",
            "nickname": "الاسم المستعار للنموذج"
        },
        "tooltip": {
            "delete": "حذف"
        },
        "confirm": {
            "delete": "هل أنت متأكد أنك تريد حذف هذا النموذج؟"
        },
        "modal": {
            "title": "إضافة نموذج مخصص",
            "form": {
                "name": {
                    "label": "معرف النموذج",
                    "placeholder": "llama3.2",
                    "required": "معرف النموذج مطلوب."
                },
                "provider": {
                    "label": "المزود",
                    "placeholder": "اختر المزود",
                    "required": "المزود مطلوب."
                },
                "type": {
                    "label": "نوع النموذج"
                }
            }
        }
    },
    "noModelFound": "لم يتم العثور على نموذج. تأكد من إضافة المزود الصحيح مع عنوان URL الأساسي ومفتاح API.",
    "radio": {
        "chat": "نموذج المحادثة",
        "embedding": "نموذج التضمين",
        "chatInfo": "يستخدم لإكمال المحادثة وتوليد المحادثات",
        "embeddingInfo": "يستخدم لـ RAG ومهام البحث الدلالي الأخرى ذات الصلة."
    },
    "nicknameModal": {
        "title": "إضافة / تعديل الاسم المستعار للنموذج",
        "form": {
            "modelName": {
                "label": "اسم النموذج",
                "placeholder": "أدخل اسم النموذج",
                "required": "اسم النموذج مطلوب."
            },
            "modelAvatar": {
                "label": "صورة النموذج",
                "placeholder": "أدخل صورة النموذج",
                "help": "يرجى إدخال رابط صورة النموذج. سيتم عرض هذه الصورة في نافذة المحادثة."
            }
        }
    }
}

================================================
FILE: src/assets/locale/ar/option.json
================================================
{ 
    "newChat": "محادثة جديدة",
    "selectAPrompt": "اختر موجهاً",
    "githubRepository": "مستودع GitHub",
    "settings": "الإعدادات",
    "sidebarTitle": "سجل المحادثات",
    "error": "خطأ",
    "somethingWentWrong": "حدث خطأ ما",
    "validationSelectModel": "الرجاء اختيار نموذج للمتابعة",
    "deleteHistoryConfirmation": "هل أنت متأكد أنك تريد حذف هذا السجل؟",
    "editHistoryTitle": "أدخل عنواناً جديداً",
    "temporaryChat": "محادثة مؤقتة",
    "more": {
        "copy": {
            "group": "نسخ",
            "asText": "نسخ كنص",
            "asMarkdown": "نسخ كماركداون",
            "success": "تم النسخ إلى الحافظة!"
        },
        "download": {
            "group": "تنزيل",
            "text": "ملف نصي (.txt)",
            "markdown": "ماركداون (.md)",
            "json": "ملف JSON (.json)"
        },
        "share": "مشاركة"
    }
}

================================================
FILE: src/assets/locale/ar/playground.json
================================================
{
    "ollamaState": {
        "searching": "جارٍ البحث عن Ollama الخاص بك 🦙",
        "running": "Ollama يعمل 🦙",
        "notRunning": "تعذر الاتصال بـ Ollama 🦙",
        "connectionError": "يبدو أنك تواجه خطأ في الاتصال. يرجى الرجوع إلى هذا <anchor>الدليل</anchor> لاستكشاف الأخطاء وإصلاحها."
    },
    "formError": {
        "noModel": "الرجاء اختيار نموذج",
        "noEmbeddingModel": "الرجاء تعيين نموذج التضمين في صفحة الإعدادات > RAG"
    },
    "form": {
        "textarea": {
            "placeholder": "اكتب رسالة..."
        },
        "webSearch": {
            "on": "تشغيل",
            "off": "إيقاف"
        }
    },
    "tooltip": {
        "searchInternet": "البحث في الإنترنت",
        "speechToText": "تحويل الكلام إلى نص",
        "uploadImage": "تحميل صورة",
        "stopStreaming": "إيقاف البث",
        "knowledge": "المعرفة",
        "vision": "[تجريبي] محادثة الرؤية",
        "clearContext": "مسح السياق"
    },
    "sendWhenEnter": "إرسال عند الضغط على Enter",
    "welcome": "مرحباً! كيف يمكنني مساعدتك اليوم؟",
    "useOCR": "استخراج النص من الصورة (OCR)"
}

================================================
FILE: src/assets/locale/ar/settings.json
================================================
{
  "generalSettings": {
    "title": "الإعدادات العامة",
    "settings": {
      "heading": "إعدادات واجهة المستخدم",
      "speechRecognitionLang": {
        "label": "لغة التعرف على الكلام",
        "placeholder": "اختر لغة"
      },
      "language": {
        "label": "اللغة",
        "placeholder": "اختر لغة"
      },
      "darkMode": {
        "label": "تغيير المظهر",
        "options": {
          "light": "فاتح",
          "dark": "داكن"
        }
      },
      "copilotResumeLastChat": {
        "label": "استئناف آخر محادثة عند فتح اللوحة الجانبية (كوبيلوت)"
      },
      "turnOnChatWithWebsite": {
        "label": "تمكين الدردشة مع الموقع بشكل افتراضي (كوبيلوت)"
      },
      "webUIResumeLastChat": {
        "label": "استئناف آخر محادثة عند فتح واجهة المستخدم"
      },
      "hideCurrentChatModelSettings": {
        "label": "إخفاء إعدادات نموذج المحادثة الحالي"
      },
      "restoreLastChatModel": {
        "label": "استعادة آخر نموذج مستخدم للمحادثات السابقة"
      },
      "sendNotificationAfterIndexing": {
        "label": "إرسال إشعار بعد الانتهاء من معالجة قاعدة المعرفة"
      },
      "generateTitle": {
        "label": "توليد العنوان باستخدام الذكاء الاصطناعي"
      },
      "ollamaStatus": {
        "label": "تمكين أو تعطيل فحص حالة اتصال أولاما"
      },
      "wideMode": {
        "label": "تمكين وضع الشاشة العريضة"
      },
      "openReasoning": {
        "label": "فتح التفكير المنطقي بشكل افتراضي"
      },
      "userChatBubble": {
        "label": "استخدام فقاعة الدردشة لرسائل المستخدم"
      },
      "autoCopyResponseToClipboard": {
        "label": "نسخ الرد تلقائياً إلى الحافظة"
      },
      "useMarkdownForUserMessage": {
        "label": "تمكين تنسيق ماركداون لرسائل المستخدم"
      },
      "copyAsFormattedText": {
        "label": "نسخ كنص منسق"
      },
      "tabMentionsEnabled": {
        "label": "تمكين إشارات التبويب (@tab)"
      },
      "pasteLargeTextAsFile": {
        "label": "لصق النص الكبير كملف"
      },
      "sidepanelTemporaryChat": {
        "label": "تمكين المحادثة المؤقتة في اللوحة الجانبية بشكل افتراضي"
      }
    },
    "sidepanelRag": {
      "heading": "إعدادات الاسترجاع",
      "ragEnabled": {
        "label": "تمكين التضمين والاسترجاع"
      },
      "maxWebsiteContext": {
        "label": "الحد الأقصى لحجم المحتوى لوضع السياق الكامل",
        "placeholder": "حجم المحتوى (الافتراضي 4028)"
      }
    },
    "webSearch": {
      "heading": "إدارة البحث على الإنترنت",
      "searchMode": {
        "label": "إجراء بحث بسيط على الإنترنت"
      },
      "provider": {
        "label": "محرك البحث",
        "placeholder": "اختر محرك بحث"
      },
      "totalSearchResults": {
        "label": "إجمالي نتائج البحث",
        "placeholder": "أدخل إجمالي نتائج البحث"
      },
      "visitSpecificWebsite": {
        "label": "زيارة الموقع المذكور في الرسالة"
      },
      "searxng": {
        "url": {
          "label": "رابط SearXNG"
        }
      },
      "braveApi": {
        "label": "مفتاح واجهة برنامج Brave",
        "placeholder": "أدخل مفتاح واجهة برنامج Brave"
      },
      "googleDomain": {
        "label": "نطاق جوجل"
      },
      "searchOnByDefault": {
        "label": "تفعيل البحث على الإنترنت بشكل افتراضي"
      }
    },
    "system": {
      "heading": "إعدادات النظام",
      "storageSyncEnabled": {
        "label": "تمكين مزامنة تخزين المتصفح (مزامنة الإعدادات عبر الأجهزة)"
      },
      "deleteChatHistory": {
        "label": "إعادة تعيين النظام",
        "button": "إعادة تعيين الكل",
        "confirm": "هل أنت متأكد أنك تريد إجراء إعادة تعيين النظام؟ سيؤدي هذا إلى مسح جميع البيانات ولا يمكن التراجع عنه."
      },
      "export": {
        "label": "تصدير جميع البيانات (سجل الدردشة، قاعدة المعرفة، الطلبات، والإعدادات)",
        "button": "تصدير البيانات",
        "success": "تم التصدير بنجاح"
      },
      "import": {
        "label": "استيراد جميع البيانات (سجل الدردشة، قاعدة المعرفة، الطلبات، والإعدادات)",
        "button": "استيراد البيانات",
        "success": "تم الاستيراد بنجاح",
        "error": "خطأ في الاستيراد"
      }
    },
    "tts": {
      "heading": "إعدادات تحويل النص إلى كلام",
      "ttsEnabled": {
        "label": "تمكين تحويل النص إلى كلام"
      },
      "ttsAutoPlay": {
        "label": "تشغيل الرد الصوتي تلقائياً بعد الاكتمال"
      },
      "ttsProvider": {
        "label": "مزود خدمة تحويل النص إلى كلام",
        "placeholder": "اختر مزود خدمة"
      },
      "ttsVoice": {
        "label": "صوت تحويل النص إلى كلام",
        "placeholder": "اختر صوتاً"
      },
      "ssmlEnabled": {
        "label": "تمكين SSML (لغة ترميز توليف الكلام)"
      },
      "removeReasoningTagTTS": {
        "label": "إزالة علامة التفكير من تحويل النص إلى كلام"
      }
    },
    "stt": {
      "heading": "إعدادات تحويل الكلام إلى نص",
      "autoStopTimeout": {
        "label": "مهلة التوقف التلقائي (مللي ثانية)",
        "placeholder": "أدخل مهلة التوقف التلقائي بالمللي ثانية"
      },
      "autoSubmitVoiceMessage": {
        "label": "إرسال الرسالة الصوتية تلقائياً"
      }
    }
  },
  "manageModels": {
    "title": "إدارة النماذج",
    "addBtn": "إضافة نموذج جديد",
    "columns": {
      "name": "الاسم",
      "digest": "الملخص",
      "modifiedAt": "تم التعديل في",
      "size": "الحجم",
      "actions": "الإجراءات"
    },
    "expandedColumns": {
      "parentModel": "النموذج الأصلي",
      "format": "التنسيق",
      "family": "العائلة",
      "parameterSize": "حجم المعلمة",
      "quantizationLevel": "مستوى التكميم"
    },
    "tooltip": {
      "delete": "حذف النموذج",
      "repull": "إعادة سحب النموذج"
    },
    "confirm": {
      "delete": "هل أنت متأكد أنك تريد حذف هذا النموذج؟",
      "repull": "هل أنت متأكد أنك تريد إعادة سحب هذا النموذج؟"
    },
    "modal": {
      "title": "إضافة نموذج جديد",
      "placeholder": "أدخل اسم النموذج",
      "pull": "سحب النموذج"
    },
    "notification": {
      "pullModel": "جاري سحب النموذج",
      "pullModelDescription": "جاري سحب نموذج {{modelName}}. لمزيد من التفاصيل، تحقق من أيقونة الإضافة.",
      "success": "نجاح",
      "error": "خطأ",
      "successDescription": "تم سحب النموذج بنجاح",
      "successDeleteDescription": "تم حذف النموذج بنجاح",
      "someError": "حدث خطأ ما. يرجى المحاولة مرة أخرى لاحقاً"
    }
  },
  "managePrompts": {
    "title": "إدارة الإرشادات",
    "addBtn": "إضافة إرشاد جديد",
    "option1": "عادي",
    "option2": "RAG",
    "questionPrompt": "إرشاد السؤال",
    "segmented": {
      "custom": "إرشادات مخصصة",
      "copilot": "إرشادات كوبيلوت"
    },
    "columns": {
      "title": "العنوان",
      "prompt": "الإرشاد",
      "type": "نوع الإرشاد",
      "actions": "الإجراءات"
    },
    "systemPrompt": "إرشاد النظام",
    "quickPrompt": "إرشاد سريع",
    "tooltip": {
      "delete": "حذف الإرشاد",
      "edit": "تعديل الإرشاد"
    },
    "confirm": {
      "delete": "هل أنت متأكد أنك تريد حذف هذا الإرشاد؟ لا يمكن التراجع عن هذا الإجراء."
    },
    "modal": {
      "addTitle": "إضافة إرشاد جديد",
      "editTitle": "تعديل الإرشاد"
    },
    "form": {
      "title": {
        "label": "العنوان",
        "placeholder": "إرشادي الرائع",
        "required": "الرجاء إدخال عنوان"
      },
      "prompt": {
        "label": "الإرشاد",
        "placeholder": "أدخل الإرشاد",
        "required": "الرجاء إدخال إرشاد",
        "help": "يمكنك استخدام {key} كمتغير في إرشادك.",
        "missingTextPlaceholder": "المتغير {text} مفقود في الإرشاد. الرجاء إضافته."
      },
      "isSystem": {
        "label": "إرشاد نظام"
      },
      "btnSave": {
        "saving": "جاري إضافة الإرشاد...",
        "save": "إضافة الإرشاد"
      },
      "btnEdit": {
        "saving": "جاري تحديث الإرشاد...",
        "save": "تحديث الإرشاد"
      }
    },
    "notification": {
      "addSuccess": "تمت إضافة الإرشاد",
      "addSuccessDesc": "تمت إضافة الإرشاد بنجاح",
      "error": "خطأ",
      "someError": "حدث خطأ ما. يرجى المحاولة مرة أخرى لاحقاً",
      "updatedSuccess": "تم تحديث الإرشاد",
      "updatedSuccessDesc": "تم تحديث الإرشاد بنجاح",
      "deletedSuccess": "تم حذف الإرشاد",
      "deletedSuccessDesc": "تم حذف الإرشاد بنجاح"
    }
  },
  "manageShare": {
    "title": "إدارة المشاركة",
    "heading": "تكوين رابط مشاركة الصفحة",
    "form": {
      "url": {
        "label": "رابط مشاركة الصفحة",
        "placeholder": "أدخل رابط مشاركة الصفحة",
        "required": "الرجاء إدخال رابط مشاركة الصفحة!",
        "help": "لأسباب تتعلق بالخصوصية، يمكنك استضافة مشاركة الصفحة ذاتياً وتوفير الرابط هنا. <anchor>تعلم المزيد</anchor>."
      }
    },
    "webshare": {
      "heading": "مشاركة الويب",
      "columns": {
        "title": "العنوان",
        "url": "الرابط",
        "actions": "الإجراءات"
      },
      "tooltip": {
        "delete": "حذف المشاركة"
      },
      "confirm": {
        "delete": "هل أنت متأكد أنك تريد حذف هذه المشاركة؟ لا يمكن التراجع عن هذا الإجراء."
      },
      "label": "إدارة مشاركة الصفحة",
      "description": "تمكين أو تعطيل ميزة مشاركة الصفحة"
    },
    "notification": {
      "pageShareSuccess": "تم تحديث رابط مشاركة الصفحة بنجاح",
      "someError": "حدث خطأ ما. يرجى المحاولة مرة أخرى لاحقاً",
      "webShareDeleteSuccess": "تم حذف مشاركة الويب بنجاح"
    }
  },
  "ollamaSettings": {
    "title": "إعدادات Ollama",
    "heading": "تكوين Ollama",
    "settings": {
      "ollamaUrl": {
        "label": "رابط Ollama",
        "placeholder": "أدخل رابط Ollama"
      },
      "globalEnable": {
        "label": "تمكين أو تعطيل تكامل Ollama عالمياً",
        "warning": "عند تعطيل تكامل Ollama عالمياً، لن يقوم مساعد الصفحة بجلب النماذج من Ollama. لا يزال بإمكانك إضافة نسخة Ollama من قسم <anchor>واجهة برمجة التطبيقات المتوافقة مع OpenAI</anchor> والتي ستعمل بشكل جيد."
      },
      "advanced": {
        "label": "تكوين رابط Ollama المتقدم",
        "urlRewriteEnabled": {
          "label": "تمكين أو تعطيل رابط المصدر المخصص"
        },
        "rewriteUrl": {
          "label": "رابط المصدر المخصص",
          "placeholder": "أدخل رابط المصدر المخصص"
        },
        "autoCORSFix": {
          "label": "تمكين أو تعطيل إصلاح CORS التلقائي لـ Ollama"
        },
        "headers": {
          "label": "الترويسات المخصصة",
          "add": "إضافة ترويسة",
          "key": {
            "label": "مفتاح الترويسة",
            "placeholder": "التفويض"
          },
          "value": {
            "label": "قيمة الترويسة",
            "placeholder": "رمز Bearer"
          }
        },
        "help": "إذا كنت تواجه مشاكل في الاتصال مع Ollama في مساعد الصفحة، يمكنك تكوين رابط مصدر مخصص. لمعرفة المزيد حول التكوين، <anchor>انقر هنا</anchor>."
      }
    }
  },
  "manageSearch": {
    "title": "إدارة البحث في الويب",
    "heading": "تكوين البحث في الويب"
  },
  "about": {
    "title": "حول",
    "heading": "حول",
    "chromeVersion": "إصدار مساعد الصفحة",
    "ollamaVersion": "إصدار Ollama",
    "support": "يمكنك دعم مشروع مساعد الصفحة من خلال التبرع أو الرعاية عبر المنصات التالية:",
    "koFi": "ادعم على Ko-fi",
    "githubSponsor": "كن راعياً على GitHub",
    "githubRepo": "مستودع GitHub"
  },
  "manageKnowledge": {
    "title": "إدارة المعرفة",
    "heading": "تكوين قاعدة المعرفة"
  },
  "rag": {
    "title": "إعدادات Pipeline ",
    "ragSettings": {
      "label": "إعدادات RAG",
      "model": {
        "label": "نموذج التضمين",
        "required": "الرجاء اختيار نموذج",
        "help": "يوصى بشدة باستخدام نماذج التضمين مثل `nomic-embed-text`.",
        "placeholder": "اختر نموذجاً"
      },
      "chunkSize": {
        "label": "حجم القطعة",
        "placeholder": "أدخل حجم القطعة",
        "required": "الرجاء إدخال حجم القطعة"
      },
      "chunkOverlap": {
        "label": "تداخل القطع",
        "placeholder": "أدخل تداخل القطع",
        "required": "الرجاء إدخال تداخل القطع"
      },
      "totalFilePerKB": {
        "label": "حد رفع الملفات الافتراضي لقاعدة المعرفة",
        "placeholder": "أدخل حد رفع الملفات الافتراضي (مثال: 10)",
        "required": "الرجاء إدخال حد رفع الملفات الافتراضي"
      },
      "noOfRetrievedDocs": {
        "label": "عدد المستندات المسترجعة",
        "placeholder": "أدخل عدد المستندات المسترجعة",
        "required": "الرجاء إدخال عدد المستندات المسترجعة"
      },
      "splittingSeparator": {
        "label": "الفاصل",
        "placeholder": "أدخل الفاصل (مثال: \\n\\n)",
        "required": "الرجاء إدخال الفاصل"
      },
      "splittingStrategy": {
        "label": "مقسم النص"
      }
    },
    "prompt": {
      "label": "تكوين إرشاد RAG",
      "option1": "عادي",
      "option2": "ويب",
      "alert": "تكوين إرشاد النظام هنا مهمل. يرجى استخدام قسم إدارة الإرشادات لإضافة أو تعديل الإرشادات. سيتم إزالة هذا القسم في إصدار مستقبلي",
      "systemPrompt": "إرشاد النظام",
      "systemPromptPlaceholder": "أدخل إرشاد النظام",
      "webSearchPrompt": "إرشاد بحث الويب",
      "webSearchPromptHelp": "لا تقم بإزالة `{search_results}` من الإرشاد.",
      "webSearchPromptError": "الرجاء إدخال إرشاد بحث الويب",
      "webSearchPromptPlaceholder": "أدخل إرشاد بحث الويب",
      "webSearchFollowUpPrompt": "إرشاد متابعة بحث الويب",
      "webSearchFollowUpPromptHelp": "لا تقم بإزالة `{chat_history}` و `{question}` من الإرشاد.",
      "webSearchFollowUpPromptError": "الرجاء إدخال إرشاد متابعة بحث الويب!",
      "webSearchFollowUpPromptPlaceholder": "إرشاد متابعة بحث الويب الخاص بك"
    }
  },
  "chromeAiSettings": {
    "title": "إعدادات Chrome AI"
  }
}


================================================
FILE: src/assets/locale/ar/sidepanel.json
================================================
{
    "tooltip": {
        "embed": "قد يستغرق تضمين الصفحة بضع دقائق. يرجى الانتظار...",
        "clear": "مسح سجل المحادثة",
        "history": "سجل المحادثة",
        "openwebui": "فتح واجهة الويب"
    }
}

================================================
FILE: src/assets/locale/da/chrome.json
================================================
{
    "heading": "Konfigurer Chrome AI",
    "status": {
        "label": "Tænd eller sluk Chrome AI Support på Page Assist"
    },
    "error": {
        "browser_not_supported": "Denne version af Chrome er ikke understøttet af Gemini Nano modelen. Opdater venligst til version 127 eller nyere",
        "ai_not_supported": "Indstillingen chrome://flags/#prompt-api-for-gemini-nano er ikke tændt. Venligst tænd for indstillingen.",
        "ai_not_ready": "Gemini Nano er ikke tilgængelig; du er nødt til at double-cheke Chrome indstillingerne.",
        "internal_error": "Der opstod en intern fejl. Prøv venligst igen senere."
    },
    "errorDescription": "For at bruge Chrome AI skal du bruge en browserversion, der er nyere end 138. Følg disse trin:\n\n1. Gå til `chrome://flags/#prompt-api-for-gemini-nano` og aktiver \"Prompt API for Gemini Nano\".\n2. Genstart Chrome for at anvende flaget.\n3. Gå tilbage til denne side og klik på \"Download Model\" — dette downloader en 4GB model for første gang.\n4. Når den er downloadet, kan Gemini Nano aktiveres gennem Page Assist.",
    "downloadModel": "Download model",
    "modelDownloadWarning": "Dette vil downloade en model med en omtrentlig downloadstørrelse på mellem 1,5 GB og 2,4 GB. Sørg for, at du har tilstrækkelig diskplads."
}

================================================
FILE: src/assets/locale/da/common.json
================================================
{
    "pageAssist": "Page Assist",
    "selectAModel": "Vælg en Model",
    "save": "Gem",
    "saved": "Gemt",
    "cancel": "Fortryd",
    "retry": "Prøv igen",
    "share": {
        "tooltip": {
            "share": "Del"
        },
        "modal": {
            "title": "Del link til Chatten"
        },
        "form": {
            "defaultValue": {
                "name": "Anonym",
                "title": "Unavngivet chat"
            },
            "title": {
                "label": "Chattitel",
                "placeholder": "Indtast chattitel",
                "required": "Chattitel er nødvendig"
            },
            "name": {
                "label": "Dit navn",
                "placeholder": "Indtast dit navn",
                "required": "Dit navn er nødvendig"
            },
            "btn": {
                "save": "Generer et Link",
                "saving": "Generering af link..."
            }
        },
        "notification": {
            "successGenerate": "Link kopied til udklipsholder",
            "failGenerate": "Kunne ikke generere link"
        }
    },
    "copyToClipboard": "Kopier til udklipsholder",
    "webSearch": "Søger på internettet",
    "regenerate": "Regenerer",
    "continue": "Fortsæt svar",
    "edit": "Ændre",
    "delete": "Slet",
    "saveAndSubmit": "Gem & Indsend",
    "editMessage": {
        "placeholder": "Skriv en besked..."
    },
    "submit": "Indsend",
    "noData": "Igen data",
    "noHistory": "Igen chat history",
    "chatWithCurrentPage": "Chat med nuværende side",
    "beta": "Beta",
    "tts": "Læs op",
    "currentChatModelSettings": "Nuværende chat model indstillinger",
    "modelSettings": {
        "label": "Model Indstillinger",
        "description": "Konfigurer model indstillingerne alle chats",
        "form": {
            "keepAlive": {
                "label": "Hold i live",
                "help": "controls how long the model will stay loaded into memory following the request (standard: 5m)",
                "placeholder": "Indtast længden af sessionen (fx. 5m, 10m, 1t)"
            },
            "temperature": {
                "label": "Temperatur",
                "placeholder": "Indtast Temperatur værdi (fx. 0.7, 1.0)"
            },
            "numCtx": {
                "label": "Kontekst Vindue Størrelse (num_ctx)",
                "placeholder": "Indtast Kontekst Vindue Størrelse værdi (standard: 2048)"
            },
            "numPredict": {
                "label": "Maks Tokens (num_predict)",
                "placeholder": "Indtast Maks Tokens værdi (fx. 2048, 4096)"
            },
            "seed": {
                "label": "Seed",
                "placeholder": "Indtast Seed værdi (fx. 1234)",
                "help": "Reproducerbarhed af modeloutput"
            },
            "topK": {
                "label": "Top K",
                "placeholder": "Indtast Top K værdi (fx. 40, 100)"
            },
            "topP": {
                "label": "Top P",
                "placeholder": "Indtast Top P value (fx. 0.9, 0.95)"
            },
            "numGpu": {
                "label": "Antal GPU'er",
                "placeholder": "Indtast antallet af lag, som sendes til GPU('er)"
            },
            "systemPrompt": {
                "label": "Midlertidige System Prompt",
                "placeholder": "Indtast System Prompt",
                "help": "Dette er en hurtig måde at indstille systemprompten i den aktuelle chat, som vil tilsidesætte den valgte systemprompt, hvis den findes."
            }
        },
        "advanced": "Flere Model Indstillinger"
    },
    "copilot": {
        "summary": "Opsummer",
        "explain": "Forklar",
        "rephrase": "Omskriv",
        "translate": "Oversæt",
        "custom": "Brugerdefineret"
    },
    "citations": "Citater",
    "downloadCode": "Download Kode",
    "date": {
        "pinned": "Fastgjort",
        "today": "I dag",
        "yesterday": "I går",
        "last7Days": "Sidste 7 dage",
        "older": "Ældre"
    },
    "range": {
        "deleteConfirm": {
            "pinned": "Er du sikker på, at du vil slette alle fastgjorte beskeder?",
            "today": "Er du sikker på, at du vil slette alle beskeder fra i dag?",
            "yesterday": "Er du sikker på, at du vil slette alle beskeder fra i går?",
            "last7Days": "Er du sikker på, at du vil slette alle beskeder fra de sidste 7 dage?",
            "older": "Er du sikker på, at du vil slette alle ældre beskeder?"
        },
        "tooltip": {
            "pinned": "Slet alle fastgjorte beskeder",
            "today": "Slet alle beskeder fra i dag",
            "yesterday": "Slet alle beskeder fra i går",
            "last7Days": "Slet alle beskeder fra de sidste 7 dage",
            "older": "Slet alle ældre beskeder"
        }
    },
    "pin": "Fastgør",
    "unpin": "Frigør",
    "generationInfo": "Genererings Info",
    "sidebarChat": "Sidepanel Chat",
    "reasoning": {
        "thinking": "Tænker....",
        "thought": "Tænkte i {{time}}"
    },
    "embeddingGen": "Opretter embeddings, dette kan tage en stund",
    "semanticSearch": "Udfører semantisk søgning",
    "downloading": "Downloader",
    "cancelPullingModel": {
        "confirm": "Er du sikker på, at du vil annullere downloadet? Dette stopper downloadprocessen. Ifølge Ollama-dokumentationen kan du genoptage, hvor du slap."
    }
}

================================================
FILE: src/assets/locale/da/knowledge.json
================================================
{
    "addBtn": "Tilføj Ny Viden",
    "columns": {
        "title": "Titel",
        "status": "Status",
        "embeddings": "Embedding Model",
        "createdAt": "Oprettet At",
        "action": "Handlinger"
    },
    "expandedColumns": {
        "name": "Navn"
    },
    "confirm": {
        "delete": "Er du sikker på du vil slette denne viden?"
    },
    "deleteSuccess": "Viden slettet med success",
    "status": {
        "pending": "Venter",
        "finished": "Færdig",
        "processing": "Processerer",
        "failed": "Fejlet"
    },
    "addKnowledge": "Tilføj Viden",
    "updateKnowledge": "Tilføj Kilde",
    "form": {
        "title": {
            "label": "Viden Titel",
            "placeholder": "Indtast viden titel",
            "required": "Viden titel er nødvendig"
        },
        "uploadFile": {
            "label": "Upload Filer",
            "uploadText": "Træk og slip denne fil here og klik upload",
            "uploadHint": "Understøttet filtyper: .pdf, .csv, .txt, .md, .docx",
            "required": "En fil er nødvendig"
        },
        "submit": "Indsend",
        "success": "Viden tilføjet med success"
    },
    "noEmbeddingModel": "Tilføj venligst en embedding model fra RAG indstillingerne først"
}

================================================
FILE: src/assets/locale/da/openai.json
================================================
{
    "settings": "OpenAI Kompatibel API",
    "heading": "OpenAI kompatibel API",
    "subheading": "Administrer og konfigurer dine OpenAI API-kompatible udbydere her.",
    "addBtn": "Tilføj Udbyder",
    "table": {
        "name": "Udbyders Navn",
        "baseUrl": "Basis URL",
        "actions": "Handling"
    },
    "modal": {
        "titleAdd": "Tilføj Ny Udbyder",
        "name": {
            "label": "Udbyders Navn",
            "required": "Udbyders navn er påkrævet.",
            "placeholder": "Indtast udbyders navn"
        },
        "baseUrl": {
            "label": "Basis URL",
            "help": "Basis URL'en for OpenAI API-udbyderen. f.eks. (http://localhost:1234/v1)",
            "required": "Basis URL er påkrævet.",
            "placeholder": "Indtast basis URL"
        },
        "apiKey": {
            "label": "API Nøgle",
            "required": "API Nøgle er påkrævet.",
            "placeholder": "Indtast API Nøgle"
        },
        "submit": "Gem",
        "update": "Opdater",
        "deleteConfirm": "Er du sikker på, at du vil slette denne udbyder?",
        "model": {
            "title": "Modelliste",
            "subheading": "Vælg venligst de chatmodeller, du ønsker at bruge med denne udbyder.",
            "success": "Nye modeller tilføjet med succes."
        },
        "tipLMStudio": "Page Assist vil automatisk hente de modeller, du har indlæst på LM Studio. Du behøver ikke at tilføje dem manuelt."
    },
    "addSuccess": "Udbyder tilføjet med succes.",
    "deleteSuccess": "Udbyder slettet med succes.",
    "updateSuccess": "Udbyder opdateret med succes.",
    "delete": "Slet",
    "edit": "Rediger",
    "newModel": "Tilføj Modeller til Udbyder",
    "noNewModel": "For LMStudio, Ollama, Llamafile, henter vi dynamisk. Ingen manuel tilføjelse nødvendig.",
    "searchModel": "Søg Model",
    "selectAll": "Vælg Alle",
    "save": "Gem",
    "saving": "Gemmer...",
    "manageModels": {
        "columns": {
            "name": "Modelnavn",
            "model_type": "Modeltype",
            "model_id": "Model-ID",
            "provider": "Udbyders Navn",
            "actions": "Handling",
            "nickname": "Model Kaldenavn"
        },
        "tooltip": {
            "delete": "Slet"
        },
        "confirm": {
            "delete": "Er du sikker på, at du vil slette denne model?"
        },
        "modal": {
            "title": "Tilføj Brugerdefineret Model",
            "form": {
                "name": {
                    "label": "Model-ID",
                    "placeholder": "llama3.2",
                    "required": "Model-ID er påkrævet."
                },
                "provider": {
                    "label": "Udbyder",
                    "placeholder": "Vælg udbyder",
                    "required": "Udbyder er påkrævet."
                },
                "type": {
                    "label": "Modeltype"
                }
            }
        }
    },
    "noModelFound": "Ingen model fundet. Sørg for, at du har tilføjet korrekt udbyder med basis URL og API-nøgle.",
    "radio": {
        "chat": "Chatmodel",
        "embedding": "Indlejringsmodel",
        "chatInfo": "bruges til chatfuldførelse og samtalegeneration",
        "embeddingInfo": "bruges til RAG og andre semantiske søgerelaterede opgaver."
    },
    "nicknameModal": {
        "title": "Tilføj / Rediger Model Kaldenavn",
        "form": {
            "modelName": {
                "label": "Modelnavn",
                "placeholder": "Indtast modelnavn",
                "required": "Modelnavn er påkrævet."
            },
            "modelAvatar": {
                "label": "Model Avatar",
                "placeholder": "Indtast model avatar",
                "help": "Indtast venligst URL'en til model avataren. Dette billede vil blive vist i chatvinduet."
            }
        }
    }
}

================================================
FILE: src/assets/locale/da/option.json
================================================
{
    "newChat": "Ny Chat",
    "selectAPrompt": "Vælg en Prompt",
    "githubRepository": "GitHub Repository",
    "settings": "Indstillinger",
    "sidebarTitle": "Chathistorik",
    "error": "Fejl",
    "somethingWentWrong": "Noget gik galt",
    "validationSelectModel": "Venligst vælg en model for at forsæætte",
    "deleteHistoryConfirmation": "Er du sikker på at du vil slette denne historik?",
    "editHistoryTitle": "Indtast en ny titel",
    "temporaryChat": "Midlertidig Chat",
    "more": {
        "copy": {
            "group": "Kopier",
            "asText": "Kopier som tekst",
            "asMarkdown": "Kopier som Markdown",
            "success": "Kopieret til udklipsholder!"
        },
        "download": {
            "group": "Download",
            "text": "Tekstfil (.txt)",
            "markdown": "Markdown (.md)",
            "json": "JSON-fil (.json)"
        },
        "share": "Del"
    }
}

================================================
FILE: src/assets/locale/da/playground.json
================================================
{
    "ollamaState": {
        "searching": "Søger efter din Ollama 🦙",
        "running": "Ollama kør 🦙",
        "notRunning": "Kan ikke oprette forbindelse til Ollama 🦙",
        "connectionError": "Det lader til, at du har en forbindelsesfejl. Se venligst denne <anchor>dokumentation</anchor> for fejlfinding."
    },
    "formError": {
        "noModel": "Vælg venligst en model",
        "noEmbeddingModel": "Vælg venligst en embedding model under indstillinger > RAG side"
    },
    "form": {
        "textarea": {
            "placeholder": "Skriv en besked..."
        },
        "webSearch": {
            "on": "Til",
            "off": "Fra"
        }
    },
    "tooltip": {
        "searchInternet": "Søg Internettet",
        "speechToText": "Tal til Tekst",
        "uploadImage": "Upload Billed",
        "stopStreaming": "Stop Streaming",
        "knowledge": "Viden",
        "clearContext": "Ryd Kontekst"
    },
    "sendWhenEnter": "Søg, når Indtast trykkes",
    "welcome": "Hej! Hvordan kan jeg hjælpe dig i dag?",
    "useOCR": "Udtræk tekst fra billede (OCR)"
}

================================================
FILE: src/assets/locale/da/settings.json
================================================
{
  "generalSettings": {
    "title": "Generelle Indstillinger",
    "settings": {
      "heading": "Web UI Indstillinger",
      "speechRecognitionLang": {
        "label": "Talegenkendelse Sprog",
        "placeholder": "Vælg et sprog"
      },
      "language": {
        "label": "Sprog",
        "placeholder": "Vælg et sprog"
      },
      "darkMode": {
        "label": "Ændre Tema",
        "options": {
          "light": "Lyst",
          "dark": "Mørkt"
        }
      },
      "copilotResumeLastChat": {
        "label": "Genoptag den sidste chat, når du åbner SidePanel (copilot)"
      },
      "webUIResumeLastChat": {
        "label": "Genoptag den sidste chat, når du åbner Web UI'en"
      },
      "hideCurrentChatModelSettings": {
        "label": "Skjul nuværende chat model indstillinger"
      },
      "restoreLastChatModel": {
        "label": "Gendan sidste brugte chatmodel fremtidigt"
      },
      "sendNotificationAfterIndexing": {
        "label": "Send besked efter færdigbehandling af vidensbasen"
      },
      "generateTitle": {
        "label": "Generer titel med AI"
      },
      "ollamaStatus": {
        "label": "Aktivér eller deaktivér Ollama forbindelsesstatus kontrol"
      },
      "wideMode": {
        "label": "Aktivér bredskærm tilstand"
      },
      "openReasoning": {
        "label": "Åbn Ræsonnement Sammenfoldet som standard"
      },
      "userChatBubble": {
        "label": "Brug chatboble til brugermeddelelser"
      },
      "autoCopyResponseToClipboard": {
        "label": "Kopiér automatisk svar til udklipsholder"
      },
      "useMarkdownForUserMessage": {
        "label": "Aktivér Markdown formatering for brugermeddelelser"
      },
      "copyAsFormattedText": {
        "label": "Kopiér som formateret tekst"
      },
      "tabMentionsEnabled": {
        "label": "Aktivér Tab Omtaler (@tab)"
      },
      "pasteLargeTextAsFile": {
        "label": "Indsæt stor tekst som fil"
      },
      "sidepanelTemporaryChat": {
        "label": "Aktivér midlertidig chat i SidePanel som standard"
      }
    },
    "sidepanelRag": {
      "heading": "Vidensbase Indstillinger",
      "ragEnabled": {
        "label": "Aktivér Indeksering og Genfinding"
      },
      "maxWebsiteContext": {
        "label": "Maksimal Indholdsstørrelse for Fuld Kontekst Tilstand",
        "placeholder": "Indholdsstørrelse (standard 4028)"
      }
    },
    "webSearch": {
      "heading": "Administrer Web Søgning",
      "searchMode": {
        "label": "Søge Tilstand"
      },
      "provider": {
        "label": "Søgemaskine",
        "placeholder": "Vælg en søgemaskine"
      },
      "totalSearchResults": {
        "label": "Antal søgeresultater",
        "placeholder": "Indtast antal Søgeresultater"
      },
      "visitSpecificWebsite": {
        "label": "Besøg websitet nævnt i samtalen"
      },
      "searxng": {
        "url": {
          "label": "SearXNG URL"
        }
      },
      "braveApi": {
        "label": "Brave API Nøgle",
        "placeholder": "Indtast din Brave API nøgle"
      },
      "searchOnByDefault": {
        "label": "Internet Søgning TIL som standard"
      }
    },
    "system": {
      "heading": "Systemindstillinger",
      "storageSyncEnabled": {
        "label": "Aktivér browser lagringssynkronisering (synkroniser indstillinger på tværs af enheder)"
      },
      "deleteChatHistory": {
        "label": "System Nulstilling",
        "button": "Nulstil Alt",
        "confirm": "Er du sikker på, at du vil udføre en systemnulstilling? Dette vil slette alle data og kan ikke fortrydes."
      },
      "export": {
        "label": "Eksporter alle data (chat-historik, vidensbase, prompts og indstillinger)",
        "button": "Eksporter data",
        "success": "Eksport fuldført"
      },
      "import": {
        "label": "Importer alle data (chat-historik, vidensbase, prompts og indstillinger)",
        "button": "Importer data",
        "success": "Import fuldført",
        "error": "Importfejl"
      }
    },
    "tts": {
      "heading": "Tekst-til-tale Indstillinger",
      "ttsEnabled": {
        "label": "Tilføj Teskt-til-Tale"
      },
      "ttsAutoPlay": {
        "label": "Automatisk afspilning af stemmerespons efter færdiggørelse"
      },
      "ttsProvider": {
        "label": "Tekst-til-Tale Udbyder",
        "placeholder": "Vælg en udbyder"
      },
      "ttsVoice": {
        "label": "Tekst-til-Tale Stemme",
        "placeholder": "Vælg en stemme"
      },
      "ssmlEnabled": {
        "label": "Aktiver SSML (Speech Synthesis Markup Language)"
      },
      "removeReasoningTagTTS": {
        "label": "Fjern Ræsonnement Tag fra TTS"
      }
    },
    "stt": {
      "heading": "Tale-til-Tekst Indstillinger",
      "autoStopTimeout": {
        "label": "Auto Stop Timeout (ms)",
        "placeholder": "Indtast auto-stop timeout i millisekunder"
      },
      "autoSubmitVoiceMessage": {
        "label": "Auto Send Stemmebesked"
      }
    }
  },
  "manageModels": {
    "title": "Administer Modeller",
    "addBtn": "Tilføj ny Model",
    "columns": {
      "name": "Navn",
      "digest": "Digest",
      "modifiedAt": "Ændret den",
      "size": "Størrelse",
      "actions": "Handlinger"
    },
    "expandedColumns": {
      "parentModel": "Forælder model",
      "format": "Format",
      "family": "Familie",
      "parameterSize": "Parameterstørrelse",
      "quantizationLevel": "kvantificeringsniveau"
    },
    "tooltip": {
      "delete": "Slet Model",
      "repull": "Hent Model Igen"
    },
    "confirm": {
      "delete": "Er du sikker på, at du vil slette denne model?",
      "repull": "Er du sikker på, at du vil hente denne model igen?"
    },
    "modal": {
      "title": "Tilføj Ny Model",
      "placeholder": "Indtast Modelnavn",
      "pull": "Hent Model"
    },
    "notification": {
      "pullModel": "Henter Model",
      "pullModelDescription": "Henter {{modelName}} model. For flere detaljer, tjek udvidelsesikonet.",
      "success": "Det virkede",
      "error": "Fejl",
      "successDescription": "Det lykkedes at hente modellen",
      "successDeleteDescription": "Det lykkedes at slette modellen",
      "someError": "Noget gik galt. Venligst prøv igen senere"
    }
  },
  "managePrompts": {
    "title": "Administrer Prompts",
    "addBtn": "Tilføj Ny Prompt",
    "option1": "Normal",
    "option2": "RAG",
    "questionPrompt": "Spørgsmålsprompt",
    "segmented": {
      "custom": "Brugerdefinerede Prompts",
      "copilot": "Copilot Prompts"
    },
    "columns": {
      "title": "Titel",
      "prompt": "Prompt",
      "type": "Prompttype",
      "actions": "Handlinger"
    },
    "systemPrompt": "Systemprompt",
    "quickPrompt": "Hurtig Prompt",
    "tooltip": {
      "delete": "Slet Prompt",
      "edit": "Ændre Prompt"
    },
    "confirm": {
      "delete": "Er du sikker på, at du vil slette denne prompt? Denne handling kan ikke fortrydes."
    },
    "modal": {
      "addTitle": "Tilføj ny Prompt",
      "editTitle": "Ændre Prompt"
    },
    "form": {
      "title": {
        "label": "Titel",
        "placeholder": "Min Seje Prompt",
        "required": "Indtast venligst en titel"
      },
      "prompt": {
        "label": "Prompt",
        "placeholder": "Indtast Prompt",
        "required": "Venligst indtast en prompt",
        "help": "Du kan bruge {key} som variabel i din prompt.",
        "missingTextPlaceholder": "Variablen {text} mangler i prompten. Tilføj venligst dette."
      },
      "isSystem": {
        "label": "Er Systemprompt"
      },
      "btnSave": {
        "saving": "Tilføjer Prompt...",
        "save": "Tilføj Prompt"
      },
      "btnEdit": {
        "saving": "Opdaterer Prompt...",
        "save": "Opdater Prompt"
      }
    },
    "notification": {
      "addSuccess": "Prompt Tilføjet",
      "addSuccessDesc": "Prompt blev tilføjet med succes",
      "error": "Fejl",
      "someError": "Noget gik galt. Prøv venligst igen senere",
      "updatedSuccess": "Prompt Opdateret",
      "updatedSuccessDesc": "Prompt blev opdateret med succes",
      "deletedSuccess": "Prompt Slettet",
      "deletedSuccessDesc": "Prompt blev slettet med succes"
    }
  },
  "manageShare": {
    "title": "Administrer Deling",
    "heading": "Konfigurerer Page deling URL",
    "form": {
      "url": {
        "label": "Page Deling URL",
        "placeholder": "Indtast websted deling URL",
        "required": "Venligst indstast din Page deling URL!",
        "help": "Af hensyn til privatliv kan du selv hoste side delingen og angive URL'en her. <anchor>Lær Mere</anchor>."
      }
    },
    "webshare": {
      "heading": "Web Deling",
      "columns": {
        "title": "Titel",
        "url": "URL",
        "actions": "Handlinger"
      },
      "tooltip": {
        "delete": "Slet Deling"
      },
      "confirm": {
        "delete": "Er du sikker på du vil slette denne deling? Dette kan ikke fortrydes."
      },
      "label": "Administrer Page Deling",
      "description": "Tilføj eller disable the page share feature"
    },
    "notification": {
      "pageShareSuccess": "Page Deling URL Updateret korrekt",
      "someError": "Noget gik galt. Prøv venligst igen senere",
      "webShareDeleteSuccess": "Webdeling er slettet korrekt"
    }
  },
  "ollamaSettings": {
    "title": "Ollama Indstillinger",
    "heading": "Konfigurerer Ollama",
    "settings": {
      "ollamaUrl": {
        "label": "Ollama URL",
        "placeholder": "Indtast Ollama URL"
      },
      "globalEnable": {
        "label": "Aktiver eller Deaktiver Ollama Integration Globalt",
        "warning": "Ved at deaktivere Ollama-integration globalt vil Page Assist ikke hente modeller fra Ollama. Du kan stadig tilføje Ollama-instans fra <anchor>OpenAI-kompatibel API</anchor> sektionen, som vil fungere fint."
      },
      "advanced": {
        "label": "Avanceret Ollama URL Konfiguration",
        "urlRewriteEnabled": {
          "label": "Aktiver eller Deaktiver Tilpasset Oprindelses-URL"
        },
        "rewriteUrl": {
          "label": "Tilpasset Oprindelses URL",
          "placeholder": "Indtast tilpasset oprindelses URL"
        },
        "autoCORSFix": {
          "label": "Aktiver eller Deaktiver Automatisk Ollama CORS Fix"
        },
        "headers": {
          "label": "Tilpas Headers",
          "Tilføj": "Tilføj Header",
          "key": {
            "label": "Header Værdi",
            "placeholder": "Autorisation"
          },
          "value": {
            "label": "Header Value",
            "placeholder": "Bearer token"
          }
        },
        "help": "Hvis du har forbindelsesproblemer med Ollama på Page Assist, kan du konfigurere en brugerdefineret oprindelses-URL. For mere information om konfigurationen, <anchor>klik her</anchor>."
      }
    }
  },
  "manageSearch": {
    "title": "Administrer Web Search",
    "heading": "Konfigurerer Web Search"
  },
  "about": {
    "title": "Om",
    "heading": "Om",
    "chromeVersion": "Page Assist Version",
    "ollamaVersion": "Ollama Version",
    "support": "Du kan støtte Page Assist-projektet ved at donere eller sponsorere via følgende platforme:",
    "koFi": "Støt på Ko-fi",
    "githubSponsor": "Sponsor på GitHub",
    "githubRepo": "GitHub Repository"
  },
  "manageKnowledge": {
    "title": "Administrer Viden",
    "heading": "konfigurer Videnbase"
  },
  "rag": {
    "title": "Pipeline Indstillinger",
    "ragSettings": {
      "label": "RAG Indstillinger",
      "model": {
        "label": "Embedding Model",
        "required": "Vælg venligst en model",
        "help": "Det anbefales stærkt at bruge indlejringsmodeller som `nomic-embed-text`.",
        "placeholder": "Vælg a model"
      },
      "chunkSize": {
        "label": "Chunk Størrelse",
        "placeholder": "Indtast Chunk Størrelse",
        "required": "Venligst indtast en chunk størrelse"
      },
      "chunkOverlap": {
        "label": "Chunk Overlap",
        "placeholder": "Indtast Chunk Overlap",
        "required": "Indtast venligst chunk overlap"
      },
      "totalFilePerKB": {
        "label": "Videnbase Standard Fil Upload Grænse",
        "placeholder": "Indtast standard fil upload grænse (f.eks. 10)",
        "required": "Indtast venligst standard fil upload grænsen"
      },
      "noOfRetrievedDocs": {
        "label": "Antal Hentede Dokumenter",
        "placeholder": "Indtast Number of Retrieved Documents",
        "required": "Venligst indtast the number of retrieved documents"
      },
      "splittingSeparator": {
        "label": "Separator",
        "placeholder": "Indtast Separator (f.eks. \\n\\n)",
        "required": "Indtast venligst en separator"
      },
      "splittingStrategy": {
        "label": "Tekst Splitter"
      }
    },
    "prompt": {
      "label": "Konfigurer RAG Prompt",
      "option1": "Normal",
      "option2": "Web",
      "alert": "Konfigurering af systemprompt her er forældet. Venligst brug Administrer Prompts sektionen til, at tilføje eller ændre prompts. Denne sektion vil blive fjernet i fremtidige versioner.",
      "systemPrompt": "System Prompt",
      "systemPromptPlaceholder": "Indtast System Prompt",
      "webSearchPrompt": "Websøgningsprompt",
      "webSearchPromptHelp": "Fjern ikke `{search_results}` fra prompten.",
      "webSearchPromptError": "Venligst indtast a web search prompt",
      "webSearchPromptPlaceholder": "Indtast Websøgningsprompt",
      "webSearchFollowUpPrompt": "Web Search Follow Up Prompt",
      "webSearchFollowUpPromptHelp": "Do not remove `{chat_history}` og `{question}` from the prompt.",
      "webSearchFollowUpPromptError": "Indtast venligst din websøgning opfølgende prompt!",
      "webSearchFollowUpPromptPlaceholder": "Din Websøgnings opfølgende Prompt"
    }
  },
  "chromeAiSettings": {
    "title": "Chrome AI Indstillinger"
  }
}


================================================
FILE: src/assets/locale/da/sidepanel.json
================================================
{
    "tooltip": {
        "embed": "Det kan tage et par minutter at indlejre siden. Vent venligst...",
        "clear": "Slet chat historiken",
        "history": "Chat historik",
        "openwebui": "Åbn WebUI"
    }
}

================================================
FILE: src/assets/locale/de/chrome.json
================================================
{
    "heading": "Chrome AI konfigurieren",
    "status": {
        "label": "Chrome AI-Unterstützung für Page Assist aktivieren oder deaktivieren"
    },
    "error": {
        "browser_not_supported": "Diese Version von Chrome wird vom Gemini Nano-Modell nicht unterstützt. Bitte aktualisieren Sie auf Version 127 oder höher",
        "ai_not_supported": "Die Einstellung chrome://flags/#prompt-api-for-gemini-nano ist nicht aktiviert. Bitte aktivieren Sie sie.",
        "ai_not_ready": "Gemini Nano ist noch nicht bereit; Sie müssen die Chrome-Einstellungen überprüfen.",
        "internal_error": "Ein interner Fehler ist aufgetreten. Bitte versuchen Sie es später erneut."
    },
    "errorDescription": "Um Chrome AI zu verwenden, benötigen Sie Chrome Version 138 oder höher. Befolgen Sie diese Schritte:\n\n1. Gehen Sie zu `chrome://flags/#prompt-api-for-gemini-nano` und aktivieren Sie \"Prompt API for Gemini Nano\".\n2. Starten Sie Chrome neu, um das Flag zu übernehmen.\n3. Kehren Sie zu dieser Seite zurück und klicken Sie auf \"Modell herunterladen\" — dies lädt beim ersten Mal ein 4-GB-Modell herunter.\n4. Sobald das Modell heruntergeladen wurde, kann Gemini Nano über Page Assist aktiviert werden.",
    "downloadModel": "Modell herunterladen",
    "modelDownloadWarning": "Dies wird ein Modell mit einer ungefähren Downloadgröße von 1,5 GB bis 2,4 GB herunterladen. Stellen Sie sicher, dass Sie über ausreichend Speicherplatz verfügen."
}

================================================
FILE: src/assets/locale/de/common.json
================================================
{
    "pageAssist": "Page Assist",
    "selectAModel": "Modell auswählen",
    "save": "Speichern",
    "saved": "Gespeichert",
    "cancel": "Abbrechen",
    "retry": "Erneut versuchen",
    "share": {
        "tooltip": {
            "share": "Teilen"
        },
        "modal": {
            "title": "Link zum Chat teilen"
        },
        "form": {
            "defaultValue": {
                "name": "Anonym",
                "title": "Unbenannter Chat"
            },
            "title": {
                "label": "Chat-Titel",
                "placeholder": "Chat-Titel eingeben",
                "required": "Chat-Titel ist erforderlich"
            },
            "name": {
                "label": "Ihr Name",
                "placeholder": "Geben Sie Ihren Namen ein",
                "required": "Ihr Name ist erforderlich"
            },
            "btn": {
                "save": "Link generieren",
                "saving": "Link wird generiert..."
            }
        },
        "notification": {
            "successGenerate": "Link in die Zwischenablage kopiert",
            "failGenerate": "Link konnte nicht generiert werden"
        }
    },
    "copyToClipboard": "In die Zwischenablage kopieren",
    "webSearch": "Web durchsuchen",
    "regenerate": "Neu generieren",
    "edit": "Bearbeiten",
    "delete": "Löschen",
    "continue": "Antwort fortsetzen",
    "saveAndSubmit": "Speichern & Absenden",
    "editMessage": {
        "placeholder": "Nachricht eingeben..."
    },
    "submit": "Absenden",
    "noData": "Keine Daten",
    "noHistory": "Kein Chat-Verlauf",
    "chatWithCurrentPage": "Mit aktueller Seite chatten",
    "beta": "Beta",
    "tts": "Vorlesen",
    "currentChatModelSettings": "Aktuelle Chat-Modell-Einstellungen",
    "modelSettings": {
        "label": "Modell-Einstellungen",
        "description": "Legen Sie die Modelloptionen global für alle Chats fest",
        "form": {
            "keepAlive": {
                "label": "Aktiv halten",
                "help": "Steuert, wie lange das Modell nach der Anfrage im Speicher geladen bleibt (Standard: 5m)",
                "placeholder": "Geben Sie die Dauer für Aktiv halten ein (z.B. 5m, 10m, 1h)"
            },
            "temperature": {
                "label": "Temperatur",
                "placeholder": "Geben Sie den Temperaturwert ein (z.B. 0.7, 1.0)"
            },
            "numCtx": {
                "label": "Kontextfenstergröße (num_ctx)",
                "placeholder": "Geben Sie die Kontextfenstergröße ein (Standard: 2048)"
            },
            "numPredict": {
                "label": "Max Tokens (num_predict)",
                "placeholder": "Geben Sie den Max-Tokens-Wert ein (z.B. 2048, 4096)"
            },
            "seed": {
                "label": "Seed",
                "placeholder": "Geben Sie den Seed-Wert ein (z.B. 1234)",
                "help": "Reproduzierbarkeit der Modellausgabe"
            },
            "topK": {
                "label": "Top K",
                "placeholder": "Geben Sie den Top-K-Wert ein (z.B. 40, 100)"
            },
            "topP": {
                "label": "Top P",
                "placeholder": "Geben Sie den Top-P-Wert ein (z.B. 0.9, 0.95)"
            },
            "numGpu": {
                "label": "Anzahl GPUs",
                "placeholder": "Geben Sie die Anzahl der Ebenen ein, die an GPU(s) gesendet werden sollen"
            },
            "systemPrompt": {
                "label": "Temporärer System-Prompt",
                "placeholder": "System-Prompt eingeben",
                "help": "Dies ist eine schnelle Möglichkeit, den System-Prompt im aktuellen Chat festzulegen, der den ausgewählten System-Prompt überschreibt, falls vorhanden."
            }
        },
        "advanced": "Weitere Modell-Einstellungen"
    },
    "copilot": {
        "summary": "Zusammenfassen",
        "explain": "Erklären",
        "rephrase": "Umformulieren",
        "translate": "Übersetzen",
        "custom": "Benutzerdefiniert"
    },
    "citations": "Zitate",
    "downloadCode": "Code herunterladen",
    "date": {
        "pinned": "Angepinnt",
        "today": "Heute",
        "yesterday": "Gestern",
        "last7Days": "Letzte 7 Tage",
        "older": "Älter"
    },
    "range": {
        "deleteConfirm": {
            "pinned": "Sind Sie sicher, dass Sie alle angepinnten Nachrichten löschen möchten?",
            "today": "Sind Sie sicher, dass Sie alle Nachrichten von heute löschen möchten?",
            "yesterday": "Sind Sie sicher, dass Sie alle Nachrichten von gestern löschen möchten?",
            "last7Days": "Sind Sie sicher, dass Sie alle Nachrichten der letzten 7 Tage löschen möchten?",
            "older": "Sind Sie sicher, dass Sie alle älteren Nachrichten löschen möchten?"
        },
        "tooltip": {
            "pinned": "Alle angepinnten Nachrichten löschen",
            "today": "Alle Nachrichten von heute löschen",
            "yesterday": "Alle Nachrichten von gestern löschen",
            "last7Days": "Alle Nachrichten der letzten 7 Tage löschen",
            "older": "Alle älteren Nachrichten löschen"
        }
    },
    "pin": "Anheften",
    "unpin": "Losheften",
    "generationInfo": "Generierungsinformationen",
    "sidebarChat": "Seitenleisten-Chat",
    "reasoning": {
        "thinking": "Denke nach....",
        "thought": "Gedanke für {{time}}"
    },
    "embeddingGen": "Erstelle Embeddings, dies kann eine Weile dauern",
    "semanticSearch": "Führe semantische Suche durch",
    "downloading": "Herunterladen",
    "cancelPullingModel": {
        "confirm": "Sind Sie sicher, dass Sie den Download abbrechen möchten? Dadurch wird der Downloadvorgang gestoppt. Laut der Ollama-Dokumentation können Sie dort weitermachen, wo Sie aufgehört haben."
    }
}

================================================
FILE: src/assets/locale/de/knowledge.json
================================================
{
    "addBtn": "Neues Wissen hinzufügen",
    "columns": {
        "title": "Titel",
        "status": "Status",
        "embeddings": "Einbettungsmodell",
        "createdAt": "Erstellt am",
        "action": "Aktionen"
    },
    "expandedColumns": {
        "name": "Name"
    },
    "confirm": {
        "delete": "Sind Sie sicher, dass Sie dieses Wissen löschen möchten?"
    },
    "deleteSuccess": "Wissen erfolgreich gelöscht",
    "status": {
        "pending": "Ausstehend",
        "finished": "Abgeschlossen",
        "processing": "In Bearbeitung",
        "failed": "Fehlgeschlagen"
    },
    "addKnowledge": "Wissen hinzufügen",
    "updateKnowledge": "Quelle hinzufügen",
    "form": {
        "title": {
            "label": "Wissenstitel",
            "placeholder": "Wissenstitel eingeben",
            "required": "Wissenstitel ist erforderlich"
        },
        "uploadFile": {
            "label": "Datei hochladen",
            "uploadText": "Ziehen Sie eine Datei hierher oder klicken Sie zum Hochladen",
            "uploadHint": "Unterstützte Dateitypen: .pdf, .csv, .txt, .md, .docx",
            "required": "Datei ist erforderlich"
        },
        "submit": "Absenden",
        "success": "Wissen erfolgreich hinzugefügt"
    },
    "noEmbeddingModel": "Bitte fügen Sie zuerst ein Einbettungsmodell von der RAG-Einstellungsseite hinzu"
}

================================================
FILE: src/assets/locale/de/openai.json
================================================
{
    "settings": "OpenAI-kompatible API",
    "heading": "OpenAI-kompatible API",
    "subheading": "Verwalten und konfigurieren Sie hier Ihre OpenAI-API-kompatiblen Anbieter.",
    "addBtn": "Anbieter hinzufügen",
    "table": {
        "name": "Anbietername",
        "baseUrl": "Basis-URL",
        "actions": "Aktion"
    },
    "modal": {
        "titleAdd": "Neuen Anbieter hinzufügen",
        "name": {
            "label": "Anbietername",
            "required": "Anbietername ist erforderlich.",
            "placeholder": "Anbieternamen eingeben"
        },
        "baseUrl": {
            "label": "Basis-URL",
            "help": "Die Basis-URL des OpenAI-API-Anbieters. z.B. (http://localhost:1234/v1)",
            "required": "Basis-URL ist erforderlich.",
            "placeholder": "Basis-URL eingeben"
        },
        "apiKey": {
            "label": "API-Schlüssel",
            "required": "API-Schlüssel ist erforderlich.",
            "placeholder": "API-Schlüssel eingeben"
        },
        "submit": "Speichern",
        "update": "Aktualisieren",
        "deleteConfirm": "Sind Sie sicher, dass Sie diesen Anbieter löschen möchten?",
        "model": {
            "title": "Modellliste",
            "subheading": "Bitte wählen Sie die Chat-Modelle aus, die Sie mit diesem Anbieter verwenden möchten.",
            "success": "Neue Modelle erfolgreich hinzugefügt."
        },
        "tipLMStudio": "Page Assist wird automatisch die Modelle abrufen, die Sie in LM Studio geladen haben. Sie müssen sie nicht manuell hinzufügen."
    },
    "addSuccess": "Anbieter erfolgreich hinzugefügt.",
    "deleteSuccess": "Anbieter erfolgreich gelöscht.",
    "updateSuccess": "Anbieter erfolgreich aktualisiert.",
    "delete": "Löschen",
    "edit": "Bearbeiten",
    "newModel": "Modelle zum Anbieter hinzufügen",
    "noNewModel": "Für LMStudio, Ollama, Llamafile, holen wir die Daten dynamisch. Keine manuelle Hinzufügung erforderlich.",
    "searchModel": "Modell suchen",
    "selectAll": "Alle auswählen",
    "save": "Speichern",
    "saving": "Speichern...",
    "manageModels": {
        "columns": {
            "name": "Modellname",
            "model_type": "Modelltyp",
            "model_id": "Modell-ID",
            "provider": "Anbietername",
            "actions": "Aktion",
            "nickname": "Modell-Spitzname"
        },
        "tooltip": {
            "delete": "Löschen"
        },
        "confirm": {
            "delete": "Sind Sie sicher, dass Sie dieses Modell löschen möchten?"
        },
        "modal": {
            "title": "Benutzerdefiniertes Modell hinzufügen",
            "form": {
                "name": {
                    "label": "Modell-ID",
                    "placeholder": "llama3.2",
                    "required": "Modell-ID ist erforderlich."
                },
                "provider": {
                    "label": "Anbieter",
                    "placeholder": "Anbieter auswählen",
                    "required": "Anbieter ist erforderlich."
                },
                "type": {
                    "label": "Modelltyp"
                }
            }
        }
    },
    "noModelFound": "Kein Modell gefunden. Stellen Sie sicher, dass Sie den korrekten Anbieter mit Basis-URL und API-Schlüssel hinzugefügt haben.",
    "radio": {
        "chat": "Chat-Modell",
        "embedding": "Embedding-Modell",
        "chatInfo": "wird für Chat-Vervollständigung und Gesprächsgenerierung verwendet",
        "embeddingInfo": "wird für RAG und andere semantische suchbezogene Aufgaben verwendet."
    },
    "nicknameModal": {
        "title": "Modell-Spitznamen hinzufügen / bearbeiten",
        "form": {
            "modelName": {
                "label": "Modellname",
                "placeholder": "Modellname eingeben",
                "required": "Modellname ist erforderlich."
            },
            "modelAvatar": {
                "label": "Modell-Avatar",
                "placeholder": "Modell-Avatar eingeben",
                "help": "Bitte geben Sie die URL des Modell-Avatars ein. Dieses Bild wird im Chat-Fenster angezeigt."
            }
        }
    }
}

================================================
FILE: src/assets/locale/de/option.json
================================================
{
    "newChat": "Neuer Chat",
    "selectAPrompt": "Wähle eine Eingabeaufforderung",
    "githubRepository": "GitHub-Repository",
    "settings": "Einstellungen",
    "sidebarTitle": "Chat-Verlauf",
    "error": "Fehler",
    "somethingWentWrong": "Etwas ist schiefgelaufen",
    "validationSelectModel": "Bitte wähle ein Modell aus, um fortzufahren",
    "deleteHistoryConfirmation": "Bist du sicher, dass du diesen Verlauf löschen möchtest?",
    "editHistoryTitle": "Gib einen neuen Titel ein",
    "temporaryChat": "Temporärer Chat",
    "more": {
        "copy": {
            "group": "Kopieren",
            "asText": "Als Text kopieren",
            "asMarkdown": "Als Markdown kopieren",
            "success": "In die Zwischenablage kopiert!"
        },
        "download": {
            "group": "Herunterladen",
            "text": "Textdatei (.txt)",
            "markdown": "Markdown (.md)",
            "json": "JSON-Datei (.json)"
        },
        "share": "Teilen"
    }
}

================================================
FILE: src/assets/locale/de/playground.json
================================================
{
    "ollamaState": {
        "searching": "Suche nach Ihrem Ollama 🦙",
        "running": "Ollama läuft 🦙",
        "notRunning": "Verbindung zu Ollama nicht möglich 🦙",
        "connectionError": "Es scheint, dass Sie ein Verbindungsproblem haben. Bitte beachten Sie diese <anchor>Dokumentation</anchor> zur Fehlerbehebung."
    },
    "formError": {
        "noModel": "Bitte wählen Sie ein Modell aus",
        "noEmbeddingModel": "Bitte legen Sie ein Embedding-Modell auf der Seite Einstellungen > RAG fest"
    },
    "form": {
        "textarea": {
            "placeholder": "Nachricht eingeben..."
        },
        "webSearch": {
            "on": "An",
            "off": "Aus"
        }
    },
    "tooltip": {
        "searchInternet": "Internet durchsuchen",
        "speechToText": "Sprache zu Text",
        "uploadImage": "Bild hochladen",
        "stopStreaming": "Streaming stoppen",
        "knowledge": "Wissen",
        "clearContext": "Kontext löschen"
    },
    "sendWhenEnter": "Senden bei Drücken der Eingabetaste",
    "welcome": "Hallo! Wie kann ich Ihnen heute helfen?",
    "useOCR": "Text aus Bild extrahieren (OCR)"
}

================================================
FILE: src/assets/locale/de/settings.json
================================================
{
  "generalSettings": {
    "title": "Allgemeine Einstellungen",
    "settings": {
      "heading": "Web-UI-Einstellungen",
      "speechRecognitionLang": {
        "label": "Spracherkennungssprache",
        "placeholder": "Sprache auswählen"
      },
      "language": {
        "label": "Sprache",
        "placeholder": "Sprache auswählen"
      },
      "darkMode": {
        "label": "Design ändern",
        "options": {
          "light": "Hell",
          "dark": "Dunkel"
        }
      },
      "defaultCopilotPrompt": {
        "label": "Standardabfrage für Seitenpanel (Copilot)",
        "placeholder": "Wählen Sie eine Aufforderung"
      },
      "defaultWebUIPrompt": {
        "label": "Standardabfrage für Web-UI",
        "placeholder": "Wählen Sie eine Aufforderung"
      },
      "copilotResumeLastChat": {
        "label": "Letzten Chat beim Öffnen des Seitenpanels fortsetzen (Copilot)"
      },
      "turnOnChatWithWebsite": {
        "label": "Chat mit Website standardmäßig aktivieren (Copilot)"
      },
      "webUIResumeLastChat": {
        "label": "Letzten Chat beim Öffnen der Web-UI fortsetzen"
      },
      "hideCurrentChatModelSettings": {
        "label": "Aktuelle Chat-Modell-Einstellungen ausblenden"
      },
      "restoreLastChatModel": {
        "label": "Zuletzt verwendetes Modell für vorherige Chats wiederherstellen"
      },
      "sendNotificationAfterIndexing": {
        "label": "Benachrichtigung nach Abschluss der Wissensbasis-Verarbeitung senden"
      },
      "generateTitle": {
        "label": "Titel mit KI generieren"
      },
      "ollamaStatus": {
        "label": "Ollama-Verbindungsstatus-Überprüfung aktivieren oder deaktivieren"
      },
      "wideMode": {
        "label": "Breitbildmodus aktivieren"
      },
      "openReasoning": {
        "label": "Offene Argumentation standardmäßig eingeklappt"
      },
      "userChatBubble": {
        "label": "Chat-Blase für Benutzernachrichten verwenden"
      }
    },
    "sidepanelRag": {
      "heading": "Abruf-Einstellungen",
      "ragEnabled": {
        "label": "Einbettung und Abruf aktivieren"
      },
      "maxWebsiteContext": {
        "label": "Maximale Inhaltsgröße für Vollkontext-Modus",
        "placeholder": "Inhaltsgröße (Standard 4028)"
      }
    },
    "webSearch": {
      "heading": "Websuche verwalten",
      "searchMode": {
        "label": "Einfache Internetsuche durchführen"
      },
      "provider": {
        "label": "Suchmaschine",
        "placeholder": "Suchmaschine auswählen"
      },
      "totalSearchResults": {
        "label": "Gesamtanzahl der Suchergebnisse",
        "placeholder": "Gesamtanzahl der Suchergebnisse eingeben"
      },
      "visitSpecificWebsite": {
        "label": "Die in der Nachricht erwähnte Website besuchen"
      },
      "searxng": {
        "url": {
          "label": "SearXNG-URL"
        }
      },
      "braveApi": {
        "label": "Brave API-Schlüssel",
        "placeholder": "Geben Sie Ihren Brave API-Schlüssel ein"
      },
      "searchOnByDefault": {
        "label": "Internetsuche standardmäßig aktiviert"
      }
    },
    "system": {
      "heading": "Systemeinstellungen",
      "storageSyncEnabled": {
        "label": "Browser-Speichersynchronisierung aktivieren (Einstellungen geräteübergreifend synchronisieren)"
      },
      "deleteChatHistory": {
        "label": "System zurücksetzen",
        "button": "Alles zurücksetzen",
        "confirm": "Sind Sie sicher, dass Sie einen Systemreset durchführen möchten? Dies löscht alle Daten und kann nicht rückgängig gemacht werden."
      },
      "export": {
        "label": "Alle Daten exportieren (Chatverlauf, Wissensdatenbank, Prompts und Einstellungen)",
        "button": "Daten exportieren",
        "success": "Export erfolgreich"
      },
      "import": {
        "label": "Alle Daten importieren (Chatverlauf, Wissensdatenbank, Prompts und Einstellungen)",
        "button": "Daten importieren",
        "success": "Import erfolgreich",
        "error": "Importfehler"
      }
    },
    "tts": {
      "heading": "Text-zu-Sprache-Einstellungen",
      "ttsEnabled": {
        "label": "Text-zu-Sprache aktivieren"
      },
      "ttsAutoPlay": {
        "label": "Sprachantwort nach Fertigstellung automatisch abspielen"
      },
      "ttsProvider": {
        "label": "Text-zu-Sprache-Anbieter",
        "placeholder": "Anbieter auswählen"
      },
      "ttsVoice": {
        "label": "Text-zu-Sprache-Stimme",
        "placeholder": "Stimme auswählen"
      },
      "ssmlEnabled": {
        "label": "SSML (Speech Synthesis Markup Language) aktivieren"
      },
      "removeReasoningTagTTS": {
        "label": "Reasoning-Tag aus Text-zu-Sprache entfernen"
      }
    },
    "stt": {
      "heading": "Sprache-zu-Text-Einstellungen",
      "autoStopTimeout": {
        "label": "Automatische Stopp-Zeitüberschreitung (ms)",
        "placeholder": "Geben Sie die automatische Stopp-Zeitüberschreitung in Millisekunden ein"
      },
      "autoSubmitVoiceMessage": {
        "label": "Sprachnachricht automatisch senden"
      }
    }
  },
  "manageModels": {
    "title": "Modelle verwalten",
    "addBtn": "Neues Modell hinzufügen",
    "columns": {
      "name": "Name",
      "digest": "Digest",
      "modifiedAt": "Zuletzt geändert",
      "size": "Größe",
      "actions": "Aktionen"
    },
    "expandedColumns": {
      "parentModel": "Übergeordnetes Modell",
      "format": "Format",
      "family": "Familie",
      "parameterSize": "Parametergröße",
      "quantizationLevel": "Quantisierungsstufe"
    },
    "tooltip": {
      "delete": "Modell löschen",
      "repull": "Modell erneut herunterladen"
    },
    "confirm": {
      "delete": "Sind Sie sicher, dass Sie dieses Modell löschen möchten?",
      "repull": "Sind Sie sicher, dass Sie dieses Modell erneut herunterladen möchten?"
    },
    "modal": {
      "title": "Neues Modell hinzufügen",
      "placeholder": "Modellnamen eingeben",
      "pull": "Modell herunterladen"
    },
    "notification": {
      "pullModel": "Modell wird heruntergeladen",
      "pullModelDescription": "Das Modell {{modelName}} wird heruntergeladen. Weitere Details finden Sie im Erweiterungssymbol.",
      "success": "Erfolgreich",
      "error": "Fehler",
      "successDescription": "Das Modell wurde erfolgreich heruntergeladen",
      "successDeleteDescription": "Das Modell wurde erfolgreich gelöscht",
      "someError": "Etwas ist schiefgelaufen. Bitte versuchen Sie es später erneut"
    }
  },
  "managePrompts": {
    "title": "Prompts verwalten",
    "addBtn": "Neuen Prompt hinzufügen",
    "option1": "Normal",
    "option2": "RAG",
    "questionPrompt": "Frage-Prompt",
    "segmented": {
      "custom": "Benutzerdefinierte Prompts",
      "copilot": "Copilot-Prompts"
    },
    "columns": {
      "title": "Titel",
      "prompt": "Prompt",
      "type": "Prompt-Typ",
      "actions": "Aktionen"
    },
    "systemPrompt": "System-Prompt",
    "quickPrompt": "Schnell-Prompt",
    "tooltip": {
      "delete": "Prompt löschen",
      "edit": "Prompt bearbeiten"
    },
    "confirm": {
      "delete": "Sind Sie sicher, dass Sie diesen Prompt löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden."
    },
    "modal": {
      "addTitle": "Neuen Prompt hinzufügen",
      "editTitle": "Prompt bearbeiten"
    },
    "form": {
      "title": {
        "label": "Titel",
        "placeholder": "Mein toller Prompt",
        "required": "Bitte geben Sie einen Titel ein"
      },
      "prompt": {
        "label": "Prompt",
        "placeholder": "Prompt eingeben",
        "required": "Bitte geben Sie einen Prompt ein",
        "help": "Sie können {key} als Variable in Ihrem Prompt verwenden.",
        "missingTextPlaceholder": "Die Variable {text} fehlt im Prompt. Bitte fügen Sie sie hinzu."
      },
      "isSystem": {
        "label": "Ist System-Prompt"
      },
      "btnSave": {
        "saving": "Prompt wird hinzugefügt...",
        "save": "Prompt hinzufügen"
      },
      "btnEdit": {
        "saving": "Prompt wird aktualisiert...",
        "save": "Prompt aktualisieren"
      }
    },
    "notification": {
      "addSuccess": "Prompt hinzugefügt",
      "addSuccessDesc": "Prompt wurde erfolgreich hinzugefügt",
      "error": "Fehler",
      "someError": "Etwas ist schiefgelaufen. Bitte versuchen Sie es später erneut",
      "updatedSuccess": "Prompt aktualisiert",
      "updatedSuccessDesc": "Prompt wurde erfolgreich aktualisiert",
      "deletedSuccess": "Prompt gelöscht",
      "deletedSuccessDesc": "Prompt wurde erfolgreich gelöscht"
    }
  },
  "manageShare": {
    "title": "Freigabe verwalten",
    "heading": "Seiten-Freigabe-URL konfigurieren",
    "form": {
      "url": {
        "label": "Seiten-Freigabe-URL",
        "placeholder": "Seiten-Freigabe-URL eingeben",
        "required": "Bitte geben Sie Ihre Seiten-Freigabe-URL ein!",
        "help": "Aus Datenschutzgründen können Sie die Seitenfreigabe selbst hosten und die URL hier angeben. <anchor>Mehr erfahren</anchor>."
      }
    },
    "webshare": {
      "heading": "Web-Freigabe",
      "columns": {
        "title": "Titel",
        "url": "URL",
        "actions": "Aktionen"
      },
      "tooltip": {
        "delete": "Freigabe löschen"
      },
      "confirm": {
        "delete": "Sind Sie sicher, dass Sie diese Freigabe löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden."
      },
      "label": "Seitenfreigabe verwalten",
      "description": "Seitenfreigabe-Funktion aktivieren oder deaktivieren"
    },
    "notification": {
      "pageShareSuccess": "Seiten-Freigabe-URL erfolgreich aktualisiert",
      "someError": "Etwas ist schiefgelaufen. Bitte versuchen Sie es später erneut",
      "webShareDeleteSuccess": "Web-Freigabe erfolgreich gelöscht"
    }
  },
  "ollamaSettings": {
    "title": "Ollama-Einstellungen",
    "heading": "Ollama konfigurieren",
    "settings": {
      "ollamaUrl": {
        "label": "Ollama-URL",
        "placeholder": "Ollama-URL eingeben"
      },
      "globalEnable": {
        "label": "Ollama-Integration global aktivieren oder deaktivieren",
        "warning": "Wenn Sie die Ollama-Integration global deaktivieren, wird Page Assist keine Modelle von Ollama abrufen. Sie können Ollama-Instanzen weiterhin über den Bereich <anchor>OpenAI-kompatible API</anchor> hinzufügen, was einwandfrei funktioniert."
      },
      "advanced": {
        "label": "Erweiterte Ollama-URL-Konfiguration",
        "urlRewriteEnabled": {
          "label": "Benutzerdefinierte Ursprungs-URL aktivieren oder deaktivieren"
        },
        "rewriteUrl": {
          "label": "Benutzerdefinierte Ursprungs-URL",
          "placeholder": "Benutzerdefinierte Ursprungs-URL eingeben"
        },
        "autoCORSFix": {
          "label": "Automatische Ollama-CORS-Korrektur aktivieren oder deaktivieren"
        },
        "headers": {
          "label": "Benutzerdefinierte Header",
          "add": "Header hinzufügen",
          "key": {
            "label": "Header-Schlüssel",
            "placeholder": "Autorisierung"
          },
          "value": {
            "label": "Header-Wert",
            "placeholder": "Bearer-Token"
          }
        },
        "help": "Wenn Sie Verbindungsprobleme mit Ollama auf Page Assist haben, können Sie eine benutzerdefinierte Ursprungs-URL konfigurieren. Um mehr über die Konfiguration zu erfahren, <anchor>klicken Sie hier</anchor>."
      }
    }
  },
  "manageSearch": {
    "title": "Web-Suche verwalten",
    "heading": "Web-Suche konfigurieren"
  },
  "about": {
    "title": "Über",
    "heading": "Über",
    "chromeVersion": "Page Assist Version",
    "ollamaVersion": "Ollama Version",
    "support": "Sie können das Page Assist-Projekt durch Spenden oder Sponsoring über die folgenden Plattformen unterstützen:",
    "koFi": "Unterstützen Sie uns auf Ko-fi",
    "githubSponsor": "Sponsern Sie uns auf GitHub",
    "githubRepo": "GitHub-Repository"
  },
  "manageKnowledge": {
    "title": "Wissen verwalten",
    "heading": "Wissensbasis konfigurieren"
  },
  "rag": {
    "title": "Pipeline-Einstellungen",
    "ragSettings": {
      "label": "RAG-Einstellungen",
      "model": {
        "label": "Embedding-Modell",
        "required": "Bitte wählen Sie ein Modell aus",
        "help": "Es wird dringend empfohlen, Embedding-Modelle wie `nomic-embed-text` zu verwenden.",
        "placeholder": "Wählen Sie ein Modell aus"
      },
      "chunkSize": {
        "label": "Chunk-Größe",
        "placeholder": "Chunk-Größe eingeben",
        "required": "Bitte geben Sie eine Chunk-Größe ein"
      },
      "chunkOverlap": {
        "label": "Chunk-Überlappung",
        "placeholder": "Chunk-Überlappung eingeben",
        "required": "Bitte geben Sie eine Chunk-Überlappung ein"
      },
      "totalFilePerKB": {
        "label": "Standard-Datei-Upload-Limit für die Wissensbasis",
        "placeholder": "Geben Sie das Standard-Datei-Upload-Limit ein (z.B. 10)",
        "required": "Bitte geben Sie das Standard-Datei-Upload-Limit ein"
      },
      "noOfRetrievedDocs": {
        "label": "Anzahl der abgerufenen Dokumente",
        "placeholder": "Anzahl der abgerufenen Dokumente eingeben",
        "required": "Bitte geben Sie die Anzahl der abgerufenen Dokumente ein"
      },
      "splittingSeparator": {
        "label": "Separator",
        "placeholder": "Separator eingeben (z.B. \\n\\n)",
        "required": "Bitte geben Sie einen Separator ein"
      },
      "splittingStrategy": {
        "label": "Text-Splitter"
      }
    },
    "prompt": {
      "label": "RAG-Prompt konfigurieren",
      "option1": "Normal",
      "option2": "Web",
      "alert": "Die Konfiguration des System-Prompts hier ist veraltet. Bitte verwenden Sie den Abschnitt 'Prompts verwalten', um Prompts hinzuzufügen oder zu bearbeiten. Dieser Abschnitt wird in einer zukünftigen Version entfernt",
      "systemPrompt": "System-Prompt",
      "systemPromptPlaceholder": "System-Prompt eingeben",
      "webSearchPrompt": "Web-Suche-Prompt",
      "webSearchPromptHelp": "Entfernen Sie `{search_results}` nicht aus dem Prompt.",
      "webSearchPromptError": "Bitte geben Sie einen Web-Suche-Prompt ein",
      "webSearchPromptPlaceholder": "Web-Suche-Prompt eingeben",
      "webSearchFollowUpPrompt": "Web-Suche-Folgeprompt",
      "webSearchFollowUpPromptHelp": "Entfernen Sie `{chat_history}` und `{question}` nicht aus dem Prompt.",
      "webSearchFollowUpPromptError": "Bitte geben Sie Ihren Web-Suche-Folgeprompt ein!",
      "webSearchFollowUpPromptPlaceholder": "Ihr Web-Suche-Folgeprompt"
    }
  },
  "chromeAiSettings": {
    "title": "Chrome AI-Einstellungen"
  }
}


================================================
FILE: src/assets/locale/de/sidepanel.json
================================================
{
    "tooltip": {
        "embed": "Es kann einige Minuten dauern, die Seite einzubetten. Bitte warten Sie...",
        "clear": "Chatverlauf löschen",
        "history": "Chatverlauf",
        "openwebui": "WebUI öffnen"
    }
}

================================================
FILE: src/assets/locale/en/chrome.json
================================================
{
    "heading": "Configure Chrome AI",
    "status": {
        "label": "Enable or Disable Chrome AI Support on Page Assist"
    },
    "error": {
        "browser_not_supported": "This version of Chrome is not supported by the Gemini Nano model. Please update to version 138 or later.",
        "ai_not_supported": "The setting chrome://flags/#prompt-api-for-gemini-nano is not enabled. Please enable it.",
        "ai_not_ready": "Gemini Nano is not ready yet; you need to double-check Chrome settings.",
        "internal_error": "An internal error occurred. Please try again later."
    },
    "errorDescription": "To use Chrome AI, you need Chrome version 138 or later. Follow these steps:\n\n1. Go to `chrome://flags/#prompt-api-for-gemini-nano` and enable \"Prompt API for Gemini Nano\".\n2. Restart Chrome to apply the flag.\n3. Return to this page and click \"Download Model\" — this will download a 4GB model for the first time.\n4. Once downloaded, Gemini Nano can be enabled through Page Assist.",
    "downloadModel": "Download Model",
    "modelDownloadWarning": "This will download a model with an approximate download size ranging from 1.5 GB to 2.4 GB. Ensure you have sufficient disk space.",
    "downloadModal": {
        "title": "Download Gemini Nano Model",
        "warning": "Large Download Required",
        "warningDescription": "This will download approximately 4GB of data. Ensure you have sufficient disk space and a stable internet connection.",
        "confirm": "Download Now",
        "cancel": "Cancel",
        "downloading": "Downloading Model",
        "downloadingDescription": "Downloading Gemini Nano model. This may take several minutes depending on your internet connection.",
        "pleaseWait": "Please do not close this window while downloading..."
    },
    "downloadSuccess": "Model downloaded successfully!",
    "downloadError": "Failed to download model. Please try again."
}

================================================
FILE: src/assets/locale/en/common.json
================================================
{
    "pageAssist": "Page Assist",
    "selectAModel": "Select a Model",
    "save": "Save",
    "saved": "Saved",
    "cancel": "Cancel",
    "retry": "Retry",
    "loadMore": "Load More...",
    "share": {
        "tooltip": {
            "share": "Share"
        },
        "modal": {
            "title": "Share link to Chat"
        },
        "form": {
            "defaultValue": {
                "name": "Anonymous",
                "title": "Untitled chat"
            },
            "title": {
                "label": "Chat title",
                "placeholder": "Enter Chat title",
                "required": "Chat title is required"
            },
            "name": {
                "label": "Your name",
                "placeholder": "Enter your name",
                "required": "Your name is required"
            },
            "btn": {
                "save": "Generate Link",
                "saving": "Generating Link..."
            }
        },
        "notification": {
            "successGenerate": "Link copied to clipboard",
            "failGenerate": "Failed to generate link"
        }
    },
    "copyToClipboard": "Copy to clipboard",
    "webSearch": "Searching the web",
    "regenerate": "Regenerate",
    "edit": "Edit",
    "delete": "Delete",
    "continue": "Continue Response",
    "saveAndSubmit": "Save & Submit",
    "editMessage": {
        "placeholder": "Type a message..."
    },
    "submit": "Submit",
    "noData": "No data",
    "noHistory": "No chat history",
    "chatWithCurrentPage": "Chat with current page",
    "beta": "Beta",
    "tts": "Read aloud",
    "currentChatModelSettings": "Current Chat Model Settings",
    "modelSettings": {
        "label": "Model Settings",
        "description": "Set the model options globally for all chats",
        "form": {
            "keepAlive": {
                "label": "Keep Alive",
                "help": "controls how long the model will stay loaded into memory following the request (default: 5m)",
                "placeholder": "e.g. 5m, 10m, 1h"
            },
            "temperature": {
                "label": "Temperature",
                "placeholder": "e.g. 0.7, 1.0"
            },
            "numCtx": {
                "label": "Context Window Size (num_ctx)",
                "placeholder": "Enter Context Window Size value (default: 2048)"
            },
            "numPredict": {
                "label": "Max Tokens (num_predict)",
                "placeholder": "e.g. 2048, 4096"
            },
            "thinking": {
                "label": "Thinking Mode (Ollama)",
                "levels": {
                    "off": "Off",
                    "on": "On",
                    "low": "Low reasoning effort",
                    "medium": "Medium reasoning effort",
                    "high": "High reasoning effort"
                }
            },
            "seed": {
                "label": "Seed",
                "placeholder": "e.g. 1234",
                "help": "Reproducibility of the model output"
            },
            "topK": {
                "label": "Top K",
                "placeholder": "e.g. 40, 100"
            },
            "topP": {
                "label": "Top P",
                "placeholder": "e.g. 0.9, 0.95"
            },
            "useMMap": {
                "label": "useMmap"
            },
            "tfsZ": {
                "label": "TFS-Z",
                "placeholder": "e.g. 1.0, 1.1"
            },
            "numKeep": {
                "label": "Num Keep",
                "placeholder": "e.g. 256, 512"
            },
            "numThread": {
                "label": "Num Thread",
                "placeholder": "e.g. 8, 16"
            },
            "useMlock": {
                "label": "useMlock"
            },
            "reasoningEffort": {
                "label": "Reasoning Effort",
                "placeholder": "low, medium, high"
            },
            "minP": {
                "label": "Min P",
                "placeholder": "e.g. 0.05"
            },
            "repeatPenalty": {
                "label": "Repeat Penalty",
                "placeholder": "e.g. 1.1, 1.2"
            },
            "repeatLastN": {
                "label": "Repeat Last N",
                "placeholder": "e.g. 64, 128"
            },
            "numGpu": {
                "label": "Num GPU",
                "placeholder": "Enter number of layers to send to GPU(s)"
            },
            "systemPrompt": {
                "label": "Temporary System Prompt",
                "placeholder": "Enter System Prompt",
                "help": "This is a quick way to set the system prompt in the current chat, which will override the selected system prompt if it exists."
            }
        },
        "advanced": "More Model Settings"
    },
    "copilot": {
        "summary": "Summarize",
        "explain": "Explain",
        "rephrase": "Rephrase",
        "translate": "Translate",
        "custom": "Custom"
    },
    "citations": "Citations",
    "segmented": {
        "ollama": "Ollama Models",
        "custom": "Custom Models"
    },
    "downloadCode": "Download Code",
    "date": {
        "pinned": "Pinned",
        "today": "Today",
        "yesterday": "Yesterday",
        "last7Days": "Last 7 Days",
        "older": "Older"
    },
    "range": {
        "deleteConfirm": {
            "pinned": "Are you sure you want to delete all pinned messages?",
            "today": "Are you sure you want to delete all messages from today?",
            "yesterday": "Are you sure you want to delete all messages from yesterday?",
            "last7Days": "Are you sure you want to delete all messages from the last 7 days?",
            "older": "Are you sure you want to delete all older messages?"
        },
        "tooltip": {
            "pinned": "Delete all pinned messages",
            "today": "Delete all messages from today",
            "yesterday": "Delete all messages from yesterday",
            "last7Days": "Delete all messages from the last 7 days",
            "older": "Delete all older messages"
        }
    },
    "historiesDeleted": "{{count}} Histories Deleted",
    "deleteHistoriesError": "Error deleting histories",
    "pin": "Pin",
    "unpin": "Unpin",
    "generationInfo": "Generation Info",
    "sidebarChat": "Sidebar Chat",
    "reasoning": {
        "thinking": "Thinking....",
        "thought": "Thought for {{time}}",
        "title": "Reasoning Process",
        "expand": "Show reasoning",
        "collapse": "Hide reasoning"
    },
    "mermaid": "Mermaid",
    "search": "Search",
    "searchResults": "Search Results",
    "embeddingGen": "Creating embeddings, this may take a while",
    "semanticSearch": "Performing semantic search",
    "newBranch": "New Branch",
    "downloading": "Downloading" ,
    "mcp": {
        "tool": "tool",
        "server": "server",
        "toolRequestTitle": "Tools requested",
        "toolResultTitle": "Tool result",
        "arguments": "Arguments",
        "output": "Output",
        "noOutput": "No output returned.",
        "status": {
            "success": "Success",
            "error": "Error"
        },
        "action": {
            "connecting": "Connecting to MCP servers",
            "loading_tools": "Loading MCP tools",
            "calling_tool": "Calling {{tool}} on {{server}}",
            "waiting_result": "Waiting for {{tool}} on {{server}}"
        }
    },
    "cancelPullingModel": {
        "confirm": "Are you sure you want to cancel the download? This will stop the download process. According to the Ollama documentation, you can restart from where you left off."
    },
    "saveChat": "Save Chat"
}


================================================
FILE: src/assets/locale/en/knowledge.json
================================================
{
    "addBtn": "Add New Knowledge",
    "columns": {
        "title": "Title",
        "status": "Status",
        "embeddings": "Embedding Model",
        "createdAt": "Created At",
        "action": "Actions"
    },
    "expandedColumns": {
        "name": "Name"
    },
    "confirm": {
        "delete": "Are you sure you want to delete this knowledge?",
        "deleteSource": "Are you sure you want to delete this source?"
    },
    "deleteSuccess": "Knowledge deleted successfully",
    "status": {
        "pending": "Pending",
        "finished": "Finished",
        "processing": "Processing",
        "failed": "Failed"
    },
    "addKnowledge": "Add Knowledge",
    "updateKnowledge": "Add Source",
    "form": {
        "tabs": {
            "upload": "Upload File",
            "text": "Text Input"
        },
        "title": {
            "label": "Knowledge Title (optional)",
            "placeholder": "Enter knowledge title",
            "placeholderOptional": "Optional title (defaults to first 50 characters)",
            "required": "Knowledge title is required"
        },
        "uploadFile": {
            "label": "Upload File",
            "uploadText": "Drag and drop a file here or click to upload",
            "uploadHint": "Supported file types: .pdf, .csv, .txt, .md, .docx",
            "required": "File is required",
            "uploadError": "Unsupported file type"
        },
        "textInput": {
            "typeLabel": "Type",
            "type": {
                "plain": "Plain Text",
                "markdown": "Markdown",
                "code": "Code"
            },
            "contentLabel": "Content",
            "placeholder": "Paste or type your text here...",
            "required": "Text content is required",
            "tooLarge": "Content is too large. Please keep it under 500k characters.",
            "defaultTitle": "Untitled Text"
        },
        "submit": "Submit",
        "success": "Knowledge added successfully"
    },
    "noEmbeddingModel": "Please add an embedding model from the RAG settings page first",
    "newSource": "New Source",
    "editSettings": {
        "title": "Edit Knowledge Settings",
        "success": "Knowledge settings updated successfully",
        "variableInfo": {
            "title": "Available Variables",
            "description": "You can use the following variables in your prompts:",
            "context": "The retrieved context from your knowledge base",
            "query": "The user's question or query"
        },
        "form": {
            "title": {
                "label": "Knowledge Title",
                "placeholder": "Enter knowledge title",
                "required": "Knowledge title is required"
            },
            "systemPrompt": {
                "label": "System Prompt",
                "help": "Customize how the AI responds using your knowledge base. Use {context} for retrieved information and {question} for the user's question. Note: {question} is required in the prompt, otherwise character won't get question context.",
                "placeholder": "Enter your custom system prompt...",
                "prefillButton": "Use Default Prompt"
            },
            "followupPrompt": {
                "label": "Follow-up Question Prompt",
                "help": "Customize how follow-up questions are processed. This prompt rephrases follow-up questions into standalone questions.",
                "placeholder": "Enter your custom follow-up prompt...",
                "prefillButton": "Use Default Prompt"
            }
        },
        "tooltip": "Edit knowledge settings"
    }
}

================================================
FILE: src/assets/locale/en/openai.json
================================================
{
    "settings": "OpenAI Compatible API",
    "heading": "OpenAI compatible API",
    "subheading": "Manage and configure your OpenAI API Compatible providers here.",
    "addBtn": "Add Provider",
    "table": {
        "name": "Provider Name",
        "baseUrl": "Base URL",
        "actions": "Action"
    },
    "modal": {
        "titleAdd": "Add New Provider",
        "titleEdit": "Edit Provider",
        "name": {
            "label": "Provider Name",
            "required": "Provider name is required.",
            "placeholder": "Enter provider name"
        },
        "baseUrl": {
            "label": "Base URL",
            "help": "The base URL of the OpenAI API provider. eg (http://localhost:1234/v1)",
            "required": "Base URL is required.",
            "placeholder": "Enter base URL"
        },
        "apiKey": {
            "label": "API Key",
            "required": "API Key is required.",
            "placeholder": "Enter API Key"
        },
        "submit": "Save",
        "update": "Update",
        "deleteConfirm": "Are you sure you want to delete this provider?",
        "model": {
            "title": "Model List",
            "subheading": "Please select the chat models you want to use with this provider.",
            "success": "Successfully added new models."
        },
        "tipLMStudio": "Page Assist will automatically fetch the models you loaded on LM Studio. You don't need to add them manually."
    },
    "addSuccess": "Provider added successfully.",
    "deleteSuccess": "Provider deleted successfully.",
    "updateSuccess": "Provider updated successfully.",
    "delete": "Delete",
    "edit": "Edit",
    "newModel": "Add Models to Provider",
    "noNewModel": "For LMStudio, Ollama, Llamafile, we fetch dynamically. No manual addition needed.",
    "searchModel": "Search Model",
    "selectAll": "Select All",
    "save": "Save",
    "saving": "Saving...",
    "manageModels": {
        "columns": {
            "name": "Model Name",
            "model_type": "Model Type",
            "model_id": "Model ID",
            "provider": "Provider Name",
            "actions": "Action",
            "nickname": "Model Nickname"
        },
        "tooltip": {
            "delete": "Delete"
        },
        "confirm": {
            "delete": "Are you sure you want to delete this model?"
        },
        "modal": {
            "title": "Add Custom Model",
            "titleEdit": "Edit Custom Model",
            "form": {
                "name": {
                    "label": "Model ID",
                    "placeholder": "deepseek-v3.1",
                    "required": "Model ID is required."
                },
                "provider": {
                    "label": "Provider",
                    "placeholder": "Select provider",
                    "required": "Provider is required."
                },
                "type": {
                    "label": "Model Type"
                }
            }
        }
    },
    "noModelFound": "No model found. Make sure you have added correct provider with base URL and API key.",
    "radio": {
        "chat": "Chat Model",
        "embedding": "Embedding Model",
        "chatInfo": "is used for chat completion and conversation generation",
        "embeddingInfo": "is used for RAG and other semantic search related tasks."
    },
    "nicknameModal": {
        "title": "Add / Edit Model Nickname",
        "form": {
            "modelName": {
                "label": "Model Name",
                "placeholder": "Enter model name",
                "required": "Model name is required."
            },
            "modelAvatar": {
                "label": "Model Avatar",
                "placeholder": "Enter model avatar",
                "help": "Please enter the URL of the model avatar. This image will be displayed in the chat window."
            }
        }
    }
}

================================================
FILE: src/assets/locale/en/option.json
================================================
{
    "newChat": "New Chat",
    "selectAPrompt": "Select a Prompt",
    "githubRepository": "GitHub Repository",
    "settings": "Settings",
    "sidebarTitle": "Chat History",
    "error": "Error",
    "somethingWentWrong": "Something went wrong",
    "validationSelectModel": "Please select a model to continue",
    "deleteHistoryConfirmation": "Are you sure you want to delete this history?",
    "editHistoryTitle": "Enter a new title",
    "temporaryChat": "Temporary Chat",
    "more": {
        "copy": {
            "group": "Copy",
            "asText": "Copy as Text",
            "asMarkdown": "Copy as Markdown",
            "success": "Copied to clipboard!"
        },
        "download": {
            "group": "Download",
            "text": "Text File (.txt)",
            "markdown": "Markdown (.md)",
            "json": "JSON File (.json)",
            "image": "Image (.png)"
        },
        "share": "Share"
    },
    "chatSaved": "Chat Saved",
    "temporaryChatSavedSuccessfully": "Your temporary chat has been saved successfully",
    "failedToSaveTemporaryChat": "Failed to save temporary chat. Please try again."
}

================================================
FILE: src/assets/locale/en/playground.json
================================================
{
    "ollamaState": {
        "searching": "Searching for Your Ollama 🦙",
        "running": "Ollama is running 🦙",
        "notRunning": "Unable to connect to Ollama 🦙",
        "connectionError": "It seems like you are having a connection error. Please refer to this <anchor>documentation</anchor> for troubleshooting."
    },
    "formError": {
        "noModel": "Please select a model",
        "noEmbeddingModel": "Please set an embedding model on the Settings > RAG page"
    },
    "form": {
        "textarea": {
            "placeholder": "Type a message..."
        },
        "webSearch": {
            "on": "On",
            "off": "Off"
        },
        "thinking": {
            "on": "On",
            "off": "Off",
            "level": "Level",
            "levels": {
                "low": "Low",
                "medium": "Medium",
                "high": "High"
            }
        }
    },
    "tooltip": {
        "searchInternet": "Search Internet",
        "thinking": "Enable reasoning mode to see the model's thinking process",
        "speechToText": "Speech to Text",
        "uploadImage": "Upload Image",
        "stopStreaming": "Stop Streaming",
        "knowledge": "Knowledge",
        "vision": "[Experimental] Vision Chat",
        "clearContext": "Clear Context",
        "uploadDocuments": "Upload Documents (beta)",
        "mcpServers": "MCP Servers",
        "mcpEmpty": "No MCP servers configured",
        "mcpEmptyDesc": "Connect MCP servers to use tools in chat.",
        "mcpAddServer": "Add MCP Server"
    },
    "sendWhenEnter": "Send when Enter pressed",
    "welcome": "Hello! How can I help you today?",
    "useOCR": "Extract text from image (OCR)",
    "fileRetrievalEnabled": "Enable RAG for Documents"
}

================================================
FILE: src/assets/locale/en/settings.json
================================================
{
  "generalSettings": {
    "title": "General Settings",
    "settings": {
      "heading": "Web UI Settings",
      "speechRecognitionLang": {
        "label": "Speech Recognition Language",
        "placeholder": "Select a language"
      },
      "language": {
        "label": "Language",
        "placeholder": "Select a language"
      },
      "darkMode": {
        "label": "Change Theme",
        "options": {
          "light": "Light",
          "dark": "Dark"
        }
      },
      "defaultCopilotPrompt": {
        "label": "Default Prompt for SidePanel (Copilot)",
        "placeholder": "Select a prompt"
      },
      "defaultWebUIPrompt": {
        "label": "Default Prompt for Web UI",
        "placeholder": "Select a prompt"
      },
      "copilotResumeLastChat": {
        "label": "Resume the last chat when opening the SidePanel (Copilot)"
      },
      "turnOnChatWithWebsite": {
        "label": "Enable Chat with Website by default (Copilot)"
      },
      "webUIResumeLastChat": {
        "label": "Resume the last chat when opening the Web UI"
      },
      "hideCurrentChatModelSettings": {
        "label": "Hide the current Chat Model Settings"
      },
      "restoreLastChatModel": {
        "label": "Restore last used model for previous chats"
      },
      "sendNotificationAfterIndexing": {
        "label": "Send Notification After Finishing Processing the Knowledge Base"
      },
      "generateTitle": {
        "label": "Generate Title using AI"
      },
      "ollamaStatus": {
        "label": "Enable or disable Ollama connection status check"
      },
      "wideMode": {
        "label": "Enable wide screen mode"
      },
      "openReasoning": {
        "label": "Open Reasoning Collapse by default"
      },
      "defaultThinkingMode": {
        "label": "Show Thinking Mode State in Forms"
      },
      "userChatBubble": {
        "label": "Use Chat Bubble for User Messages"
      },
      "autoCopyResponseToClipboard": {
        "label": "Automatically Copy Response to Clipboard"
      },
      "useMarkdownForUserMessage": {
        "label": "Enable Markdown formatting for User messages"
      },
      "copyAsFormattedText": {
        "label": "Copy as Formatted Text"
      },
      "tabMentionsEnabled": {
        "label": "Enable Tab Mentions (@tab)"
      },
      "pasteLargeTextAsFile": {
        "label": "Paste Large Text as File"
      },
      "ocrLanguage": {
        "label": "Default OCR Language",
        "placeholder": "Select an OCR language"
      },
      "sidepanelTemporaryChat": {
        "label": "Enable Temporary Chat in SidePanel by default"
      },
      "webuiTemporaryChat": {
        "label": "Enable Temporary Chat in Web UI by default"
      },
      "removeReasoningTagFromCopy": {
        "label": "Remove Reasoning Tag from Copied Text"
      },
      "youtubeAutoSummarize": {
        "label": "Show the 'Summarize' button on YouTube videos."
      },
      "hideReasoningWidget": {
        "label": "Hide Reasoning Widget from AI Messages"
      },
      "persistChatInput": {
        "label": "Persist Chat Input (Save unsent messages)"
      },
      "enableMessageQueue": {
        "label": "Enable Message Queue While Streaming"
      },
      "optimizeQueueForSmallScreen": {
        "label": "Optimize Chat UI for Small Screens"
      },
      "tableTextWrap": {
        "label": "Enable Text Wrapping in Markdown Tables"
      },
      "showMoreForLargeMessage": {
        "label": "Show 'Show more' for large human messages"
      },
      "sidebarPosition": {
        "label": "Sidebar Position",
        "options": {
          "left": "Left",
          "right": "Right"
        }
      },
      "showMcpServersInChat": {
        "label": "Show MCP Servers Toggle in Chat"
      }
    },
    "sidepanelRag": {
      "heading": "Retrieval Settings",
      "ragEnabled": {
        "label": "Enable Embedding and Retrieval"
      },
      "maxWebsiteContext": {
        "label": "Maximum Content Size for Full Context Mode",
        "placeholder": "Content size (default 4028)"
      }
    },
    "webSearch": {
      "heading": "Manage Web Search",
      "searchMode": {
        "label": "Perform Simple Internet Search"
      },
      "provider": {
        "label": "Search Engine",
        "placeholder": "Select a search engine"
      },
      "totalSearchResults": {
        "label": "Total Search Results",
        "placeholder": "Enter Total Search Results"
      },
      "visitSpecificWebsite": {
        "label": "Visit the website mentioned in the message"
      },
      "searxng": {
        "url": {
          "label": "SearXNG URL"
        }
      },
      "braveApi": {
        "label": "Brave API Key",
        "placeholder": "Enter your Brave API key"
      },
      "tavilyApi": {
        "label": "Tavily API Key ",
        "placeholder": "Enter your Tavily API key"
      },
      "exa": {
        "label": "Exa API Key",
        "placeholder": "Enter your Exa API key"
      },
      "googleDomain": {
        "label": "Google Domain"
      },
      "searchOnByDefault": {
        "label": "Internet Search ON by default"
      },
      "firecrawlAPIKey": {
        "label": "Firecrawl API Key",
        "placeholder": "Enter your Firecrawl API key"
      },
      "domainFilter": {
        "label": "Domain Filter List",
        "description": "Only show results from these domains",
        "placeholder": "e.g., example.com"
      },
      "blockedDomains": {
        "label": "Blocked Domains",
        "description": "Exclude results from these domains",
        "placeholder": "e.g., spam.com"
      }
    },
    "system": {
      "heading": "System Settings",
      "deleteChatHistory": {
        "label": "System Reset",
        "button": "Reset All",
        "confirm": "Are you sure you want to perform a system reset? This will clear all data and cannot be undone."
      },
      "export": {
        "label": "Export All Data (Chat History, Knowledge Base, Prompts, and Settings)",
        "button": "Export Data",
        "success": "Export Success"
      },
      "import": {
        "label": "Import All Data (Chat History, Knowledge Base, Prompts, and Settings)",
        "button": "Import Data",
        "success": "Import Success",
        "error": "Import Error"
      },
      "actionIcon": {
        "label": "Set Default Action for Extension Icon Clicks"
      },
      "contextMenu": {
        "label": "Set Default action for Context Menu"
      },
      "fontSize": {
        "label": "Font Size"
      },
      "webuiBtnSidePanel": {
        "label": "Show Web UI Button in Side Panel"
      },
      "chatBackgroundImage": {
        "label": "Chat Background Image"
      },
      "storageSyncEnabled": {
        "label": "Enable Browser Storage Sync (Sync settings across devices)"
      }
    },
    "tts": {
      "heading": "Text-to-Speech Settings",
      "ttsEnabled": {
        "label": "Enable Text-to-Speech"
      },
      "ttsAutoPlay": {
        "label": "Auto play voice response after completion"
      },
      "ttsProvider": {
        "label": "Text-to-Speech Provider",
        "placeholder": "Select a provider"
      },
      "ttsVoice": {
        "label": "Text-to-Speech Voice",
        "placeholder": "Select a voice"
      },
      "ssmlEnabled": {
        "label": "Enable SSML (Speech Synthesis Markup Language)"
      },
      "responseSplitting": {
        "label": "Response Splitting"
      },
      "removeReasoningTagTTS": {
        "label": "Remove Reasoning Tag from TTS"
      }
    },
    "stt": {
      "heading": "Speech-to-Text Settings",
      "autoStopTimeout": {
        "label": "Auto Stop Timeout (ms)",
        "placeholder": "Enter auto-stop timeout in milliseconds"
      },
      "autoSubmitVoiceMessage": {
        "label": "Auto Submit Voice Message"
      }
    }
  },
  "manageModels": {
    "title": "Manage Models",
    "addBtn": "Add New Model",
    "columns": {
      "name": "Name",
      "digest": "Digest",
      "nickname": "Nickname",
      "modifiedAt": "Modified At",
      "size": "Size",
      "actions": "Actions"
    },
    "expandedColumns": {
      "parentModel": "Parent Model",
      "format": "Format",
      "family": "Family",
      "parameterSize": "Parameter Size",
      "quantizationLevel": "Quantization Level"
    },
    "tooltip": {
      "delete": "Delete Model",
      "repull": "Re-Pull Model",
      "editNickname": "Edit Nickname"
    },
    "confirm": {
      "delete": "Are you sure you want to delete this model?",
      "repull": "Are you sure you want to re-pull this model?"
    },
    "modal": {
      "title": "Add New Model",
      "placeholder": "Enter Model Name",
      "pull": "Pull Model"
    },
    "notification": {
      "pullModel": "Pulling Model",
      "pullModelDescription": "Pulling {{modelName}} model. For more details, check the extension icon.",
      "cancellingDownload": "Cancelling Download",
      "cancellingDownloadDescription": "Model download is being cancelled...",
      "success": "Success",
      "error": "Error",
      "successDescription": "Successfully pulled the model",
      "successDeleteDescription": "Successfully deleted the model",
      "someError": "Something went wrong. Please try again later"
    }
  },
  "managePrompts": {
    "title": "Manage Prompts",
    "addBtn": "Add New Prompt",
    "option1": "Normal",
    "option2": "RAG",
    "questionPrompt": "Question Prompt",
    "segmented": {
      "custom": "Custom Prompts",
      "copilot": "Copilot Prompts"
    },
    "columns": {
      "title": "Title",
      "prompt": "Prompt",
      "type": "Prompt Type",
      "actions": "Actions"
    },
    "systemPrompt": "System Prompt",
    "quickPrompt": "Quick Prompt",
    "tooltip": {
      "delete": "Delete Prompt",
      "edit": "Edit Prompt"
    },
    "confirm": {
      "delete": "Are you sure you want to delete this prompt? This action cannot be undone."
    },
    "modal": {
      "addTitle": "Add New Prompt",
      "editTitle": "Edit Prompt"
    },
    "form": {
      "title": {
        "label": "Title",
        "placeholder": "My Awesome Prompt",
        "required": "Please enter a title"
      },
      "prompt": {
        "label": "Prompt",
        "placeholder": "Enter Prompt",
        "required": "Please enter a prompt",
        "help": "You can use {key} as variable in your prompt.",
        "missingTextPlaceholder": "The {text} variable is missing in the prompt. Please add it."
      },
      "isSystem": {
        "label": "Is System Prompt"
      },
      "btnSave": {
        "saving": "Adding Prompt...",
        "save": "Add Prompt"
      },
      "btnEdit": {
        "saving": "Updating Prompt...",
        "save": "Update Prompt"
      }
    },
    "notification": {
      "addSuccess": "Prompt Added",
      "addSuccessDesc": "Prompt has been added successfully",
      "error": "Error",
      "someError": "Something went wrong. Please try again later",
      "updatedSuccess": "Prompt Updated",
      "updatedSuccessDesc": "Prompt has been updated successfully",
      "deletedSuccess": "Prompt Deleted",
      "deletedSuccessDesc": "Prompt has been deleted successfully"
    }
  },
  "manageShare": {
    "title": "Manage Share",
    "heading": "Configure Page Share URL",
    "form": {
      "url": {
        "label": "Page Share URL",
        "placeholder": "Enter Page Share URL",
        "required": "Please input your Page Share URL!",
        "help": "For privacy reasons, you can self-host the page share and provide the URL here. <anchor>Learn More</anchor>."
      }
    },
    "webshare": {
      "heading": "Web Share",
      "columns": {
        "title": "Title",
        "url": "URL",
        "actions": "Actions"
      },
      "tooltip": {
        "delete": "Delete Share"
      },
      "confirm": {
        "delete": "Are you sure you want to delete this share? This action cannot be undone."
      },
      "label": "Manage Page Share",
      "description": "Enable or disable the page share feature"
    },
    "notification": {
      "pageShareSuccess": "Page Share URL updated successfully",
      "someError": "Something went wrong. Please try again later",
      "webShareDeleteSuccess": "Web Share deleted successfully"
    }
  },
  "ollamaSettings": {
    "title": "Ollama Settings",
    "heading": "Configure Ollama",
    "settings": {
      "ollamaUrl": {
        "label": "Ollama URL",
        "placeholder": "Enter Ollama URL"
      },
      "globalEnable": {
        "label": "Enable or Disable Ollama Integration Globally",
        "warning": "By disabling Ollama integration globally, Page Assist won't fetch models from Ollama. You can still add Ollama instance from the <anchor>OpenAI compatible API</anchor> section which will work fine."
      },
      "advanced": {
        "label": "Advance Ollama URL Configuration",
        "urlRewriteEnabled": {
          "label": "Enable or Disable Custom Origin URL"
        },
        "rewriteUrl": {
          "label": "Custom Origin URL",
          "placeholder": "Enter Custom Origin URL"
        },
        "autoCORSFix": {
          "label": "Enable or Disable Automatic Ollama CORS Fix"
        },
        "headers": {
          "label": "Custom Headers",
          "add": "Add Header",
          "key": {
            "label": "Header Key",
            "placeholder": "Authorization"
          },
          "value": {
            "label": "Header Value",
            "placeholder": "Bearer token"
          }
        },
        "help": "If you have connection issues with Ollama on Page Assist, you can configure a custom origin URL. To learn more about the configuration, <anchor>click here</anchor>."
      }
    }
  },
  "manageSearch": {
    "title": "Manage Web Search",
    "heading": "Configure Web Search"
  },
  "mcpSettings": {
    "title": "MCP Servers",
    "heading": "Manage MCP Servers",
    "subheading": "Add HTTP MCP servers for normal chat, including bearer auth and custom headers.",
    "addBtn": "Add MCP Server",
    "table": {
      "name": "Name",
      "url": "URL",
      "tools": "Cached Tools",
      "status": "Validation",
      "notValidated": "Not validated yet",
      "toolsUnavailable": "No cached tools",
      "auth": "Auth",
      "enabled": "Enabled",
      "actions": "Actions"
    },
    "actions": {
      "refreshTools": "Refresh tools",
      "enable": "Enable",
      "disable": "Disable"
    },
    "status": {
      "ready": "{{count}} tools available",
      "failed": "Validation failed",
      "notValidated": "Not validated",
      "lastChecked": "Last checked: {{value}}"
    },
    "auth": {
      "none": "No auth",
      "bearer": "Bearer token"
    },
    "modal": {
      "titleAdd": "Add MCP Server",
      "titleEdit": "Edit MCP Server",
      "deleteConfirm": "Delete {{name}}?",
      "name": {
        "label": "Server Name",
        "placeholder": "My MCP Server",
        "required": "Please enter a server name"
      },
      "url": {
        "label": "Server URL",
        "placeholder": "https://example.com/mcp",
        "help": "Only Streamable HTTP MCP endpoints over HTTP or HTTPS are supported right now.",
        "required": "Please enter a server URL",
        "invalid": "Please enter a valid HTTP or HTTPS URL"
      },
      "transportNotice": {
        "title": "Transport support",
        "description": "Page Assist supports Streamable HTTP MCP servers only. Legacy SSE endpoints such as /sse or /messages?sessionId=... are not supported."
      },
      "auth": {
        "label": "Authentication"
      },
      "bearerToken": {
        "label": "Bearer Token",
        "placeholder": "Enter bearer token",
        "required": "Please enter a bearer token"
      },
      "enabled": {
        "label": "Global Enable"
      },
      "headers": {
        "label": "Custom Headers",
        "add": "Add Header",
        "key": {
          "label": "Header Key",
          "placeholder": "X-Request-ID"
        },
        "value": {
          "label": "Header Value",
          "placeholder": "value"
        }
      },
      "validation": {
        "title": "Validate Tools",
        "help": "Connect to the MCP server, fetch available tools, and cache them before saving. Validation expects a Streamable HTTP MCP endpoint.",
        "button": "Validate and Load Tools",
        "availableTools": "Available tools",
        "idle": "Validate this server to confirm the connection and load its available tools.",
        "stale": "Connection details changed. Validate again to refresh the cached tools.",
        "failed": "Could not validate this MCP server.",
        "success": "Validated successfully. {{count}} tools are available.",
        "syncedAt": "Last synced: {{value}}",
        "saveHint": "Saving will validate the current configuration if the cached tool list is stale or missing."
      },
      "submit": "Save MCP Server",
      "update": "Update MCP Server"
    },
    "notification": {
      "added": "MCP server added",
      "updated": "MCP server updated",
      "deleted": "MCP server deleted",
      "validated": "Loaded {{count}} MCP tools",
      "toolsRefreshed": "Refreshed tools for {{name}}",
      "validationFailedTitle": "MCP validation failed",
      "storageBlockedTitle": "Page Assist can't save data",
      "storageBlockedDescription": "Firefox Private Mode does not support saving data to IndexedDB. Please manage MCP servers from a normal window."
    }
  },
  "about": {
    "title": "About",
    "heading": "About",
    "chromeVersion": "Page Assist Version",
    "ollamaVersion": "Ollama Version",
    "support": "You can support the Page Assist project by donating or sponsoring through the following platforms:",
    "koFi": "Support on Ko-fi",
    "githubSponsor": "Sponsor on GitHub",
    "githubRepo": "GitHub Repository"
  },
  "manageKnowledge": {
    "title": "Manage Knowledge",
    "heading": "Configure Knowledge Base"
  },
  "rag": {
    "title": "Pipeline Settings",
    "ragSettings": {
      "label": "RAG Settings",
      "model": {
        "label": "Embedding Model",
        "required": "Please select a model",
        "help": "Highly recommended to use embedding models like `nomic-embed-text`.",
        "placeholder": "Select a model"
      },
      "chunkSize": {
        "label": "Chunk Size",
        "placeholder": "Enter Chunk Size",
        "required": "Please enter a chunk size"
      },
      "chunkOverlap": {
        "label": "Chunk Overlap",
        "placeholder": "Enter Chunk Overlap",
        "required": "Please enter a chunk overlap"
      },
      "totalFilePerKB": {
        "label": "Knowledge Base Default File Upload Limit",
        "placeholder": "Enter default file upload limit (e.g., 10)",
        "required": "Please enter the default file upload limit"
      },
      "noOfRetrievedDocs": {
        "label": "Number of Retrieved Documents",
        "placeholder": "Enter Number of Retrieved Documents",
        "required": "Please enter the number of retrieved documents"
      },
      "splittingSeparator": {
        "label": "Separator",
        "placeholder": "Enter Separator (e.g., \\n\\n)",
        "required": "Please enter a separator"
      },
      "splittingStrategy": {
        "label": "Text Splitter"
      }
    },
    "prompt": {
      "label": "Configure RAG Prompt",
      "option1": "Normal",
      "option2": "Web",
      "alert": "Configuring the system prompt here is deprecated. Please use the Manage Prompts section to add or edit prompts. This section will be removed in a future release",
      "systemPrompt": "System Prompt",
      "systemPromptPlaceholder": "Enter System Prompt",
      "webSearchPrompt": "Web Search Prompt",
      "webSearchPromptHelp": "Do not remove `{search_results}` from the prompt.",
      "webSearchPromptError": "Please enter a web search prompt",
      "webSearchPromptPlaceholder": "Enter Web Search Prompt",
      "webSearchFollowUpPrompt": "Web Search Follow Up Prompt",
      "webSearchFollowUpPromptHelp": "Do not remove `{chat_history}` and `{question}` from the prompt.",
      "webSearchFollowUpPromptError": "Please input your Web Search Follow Up Prompt!",
      "webSearchFollowUpPromptPlaceholder": "Your Web Search Follow Up Prompt"
    }
  },
  "chromeAiSettings": {
    "title": "Chrome AI Settings"
  },
  "mermaid": "Mermaid"
}


================================================
FILE: src/assets/locale/en/sidepanel.json
================================================
{
    "tooltip": {
        "embed": "It may take a few minutes to embed the page. Please wait...",
        "clear": "Erase chat history",
        "history": "Chat history", 
        "openwebui": "Open WebUI"
    }
}

================================================
FILE: src/assets/locale/es/chrome.json
================================================
{
    "heading": "Configurar Chrome AI",
    "status": {
        "label": "Habilitar o deshabilitar el soporte de Chrome AI en Page Assist"
    },
    "error": {
        "browser_not_supported": "Esta versión de Chrome no es compatible con el modelo Gemini Nano. Por favor, actualice a la versión 127 o posterior.",
        "ai_not_supported": "La configuración chrome://flags/#prompt-api-for-gemini-nano no está habilitada. Por favor, habilítela.",
        "ai_not_ready": "Gemini Nano aún no está listo; necesita verificar la configuración de Chrome.",
        "internal_error": "Ocurrió un error interno. Por favor, inténtelo de nuevo más tarde."
    },
    "errorDescription": "Para usar Chrome AI, necesita la versión 138 o posterior de Chrome. Siga estos pasos:\n\n1. Vaya a `chrome://flags/#prompt-api-for-gemini-nano` y habilite \"Prompt API for Gemini Nano\".\n2. Reinicie Chrome para aplicar el cambio.\n3. Regrese a esta página y haga clic en \"Descargar Modelo\" — esto descargará un modelo de 4GB por primera vez.\n4. Una vez descargado, Gemini Nano se puede habilitar a través de Page Assist.",
    "downloadModel": "Descargar Modelo",
    "modelDownloadWarning": "Esto descargará un modelo con un tamaño de descarga aproximado que varía entre 1.5 GB y 2.4 GB. Asegúrese de tener suficiente espacio en disco."
}

================================================
FILE: src/assets/locale/es/common.json
================================================
{
    "pageAssist": "Page Assist",
    "selectAModel": "Selecione un Modelo",
    "save": "Guardar",
    "saved": "Guardado",
    "cancel": "Cancelar",
    "retry": "Reintentar",
    "share": {
        "tooltip": {
            "share": "Compartir"
        },
        "modal": {
            "title": "Compartir enlace para chat"
        },
        "form": {
            "defaultValue": {
                "name": "Anónimo",
                "title": "Chat sin título"
            },
            "title": {
                "label": "Título del Chat",
                "placeholder": "Ingresar el título del Chat",
                "required": "El título del Chat es obligatorio"
            },
            "name": {
                "label": "Tu nombre",
                "placeholder": "Ingresar tu nombre",
                "required": "Tu nombre es obligatorio"
            },
            "btn": {
                "save": "Generar enlace",
                "saving": "Generando enlace..."
            }
        },
        "notification": {
            "successGenerate": "Enlace copiado al Clipboard",
            "failGenerate": "Fallo al generar el enlace"
        }
    },
    "copyToClipboard": "Copiar al clipboard",
    "webSearch": "Buscando en la web",
    "regenerate": "Regenerar",
    "continue": "Continuar Respuesta",
    "edit": "Editar",
    "delete": "Borrar",
    "saveAndSubmit": "Guardar y Enviar",
    "editMessage": {
        "placeholder": "Ingresar un mensaje..."
    },
    "submit": "Enviar",
    "noData": "Sin datos",
    "noHistory": "Chat sin histórico",
    "chatWithCurrentPage": "Conversar con la página actual",
    "beta": "Beta",
    "tts": "Leer en voz alta",
    "currentChatModelSettings": "Configuraciones del Modelo de Chat Actual",
    "modelSettings": {
        "label": "Configuraciones del Modelo",
        "description": "Definir las opciones del modelo globalmente para todos los chats",
        "form": {
            "keepAlive": {
                "label": "Mantener vivo",
                "help": "controlar cuanto tiempo el modelo permanecera cargado en la memoria luego de su utilización (por defecto: 5m)",
                "placeholder": "Ingresar duración para mantenerlo vivo (ej: 5m, 10m, 1h)"
            },
            "temperature": {
                "label": "Temperatura",
                "placeholder": "Ingresar valor de la Temperatura (ej: 0.7, 1.0)"
            },
            "numCtx": {
                "label": "Tamaño de la Ventana de Contexto (num_ctx)",
                "placeholder": "Ingrese el valor del tamaño de la ventana de contexto (por defecto: 2048)"
            },
            "numPredict": {
                "label": "Máximo de Tokens (num_predict)",
                "placeholder": "Ingrese el valor máximo de Tokens (ej: 2048, 4096)"
            },
            "seed": {
                "label": "Semilla",
                "placeholder": "Ingresar el valor de la semilla (ej: 1234)",
                "help": "Reproductibilidad de la salida del modelo"
            },
            "topK": {
                "label": "Top K",
                "placeholder": "Ingresar el valor de Top K (ej: 40, 100)"
            },
            "topP": {
                "label": "Top P",
                "placeholder": "Ingresar el valor de Top P (ej: 0.9, 0.95)"
            },
            "numGpu": {
                "label": "Num GPU",
                "placeholder": "Ingrese el número de capas para enviar a la(s) GPU(s)"
            },
            "systemPrompt": {
                "label": "Prompt de Sistema Temporal",
                "placeholder": "Ingrese el Prompt de Sistema",
                "help": "Esta es una forma rápida de establecer el prompt de sistema en el chat actual, que anulará el prompt de sistema seleccionado si existe."
            }
        },
        "advanced": "Más Configuraciones del Modelo"
    },
    "copilot": {
        "summary": "Resumir",
        "explain": "Explicar",
        "rephrase": "Reformular",
        "translate": "Traducir"
    },
    "citations": "Citas",
    "downloadCode": "Descargar Código",
    "date": {
        "pinned": "Fijado",
        "today": "Hoy",
        "yesterday": "Ayer",
        "last7Days": "Últimos 7 días",
        "older": "Más antiguo"
    },
    "range": {
        "deleteConfirm": {
            "pinned": "¿Está seguro de que desea eliminar todos los mensajes fijados?",
            "today": "¿Está seguro de que desea eliminar todos los mensajes de hoy?",
            "yesterday": "¿Está seguro de que desea eliminar todos los mensajes de ayer?",
            "last7Days": "¿Está seguro de que desea eliminar todos los mensajes de los últimos 7 días?",
            "older": "¿Está seguro de que desea eliminar todos los mens
Download .txt
gitextract_4dq_zncw/

├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .prettierrc.cjs
├── CONTRIBUTING.md
├── LICENCE
├── PRIVACY.md
├── README.md
├── bun.lockb
├── docs/
│   ├── .vitepress/
│   │   └── config.mts
│   ├── browser-support.md
│   ├── connection-issue.md
│   ├── extensions-causing-issue-other-websites.md
│   ├── features/
│   │   ├── internet-search.md
│   │   ├── knowledge-base.md
│   │   ├── mcp.md
│   │   ├── ollama.md
│   │   ├── other.md
│   │   ├── page-share.md
│   │   └── prompts.md
│   ├── index.md
│   ├── markdown-examples.md
│   ├── package.json
│   ├── postcss.config.js
│   ├── privacy.md
│   ├── prompt.md
│   ├── providers/
│   │   ├── llamacpp.md
│   │   ├── lmstudio.md
│   │   ├── ollama.md
│   │   └── openai.md
│   ├── shortcuts.md
│   └── sidebar/
│       ├── chat-with-website.md
│       ├── copilot.md
│       ├── index.md
│       └── vision.md
├── package.json
├── page-share.md
├── postcss.config.js
├── src/
│   ├── assets/
│   │   ├── locale/
│   │   │   ├── ar/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── da/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── de/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── en/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── es/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── fa/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── fr/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── it/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── ja-JP/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── ko/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── ml/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── no/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── pt-BR/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── ru/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── sv/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── uk/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   ├── zh/
│   │   │   │   ├── chrome.json
│   │   │   │   ├── common.json
│   │   │   │   ├── knowledge.json
│   │   │   │   ├── openai.json
│   │   │   │   ├── option.json
│   │   │   │   ├── playground.json
│   │   │   │   ├── settings.json
│   │   │   │   └── sidepanel.json
│   │   │   └── zh-TW/
│   │   │       ├── chrome.json
│   │   │       ├── common.json
│   │   │       ├── knowledge.json
│   │   │       ├── openai.json
│   │   │       ├── option.json
│   │   │       ├── playground.json
│   │   │       ├── settings.json
│   │   │       └── sidepanel.json
│   │   └── tailwind.css
│   ├── chain/
│   │   ├── chat-with-website.ts
│   │   └── chat-with-x.ts
│   ├── components/
│   │   ├── Common/
│   │   │   ├── Beta.tsx
│   │   │   ├── CodeBlock.tsx
│   │   │   ├── DocumentCard.tsx
│   │   │   ├── ImageExport.tsx
│   │   │   ├── Markdown.tsx
│   │   │   ├── McpServerToggle.tsx
│   │   │   ├── Mermaid.tsx
│   │   │   ├── Message/
│   │   │   │   └── ReasoningSection.tsx
│   │   │   ├── ModelSelect.tsx
│   │   │   ├── PageAssistLoader.tsx
│   │   │   ├── PageAssistProvider.tsx
│   │   │   ├── Playground/
│   │   │   │   ├── ActionInfo.tsx
│   │   │   │   ├── DocumentChip.tsx
│   │   │   │   ├── DocumentFile.tsx
│   │   │   │   ├── EditMessageForm.tsx
│   │   │   │   ├── GenerationInfo.tsx
│   │   │   │   ├── HumanMessge.tsx
│   │   │   │   ├── McpInvocationBlock.tsx
│   │   │   │   ├── Message.tsx
│   │   │   │   ├── MessageSource.tsx
│   │   │   │   ├── MessageSourcePopup.tsx
│   │   │   │   ├── PlaygroundUserMessage.tsx
│   │   │   │   └── message-groups.ts
│   │   │   ├── PromptSelect.tsx
│   │   │   ├── ProviderIcon.tsx
│   │   │   ├── QueuedMessagesList.tsx
│   │   │   ├── SaveButton.tsx
│   │   │   ├── Settings/
│   │   │   │   ├── AdvanceOllamaSettings.tsx
│   │   │   │   └── CurrentChatModelSettings.tsx
│   │   │   ├── ShareModal.tsx
│   │   │   └── TableBlock.tsx
│   │   ├── Icons/
│   │   │   ├── AliBaBaCloud.tsx
│   │   │   ├── AnthropicIcon.tsx
│   │   │   ├── BigModelZhipuIcon.tsx
│   │   │   ├── CSVIcon.tsx
│   │   │   ├── CanopyWaveIcon.tsx
│   │   │   ├── ChatSettings.tsx
│   │   │   ├── ChutesIcon.tsx
│   │   │   ├── DeepSeek.tsx
│   │   │   ├── Fireworks.tsx
│   │   │   ├── GeminiIcon.tsx
│   │   │   ├── Groq.tsx
│   │   │   ├── HuggingFaceIcon.tsx
│   │   │   ├── InfinigenceAI.tsx
│   │   │   ├── LMStudio.tsx
│   │   │   ├── LlamacppLogo.tsx
│   │   │   ├── Llamafile.tsx
│   │   │   ├── MCPIcon.tsx
│   │   │   ├── MiniMaxIcon.tsx
│   │   │   ├── Mistral.tsx
│   │   │   ├── Moonshot.tsx
│   │   │   ├── Novita.tsx
│   │   │   ├── Ollama.tsx
│   │   │   ├── OpenAI.tsx
│   │   │   ├── OpenRouter.tsx
│   │   │   ├── PDFIcon.tsx
│   │   │   ├── SiliconFlow.tsx
│   │   │   ├── TXTIcon.tsx
│   │   │   ├── TencentCloud.tsx
│   │   │   ├── Togther.tsx
│   │   │   ├── VercelIcon.tsx
│   │   │   ├── VllmLogo.tsx
│   │   │   ├── VolcEngine.tsx
│   │   │   └── XAI.tsx
│   │   ├── Layouts/
│   │   │   ├── Header.tsx
│   │   │   ├── Layout.tsx
│   │   │   ├── LinkComponent.tsx
│   │   │   ├── MoreOptions.tsx
│   │   │   ├── NewChat.tsx
│   │   │   ├── SettingsOptionLayout.tsx
│   │   │   └── SidePanelSettingsLayout.tsx
│   │   ├── Option/
│   │   │   ├── Knowledge/
│   │   │   │   ├── AddKnowledge.tsx
│   │   │   │   ├── EditKnowledgeSettings.tsx
│   │   │   │   ├── KnowledgeIcon.tsx
│   │   │   │   ├── KnowledgeSelect.tsx
│   │   │   │   ├── SelectedKnowledge.tsx
│   │   │   │   ├── UpdateKnowledge.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   └── utils/
│   │   │   │       └── unsupported-types.ts
│   │   │   ├── Models/
│   │   │   │   ├── AddCustomModelModal.tsx
│   │   │   │   ├── AddOllamaModelModal.tsx
│   │   │   │   ├── AddUpdateModelSettings.tsx
│   │   │   │   ├── AddUpdateOAIModelSettings.tsx
│   │   │   │   ├── CancelPullingModel.tsx
│   │   │   │   ├── CustomModelsTable.tsx
│   │   │   │   ├── ModelNicknameModal.tsx
│   │   │   │   ├── OllamaModelsTable.tsx
│   │   │   │   └── index.tsx
│   │   │   ├── Playground/
│   │   │   │   ├── DocumentChip.tsx
│   │   │   │   ├── MentionHighlighter.tsx
│   │   │   │   ├── MentionsDropdown.tsx
│   │   │   │   ├── Playground.tsx
│   │   │   │   ├── PlaygroundChat.tsx
│   │   │   │   ├── PlaygroundEmpty.tsx
│   │   │   │   ├── PlaygroundFile.tsx
│   │   │   │   ├── PlaygroundForm.tsx
│   │   │   │   ├── PlaygroundNewChat.tsx
│   │   │   │   └── PlaygroundSettings.tsx
│   │   │   ├── Prompt/
│   │   │   │   └── index.tsx
│   │   │   ├── Settings/
│   │   │   │   ├── about.tsx
│   │   │   │   ├── chrome.tsx
│   │   │   │   ├── general-settings.tsx
│   │   │   │   ├── mcp.tsx
│   │   │   │   ├── memory.tsx
│   │   │   │   ├── model-settings.tsx
│   │   │   │   ├── ollama.tsx
│   │   │   │   ├── openai-fetch-model.tsx
│   │   │   │   ├── openai.tsx
│   │   │   │   ├── prompt.tsx
│   │   │   │   ├── rag.tsx
│   │   │   │   ├── search-mode.tsx
│   │   │   │   ├── sidepanel-rag.tsx
│   │   │   │   ├── sst-settings.tsx
│   │   │   │   ├── system-settings.tsx
│   │   │   │   ├── title.tsx
│   │   │   │   └── tts-mode.tsx
│   │   │   ├── Share/
│   │   │   │   └── index.tsx
│   │   │   └── Sidebar.tsx
│   │   ├── Select/
│   │   │   ├── LoadingIndicator.tsx
│   │   │   └── index.tsx
│   │   ├── ShortcutConfig.tsx
│   │   └── Sidepanel/
│   │       ├── Chat/
│   │       │   ├── body.tsx
│   │       │   ├── empty.tsx
│   │       │   ├── form.tsx
│   │       │   └── header.tsx
│   │       └── Settings/
│   │           ├── body.tsx
│   │           └── header.tsx
│   ├── context/
│   │   ├── FontSizeProvider.tsx
│   │   └── index.tsx
│   ├── data/
│   │   └── ocr-language.ts
│   ├── db/
│   │   ├── dexie/
│   │   │   ├── branch.ts
│   │   │   ├── chat.ts
│   │   │   ├── firefox-sync.ts
│   │   │   ├── helpers.ts
│   │   │   ├── knowledge.ts
│   │   │   ├── mcp.ts
│   │   │   ├── memory.ts
│   │   │   ├── migration.ts
│   │   │   ├── modelState.ts
│   │   │   ├── models.ts
│   │   │   ├── nickname.ts
│   │   │   ├── openai.ts
│   │   │   ├── providerState.ts
│   │   │   ├── schema.ts
│   │   │   ├── types.ts
│   │   │   └── vector.ts
│   │   ├── document.ts
│   │   ├── index.ts
│   │   ├── knowledge.ts
│   │   ├── models.ts
│   │   ├── nickname.ts
│   │   ├── openai.ts
│   │   └── vector.ts
│   ├── entries/
│   │   ├── background.ts
│   │   ├── hf-pull.content.ts
│   │   ├── ollama-pull.content.ts
│   │   ├── options/
│   │   │   ├── App.tsx
│   │   │   ├── index.html
│   │   │   └── main.tsx
│   │   ├── sidepanel/
│   │   │   ├── App.tsx
│   │   │   ├── index.html
│   │   │   └── main.tsx
│   │   └── youtube-summarize.content.ts
│   ├── entries-firefox/
│   │   ├── background.ts
│   │   ├── hf-pull.content.ts
│   │   ├── ollama-pull.content.ts
│   │   ├── options/
│   │   │   ├── App.tsx
│   │   │   ├── index.html
│   │   │   └── main.tsx
│   │   ├── sidepanel/
│   │   │   ├── App.tsx
│   │   │   ├── index.html
│   │   │   └── main.tsx
│   │   └── youtube-summarize.content.ts
│   ├── hooks/
│   │   ├── chat-helper/
│   │   │   └── index.ts
│   │   ├── chat-modes/
│   │   │   ├── continueChatMode.ts
│   │   │   ├── documentChatMode.ts
│   │   │   ├── normalChatMode.ts
│   │   │   ├── ragMode.ts
│   │   │   ├── searchChatMode.ts
│   │   │   └── tabChatMode.ts
│   │   ├── handlers/
│   │   │   └── messageHandlers.ts
│   │   ├── keyboard/
│   │   │   ├── index.ts
│   │   │   ├── useKeyboardShortcuts.ts
│   │   │   └── useShortcutConfig.ts
│   │   ├── useBackgroundMessage.tsx
│   │   ├── useDarkmode.tsx
│   │   ├── useDebounce.tsx
│   │   ├── useDynamicTextareaSize.tsx
│   │   ├── useI18n.tsx
│   │   ├── useLocal.tsx
│   │   ├── useMessage.tsx
│   │   ├── useMessageOption.tsx
│   │   ├── useMessageQueue.ts
│   │   ├── useMigration.tsx
│   │   ├── useSmartScroll.tsx
│   │   ├── useSmartScroll2.tsx
│   │   ├── useSpeechRecognition.tsx
│   │   ├── useTTS.tsx
│   │   ├── useTabMentions.ts
│   │   └── utils/
│   │       └── messageHelpers.ts
│   ├── i18n/
│   │   ├── index.ts
│   │   ├── lang/
│   │   │   ├── ar.ts
│   │   │   ├── da.ts
│   │   │   ├── de.ts
│   │   │   ├── en.ts
│   │   │   ├── es.ts
│   │   │   ├── fa.ts
│   │   │   ├── fr.ts
│   │   │   ├── it.ts
│   │   │   ├── ja.ts
│   │   │   ├── ko.ts
│   │   │   ├── ml.ts
│   │   │   ├── no.ts
│   │   │   ├── pt.ts
│   │   │   ├── ru.ts
│   │   │   ├── sv.ts
│   │   │   ├── uk.ts
│   │   │   ├── zh-TW.ts
│   │   │   └── zh.ts
│   │   └── support-language.ts
│   ├── libs/
│   │   ├── PAMemoryVectorStore.ts
│   │   ├── PageAssistVectorStore.ts
│   │   ├── byte-formater.ts
│   │   ├── class-name.tsx
│   │   ├── clean-url.ts
│   │   ├── export-import.ts
│   │   ├── fetcher.ts
│   │   ├── get-html.ts
│   │   ├── get-screenshot.ts
│   │   ├── get-tab-contents.ts
│   │   ├── mcp/
│   │   │   ├── client.ts
│   │   │   ├── errors.ts
│   │   │   ├── http-client.ts
│   │   │   ├── normal-chat.ts
│   │   │   ├── oauth-flow.ts
│   │   │   ├── oauth.ts
│   │   │   ├── remote-tools.ts
│   │   │   ├── tool-schema.ts
│   │   │   ├── types.ts
│   │   │   └── utils.ts
│   │   ├── model-utils.ts
│   │   ├── openai.ts
│   │   ├── pdf.ts
│   │   ├── pdfjs.ts
│   │   ├── process-knowledge.ts
│   │   ├── process-source.ts
│   │   ├── reasoning.ts
│   │   ├── runtime.ts
│   │   ├── send-notification.ts
│   │   └── to-base64.ts
│   ├── loader/
│   │   ├── csv.ts
│   │   ├── docx.ts
│   │   ├── html.ts
│   │   ├── pdf-url.ts
│   │   ├── pdf.ts
│   │   └── txt.ts
│   ├── models/
│   │   ├── ChatChromeAi.ts
│   │   ├── ChatGoogleAI.ts
│   │   ├── ChatOllama.ts
│   │   ├── ChatTypes.ts
│   │   ├── CustomAIMessageChunk.ts
│   │   ├── CustomChatAnthropic.ts
│   │   ├── CustomChatOpenAI.ts
│   │   ├── OAIEmbedding.ts
│   │   ├── OllamaEmbedding.ts
│   │   ├── embedding.ts
│   │   ├── index.ts
│   │   ├── types.ts
│   │   └── utils/
│   │       ├── chrome.ts
│   │       ├── ollama.ts
│   │       └── openai.ts
│   ├── parser/
│   │   ├── amazon.ts
│   │   ├── default.ts
│   │   ├── google-docs.ts
│   │   ├── google-sheets.ts
│   │   ├── reader.ts
│   │   ├── twitter.ts
│   │   └── wiki.ts
│   ├── public/
│   │   ├── _locales/
│   │   │   ├── da/
│   │   │   │   └── messages.json
│   │   │   ├── de/
│   │   │   │   └── messages.json
│   │   │   ├── en/
│   │   │   │   └── messages.json
│   │   │   ├── es/
│   │   │   │   └── messages.json
│   │   │   ├── fa/
│   │   │   │   └── messages.json
│   │   │   ├── fr/
│   │   │   │   └── messages.json
│   │   │   ├── it/
│   │   │   │   └── messages.json
│   │   │   ├── ja/
│   │   │   │   └── messages.json
│   │   │   ├── ml/
│   │   │   │   └── messages.json
│   │   │   ├── no/
│   │   │   │   └── messages.json
│   │   │   ├── ru/
│   │   │   │   └── messages.json
│   │   │   ├── sv/
│   │   │   │   └── messages.json
│   │   │   ├── zh_CN/
│   │   │   │   └── messages.json
│   │   │   └── zh_TW/
│   │   │       └── messages.json
│   │   └── ocr/
│   │       ├── tesseract-core-simd.js
│   │       └── tesseract-core-simd.wasm
│   ├── queue/
│   │   └── index.ts
│   ├── routes/
│   │   ├── chrome-route.tsx
│   │   ├── chrome.tsx
│   │   ├── firefox-route.tsx
│   │   ├── firefox.tsx
│   │   ├── option-index.tsx
│   │   ├── option-rag.tsx
│   │   ├── option-settings-about.tsx
│   │   ├── option-settings-chrome.tsx
│   │   ├── option-settings-knowledge.tsx
│   │   ├── option-settings-mcp.tsx
│   │   ├── option-settings-model.tsx
│   │   ├── option-settings-openai.tsx
│   │   ├── option-settings-prompt.tsx
│   │   ├── option-settings-share.tsx
│   │   ├── option-settings.tsx
│   │   ├── options-settings-ollama.tsx
│   │   ├── sidepanel-chat.tsx
│   │   ├── sidepanel-settings-model.tsx
│   │   ├── sidepanel-settings-openai.tsx
│   │   └── sidepanel-settings.tsx
│   ├── services/
│   │   ├── action.ts
│   │   ├── app.ts
│   │   ├── application.ts
│   │   ├── chrome.ts
│   │   ├── elevenlabs.ts
│   │   ├── kb.ts
│   │   ├── model-settings.ts
│   │   ├── ocr.ts
│   │   ├── ollama.ts
│   │   ├── openai-tts.ts
│   │   ├── search.ts
│   │   ├── title.ts
│   │   └── tts.ts
│   ├── store/
│   │   ├── index.tsx
│   │   ├── model.tsx
│   │   ├── option.tsx
│   │   └── webui.tsx
│   ├── types/
│   │   ├── index.ts
│   │   └── message.ts
│   ├── utils/
│   │   ├── action.ts
│   │   ├── chrome-download.ts
│   │   ├── chrome.ts
│   │   ├── clean-headers.ts
│   │   ├── clean.ts
│   │   ├── clipboard.ts
│   │   ├── color.ts
│   │   ├── compress.ts
│   │   ├── constant.ts
│   │   ├── ff-error.ts
│   │   ├── file-processor.ts
│   │   ├── format-file-size.ts
│   │   ├── generate-history.ts
│   │   ├── google-domains.ts
│   │   ├── human-message.tsx
│   │   ├── humanize-milliseconds.ts
│   │   ├── is-private-mode.ts
│   │   ├── is-youtube.ts
│   │   ├── key-down.tsx
│   │   ├── langauge-extension.ts
│   │   ├── latex.ts
│   │   ├── markdown-to-ssml.ts
│   │   ├── markdown-to-text.ts
│   │   ├── marked/
│   │   │   └── katex.tsx
│   │   ├── math-delimiter.ts
│   │   ├── memory-embeddings.ts
│   │   ├── model.ts
│   │   ├── oai-api-providers.ts
│   │   ├── ocr.ts
│   │   ├── ollama-pull-inject.ts
│   │   ├── pull-ollama.ts
│   │   ├── rerank.ts
│   │   ├── search-provider.ts
│   │   ├── select-variable.ts
│   │   ├── supported-languages.ts
│   │   ├── system-message.ts
│   │   ├── text-splitter.ts
│   │   ├── to-source.ts
│   │   ├── tts.ts
│   │   ├── update-page-title.ts
│   │   └── verify-page-share.ts
│   └── web/
│       ├── search-engines/
│       │   ├── baidu.ts
│       │   ├── bing.ts
│       │   ├── brave-api.ts
│       │   ├── brave.ts
│       │   ├── duckduckgo.ts
│       │   ├── exa.ts
│       │   ├── firecrawl.ts
│       │   ├── google.ts
│       │   ├── kagi-api.ts
│       │   ├── ollama.ts
│       │   ├── perplexity-api.ts
│       │   ├── searxng.ts
│       │   ├── sogou.ts
│       │   ├── startpage.ts
│       │   ├── stract.ts
│       │   └── tavily-api.ts
│       ├── web.ts
│       └── website/
│           └── index.ts
├── tailwind.config.js
├── tsconfig.json
└── wxt.config.ts
Download .txt
SYMBOL INDEX (729 symbols across 183 files)

FILE: src/chain/chat-with-website.ts
  type RetrievalChainInput (line 19) | type RetrievalChainInput = {
  function groupMessagesByConversation (line 24) | function groupMessagesByConversation(messages: ChatHistory) {

FILE: src/chain/chat-with-x.ts
  type RetrievalChainInput (line 18) | type RetrievalChainInput = {

FILE: src/components/Common/CodeBlock.tsx
  type Props (line 16) | interface Props {

FILE: src/components/Common/DocumentCard.tsx
  type Props (line 4) | type Props = {

FILE: src/components/Common/Markdown.tsx
  function Markdown (line 15) | function Markdown({

FILE: src/components/Common/Mermaid.tsx
  function Mermaid (line 4) | function Mermaid({ code }: { code: string }) {

FILE: src/components/Common/Message/ReasoningSection.tsx
  type ReasoningSectionProps (line 14) | interface ReasoningSectionProps {
  method code (line 68) | code({ node, inline, className, children, ...props }) {

FILE: src/components/Common/ModelSelect.tsx
  type Props (line 10) | type Props = {

FILE: src/components/Common/Playground/ActionInfo.tsx
  type Props (line 4) | type Props = {

FILE: src/components/Common/Playground/DocumentChip.tsx
  type DocumentChipProps (line 4) | interface DocumentChipProps {

FILE: src/components/Common/Playground/DocumentFile.tsx
  type DocumentFileProps (line 5) | interface DocumentFileProps {

FILE: src/components/Common/Playground/EditMessageForm.tsx
  type Props (line 6) | type Props = {

FILE: src/components/Common/Playground/GenerationInfo.tsx
  type GenerationMetrics (line 1) | type GenerationMetrics = {
  type Props (line 12) | type Props = {

FILE: src/components/Common/Playground/HumanMessge.tsx
  type Props (line 5) | type Props = {
  constant MAX_MESSAGE_LENGTH (line 10) | const MAX_MESSAGE_LENGTH = 500

FILE: src/components/Common/Playground/McpInvocationBlock.tsx
  constant OUTPUT_CLAMP_HEIGHT (line 14) | const OUTPUT_CLAMP_HEIGHT = 200
  constant MAX_PREVIEW_CHARS (line 15) | const MAX_PREVIEW_CHARS = 2000
  type Props (line 17) | type Props = {

FILE: src/components/Common/Playground/Message.tsx
  type Props (line 42) | type Props = {

FILE: src/components/Common/Playground/MessageSource.tsx
  type Props (line 3) | type Props = {

FILE: src/components/Common/Playground/MessageSourcePopup.tsx
  type Props (line 4) | type Props = {

FILE: src/components/Common/Playground/PlaygroundUserMessage.tsx
  type Props (line 19) | type Props = {

FILE: src/components/Common/Playground/message-groups.ts
  type PlaygroundToolResult (line 6) | type PlaygroundToolResult = {
  type PlaygroundToolInvocation (line 14) | type PlaygroundToolInvocation = {
  type PlaygroundMessageSegment (line 23) | type PlaygroundMessageSegment =
  type PlaygroundMessageGroup (line 36) | type PlaygroundMessageGroup = Message & {

FILE: src/components/Common/PromptSelect.tsx
  type Props (line 8) | type Props = {

FILE: src/components/Common/QueuedMessagesList.tsx
  type Props (line 5) | type Props = {

FILE: src/components/Common/SaveButton.tsx
  type Props (line 4) | type Props = {

FILE: src/components/Common/Settings/CurrentChatModelSettings.tsx
  type Props (line 26) | type Props = {

FILE: src/components/Common/ShareModal.tsx
  type Props (line 15) | type Props = {

FILE: src/components/Common/TableBlock.tsx
  type TableProps (line 14) | interface TableProps {
  type TableData (line 18) | interface TableData {

FILE: src/components/Layouts/Header.tsx
  type Props (line 26) | type Props = {

FILE: src/components/Layouts/Layout.tsx
  function OptionLayout (line 23) | function OptionLayout({

FILE: src/components/Layouts/LinkComponent.tsx
  function classNames (line 4) | function classNames(...classes: string[]) {

FILE: src/components/Layouts/MoreOptions.tsx
  type MoreOptionsProps (line 20) | interface MoreOptionsProps {

FILE: src/components/Layouts/NewChat.tsx
  type Props (line 8) | type Props = {

FILE: src/components/Option/Knowledge/AddKnowledge.tsx
  type Props (line 15) | type Props = {

FILE: src/components/Option/Knowledge/EditKnowledgeSettings.tsx
  constant DEFAULT_RAG_QUESTION_PROMPT (line 8) | const DEFAULT_RAG_QUESTION_PROMPT =
  constant DEFAUTL_RAG_SYSTEM_PROMPT (line 11) | const DEFAUTL_RAG_SYSTEM_PROMPT = `You are a helpful AI assistant. Use t...
  type Props (line 13) | type Props = {

FILE: src/components/Option/Knowledge/KnowledgeIcon.tsx
  type Props (line 5) | type Props = {

FILE: src/components/Option/Knowledge/UpdateKnowledge.tsx
  type Props (line 24) | type Props = {

FILE: src/components/Option/Models/AddCustomModelModal.tsx
  type Props (line 11) | type Props = {

FILE: src/components/Option/Models/AddOllamaModelModal.tsx
  type Props (line 11) | type Props = {

FILE: src/components/Option/Models/AddUpdateModelSettings.tsx
  type Props (line 16) | type Props = {

FILE: src/components/Option/Models/AddUpdateOAIModelSettings.tsx
  type Props (line 17) | type Props = {

FILE: src/components/Option/Models/CancelPullingModel.tsx
  type Props (line 4) | type Props = {

FILE: src/components/Option/Models/ModelNicknameModal.tsx
  type Props (line 8) | type Props = {

FILE: src/components/Option/Playground/DocumentChip.tsx
  type DocumentChipProps (line 5) | interface DocumentChipProps {

FILE: src/components/Option/Playground/MentionHighlighter.tsx
  type MentionHighlighterProps (line 3) | interface MentionHighlighterProps {

FILE: src/components/Option/Playground/MentionsDropdown.tsx
  type MentionsDropdownProps (line 5) | interface MentionsDropdownProps {

FILE: src/components/Option/Playground/PlaygroundFile.tsx
  type Props (line 5) | type Props = {

FILE: src/components/Option/Playground/PlaygroundForm.tsx
  type Props (line 45) | type Props = {

FILE: src/components/Option/Prompt/index.tsx
  function customPrompts (line 278) | function customPrompts() {
  function copilotPrompts (line 387) | function copilotPrompts() {
  function customCopilotPrompts (line 461) | function customCopilotPrompts() {

FILE: src/components/Option/Settings/mcp.tsx
  type ValidationSnapshot (line 48) | type ValidationSnapshot = {

FILE: src/components/Option/Settings/openai-fetch-model.tsx
  type Props (line 11) | type Props = {

FILE: src/components/Option/Sidebar.tsx
  type Props (line 61) | type Props = {

FILE: src/components/Select/index.tsx
  type SelectOption (line 6) | interface SelectOption {
  type SelectProps (line 11) | interface SelectProps {

FILE: src/components/Sidepanel/Chat/form.tsx
  type Props (line 39) | type Props = {

FILE: src/components/Sidepanel/Chat/header.tsx
  type SidepanelHeaderProps (line 25) | type SidepanelHeaderProps = {

FILE: src/context/FontSizeProvider.tsx
  type FontSizeContextType (line 4) | interface FontSizeContextType {
  type FontSizeProviderProps (line 13) | interface FontSizeProviderProps {

FILE: src/context/index.tsx
  type PageAssistContext (line 4) | interface PageAssistContext {

FILE: src/db/dexie/chat.ts
  constant PAGE_SIZE (line 17) | const PAGE_SIZE = 30
  function searchQueryInContent (line 19) | function searchQueryInContent(content: string, query: string): boolean {
  function fastForward (line 35) | function fastForward(
  class PageAssistDatabase (line 50) | class PageAssistDatabase {
    method getSessionFiles (line 51) | async getSessionFiles(sessionId: string): Promise<UploadedFile[]> {
    method getProjectFolders (line 56) | async getProjectFolders(): Promise<ProjectFolders> {
    method addProjectFolder (line 60) | async addProjectFolder(project: ProjectFolder) {
    method updateProjectFolder (line 64) | async updateProjectFolder(id: string, title: string) {
    method deleteProjectFolder (line 68) | async deleteProjectFolder(id: string) {
    method assignHistoryToFolder (line 82) | async assignHistoryToFolder(history_id: string, folder_id?: string) {
    method getSessionFilesInfo (line 86) | async getSessionFilesInfo(sessionId: string): Promise<SessionFiles | n...
    method addFileToSession (line 91) | async addFileToSession(sessionId: string, file: UploadedFile) {
    method removeFileFromSession (line 103) | async removeFileFromSession(sessionId: string, fileId: string) {
    method updateFileInSession (line 115) | async updateFileInSession(
    method setRetrievalEnabled (line 133) | async setRetrievalEnabled(sessionId: string, enabled: boolean) {
    method clearSessionFiles (line 144) | async clearSessionFiles(sessionId: string) {
    method getChatHistory (line 148) | async getChatHistory(id: string): Promise<MessageHistory> {
    method getChatHistories (line 161) | async getChatHistories(): Promise<ChatHistory> {
    method fullTextSearchChatHistories (line 165) | async fullTextSearchChatHistories(query: string): Promise<ChatHistory> {
    method getChatHistoryTitleById (line 202) | async getChatHistoryTitleById(id: string): Promise<string> {
    method getHistoryInfo (line 207) | async getHistoryInfo(id: string): Promise<HistoryInfo> {
    method addChatHistory (line 211) | async addChatHistory(history: HistoryInfo) {
    method updateChatHistoryCreatedAt (line 215) | async updateChatHistoryCreatedAt(id: string, createdAt: number) {
    method addMessage (line 219) | async addMessage(message: Message) {
    method updateMessage (line 223) | async updateMessage(history_id: string, message_id: string, content: s...
    method removeChatHistory (line 227) | async removeChatHistory(id: string) {
    method removeMessage (line 231) | async removeMessage(history_id: string, message_id: string) {
    method updateLastUsedModel (line 235) | async updateLastUsedModel(history_id: string, model_id: string) {
    method updateLastUsedPrompt (line 239) | async updateLastUsedPrompt(
    method clear (line 246) | async clear() {
    method deleteChatHistory (line 251) | async deleteChatHistory(id: string) {
    method deleteAllChatHistory (line 258) | async deleteAllChatHistory() {
    method clearDB (line 265) | async clearDB() {
    method deleteMessage (line 270) | async deleteMessage(history_id: string) {
    method getChatHistoriesPaginated (line 273) | async getChatHistoriesPaginated(
    method getChatHistoriesPaginatedOptimized (line 327) | async getChatHistoriesPaginatedOptimized(
    method getAllPrompts (line 370) | async getAllPrompts(): Promise<Prompts> {
    method addPrompt (line 374) | async addPrompt(prompt: Prompt) {
    method deletePrompt (line 378) | async deletePrompt(id: string) {
    method updatePrompt (line 382) | async updatePrompt(
    method getPromptById (line 391) | async getPromptById(id: string): Promise<Prompt | undefined> {
    method getWebshare (line 396) | async getWebshare(id: string) {
    method getAllWebshares (line 400) | async getAllWebshares(): Promise<Webshare[]> {
    method addWebshare (line 404) | async addWebshare(webshare: Webshare) {
    method deleteWebshare (line 408) | async deleteWebshare(id: string) {
    method getUserID (line 413) | async getUserID(): Promise<string> {
    method setUserID (line 418) | async setUserID(id: string) {
    method importChatHistoryV2 (line 422) | async importChatHistoryV2(
    method importPromptsV2 (line 455) | async importPromptsV2(
    method importSessionFilesV2 (line 479) | async importSessionFilesV2(

FILE: src/db/dexie/knowledge.ts
  class PageAssistKnowledge (line 12) | class PageAssistKnowledge {
    method getAll (line 13) | async getAll(): Promise<Knowledge[]> {
    method getById (line 17) | async getById(id: string): Promise<Knowledge | undefined> {
    method create (line 21) | async create(knowledge: Knowledge): Promise<void> {
    method update (line 25) | async update(knowledge: Knowledge): Promise<void> {
    method delete (line 29) | async delete(id: string): Promise<void> {
    method deleteSource (line 33) | async deleteSource(id: string, source_id: string): Promise<void> {
    method importDataV2 (line 43) | async importDataV2(

FILE: src/db/dexie/mcp.ts
  class McpServerDb (line 12) | class McpServerDb {
    method importDataV2 (line 37) | async importDataV2(

FILE: src/db/dexie/migration.ts
  class DatabaseMigration (line 16) | class DatabaseMigration {
    method constructor (line 25) | constructor() {
    method migrateAllData (line 35) | async migrateAllData(): Promise<{
    method migrateSessionFiles (line 217) | async migrateSessionFiles(sessionIds: string[]): Promise<{
    method verifyMigration (line 252) | async verifyMigration(): Promise<{
    method clearDexieDatabase (line 331) | async clearDexieDatabase(): Promise<void> {

FILE: src/db/dexie/modelState.ts
  class ModelStateDb (line 4) | class ModelStateDb {
    method getModelState (line 5) | async getModelState(model_id: string): Promise<ModelState | undefined> {
    method getAllModelStates (line 9) | async getAllModelStates(): Promise<ModelStates> {
    method setModelState (line 13) | async setModelState(model_id: string, is_enabled: boolean): Promise<vo...
    method deleteModelState (line 21) | async deleteModelState(model_id: string): Promise<void> {
    method importDataV2 (line 25) | async importDataV2(

FILE: src/db/dexie/models.ts
  class ModelDb (line 153) | class ModelDb {
    method importDataV2 (line 178) | async importDataV2(

FILE: src/db/dexie/nickname.ts
  class ModelNickname (line 4) | class ModelNickname {
    method saveModelNickname (line 5) | async saveModelNickname(
    method getModelNicknameByID (line 24) | async getModelNicknameByID(model_id: string) {
    method getAllModelNicknames (line 28) | async getAllModelNicknames() {
    method importDataV2 (line 32) | async importDataV2(

FILE: src/db/dexie/openai.ts
  class OpenAIModelDb (line 21) | class OpenAIModelDb {
    method importDataV2 (line 41) | async importDataV2(

FILE: src/db/dexie/providerState.ts
  class ProviderStateDb (line 4) | class ProviderStateDb {
    method getProviderState (line 5) | async getProviderState(provider_id: string): Promise<ProviderState | u...
    method getAllProviderStates (line 9) | async getAllProviderStates(): Promise<ProviderStates> {
    method setProviderState (line 13) | async setProviderState(provider_id: string, is_enabled: boolean): Prom...
    method deleteProviderState (line 21) | async deleteProviderState(provider_id: string): Promise<void> {
    method importDataV2 (line 25) | async importDataV2(

FILE: src/db/dexie/schema.ts
  class PageAssistDexieDB (line 22) | class PageAssistDexieDB extends Dexie {
    method constructor (line 49) | constructor() {

FILE: src/db/dexie/types.ts
  type LastUsedModelType (line 4) | type LastUsedModelType = { prompt_id?: string; prompt_content?: string }
  type HistoryInfo (line 6) | type HistoryInfo = {
  type WebSearch (line 19) | type WebSearch = {
  type UploadedFile (line 29) | type UploadedFile = {
  type SessionFiles (line 40) | type SessionFiles = {
  type Message (line 48) | type Message = {
  type Webshare (line 72) | type Webshare = {
  type Prompt (line 81) | type Prompt = {
  type UserSettings (line 90) | type UserSettings = {
  type Source (line 95) | type Source = {
  type Knowledge (line 102) | type Knowledge = {
  type PageAssistVector (line 115) | interface PageAssistVector {
  type VectorData (line 122) | type VectorData = {
  type DocumentSource (line 128) | type DocumentSource = {
  type Document (line 135) | type Document = {
  type OpenAIModelConfig (line 149) | type OpenAIModelConfig = {
  type McpServerConfig (line 161) | type McpServerConfig = McpServer
  type Model (line 163) | type Model = {
  type ModelNickname (line 175) | type ModelNickname = {
  type ModelState (line 182) | type ModelState = {
  type ProviderState (line 188) | type ProviderState = {
  type Memory (line 194) | type Memory = {
  type ProjectFolder (line 201) | type ProjectFolder = {
  type MessageHistory (line 207) | type MessageHistory = Message[]
  type ChatHistory (line 208) | type ChatHistory = HistoryInfo[]
  type Prompts (line 209) | type Prompts = Prompt[]
  type OpenAIModelConfigs (line 210) | type OpenAIModelConfigs = OpenAIModelConfig[]
  type McpServerConfigs (line 211) | type McpServerConfigs = McpServerConfig[]
  type Models (line 212) | type Models = Model[]
  type ModelNicknames (line 213) | type ModelNicknames = ModelNickname[]
  type ModelStates (line 214) | type ModelStates = ModelState[]
  type ProviderStates (line 215) | type ProviderStates = ProviderState[]
  type Memories (line 216) | type Memories = Memory[]
  type ProjectFolders (line 217) | type ProjectFolders = ProjectFolder[]

FILE: src/db/dexie/vector.ts
  class PageAssistVectorDb (line 5) | class PageAssistVectorDb {
    method insertVector (line 6) | async insertVector(id: string, vector: PageAssistVector[]): Promise<vo...
    method deleteVector (line 20) | async deleteVector(id: string): Promise<void> {
    method deleteVectorByFileId (line 24) | async deleteVectorByFileId(id: string, file_id: string): Promise<void> {
    method getVector (line 32) | async getVector(id: string): Promise<VectorData | undefined> {
    method getAll (line 36) | async getAll(): Promise<VectorData[]> {
    method saveImportedData (line 40) | async saveImportedData(data: VectorData[]): Promise<void> {
    method saveImportedDataV2 (line 43) | async saveImportedDataV2(data: VectorData[], options: {

FILE: src/db/document.ts
  type Source (line 4) | type Source = {
  type Document (line 11) | type Document = {
  class PageAssistDocument (line 31) | class PageAssistDocument {
    method constructor (line 34) | constructor() {

FILE: src/db/index.ts
  type HistoryInfo (line 7) | type HistoryInfo = {
  type WebSearch (line 17) | type WebSearch = {
  type UploadedFile (line 27) | type UploadedFile = {
  type SessionFiles (line 38) | type SessionFiles = {
  type Message (line 45) | type Message = {
  function simpleFuzzyMatch (line 62) | function simpleFuzzyMatch(text: string, query: string): boolean {
  type Webshare (line 107) | type Webshare = {
  type Prompt (line 116) | type Prompt = {
  type MessageHistory (line 125) | type MessageHistory = Message[]
  type ChatHistory (line 127) | type ChatHistory = HistoryInfo[]
  type Prompts (line 129) | type Prompts = Prompt[]
  class PageAssitDatabase (line 131) | class PageAssitDatabase {
    method constructor (line 134) | constructor() {
    method getSessionFiles (line 138) | async getSessionFiles(sessionId: string): Promise<UploadedFile[]> {
    method getSessionFilesInfo (line 149) | async getSessionFilesInfo(sessionId: string): Promise<SessionFiles | n...
    method addFileToSession (line 157) | async addFileToSession(sessionId: string, file: UploadedFile) {
    method removeFileFromSession (line 169) | async removeFileFromSession(sessionId: string, fileId: string) {
    method updateFileInSession (line 181) | async updateFileInSession(
    method setRetrievalEnabled (line 199) | async setRetrievalEnabled(sessionId: string, enabled: boolean) {
    method clearSessionFiles (line 210) | async clearSessionFiles(sessionId: string) {
    method getChatHistory (line 214) | async getChatHistory(id: string): Promise<MessageHistory> {
    method getChatHistories (line 233) | async getChatHistories(): Promise<ChatHistory> {
    method getChatHistoryTitleById (line 241) | async getChatHistoryTitleById(id: string): Promise<string> {
    method addChatHistory (line 247) | async addChatHistory(history: HistoryInfo) {
    method addMessage (line 253) | async addMessage(message: Message) {
    method updateMessage (line 260) | async updateMessage(history_id: string, message_id: string, content: s...
    method removeChatHistory (line 271) | async removeChatHistory(id: string) {
    method removeMessage (line 279) | async removeMessage(history_id: string, message_id: string) {
    method clear (line 287) | async clear() {
    method deleteChatHistory (line 291) | async deleteChatHistory(id: string) {
    method deleteAllChatHistory (line 300) | async deleteAllChatHistory() {
    method deleteMessage (line 308) | async deleteMessage(history_id: string) {
    method getAllPrompts (line 312) | async getAllPrompts(): Promise<Prompts> {
    method bulkAddPrompts (line 320) | async bulkAddPrompts(prompts: Prompt[]) {
    method addPrompt (line 325) | async addPrompt(prompt: Prompt) {
    method deletePrompt (line 331) | async deletePrompt(id: string) {
    method updatePrompt (line 337) | async updatePrompt(
    method getPromptById (line 355) | async getPromptById(id: string) {
    method getWebshare (line 360) | async getWebshare(id: string) {
    method getAllWebshares (line 368) | async getAllWebshares(): Promise<Webshare[]> {
    method addWebshare (line 376) | async addWebshare(webshare: Webshare) {
    method deleteWebshare (line 382) | async deleteWebshare(id: string) {
    method getUserID (line 388) | async getUserID() {
    method setUserID (line 396) | async setUserID(id: string) {
    method searchChatHistories (line 400) | async searchChatHistories(query: string): Promise<ChatHistory> {

FILE: src/db/knowledge.ts
  type Source (line 3) | type Source = {
  type Knowledge (line 12) | type Knowledge = {
  class PageAssistKnowledge (line 30) | class PageAssistKnowledge {
    method constructor (line 33) | constructor() {

FILE: src/db/models.ts
  type Model (line 8) | type Model = {
  class ModelDb (line 130) | class ModelDb {
    method constructor (line 133) | constructor() {

FILE: src/db/nickname.ts
  class ModelNickname (line 4) | class ModelNickname {
    method constructor (line 8) | constructor() {
    method saveModelNickname (line 14) | async saveModelNickname(
    method getModelNicknameByID (line 29) | async getModelNicknameByID(model_id: string) {
    method getAllModelNicknames (line 34) | async getAllModelNicknames() {

FILE: src/db/openai.ts
  class OpenAIModelDb (line 12) | class OpenAIModelDb {
    method constructor (line 15) | constructor() {

FILE: src/db/vector.ts
  type PageAssistVector (line 3) | interface PageAssistVector {
  type VectorData (line 10) | type VectorData = {
  class PageAssistVectorDb (line 15) | class PageAssistVectorDb {
    method constructor (line 18) | constructor() {

FILE: src/entries-firefox/background.ts
  method main (line 11) | main() {

FILE: src/entries-firefox/hf-pull.content.ts
  method main (line 2) | main(ctx) {

FILE: src/entries-firefox/ollama-pull.content.ts
  method main (line 4) | main(ctx) {

FILE: src/entries-firefox/options/App.tsx
  function IndexOption (line 14) | function IndexOption() {

FILE: src/entries-firefox/sidepanel/App.tsx
  function IndexSidepanel (line 14) | function IndexSidepanel() {

FILE: src/entries-firefox/youtube-summarize.content.ts
  method main (line 2) | async main(ctx) {

FILE: src/entries/background.ts
  method main (line 11) | main() {

FILE: src/entries/hf-pull.content.ts
  method main (line 2) | main(ctx) {

FILE: src/entries/ollama-pull.content.ts
  method main (line 4) | main(ctx) {

FILE: src/entries/options/App.tsx
  function IndexOption (line 15) | function IndexOption() {

FILE: src/entries/sidepanel/App.tsx
  function IndexSidepanel (line 14) | function IndexSidepanel() {

FILE: src/entries/youtube-summarize.content.ts
  method main (line 2) | async main(ctx) {

FILE: src/hooks/chat-modes/continueChatMode.ts
  method handleLLMEnd (line 115) | handleLLMEnd(output: any): any {

FILE: src/hooks/chat-modes/documentChatMode.ts
  method handleLLMEnd (line 347) | handleLLMEnd(output: any): any {

FILE: src/hooks/chat-modes/normalChatMode.ts
  method handleLLMEnd (line 282) | handleLLMEnd(output: any): any {

FILE: src/hooks/chat-modes/ragMode.ts
  method handleLLMEnd (line 223) | handleLLMEnd(output: any): any {

FILE: src/hooks/chat-modes/searchChatMode.ts
  method handleLLMEnd (line 223) | handleLLMEnd(output: any): any {

FILE: src/hooks/chat-modes/tabChatMode.ts
  method handleLLMEnd (line 179) | handleLLMEnd(output: any): any {

FILE: src/hooks/keyboard/useKeyboardShortcuts.ts
  type KeyboardShortcut (line 4) | interface KeyboardShortcut {
  type KeyboardShortcutConfig (line 14) | interface KeyboardShortcutConfig {

FILE: src/hooks/keyboard/useShortcutConfig.ts
  type ShortcutConfig (line 4) | interface ShortcutConfig {

FILE: src/hooks/useBackgroundMessage.tsx
  type Message (line 3) | interface Message {
  function useBackgroundMessage (line 9) | function useBackgroundMessage() {

FILE: src/hooks/useDarkmode.tsx
  type DarkModeState (line 4) | type DarkModeState = {

FILE: src/hooks/useLocal.tsx
  function useLocal (line 3) | function useLocal(key: string) {
  function useChatWidget (line 26) | function useChatWidget() {

FILE: src/hooks/useMessage.tsx
  method handleLLMEnd (line 388) | handleLLMEnd(output: any): any {
  method handleLLMEnd (line 645) | handleLLMEnd(output: any): any {
  method handleLLMEnd (line 914) | handleLLMEnd(output: any): any {
  method handleLLMEnd (line 1235) | handleLLMEnd(output: any): any {
  method handleLLMEnd (line 1484) | handleLLMEnd(output: any): any {

FILE: src/hooks/useMessageQueue.ts
  type QueuedMessage (line 3) | type QueuedMessage = {

FILE: src/hooks/useMigration.tsx
  type MigrationResult (line 18) | interface MigrationResult {

FILE: src/hooks/useSpeechRecognition.tsx
  type SpeechRecognitionEvent (line 3) | type SpeechRecognitionEvent = {
  type SpeechRecognitionErrorEvent (line 9) | interface SpeechRecognitionErrorEvent extends Event {
  type Window (line 13) | interface Window {
  type SpeechRecognition (line 19) | type SpeechRecognition = {
  type SpeechRecognitionProps (line 32) | type SpeechRecognitionProps = {
  type ListenArgs (line 41) | type ListenArgs = {
  type SpeechRecognitionHook (line 52) | type SpeechRecognitionHook = {

FILE: src/hooks/useTTS.tsx
  type VoiceOptions (line 20) | interface VoiceOptions {
  method onEvent (line 54) | onEvent(event) {

FILE: src/hooks/useTabMentions.ts
  type TabInfo (line 4) | interface TabInfo {
  type MentionPosition (line 11) | interface MentionPosition {

FILE: src/libs/PAMemoryVectorStore.ts
  type MemoryVector (line 7) | interface MemoryVector {
  type MemoryVectorStoreArgs (line 13) | interface MemoryVectorStoreArgs {
  class PAMemoryVectorStore (line 17) | class PAMemoryVectorStore extends VectorStore {
    method constructor (line 25) | constructor(embeddings: EmbeddingsInterface, args?: MemoryVectorStoreA...
    method _vectorstoreType (line 30) | _vectorstoreType(): string {
    method addVectors (line 34) | async addVectors(vectors: number[][], documents: DocumentInterface[], ...
    method similaritySearchVectorWithScore (line 43) | similaritySearchVectorWithScore(query: number[], k: number, filter?: t...
    method addDocuments (line 47) | async addDocuments(documents: Document[]): Promise<void> {
    method similaritySearch (line 53) | async similaritySearch(query: string, k = 4): Promise<Document[]> {
    method similaritySearchWithScore (line 74) | async similaritySearchWithScore(query: string, k = 4): Promise<[Docume...
    method fromDocuments (line 94) | static async fromDocuments(

FILE: src/libs/PageAssistVectorStore.ts
  type PageAssistVector (line 12) | interface PageAssistVector {
  type MemoryVectorStoreArgs (line 23) | interface MemoryVectorStoreArgs {
  class PageAssistVectorStore (line 34) | class PageAssistVectorStore extends VectorStore {
    method _vectorstoreType (line 46) | _vectorstoreType(): string {
    method constructor (line 50) | constructor(embeddings: EmbeddingsInterface, args: MemoryVectorStoreAr...
    method addDocuments (line 67) | async addDocuments(documents: Document[]): Promise<void> {
    method addVectors (line 83) | async addVectors(vectors: number[][], documents: Document[]): Promise<...
    method similaritySearchVectorWithScore (line 109) | async similaritySearchVectorWithScore(
    method getAllPageContent (line 158) | async getAllPageContent() {
    method fromTexts (line 205) | static async fromTexts(
    method fromDocuments (line 231) | static async fromDocuments(
    method fromExistingIndex (line 249) | static async fromExistingIndex(
    method clearMemory (line 257) | clearMemory() {
    method similaritySearchKB (line 261) | async similaritySearchKB(queryTxt: string, k = 4, filter = undefined) {

FILE: src/libs/byte-formater.ts
  constant UNITS (line 1) | const UNITS = [

FILE: src/libs/get-html.ts
  function extractYouTubeData (line 32) | function extractYouTubeData(htmlContent: string) {
  function fetchTranscript (line 185) | async function fetchTranscript(extractedData: any) {
  function parseTranscriptResponse (line 224) | function parseTranscriptResponse(data: any) {

FILE: src/libs/mcp/errors.ts
  class McpBootstrapError (line 1) | class McpBootstrapError extends Error {
    method constructor (line 2) | constructor(message: string, public readonly cause?: unknown) {
  constant LEGACY_MCP_ERROR_PATTERNS (line 8) | const LEGACY_MCP_ERROR_PATTERNS = [

FILE: src/libs/mcp/http-client.ts
  type McpClientCallbacks (line 13) | type McpClientCallbacks = {
  type ConnectedServer (line 19) | type ConnectedServer = {
  class HttpOnlyMcpClient (line 222) | class HttpOnlyMcpClient {
    method constructor (line 227) | constructor(servers: McpServer[], callbacks?: McpClientCallbacks) {
    method getTools (line 234) | async getTools() {
    method close (line 247) | async close() {
    method loadTools (line 263) | private async loadTools() {
    method buildToolsFromCache (line 283) | private buildToolsFromCache(server: McpServer) {
    method getOrCreateConnection (line 297) | private async getOrCreateConnection(server: McpServer) {
    method loadToolsForConnection (line 323) | private async loadToolsForConnection(connection: ConnectedServer) {
    method fetchTools (line 336) | private async fetchTools(connection: ConnectedServer) {

FILE: src/libs/mcp/normal-chat.ts
  type SetMessages (line 41) | type SetMessages = (messages: Message[] | ((prev: Message[]) => Message[...
  type SetHistory (line 42) | type SetHistory = (history: ChatHistory) => void
  type RunMcpNormalChatParams (line 44) | type RunMcpNormalChatParams = {
  constant STREAM_THROTTLE_MS (line 90) | const STREAM_THROTTLE_MS = 50
  method handleLLMEnd (line 118) | handleLLMEnd(output: any) {

FILE: src/libs/mcp/oauth-flow.ts
  type PendingOAuthFlow (line 16) | type PendingOAuthFlow = {

FILE: src/libs/mcp/oauth.ts
  type OAuthDiscoveryResult (line 35) | type OAuthDiscoveryResult = {

FILE: src/libs/mcp/remote-tools.ts
  type McpConnectableServer (line 9) | type McpConnectableServer = Pick<
  type McpRemoteTool (line 14) | type McpRemoteTool = {
  type McpServerConnection (line 20) | type McpServerConnection = {
  type McpToolValidationResult (line 25) | type McpToolValidationResult = {
  constant MCP_CLIENT_INFO (line 31) | const MCP_CLIENT_INFO: Implementation = {

FILE: src/libs/mcp/types.ts
  type ChatMessageKind (line 1) | type ChatMessageKind = "text" | "assistant_tool_calls" | "tool_result"
  type McpHeader (line 3) | type McpHeader = {
  type McpAvailableTool (line 8) | type McpAvailableTool = {
  type McpOAuthTokens (line 15) | type McpOAuthTokens = {
  type McpOAuthClientRegistration (line 23) | type McpOAuthClientRegistration = {
  type McpOAuthMetadata (line 30) | type McpOAuthMetadata = {
  type McpServer (line 39) | type McpServer = {
  type McpServerInput (line 58) | type McpServerInput = Pick<
  type McpToolCall (line 72) | type McpToolCall = {
  type ChatActionInfo (line 81) | type ChatActionInfo =

FILE: src/libs/mcp/utils.ts
  constant MCP_TOOL_NAME_SEPARATOR (line 10) | const MCP_TOOL_NAME_SEPARATOR = "__"

FILE: src/libs/model-utils.ts
  function isThinkingCapableModel (line 12) | function isThinkingCapableModel(modelId: string | null | undefined): boo...
  function isGptOssModel (line 37) | function isGptOssModel(modelId: string | null | undefined): boolean {
  function getThinkingType (line 48) | function getThinkingType(modelId: string | null | undefined): "boolean" ...

FILE: src/libs/openai.ts
  type Model (line 4) | type Model = {

FILE: src/libs/reasoning.ts
  function parseReasoning (line 2) | function parseReasoning(text: string): {
  function isReasoningStarted (line 74) | function isReasoningStarted(text: string): boolean {
  function isReasoningEnded (line 79) | function isReasoningEnded(text: string): boolean {
  function removeReasoning (line 84) | function removeReasoning(text: string): string {
  function mergeReasoningContent (line 91) | function mergeReasoningContent(
  function replaceThinkTagToEM (line 102) | function replaceThinkTagToEM(text: string): string {

FILE: src/loader/csv.ts
  type WebLoaderParams (line 5) | interface WebLoaderParams {
  class PageAssisCSVUrlLoader (line 14) | class PageAssisCSVUrlLoader
    method constructor (line 23) | constructor({ url, name }: WebLoaderParams) {
    method parse (line 30) | public async parse(raw: string): Promise<string[]> {
    method load (line 52) | async load(): Promise<Document<Record<string, any>>[]> {

FILE: src/loader/docx.ts
  type WebLoaderParams (line 5) | interface WebLoaderParams {
  class PageAssistDocxLoader (line 10) | class PageAssistDocxLoader
    method constructor (line 16) | constructor({ fileName, buffer }: WebLoaderParams) {
    method load (line 22) | public async load(): Promise<Document[]> {

FILE: src/loader/html.ts
  type WebLoaderParams (line 15) | interface WebLoaderParams {
  class PageAssistHtmlLoader (line 20) | class PageAssistHtmlLoader
    method constructor (line 26) | constructor({ html, url }: WebLoaderParams) {
    method load (line 32) | async load(): Promise<Document<Record<string, any>>[]> {
    method loadByURL (line 69) | async loadByURL(): Promise<Document<Record<string, any>>[]> {

FILE: src/loader/pdf-url.ts
  type WebLoaderParams (line 4) | interface WebLoaderParams {
  class PageAssistPDFUrlLoader (line 9) | class PageAssistPDFUrlLoader
    method constructor (line 17) | constructor({ url, name }: WebLoaderParams) {
    method load (line 23) | async load(): Promise<Document<Record<string, any>>[]> {

FILE: src/loader/pdf.ts
  type WebLoaderParams (line 3) | interface WebLoaderParams {
  class PageAssistPDFLoader (line 8) | class PageAssistPDFLoader
    method constructor (line 15) | constructor({ pdf, url }: WebLoaderParams) {
    method load (line 21) | async load(): Promise<Document<Record<string, any>>[]> {

FILE: src/loader/txt.ts
  type WebLoaderParams (line 3) | interface WebLoaderParams {
  class PageAssisTXTUrlLoader (line 8) | class PageAssisTXTUrlLoader
    method constructor (line 16) | constructor({ url, name }: WebLoaderParams) {
    method parse (line 22) | public async parse(raw: string): Promise<string[]> {
    method load (line 25) | async load(): Promise<Document<Record<string, any>>[]> {

FILE: src/models/ChatChromeAi.ts
  type AITextSessionOptions (line 15) | interface AITextSessionOptions {
  type AIModelAvailability (line 20) | const enum AIModelAvailability {
  type ChromeAIInputs (line 26) | interface ChromeAIInputs extends BaseChatModelParams {
  type ChromeAICallOptions (line 35) | interface ChromeAICallOptions extends BaseLanguageModelCallOptions {}
  function formatPrompt (line 37) | function formatPrompt(messages: BaseMessage[]): string {
  class ChatChromeAI (line 53) | class ChatChromeAI extends SimpleChatModel<ChromeAICallOptions> {
    method lc_name (line 62) | static lc_name() {
    method constructor (line 66) | constructor(inputs?: ChromeAIInputs) {
    method _llmType (line 76) | _llmType() {
    method initialize (line 83) | async initialize() {
    method destroy (line 108) | destroy() {
    method _streamResponseChunks (line 115) | async *_streamResponseChunks(
    method _call (line 145) | async _call(

FILE: src/models/ChatGoogleAI.ts
  class ChatGoogleAI (line 3) | class ChatGoogleAI extends ChatOpenAI {
    method lc_name (line 8) | static lc_name() {

FILE: src/models/ChatOllama.ts
  type ChatOllamaCallOptions (line 31) | interface ChatOllamaCallOptions extends BaseChatModelCallOptions {
  type ChatOllamaInput (line 35) | interface ChatOllamaInput extends OllamaInput { }
  class ChatOllama (line 37) | class ChatOllama
    method lc_name (line 40) | static lc_name() {
    method constructor (line 126) | constructor(fields: OllamaInput & BaseChatModelParams) {
    method getLsParams (line 172) | getLsParams(options: this["ParsedCallOptions"]): LangSmithParams {
    method _llmType (line 184) | _llmType() {
    method bindTools (line 188) | override bindTools(
    method invocationParams (line 204) | invocationParams(options?: this["ParsedCallOptions"]) {
    method _combineLLMOutput (line 252) | _combineLLMOutput() {
    method _generate (line 256) | async _generate(
    method _streamResponseChunksLegacy (line 295) | async *_streamResponseChunksLegacy(
    method _streamResponseChunks (line 336) | async *_streamResponseChunks(
    method _convertMessagesToOllamaMessages (line 412) | protected _convertMessagesToOllamaMessages(
    method _formatMessagesAsPrompt (line 490) | protected _formatMessagesAsPrompt(messages: BaseMessage[]): string {

FILE: src/models/ChatTypes.ts
  type ChatDocument (line 1) | type ChatDocument  = {
  type ChatDocuments (line 11) | type ChatDocuments = ChatDocument[]

FILE: src/models/CustomAIMessageChunk.ts
  type BaseMessageFields (line 1) | interface BaseMessageFields {
  class CustomAIMessageChunk (line 9) | class CustomAIMessageChunk {
    method constructor (line 19) | constructor(fields: BaseMessageFields) {
    method _mergeAdditionalKwargs (line 31) | static _mergeAdditionalKwargs(
    method _getType (line 62) | _getType(): string {
    method _updateId (line 66) | _updateId(value: string | undefined) {
    method concat (line 70) | concat(chunk: CustomAIMessageChunk) {
  function isAiMessageChunkFields (line 81) | function isAiMessageChunkFields(value: unknown): value is BaseMessageFie...
  function isAiMessageChunkFieldsList (line 86) | function isAiMessageChunkFieldsList(

FILE: src/models/CustomChatAnthropic.ts
  type AnthropicMessageOptions (line 24) | interface AnthropicMessageOptions {
  type AnthropicCallOptions (line 35) | interface AnthropicCallOptions extends BaseChatModelCallOptions {
  function detectImageMediaType (line 39) | function detectImageMediaType(base64Data: string): string | null {
  function convertToAnthropicTools (line 67) | function convertToAnthropicTools(tools: BindToolsInput[]): any[] {
  function convertMessagesToAnthropicFormat (line 79) | function convertMessagesToAnthropicFormat(messages: BaseMessage[]): Arra...
  class ChatAnthropic (line 205) | class ChatAnthropic extends BaseChatModel<AnthropicCallOptions, AIMessag...
    method lc_name (line 215) | static lc_name() {
    method constructor (line 219) | constructor(inputs?: AnthropicMessageOptions & BaseChatModelParams) {
    method _llmType (line 235) | _llmType() {
    method getLsParams (line 239) | getLsParams(_options: this["ParsedCallOptions"]): LangSmithParams {
    method bindTools (line 250) | override bindTools(
    method _generate (line 260) | async _generate(
    method _streamResponseChunks (line 289) | async *_streamResponseChunks(

FILE: src/models/CustomChatOpenAI.ts
  type OpenAIRoleEnum (line 46) | type OpenAIRoleEnum = "system" | "assistant" | "user" | "function" | "tool"
  type ReasoningEffort (line 47) | type ReasoningEffort = 'low' | 'medium' | 'high' | null
  type ReasoningEffortOptions (line 49) | interface ReasoningEffortOptions {
  type OpenAIChatInput (line 53) | type OpenAIChatInput = OldOpenAIChatInput & ReasoningEffortOptions
  function extractGenericMessageCustomRole (line 54) | function extractGenericMessageCustomRole(message: ChatMessage) {
  function messageToOpenAIRole (line 66) | function messageToOpenAIRole(message: BaseMessage): OpenAIRoleEnum {
  function openAIResponseToChatMessage (line 88) | function openAIResponseToChatMessage(
  function _convertDeltaToMessageChunk (line 116) | function _convertDeltaToMessageChunk(
  function convertMessagesToOpenAIParams (line 182) | function convertMessagesToOpenAIParams(messages: BaseMessage[]) {
  class CustomChatOpenAI (line 235) | class CustomChatOpenAI<
    method lc_name (line 299) | static lc_name() {
    method callKeys (line 302) | get callKeys() {
    method lc_secrets (line 315) | get lc_secrets() {
    method lc_aliases (line 322) | get lc_aliases() {
    method constructor (line 332) | constructor(
    method invocationParams (line 528) | invocationParams(options) {
    method _identifyingParams (line 565) | _identifyingParams() {
    method _streamResponseChunks (line 573) | async *_streamResponseChunks(
    method identifyingParams (line 641) | identifyingParams() {
    method _generate (line 645) | async _generate(
    method getEstimatedTokenCountFromPrompt (line 744) | async getEstimatedTokenCountFromPrompt(messages, functions, function_c...
    method getNumTokensFromGenerations (line 759) | async getNumTokensFromGenerations(generations) {
    method getNumTokensFromMessages (line 772) | async getNumTokensFromMessages(messages) {
    method completionWithRetry (line 834) | async completionWithRetry(
    method _getClientOptions (line 852) | _getClientOptions(options) {
    method _llmType (line 889) | _llmType() {
    method bindTools (line 892) | override bindTools(
    method _combineLLMOutput (line 902) | _combineLLMOutput(...llmOutputs) {
    method withStructuredOutput (line 922) | withStructuredOutput(outputSchema, config) {
  function isZodSchema (line 994) | function isZodSchema(
  function isStructuredOutputMethodParams (line 1001) | function isStructuredOutputMethodParams(

FILE: src/models/OAIEmbedding.ts
  type OpenAIEmbeddingsParams (line 7) | interface OpenAIEmbeddingsParams extends EmbeddingsParams {
  class OAIEmbedding (line 17) | class OAIEmbedding extends Embeddings {
    method constructor (line 48) | constructor(
    method embedDocuments (line 95) | async embedDocuments(texts: string[]): Promise<number[][]> {
    method embedQuery (line 125) | async embedQuery(text: string): Promise<number[]> {
    method _embed (line 138) | async _embed(texts: string[]): Promise<number[][]> {
    method embeddingWithRetry (line 146) | protected async embeddingWithRetry(

FILE: src/models/OllamaEmbedding.ts
  type OllamaInput (line 6) | interface OllamaInput {
  type OllamaRequestParams (line 44) | interface OllamaRequestParams {
  type CamelCasedRequestOptions (line 83) | type CamelCasedRequestOptions = Omit<
  type OllamaEmbeddingsParams (line 92) | interface OllamaEmbeddingsParams extends EmbeddingsParams {
  class OllamaEmbeddingsPageAssist (line 114) | class OllamaEmbeddingsPageAssist extends Embeddings {
    method constructor (line 127) | constructor(params?: OllamaEmbeddingsParams) {
    method _convertOptions (line 159) | _convertOptions(requestOptions: CamelCasedRequestOptions) {
    method _request (line 205) | async _request(prompt: string | string[]): Promise<number[] | number[]...
    method _embed (line 244) | async _embed(texts: string[]): Promise<number[][]> {
    method embedDocuments (line 258) | async embedDocuments(documents: string[]) {
    method embedQuery (line 262) | async embedQuery(document: string) {

FILE: src/models/embedding.ts
  type EmbeddingModel (line 6) | type EmbeddingModel = {

FILE: src/models/types.ts
  type OpenAICoreRequestOptions (line 1) | type OpenAICoreRequestOptions<
  type LegacyOpenAIInput (line 18) | interface LegacyOpenAIInput {

FILE: src/models/utils/chrome.ts
  type AITextSession (line 51) | interface AITextSession {

FILE: src/models/utils/ollama.ts
  type OllamaInput (line 6) | interface OllamaInput {
  type OllamaRequestParams (line 49) | interface OllamaRequestParams {
  type OllamaToolFunction (line 91) | interface OllamaToolFunction {
  type OllamaToolCall (line 97) | interface OllamaToolCall {
  type OllamaMessage (line 101) | type OllamaMessage = {
  type OllamaGenerateRequestParams (line 109) | interface OllamaGenerateRequestParams extends OllamaRequestParams {
  type OllamaChatRequestParams (line 113) | interface OllamaChatRequestParams extends OllamaRequestParams {
  type BaseOllamaGenerationChunk (line 119) | type BaseOllamaGenerationChunk = {
  type OllamaGenerationChunk (line 131) | type OllamaGenerationChunk = BaseOllamaGenerationChunk & {
  type OllamaChatGenerationChunk (line 135) | type OllamaChatGenerationChunk = BaseOllamaGenerationChunk & {
  type OllamaCallOptions (line 139) | type OllamaCallOptions = BaseLanguageModelCallOptions & {

FILE: src/models/utils/openai.ts
  function wrapOpenAIClientError (line 14) | function wrapOpenAIClientError(e: any) {
  function formatToOpenAIAssistantTool (line 33) | function formatToOpenAIAssistantTool(tool: StructuredToolInterface) {
  type OpenAIToolChoice (line 44) | type OpenAIToolChoice =
  function formatToOpenAIToolChoice (line 49) | function formatToOpenAIToolChoice(

FILE: src/parser/google-docs.ts
  function traverse (line 8) | function traverse(

FILE: src/public/ocr/tesseract-core-simd.js
  function xa (line 15) | function xa(a,c){for(var d=c+NaN,e=c;a[e]&&!(e>=d);)++e;if(16<e-c&&a.buf...
  function q (line 15) | function q(a){return a?xa(ya,a):""}
  function za (line 16) | function za(a,c,d,e){if(!(0<e))return 0;var g=d;e=d+e-1;for(var h=0;h<a....
  function Aa (line 17) | function Aa(a){for(var c=0,d=0;d<a.length;++d){var e=a.charCodeAt(d);127...
  function Fa (line 17) | function Fa(){var a=ta.buffer;Ba=a;b.HEAP8=r=new Int8Array(a);b.HEAP16=C...
  function Ma (line 18) | function Ma(){var a=b.preRun.shift();Ha.unshift(a)}
  function Qa (line 18) | function Qa(){Na++;b.monitorRunDependencies&&b.monitorRunDependencies(Na)}
  function Ra (line 18) | function Ra(){Na--;b.monitorRunDependencies&&b.monitorRunDependencies(Na...
  function n (line 18) | function n(a){if(b.onAbort)b.onAbort(a);a="Aborted("+a+")";pa(a);ua=!0;a...
  function Sa (line 19) | function Sa(){return z.startsWith("data:application/octet-stream;base64,")}
  function Ua (line 19) | function Ua(){var a=z;try{if(a==z&&sa)return new Uint8Array(sa);if(la)re...
  function Va (line 20) | function Va(){if(!sa&&(fa||ha)){if("function"==typeof fetch&&!z.startsWi...
  function oa (line 21) | function oa(a){this.name="ExitStatus";this.message="Program terminated w...
  function Xa (line 21) | function Xa(a){for(;0<a.length;)a.shift()(b)}
  function Ya (line 22) | function Ya(a,c="i8"){c.endsWith("*")&&(c="*");switch(c){case "i1":retur...
  function Za (line 23) | function Za(a,c,d="i8"){d.endsWith("*")&&(d="*");switch(d){case "i1":r[a...
  function $a (line 24) | function $a(a){this.If=a-24;this.Ih=function(c){y[this.If+4>>2]=c};this....
  function gb (line 26) | function gb(){if("object"==typeof crypto&&"function"==typeof crypto.getR...
  function hb (line 27) | function hb(){for(var a="",c=!1,d=arguments.length-1;-1<=d&&!c;d--){c=0<...
  function d (line 28) | function d(k){for(var m=0;m<k.length&&""===k[m];m++);for(var t=k.length-...
  function jb (line 28) | function jb(a,c){var d=Array(Aa(a)+1);a=za(a,d,0,d.length);c&&(d.length=...
  function lb (line 29) | function lb(a,c){kb[a]={input:[],output:[],tg:c};D.gh(a,mb)}
  function pb (line 33) | function pb(a){a=65536*Math.ceil(a/65536);var c=qb(65536,a);if(!c)return...
  function rb (line 41) | function rb(a,c,d){var e="al "+a;ka(a,g=>{g||n('Loading data file "'+a+'...
  function d (line 47) | function d(k){D.Gg--;return c(k)}
  function e (line 47) | function e(k){if(k){if(!e.Vh)return e.Vh=!0,d(k)}else++h>=
  function h (line 68) | function h(){this.$g=!1;this.Vf=[]}
  function k (line 68) | function k(p,x,N,l,w){p=p.node.Lf;if(w>=p.length)return 0;l=Math.min(p.l...
  function p (line 73) | function p(l){function w(B){u&&u();m||D.wg(a,c,B,e,g,t);h&&h();Ra(N)}sb....
  function tb (line 75) | function tb(a,c,d){if("/"===c.charAt(0))return c;if(-100===a)a=D.cwd();e...
  function ub (line 76) | function ub(a,c,d){try{var e=a(c)}catch(g){if(g&&g.node&&cb(c)!==cb(D.fg...
  function wb (line 78) | function wb(){vb+=4;return v[vb-4>>2]}
  function xb (line 78) | function xb(a){a=D.gg(a);if(!a)throw new D.Jf(8);return a}
  function yb (line 79) | function yb(a){var c=Aa(a)+1,d=zb(c);d&&za(a,r,d,c);return d}
  function Ab (line 79) | function Ab(a,c,d){function e(t){return(t=t.toTimeString().match(/\(([A-...
  function Bb (line 79) | function Bb(a,c,d){Bb.Mh||(Bb.Mh=!0,Ab(a,c,d))}
  function Fb (line 80) | function Fb(){if(!Gb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/"...
  function Hb (line 80) | function Hb(a){return 0===a%4&&(0!==a%100||0===a%400)}
  function Kb (line 82) | function Kb(a,c,d,e){function g(l,w,B){for(l="number"==typeof l?l.toStri...
  function Mb (line 89) | function Mb(a){var c=Lb[a];c||(a>=Lb.length&&(Lb.length=a+1),Lb[a]=c=Ga....
  function Nb (line 89) | function Nb(a,c,d,e){a||(a=this);this.parent=a;this.Sf=a.Sf;this.zg=null...
  function a (line 104) | function a(g){b.asm=g.exports;ta=b.asm.X;Fa();Ga=b.asm.tf;Ia.unshift(b.a...
  function c (line 104) | function c(g){a(g.instance)}
  function d (line 104) | function d(g){return Va().then(function(h){return WebAssembly.instantiat...
  function Rb (line 193) | function Rb(a,c,d,e){var g=Dh();try{return Mb(a)(c,d,e)}catch(h){Eh(g);i...
  function Ub (line 193) | function Ub(a,c){var d=Dh();try{Mb(a)(c)}catch(e){Eh(d);if(e!==e+0)throw...
  function Pb (line 193) | function Pb(a,c){var d=Dh();try{return Mb(a)(c)}catch(e){Eh(d);if(e!==e+...
  function Wb (line 193) | function Wb(a,c,d,e){var g=Dh();try{Mb(a)(c,d,e)}catch(h){Eh(g);if(h!==h...
  function Vb (line 193) | function Vb(a,c,d){var e=Dh();try{Mb(a)(c,d)}catch(g){Eh(e);if(g!==g+0)t...
  function Qb (line 194) | function Qb(a,c,d){var e=Dh();try{return Mb(a)(c,d)}catch(g){Eh(e);if(g!...
  function Sb (line 194) | function Sb(a,c,d,e,g){var h=Dh();try{return Mb(a)(c,d,e,g)}catch(k){Eh(...
  function Xb (line 194) | function Xb(a,c,d,e,g){var h=Dh();try{Mb(a)(c,d,e,g)}catch(k){Eh(h);if(k...
  function Tb (line 194) | function Tb(a,c,d,e,g,h){var k=Dh();try{return Mb(a)(c,d,e,g,h)}catch(m)...
  function Zb (line 195) | function Zb(a,c,d,e,g,h,k,m,t,u){var p=Dh();try{Mb(a)(c,d,e,g,h,k,m,t,u)...
  function Yb (line 195) | function Yb(a,c,d,e,g,h){var k=Dh();try{Mb(a)(c,d,e,g,h)}catch(m){Eh(k);...
  function Hh (line 196) | function Hh(){function a(){if(!Fh&&(Fh=!0,b.calledRun=!0,!ua)){La=!0;b.n...
  function G (line 197) | function G(){}
  function Ih (line 197) | function Ih(a){return(a||G).Of}
  function H (line 197) | function H(a,c){var d=Ih(c),e=d[a];if(e)return e;e=Object.create((c||G)....
  function I (line 198) | function I(){if(Nh){for(var a=0;a<Mh.length;a++)b._free(Mh[a]);Mh.length...
  function J (line 199) | function J(a){if("string"===typeof a){a=jb(a);var c=r;Jh||n();c=a.length...
  function Oh (line 199) | function Oh(){throw"cannot construct a ParagraphJustification, no constr...
  function Ph (line 200) | function Ph(){throw"cannot construct a BoolPtr, no constructor in IDL";}
  function K (line 200) | function K(){throw"cannot construct a TessResultRenderer, no constructor...
  function Qh (line 202) | function Qh(){throw"cannot construct a LongStarPtr, no constructor in ID...
  function Rh (line 202) | function Rh(){throw"cannot construct a VoidPtr, no constructor in IDL";}
  function L (line 203) | function L(a){a&&"object"===typeof a&&(a=a.If);this.If=mc(a);Ih(L)[this....
  function Th (line 213) | function Th(){throw"cannot construct a TextlineOrder, no constructor in ...
  function Uh (line 214) | function Uh(){throw"cannot construct a ETEXT_DESC, no constructor in IDL";}
  function P (line 214) | function P(){throw"cannot construct a PageIterator, no constructor in ID...
  function Vh (line 221) | function Vh(){throw"cannot construct a WritingDirection, no constructor ...
  function Wh (line 222) | function Wh(a){a&&"object"===typeof a&&(a=a.If);this.If=zd(a);Ih(Wh)[thi...
  function Q (line 222) | function Q(){throw"cannot construct a Box, no constructor in IDL";}
  function R (line 224) | function R(a,c,d){I();a=a&&"object"===typeof a?a.If:J(a);c=c&&"object"==...
  function Xh (line 226) | function Xh(){throw"cannot construct a PixaPtr, no constructor in IDL";}
  function Yh (line 226) | function Yh(){throw"cannot construct a FloatPtr, no constructor in IDL";}
  function Zh (line 227) | function Zh(a){a&&"object"===typeof a&&(a=a.If);this.If=Vd(a);Ih(Zh)[thi...
  function $h (line 227) | function $h(){throw"cannot construct a PixPtr, no constructor in IDL";}
  function ai (line 228) | function ai(){throw"cannot construct a UNICHARSET, no constructor in IDL";}
  function bi (line 229) | function bi(){throw"cannot construct a IntPtr, no constructor in IDL";}
  function ci (line 230) | function ci(){throw"cannot construct a Orientation, no constructor in ID...
  function S (line 230) | function S(){throw"cannot construct a OSBestResult, no constructor in ID...
  function T (line 232) | function T(){throw"cannot construct a Boxa, no constructor in IDL";}
  function V (line 233) | function V(){throw"cannot construct a PixColormap, no constructor in IDL";}
  function M (line 235) | function M(){throw"cannot construct a Pta, no constructor in IDL";}
  function O (line 237) | function O(){throw"cannot construct a Pix, no constructor in IDL";}
  function ei (line 241) | function ei(){throw"cannot construct a DoublePtr, no constructor in IDL";}
  function fi (line 241) | function fi(){throw"cannot construct a Dawg, no constructor in IDL";}
  function di (line 242) | function di(){throw"cannot construct a BoxPtr, no constructor in IDL";}
  function X (line 242) | function X(){this.If=Se();Ih(X)[this.If]=this}
  function Y (line 260) | function Y(){this.If=lg();Ih(Y)[this.If]=this}
  function Z (line 261) | function Z(){throw"cannot construct a Pixa, no constructor in IDL";}
  function a (line 263) | function a(){b.RIL_BLOCK=wg();b.RIL_PARA=xg();b.RIL_TEXTLINE=yg();b.RIL_...
  function gi (line 266) | function gi(){this.og={}}

FILE: src/queue/index.ts
  constant KNOWLEDGE_QUEUE (line 4) | const KNOWLEDGE_QUEUE = Symbol("queue")

FILE: src/services/app.ts
  constant DEFAULT_URL_REWRITE_URL (line 7) | const DEFAULT_URL_REWRITE_URL = "http://127.0.0.1:11434"

FILE: src/services/application.ts
  constant DEFAULT_SUMMARY_PROMPT (line 5) | const DEFAULT_SUMMARY_PROMPT = `Provide a concise summary of the followi...
  constant DEFAULT_REPHRASE_PROMPT (line 16) | const DEFAULT_REPHRASE_PROMPT = `Rewrite the following text in a differe...
  constant DEFAULT_TRANSLATE_PROMPT (line 27) | const DEFAULT_TRANSLATE_PROMPT = `Translate the following text from its ...
  constant DEFAULT_EXPLAIN_PROMPT (line 36) | const DEFAULT_EXPLAIN_PROMPT = `Provide a detailed explanation of the fo...
  constant DEFAULT_CUSTOM_PROMPT (line 55) | const DEFAULT_CUSTOM_PROMPT = `{text}`
  type CustomCopilotPrompt (line 202) | interface CustomCopilotPrompt {

FILE: src/services/chrome.ts
  constant DEFAULT_CHROME_AI_MODEL (line 5) | const DEFAULT_CHROME_AI_MODEL = {

FILE: src/services/elevenlabs.ts
  type Voice (line 2) | interface Voice {
  type Model (line 7) | interface Model {
  constant BASE_URL (line 12) | const BASE_URL = 'https://api.elevenlabs.io/v1';

FILE: src/services/model-settings.ts
  type ModelSettings (line 8) | type ModelSettings = {

FILE: src/services/ollama.ts
  constant DEFAULT_OLLAMA_URL (line 17) | const DEFAULT_OLLAMA_URL = "http://127.0.0.1:11434"
  constant DEFAULT_ASK_FOR_MODEL_SELECTION_EVERY_TIME (line 18) | const DEFAULT_ASK_FOR_MODEL_SELECTION_EVERY_TIME = true
  constant DEFAULT_PAGE_SHARE_URL (line 19) | const DEFAULT_PAGE_SHARE_URL = "https://pageassist.xyz"
  constant DEFAULT_RAG_QUESTION_PROMPT (line 21) | const DEFAULT_RAG_QUESTION_PROMPT =
  constant DEFAUTL_RAG_SYSTEM_PROMPT (line 24) | const DEFAUTL_RAG_SYSTEM_PROMPT = `You are a helpful AI assistant. Use t...
  constant DEFAULT_WEBSEARCH_PROMPT (line 26) | const DEFAULT_WEBSEARCH_PROMPT = `You are an AI model who is expert at s...
  constant DEFAULT_WEBSEARCH_FOLLOWUP_PROMPT (line 37) | const DEFAULT_WEBSEARCH_FOLLOWUP_PROMPT = `You will rephrase follow-up q...

FILE: src/services/search.ts
  constant TOTAL_SEARCH_RESULTS (line 8) | const TOTAL_SEARCH_RESULTS = 2
  constant DEFAULT_PROVIDER (line 9) | const DEFAULT_PROVIDER = "duckduckgo"
  constant AVAILABLE_PROVIDERS (line 11) | const AVAILABLE_PROVIDERS = ["google", "duckduckgo"] as const

FILE: src/services/title.ts
  constant DEFAULT_TITLE_GEN_PROMPT (line 11) | const DEFAULT_TITLE_GEN_PROMPT = `Here is the conversation:

FILE: src/services/tts.ts
  constant DEFAULT_TTS_PROVIDER (line 8) | const DEFAULT_TTS_PROVIDER = "browser"
  constant AVAILABLE_TTS_PROVIDERS (line 10) | const AVAILABLE_TTS_PROVIDERS = ["browser", "elevenlabs"] as const

FILE: src/store/index.tsx
  type Message (line 4) | type Message = {
  type ChatHistory (line 24) | type ChatHistory = {
  type State (line 38) | type State = {

FILE: src/store/model.tsx
  type CurrentChatModelSettings (line 4) | type CurrentChatModelSettings = {

FILE: src/store/option.tsx
  type WebSearch (line 8) | type WebSearch = {
  type Message (line 17) | type Message = {
  type ChatHistory (line 39) | type ChatHistory = {
  type State (line 53) | type State = {

FILE: src/store/webui.tsx
  type State (line 3) | type State = {

FILE: src/types/index.ts
  type BotResponse (line 3) | type BotResponse = {

FILE: src/types/message.ts
  type WebSearch (line 4) | type WebSearch = {
  type Message (line 13) | type Message = {

FILE: src/utils/chrome-download.ts
  type DownloadProgressEvent (line 1) | interface DownloadProgressEvent {
  method monitor (line 13) | monitor(m: any) {
  method monitor (line 38) | monitor(m: any) {

FILE: src/utils/compress.ts
  function compressText (line 6) | async function compressText(text: string): Promise<ArrayBuffer> {
  function decompressData (line 21) | async function decompressData(compressedData: ArrayBuffer): Promise<stri...
  function arrayBufferToBase64 (line 36) | function arrayBufferToBase64(buffer: ArrayBuffer): string {
  function base64ToArrayBuffer (line 45) | function base64ToArrayBuffer(base64: string): ArrayBuffer {
  function getCompressionStats (line 55) | function getCompressionStats(originalText: string, compressedData: Array...

FILE: src/utils/constant.ts
  constant PASTED_TEXT_CHAR_LIMIT (line 1) | const PASTED_TEXT_CHAR_LIMIT = 1_500

FILE: src/utils/google-domains.ts
  constant ALL_GOOGLE_DOMAINS (line 1) | const ALL_GOOGLE_DOMAINS = [

FILE: src/utils/human-message.tsx
  type HumanMessageType (line 9) | type HumanMessageType = {

FILE: src/utils/is-youtube.ts
  constant YT_REGEX (line 2) | const YT_REGEX =

FILE: src/utils/latex.ts
  function escapeBrackets (line 28) | function escapeBrackets(text: string): string {
  function escapeMhchem (line 50) | function escapeMhchem(text: string) {

FILE: src/utils/markdown-to-ssml.ts
  function markdownToSSML (line 1) | function markdownToSSML(markdown: string): string {

FILE: src/utils/markdown-to-text.ts
  function markdownToText (line 1) | function markdownToText(markdown: string): string {

FILE: src/utils/marked/katex.tsx
  type KatexOptions (line 3) | interface KatexOptions {
  type KatexToken (line 20) | interface KatexToken {
  type MarkedToken (line 27) | interface MarkedToken {
  type TokenizerThis (line 33) | interface TokenizerThis {
  type MarkedExtension (line 43) | interface MarkedExtension {
  type KatexMarkedExtension (line 55) | interface KatexMarkedExtension {
  type RendererFunction (line 59) | type RendererFunction = (token: KatexToken) => string
  function markedKatexExtension (line 68) | function markedKatexExtension(options: KatexOptions = {}): KatexMarkedEx...
  function createRenderer (line 77) | function createRenderer(options: any, newlineAfter: boolean): RendererFu...
  function inlineKatex (line 93) | function inlineKatex(
  function blockKatex (line 145) | function blockKatex(

FILE: src/utils/oai-api-providers.ts
  constant OAI_API_PROVIDERS (line 1) | const OAI_API_PROVIDERS = [

FILE: src/utils/ocr.ts
  function processImageForOCR (line 4) | async function processImageForOCR(imageData: string): Promise<string> {

FILE: src/utils/ollama-pull-inject.ts
  function makeDownloadButton (line 5) | function makeDownloadButton(
  function injectOllamaPullButtons (line 32) | function injectOllamaPullButtons(

FILE: src/utils/search-provider.ts
  constant SUPPORTED_SEARCH_PROVIDERS (line 1) | const SUPPORTED_SEARCH_PROVIDERS = [

FILE: src/utils/supported-languages.ts
  constant SUPPORTED_LANGUAGES (line 1) | const SUPPORTED_LANGUAGES = [

FILE: src/utils/tts.ts
  constant CODE_BLOCK_PATTERN (line 3) | const CODE_BLOCK_PATTERN = /```[\s\S]*?```/g;

FILE: src/web/search-engines/bing.ts
  constant BING_SEARCH_URL (line 19) | const BING_SEARCH_URL = "https://www.bing.com/search?q="

FILE: src/web/search-engines/brave-api.ts
  type BraveAPIResult (line 14) | interface BraveAPIResult {
  type BraveAPIResponse (line 20) | interface BraveAPIResponse {

FILE: src/web/search-engines/exa.ts
  type ExaAPIResult (line 18) | interface ExaAPIResult {
  type ExaAPIResponse (line 24) | interface ExaAPIResponse {

FILE: src/web/search-engines/firecrawl.ts
  type FirecrawlAPIResult (line 19) | interface FirecrawlAPIResult {
  type FirecrawlAPIResponse (line 26) | interface FirecrawlAPIResponse {

FILE: src/web/search-engines/kagi-api.ts
  type KagiSearchResult (line 14) | interface KagiSearchResult {
  type KagiAPIResponse (line 28) | interface KagiAPIResponse {

FILE: src/web/search-engines/ollama.ts
  type OllamaAPIResult (line 19) | interface OllamaAPIResult {
  type OllamaAPIResponse (line 25) | interface OllamaAPIResponse {

FILE: src/web/search-engines/perplexity-api.ts
  type PerplexitySearchResult (line 18) | interface PerplexitySearchResult {
  type PerplexityAPIResponse (line 26) | interface PerplexityAPIResponse {

FILE: src/web/search-engines/searxng.ts
  type SearxNGJSONResult (line 15) | interface SearxNGJSONResult {
  type SearxNGJSONResponse (line 21) | interface SearxNGJSONResponse {

FILE: src/web/search-engines/stract.ts
  type Snippet (line 15) | interface Snippet {
  type Text (line 20) | interface Text {
  type Fragment (line 24) | interface Fragment {
  type StractAPIResult (line 29) | interface StractAPIResult {
  type StractAPIResponse (line 36) | interface StractAPIResponse {

FILE: src/web/search-engines/tavily-api.ts
  type Results (line 14) | interface Results {
  type TavilyAPIResult (line 20) | interface TavilyAPIResult {

FILE: src/web/web.ts
  type ProviderResults (line 21) | interface ProviderResults {
  type SearchProviderResult (line 26) | interface SearchProviderResult {
Condensed preview — 580 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,610K chars).
[
  {
    "path": ".github/FUNDING.yml",
    "chars": 28,
    "preview": "github: n4ze3m\nko_fi: n4ze3m"
  },
  {
    "path": ".gitignore",
    "chars": 529,
    "preview": "\n# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n# settings\n.vscode\n\n# dependencie"
  },
  {
    "path": ".prettierrc.cjs",
    "chars": 423,
    "preview": "/**\n * @type {import('prettier').Options}\n */\nmodule.exports = {\n  printWidth: 80,\n  tabWidth: 2,\n  useTabs: false,\n  se"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3032,
    "preview": "# Contributing to Page Assist\n\nThank you for your interest in contributing to Page Assist! We welcome contributions from"
  },
  {
    "path": "LICENCE",
    "chars": 1071,
    "preview": "MIT License\n\nCopyright (c) 2023 Muhammed Nazeem\n\nPermission is hereby granted, free of charge, to any person obtaining a"
  },
  {
    "path": "PRIVACY.md",
    "chars": 1603,
    "preview": "# Privacy Policy\n\n## Data Collection\nPage Assist is committed to user privacy and does not collect any user data. All op"
  },
  {
    "path": "README.md",
    "chars": 7436,
    "preview": "<p align=\"center\">\n    <h1 align=\"center\">Page Assist</h1>\n</p>\n\n\n<p align=\"center\">\n<a href=\"https://discord.gg/bu54382"
  },
  {
    "path": "docs/.vitepress/config.mts",
    "chars": 3338,
    "preview": "import { defineConfig } from 'vitepress'\n\n// https://vitepress.dev/reference/site-config\nexport default defineConfig({\n "
  },
  {
    "path": "docs/browser-support.md",
    "chars": 749,
    "preview": "# Browser Support\n\nFor the best experience, we recommend using Page Assist with the latest versions of Google Chrome, Mi"
  },
  {
    "path": "docs/connection-issue.md",
    "chars": 2922,
    "preview": "# Ollama Connection Issues\n\nConnection issues can be caused by a number of reasons. Here are some common issues and how "
  },
  {
    "path": "docs/extensions-causing-issue-other-websites.md",
    "chars": 2525,
    "preview": "# Extensions Causing Issue with Other Websites\n\nSince Page Assist rewrites the Origin header to avoid CORS issues on the"
  },
  {
    "path": "docs/features/internet-search.md",
    "chars": 2223,
    "preview": "# Internet Search\n\nPage Assist supports internet search which can be used with your LLM. It works similarly to ChatGPT's"
  },
  {
    "path": "docs/features/knowledge-base.md",
    "chars": 1166,
    "preview": "# Knowledge Base\n\nPage Assist supports Knowledge Base which is useful for chatting with your own data. You can use it to"
  },
  {
    "path": "docs/features/mcp.md",
    "chars": 2753,
    "preview": "# MCP (Model Context Protocol)\n\nPage Assist supports MCP which allows your LLM to use external tools like search, databa"
  },
  {
    "path": "docs/features/ollama.md",
    "chars": 1800,
    "preview": "# Ollama\n\nPage Assist is designed to work with Ollama. Following are a few things you can do with Page Assist for your O"
  },
  {
    "path": "docs/features/other.md",
    "chars": 1670,
    "preview": "# Other Features\n\nThese are small utility features that Page Assist has.\n\n## Wide Mode\n\nFor larger screens, you can enab"
  },
  {
    "path": "docs/features/page-share.md",
    "chars": 1071,
    "preview": "# Page Share \n\nPage Share is a feature that allows you to share your chat with others like the share feature of ChatGPT."
  },
  {
    "path": "docs/features/prompts.md",
    "chars": 1879,
    "preview": "# Prompts\n\nPage Assist offers three types of prompts to enhance your AI interaction experience:\n\n1. **Custom Prompts** -"
  },
  {
    "path": "docs/index.md",
    "chars": 1682,
    "preview": "# Welcome to Page Assist\n\nWelcome to Page Assist, the browser companion for your Local AI model! With Page Assist, your "
  },
  {
    "path": "docs/markdown-examples.md",
    "chars": 1055,
    "preview": "# Markdown Extension Examples\n\nThis page demonstrates some of the built-in markdown extensions provided by VitePress.\n\n#"
  },
  {
    "path": "docs/package.json",
    "chars": 221,
    "preview": "{\n  \"name\": \"page-assist-docs\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"vitepress build\",\n    \"dev\": \"vitepress "
  },
  {
    "path": "docs/postcss.config.js",
    "chars": 20,
    "preview": "module.exports = {}\n"
  },
  {
    "path": "docs/privacy.md",
    "chars": 1603,
    "preview": "# Privacy Policy\n\n## Data Collection\nPage Assist is committed to user privacy and does not collect any user data. All op"
  },
  {
    "path": "docs/prompt.md",
    "chars": 10,
    "preview": "# Prompt \n"
  },
  {
    "path": "docs/providers/llamacpp.md",
    "chars": 683,
    "preview": "# LLaMA.cpp\n\nPage Assist supports LLaMA.cpp API endpoints. You can use any LLaMA.cpp API endpoint with Page Assist.\n\n## "
  },
  {
    "path": "docs/providers/lmstudio.md",
    "chars": 620,
    "preview": "# LM Studio\n\nYou can add LMStudio's API to Page Assist. Here's how you can do it:\n\n1. Click on the Page Assist icon on t"
  },
  {
    "path": "docs/providers/ollama.md",
    "chars": 858,
    "preview": "# Ollama \n\nOllama lets you run large language models locally on your machine.\n\nPage Assist supports Ollama by default. Y"
  },
  {
    "path": "docs/providers/openai.md",
    "chars": 1126,
    "preview": "# OpenAI Compatible API\n\nPage Assist supports OpenAI Compatible API endpoints. You can use any OpenAI Compatible API end"
  },
  {
    "path": "docs/shortcuts.md",
    "chars": 1516,
    "preview": "# Shortcut Keys\n\nPage Assist supports the following shortcut keys:\n\n| Action       | Shortcut       |\n| ------------ | -"
  },
  {
    "path": "docs/sidebar/chat-with-website.md",
    "chars": 1219,
    "preview": "# Sidebar Chat with Website\n\nThis is one of the features of Page Assist that allows you to chat with your AI model from "
  },
  {
    "path": "docs/sidebar/copilot.md",
    "chars": 4901,
    "preview": "# Copilot\n\nSidebar Copilot is a feature that allows you to select text from any webpage and perform AI-powered actions o"
  },
  {
    "path": "docs/sidebar/index.md",
    "chars": 1308,
    "preview": "# Page Assist Sidebar \n\nSidebar is a really good feature of the extension. It allows you to chat with your AI model from"
  },
  {
    "path": "docs/sidebar/vision.md",
    "chars": 1094,
    "preview": "# Sidebar Vision (🧪)\n\nThe vision feature of the sidebar allows LLM to see the current webpage. This is similar to [Chat "
  },
  {
    "path": "package.json",
    "chars": 3565,
    "preview": "{\n  \"name\": \"pageassist\",\n  \"displayName\": \"Page Assist - A Web UI for Local AI Models\",\n  \"version\": \"1.0.9\",\n  \"descri"
  },
  {
    "path": "page-share.md",
    "chars": 763,
    "preview": "# Page Share\n\nPage Share allows you to share the chat publicly, similar to ChatGPT Share. You can self-host Page Share f"
  },
  {
    "path": "postcss.config.js",
    "chars": 141,
    "preview": "/**\n * @type {import('postcss').ProcessOptions}\n */\nmodule.exports = {\n    plugins: {\n      tailwindcss: {},\n      autop"
  },
  {
    "path": "src/assets/locale/ar/chrome.json",
    "chars": 1143,
    "preview": "{\n    \"heading\": \"إعداد Chrome AI\",\n    \"status\": {\n        \"label\": \"تمكين أو تعطيل دعم Chrome AI في مساعد الصفحة\"\n    "
  },
  {
    "path": "src/assets/locale/ar/common.json",
    "chars": 5378,
    "preview": "{\n    \"pageAssist\": \"مساعد الصفحة\",\n    \"selectAModel\": \"اختر نموذجًا\",\n    \"save\": \"حفظ\",\n    \"saved\": \"تم الحفظ\",\n    "
  },
  {
    "path": "src/assets/locale/ar/knowledge.json",
    "chars": 1216,
    "preview": "{ \n    \"addBtn\": \"إضافة معرفة جديدة\",\n    \"columns\": {\n        \"title\": \"العنوان\",\n        \"status\": \"الحالة\",\n        \""
  },
  {
    "path": "src/assets/locale/ar/openai.json",
    "chars": 3809,
    "preview": "{\n    \"settings\": \"واجهة برمجة التطبيقات المتوافقة مع OpenAI\",\n    \"heading\": \"واجهة برمجة التطبيقات المتوافقة مع OpenAI"
  },
  {
    "path": "src/assets/locale/ar/option.json",
    "chars": 864,
    "preview": "{ \n    \"newChat\": \"محادثة جديدة\",\n    \"selectAPrompt\": \"اختر موجهاً\",\n    \"githubRepository\": \"مستودع GitHub\",\n    \"sett"
  },
  {
    "path": "src/assets/locale/ar/playground.json",
    "chars": 1091,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"جارٍ البحث عن Ollama الخاص بك 🦙\",\n        \"running\": \"Ollama يعمل 🦙\",\n     "
  },
  {
    "path": "src/assets/locale/ar/settings.json",
    "chars": 13388,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"الإعدادات العامة\",\n    \"settings\": {\n      \"heading\": \"إعدادات واجهة المستخدم\",\n "
  },
  {
    "path": "src/assets/locale/ar/sidepanel.json",
    "chars": 208,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"قد يستغرق تضمين الصفحة بضع دقائق. يرجى الانتظار...\",\n        \"clear\": \"مسح سجل المح"
  },
  {
    "path": "src/assets/locale/da/chrome.json",
    "chars": 1293,
    "preview": "{\n    \"heading\": \"Konfigurer Chrome AI\",\n    \"status\": {\n        \"label\": \"Tænd eller sluk Chrome AI Support på Page Ass"
  },
  {
    "path": "src/assets/locale/da/common.json",
    "chars": 5442,
    "preview": "{\n    \"pageAssist\": \"Page Assist\",\n    \"selectAModel\": \"Vælg en Model\",\n    \"save\": \"Gem\",\n    \"saved\": \"Gemt\",\n    \"can"
  },
  {
    "path": "src/assets/locale/da/knowledge.json",
    "chars": 1262,
    "preview": "{\n    \"addBtn\": \"Tilføj Ny Viden\",\n    \"columns\": {\n        \"title\": \"Titel\",\n        \"status\": \"Status\",\n        \"embed"
  },
  {
    "path": "src/assets/locale/da/openai.json",
    "chars": 3886,
    "preview": "{\n    \"settings\": \"OpenAI Kompatibel API\",\n    \"heading\": \"OpenAI kompatibel API\",\n    \"subheading\": \"Administrer og kon"
  },
  {
    "path": "src/assets/locale/da/option.json",
    "chars": 925,
    "preview": "{\n    \"newChat\": \"Ny Chat\",\n    \"selectAPrompt\": \"Vælg en Prompt\",\n    \"githubRepository\": \"GitHub Repository\",\n    \"set"
  },
  {
    "path": "src/assets/locale/da/playground.json",
    "chars": 1088,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Søger efter din Ollama 🦙\",\n        \"running\": \"Ollama kør 🦙\",\n        \"notR"
  },
  {
    "path": "src/assets/locale/da/settings.json",
    "chars": 13909,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Generelle Indstillinger\",\n    \"settings\": {\n      \"heading\": \"Web UI Indstillinge"
  },
  {
    "path": "src/assets/locale/da/sidepanel.json",
    "chars": 221,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"Det kan tage et par minutter at indlejre siden. Vent venligst...\",\n        \"clear\":"
  },
  {
    "path": "src/assets/locale/de/chrome.json",
    "chars": 1457,
    "preview": "{\n    \"heading\": \"Chrome AI konfigurieren\",\n    \"status\": {\n        \"label\": \"Chrome AI-Unterstützung für Page Assist ak"
  },
  {
    "path": "src/assets/locale/de/common.json",
    "chars": 5845,
    "preview": "{\n    \"pageAssist\": \"Page Assist\",\n    \"selectAModel\": \"Modell auswählen\",\n    \"save\": \"Speichern\",\n    \"saved\": \"Gespei"
  },
  {
    "path": "src/assets/locale/de/knowledge.json",
    "chars": 1373,
    "preview": "{\n    \"addBtn\": \"Neues Wissen hinzufügen\",\n    \"columns\": {\n        \"title\": \"Titel\",\n        \"status\": \"Status\",\n      "
  },
  {
    "path": "src/assets/locale/de/openai.json",
    "chars": 4175,
    "preview": "{\n    \"settings\": \"OpenAI-kompatible API\",\n    \"heading\": \"OpenAI-kompatible API\",\n    \"subheading\": \"Verwalten und konf"
  },
  {
    "path": "src/assets/locale/de/option.json",
    "chars": 992,
    "preview": "{\n    \"newChat\": \"Neuer Chat\",\n    \"selectAPrompt\": \"Wähle eine Eingabeaufforderung\",\n    \"githubRepository\": \"GitHub-Re"
  },
  {
    "path": "src/assets/locale/de/playground.json",
    "chars": 1152,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Suche nach Ihrem Ollama 🦙\",\n        \"running\": \"Ollama läuft 🦙\",\n        \"n"
  },
  {
    "path": "src/assets/locale/de/settings.json",
    "chars": 14777,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Allgemeine Einstellungen\",\n    \"settings\": {\n      \"heading\": \"Web-UI-Einstellung"
  },
  {
    "path": "src/assets/locale/de/sidepanel.json",
    "chars": 230,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"Es kann einige Minuten dauern, die Seite einzubetten. Bitte warten Sie...\",\n       "
  },
  {
    "path": "src/assets/locale/en/chrome.json",
    "chars": 1932,
    "preview": "{\n    \"heading\": \"Configure Chrome AI\",\n    \"status\": {\n        \"label\": \"Enable or Disable Chrome AI Support on Page As"
  },
  {
    "path": "src/assets/locale/en/common.json",
    "chars": 7762,
    "preview": "{\n    \"pageAssist\": \"Page Assist\",\n    \"selectAModel\": \"Select a Model\",\n    \"save\": \"Save\",\n    \"saved\": \"Saved\",\n    \""
  },
  {
    "path": "src/assets/locale/en/knowledge.json",
    "chars": 3657,
    "preview": "{\n    \"addBtn\": \"Add New Knowledge\",\n    \"columns\": {\n        \"title\": \"Title\",\n        \"status\": \"Status\",\n        \"emb"
  },
  {
    "path": "src/assets/locale/en/openai.json",
    "chars": 3918,
    "preview": "{\n    \"settings\": \"OpenAI Compatible API\",\n    \"heading\": \"OpenAI compatible API\",\n    \"subheading\": \"Manage and configu"
  },
  {
    "path": "src/assets/locale/en/option.json",
    "chars": 1146,
    "preview": "{\n    \"newChat\": \"New Chat\",\n    \"selectAPrompt\": \"Select a Prompt\",\n    \"githubRepository\": \"GitHub Repository\",\n    \"s"
  },
  {
    "path": "src/assets/locale/en/playground.json",
    "chars": 1767,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Searching for Your Ollama 🦙\",\n        \"running\": \"Ollama is running 🦙\",\n   "
  },
  {
    "path": "src/assets/locale/en/settings.json",
    "chars": 20416,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"General Settings\",\n    \"settings\": {\n      \"heading\": \"Web UI Settings\",\n      \"s"
  },
  {
    "path": "src/assets/locale/en/sidepanel.json",
    "chars": 215,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"It may take a few minutes to embed the page. Please wait...\",\n        \"clear\": \"Era"
  },
  {
    "path": "src/assets/locale/es/chrome.json",
    "chars": 1325,
    "preview": "{\n    \"heading\": \"Configurar Chrome AI\",\n    \"status\": {\n        \"label\": \"Habilitar o deshabilitar el soporte de Chrome"
  },
  {
    "path": "src/assets/locale/es/common.json",
    "chars": 5768,
    "preview": "{\n    \"pageAssist\": \"Page Assist\",\n    \"selectAModel\": \"Selecione un Modelo\",\n    \"save\": \"Guardar\",\n    \"saved\": \"Guard"
  },
  {
    "path": "src/assets/locale/es/knowledge.json",
    "chars": 1407,
    "preview": "{\n    \"addBtn\": \"Agregar Nuevo Conocimiento\",\n    \"columns\": {\n        \"title\": \"Título\",\n        \"status\": \"Estado\",\n  "
  },
  {
    "path": "src/assets/locale/es/openai.json",
    "chars": 4224,
    "preview": "{\n    \"settings\": \"API compatible con OpenAI\",\n    \"heading\": \"API compatible con OpenAI\",\n    \"subheading\": \"Gestiona y"
  },
  {
    "path": "src/assets/locale/es/option.json",
    "chars": 958,
    "preview": "{\n    \"newChat\": \"Nuevo Chat\",\n    \"selectAPrompt\": \"Selecione un Prompt\",\n    \"githubRepository\": \"Repositorio de GitHu"
  },
  {
    "path": "src/assets/locale/es/playground.json",
    "chars": 1128,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Buscando tu Ollama 🦙\",\n        \"running\": \"Ollama está funcionando 🦙\",\n    "
  },
  {
    "path": "src/assets/locale/es/settings.json",
    "chars": 18425,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Configuraciones Generales\",\n    \"settings\": {\n      \"heading\": \"Configuraciones d"
  },
  {
    "path": "src/assets/locale/es/sidepanel.json",
    "chars": 264,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"Puede demorar algunos minutos para incluir la página. Por favor, aguarde...\",\n     "
  },
  {
    "path": "src/assets/locale/fa/chrome.json",
    "chars": 1226,
    "preview": "{\n    \"heading\": \"تنظیمات AI کروم\",\n    \"status\": {\n        \"label\": \"فعال یا غیر فعال کردن پشتیبانی از AI کروم\"\n    },\n"
  },
  {
    "path": "src/assets/locale/fa/common.json",
    "chars": 5248,
    "preview": "{\n    \"pageAssist\": \"دستیار صفحه\",\n    \"selectAModel\": \"یک مدل انتخاب کنید\",\n    \"save\": \"ذخیره\",\n    \"saved\": \"ذخیره شد"
  },
  {
    "path": "src/assets/locale/fa/knowledge.json",
    "chars": 1299,
    "preview": "{\n    \"addBtn\": \"افزودن دانش جدید\",\n    \"columns\": {\n        \"title\": \"عنوان\",\n        \"status\": \"وضعیت\",\n        \"embed"
  },
  {
    "path": "src/assets/locale/fa/openai.json",
    "chars": 3976,
    "preview": "{\n    \"settings\": \"API سازگار با OpenAI\",\n    \"heading\": \"API سازگار با OpenAI\",\n    \"subheading\": \"ارائه‌دهندگان API سا"
  },
  {
    "path": "src/assets/locale/fa/option.json",
    "chars": 918,
    "preview": "{\n    \"newChat\": \"گپ جدید\",\n    \"selectAPrompt\": \"یک پرامپت را انتخاب کنید\",\n    \"githubRepository\": \"مخزن GitHub\",\n    "
  },
  {
    "path": "src/assets/locale/fa/playground.json",
    "chars": 1077,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"در حال جستجوی Ollama شما 🦙\",\n        \"running\": \"Ollama در حال اجرا است 🦙\","
  },
  {
    "path": "src/assets/locale/fa/settings.json",
    "chars": 17082,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"تنظیمات عمومی\",\n    \"settings\": {\n      \"heading\": \"تنظیمات رابط کاربری وب\",\n    "
  },
  {
    "path": "src/assets/locale/fa/sidepanel.json",
    "chars": 236,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"ممکن است چند دقیقه طول بکشد تا صفحه جاسازی شود. لطفاً منتظر بمانید...\",\n        \"cl"
  },
  {
    "path": "src/assets/locale/fr/chrome.json",
    "chars": 1385,
    "preview": "{\n    \"heading\": \"Configurer Chrome AI\",\n    \"status\": {\n        \"label\": \"Activer ou désactiver la prise en charge de C"
  },
  {
    "path": "src/assets/locale/fr/common.json",
    "chars": 6921,
    "preview": "{\n    \"pageAssist\": \"Page Assist\",\n    \"selectAModel\": \"Sélectionner un modèle\",\n    \"save\": \"Enregistrer\",\n    \"saved\":"
  },
  {
    "path": "src/assets/locale/fr/knowledge.json",
    "chars": 1433,
    "preview": "{\n    \"addBtn\": \"Ajouter de nouvelles connaissances\",\n    \"columns\": {\n        \"title\": \"Titre\",\n        \"status\": \"Stat"
  },
  {
    "path": "src/assets/locale/fr/openai.json",
    "chars": 4417,
    "preview": "{\n    \"settings\": \"API compatible OpenAI\",\n    \"heading\": \"API compatible OpenAI\",\n    \"subheading\": \"Gérez et configure"
  },
  {
    "path": "src/assets/locale/fr/option.json",
    "chars": 1023,
    "preview": "{\n    \"newChat\": \"Nouveau chat\",\n    \"selectAPrompt\": \"Sélectionner un prompt\",\n    \"githubRepository\": \"Dépôt GitHub\",\n"
  },
  {
    "path": "src/assets/locale/fr/playground.json",
    "chars": 1281,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Recherche de votre Ollama 🦙\",\n        \"running\": \"Ollama est en cours d'exé"
  },
  {
    "path": "src/assets/locale/fr/settings.json",
    "chars": 18804,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Paramètres généraux\",\n    \"settings\": {\n      \"heading\": \"Paramètres de l'interfa"
  },
  {
    "path": "src/assets/locale/fr/sidepanel.json",
    "chars": 250,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"L'intégration de la page peut prendre quelques minutes. Veuillez patienter...\",\n   "
  },
  {
    "path": "src/assets/locale/it/chrome.json",
    "chars": 1329,
    "preview": "{\n    \"heading\": \"Configura Chrome AI\",\n    \"status\": {\n        \"label\": \"Abilita o disabilita il supporto di Chrome AI "
  },
  {
    "path": "src/assets/locale/it/common.json",
    "chars": 5723,
    "preview": "{\n    \"pageAssist\": \"Page Assist\",\n    \"selectAModel\": \"Seleziona un Modello\",\n    \"save\": \"Salva\",\n    \"saved\": \"Salvat"
  },
  {
    "path": "src/assets/locale/it/knowledge.json",
    "chars": 1349,
    "preview": "{\n    \"addBtn\": \"Aggiungi nuova Knowledge Base\",\n    \"columns\": {\n        \"title\": \"Titolo\",\n        \"status\": \"Stato\",\n"
  },
  {
    "path": "src/assets/locale/it/openai.json",
    "chars": 4177,
    "preview": "{\n    \"settings\": \"API compatibile con OpenAI\",\n    \"heading\": \"API compatibile con OpenAI\",\n    \"subheading\": \"Gestisci"
  },
  {
    "path": "src/assets/locale/it/option.json",
    "chars": 946,
    "preview": "{\n    \"newChat\": \"Nuova Chat\",\n    \"selectAPrompt\": \"Scegli un Prompt\",\n    \"githubRepository\": \"GitHub Repository\",\n   "
  },
  {
    "path": "src/assets/locale/it/playground.json",
    "chars": 1087,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Sto cercando Ollama 🦙\",\n        \"running\": \"Ollama è attivo 🦙\",\n        \"no"
  },
  {
    "path": "src/assets/locale/it/settings.json",
    "chars": 18446,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Impostazioni Generali\",\n    \"settings\": {\n      \"heading\": \"Impostazioni Web UI\","
  },
  {
    "path": "src/assets/locale/it/sidepanel.json",
    "chars": 259,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"L'inserimento della pagina potrebbe richiedere alcuni minuti. Attendere prego...\",\n"
  },
  {
    "path": "src/assets/locale/ja-JP/chrome.json",
    "chars": 917,
    "preview": "{\n    \"heading\": \"Chrome AIの設定\",\n    \"status\": {\n        \"label\": \"Page AssistでChrome AIサポートを有効または無効にする\"\n    },\n    \"err"
  },
  {
    "path": "src/assets/locale/ja-JP/common.json",
    "chars": 3702,
    "preview": "{\n  \"pageAssist\": \"ページアシスト\",\n  \"selectAModel\": \"モデルを選択\",\n  \"save\": \"保存\",\n  \"saved\": \"保存済み\",\n  \"cancel\": \"キャンセル\",\n  \"retr"
  },
  {
    "path": "src/assets/locale/ja-JP/knowledge.json",
    "chars": 1053,
    "preview": "{\n    \"addBtn\": \"新しい知識を追加\",\n    \"columns\": {\n        \"title\": \"タイトル\",\n        \"status\": \"ステータス\",\n        \"embeddings\": \""
  },
  {
    "path": "src/assets/locale/ja-JP/openai.json",
    "chars": 3166,
    "preview": "{\n    \"settings\": \"OpenAI互換API\",\n    \"heading\": \"OpenAI互換API\",\n    \"subheading\": \"OpenAI API互換プロバイダーの管理と設定はこちらで行います。\",\n "
  },
  {
    "path": "src/assets/locale/ja-JP/option.json",
    "chars": 699,
    "preview": "{\n  \"newChat\": \"新しいチャット\",\n  \"selectAPrompt\": \"プロンプトを選択\",\n  \"githubRepository\": \"GitHubリポジトリ\",\n  \"settings\": \"設定\",\n  \"sid"
  },
  {
    "path": "src/assets/locale/ja-JP/playground.json",
    "chars": 890,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Ollamaを検索中 🦙\",\n        \"running\": \"Ollamaが実行中 🦙\",\n        \"notRunning\": \"Ol"
  },
  {
    "path": "src/assets/locale/ja-JP/settings.json",
    "chars": 13933,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"一般設定\",\n    \"settings\": {\n      \"heading\": \"Web UIの設定\",\n      \"speechRecognitionLa"
  },
  {
    "path": "src/assets/locale/ja-JP/sidepanel.json",
    "chars": 104,
    "preview": "{\n  \"tooltip\": {\n    \"embed\": \"ページを埋め込むのに数分かかる場合があります。しばらくお待ちください...\",\n    \"openwebui\": \"WebUIを開く\"\n  }\n}"
  },
  {
    "path": "src/assets/locale/ko/chrome.json",
    "chars": 940,
    "preview": "{\n    \"heading\": \"Chrome AI 설정\",\n    \"status\": {\n        \"label\": \"Page Assist에서 Chrome AI 지원을 활성화하거나 비활성화하기\"\n    },\n   "
  },
  {
    "path": "src/assets/locale/ko/common.json",
    "chars": 3668,
    "preview": "{\n  \"pageAssist\": \"페이지 어시스트\",\n  \"selectAModel\": \"모델 선택\",\n  \"save\": \"저장\",\n  \"saved\": \"저장됨\",\n  \"cancel\": \"취소\",\n  \"retry\": "
  },
  {
    "path": "src/assets/locale/ko/knowledge.json",
    "chars": 1039,
    "preview": "{\n    \"addBtn\": \"새 지식 추가\",\n    \"columns\": {\n        \"title\": \"제목\",\n        \"status\": \"상태\",\n        \"embeddings\": \"임베딩 모델"
  },
  {
    "path": "src/assets/locale/ko/openai.json",
    "chars": 3181,
    "preview": "{\n    \"settings\": \"OpenAI 호환 API\",\n    \"heading\": \"OpenAI 호환 API\",\n    \"subheading\": \"여기에서 OpenAI API 호환 공급자를 관리하고 설정할 수"
  },
  {
    "path": "src/assets/locale/ko/option.json",
    "chars": 758,
    "preview": "{\n    \"newChat\": \"새 채팅\",\n    \"selectAPrompt\": \"프롬프트 선택\",\n    \"githubRepository\": \"GitHub 리포지토리\",\n    \"settings\": \"설정\",\n "
  },
  {
    "path": "src/assets/locale/ko/playground.json",
    "chars": 880,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Ollama 검색 중 🦙\",\n        \"running\": \"Ollama 실행 중 🦙\",\n        \"notRunning\": \""
  },
  {
    "path": "src/assets/locale/ko/settings.json",
    "chars": 13713,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"일반 설정\",\n    \"settings\": {\n      \"heading\": \"웹 UI 설정\",\n      \"speechRecognitionLan"
  },
  {
    "path": "src/assets/locale/ko/sidepanel.json",
    "chars": 109,
    "preview": "{\n  \"tooltip\": {\n    \"embed\": \"페이지를 임베드하는 데 몇 분이 걸릴 수 있습니다. 잠시만 기다려 주세요...\",\n    \"openwebui\": \"웹 UI 열기\"\n  }\n}"
  },
  {
    "path": "src/assets/locale/ml/chrome.json",
    "chars": 1353,
    "preview": "{\n    \"heading\": \"ക്രോം എഐ കോൺഫിഗർ ചെയ്യുക\",\n    \"status\": {\n        \"label\": \"പേജ് അസിസ്റ്റിൽ ക്രോം എഐ പിന്തുണ സജ്ജമാക്"
  },
  {
    "path": "src/assets/locale/ml/common.json",
    "chars": 5819,
    "preview": "{\n    \"pageAssist\": \"പേജ് ആസിസ്റ്റ്\",\n    \"selectAModel\": \"ഒരു മോഡല്‍ തിരഞ്ഞെടുക്കുക\",\n    \"save\": \"സേവ് ചെയ്യുക\",\n    \""
  },
  {
    "path": "src/assets/locale/ml/knowledge.json",
    "chars": 1436,
    "preview": "{\n    \"addBtn\": \"പുതിയ വിജ്ഞാനം ചേര്‍ക്കുക\",\n    \"columns\": {\n        \"title\": \"തലക്കെട്ട്\",\n        \"status\": \"സ്ഥിതി\","
  },
  {
    "path": "src/assets/locale/ml/openai.json",
    "chars": 4027,
    "preview": "{\n    \"settings\": \"OpenAI അനുയോജ്യമായ API\",\n    \"heading\": \"OpenAI അനുയോജ്യമായ API\",\n    \"subheading\": \"നിങ്ങളുടെ OpenAI"
  },
  {
    "path": "src/assets/locale/ml/option.json",
    "chars": 996,
    "preview": "{\n    \"newChat\": \"പുതിയ ചാറ്റ്\",\n    \"selectAPrompt\": \"ഒരു പ്രോംപ്റ്റ് തിരഞ്ഞെടുക്കുക\",\n    \"githubRepository\": \"ഗിറ്റ്ഹ"
  },
  {
    "path": "src/assets/locale/ml/playground.json",
    "chars": 1212,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"നിങ്ങളുടെ ഒല്ലാമയ്ക്കായി തിരയുന്നു 🦙\",\n        \"running\": \"ഒല്ലാമ പ്രവര്‍ത്"
  },
  {
    "path": "src/assets/locale/ml/settings.json",
    "chars": 15574,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"പൊതുവായ സെറ്റിംഗുകൾ\",\n    \"settings\": {\n      \"heading\": \"വെബ് UI സെറ്റിംഗുകൾ\",\n "
  },
  {
    "path": "src/assets/locale/ml/sidepanel.json",
    "chars": 164,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"പേജ് പ്രോസസ്സ് ചെയ്യുന്നതിന് കുറച്ച് മിനിറ്റുകൾ എടുത്തേക്കാം. കാത്തിരിക്കൂ..\",\n    "
  },
  {
    "path": "src/assets/locale/no/chrome.json",
    "chars": 1292,
    "preview": "{\n    \"heading\": \"Konfigurer Chrome AI\",\n    \"status\": {\n        \"label\": \"Slå Chrome AI Support på eller av på Page Ass"
  },
  {
    "path": "src/assets/locale/no/common.json",
    "chars": 5500,
    "preview": "{\n    \"pageAssist\": \"Sideassistent\",\n    \"selectAModel\": \"Velg en modell\",\n    \"save\": \"Lagre\",\n    \"saved\": \"Lagret\",\n "
  },
  {
    "path": "src/assets/locale/no/knowledge.json",
    "chars": 1313,
    "preview": "{\n    \"addBtn\": \"Legg Til Ny Kunnskap\",\n    \"columns\": {\n        \"title\": \"Tittel\",\n        \"status\": \"Status\",\n        "
  },
  {
    "path": "src/assets/locale/no/openai.json",
    "chars": 3930,
    "preview": "{\n    \"settings\": \"OpenAI-kompatibel API\",\n    \"heading\": \"OpenAI-kompatibel API\",\n    \"subheading\": \"Administrer og kon"
  },
  {
    "path": "src/assets/locale/no/option.json",
    "chars": 932,
    "preview": "{\n    \"newChat\": \"Ny Chat\",\n    \"selectAPrompt\": \"Velg en Prompt\",\n    \"githubRepository\": \"GitHub Repository\",\n    \"set"
  },
  {
    "path": "src/assets/locale/no/playground.json",
    "chars": 1086,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Søker etter din Ollama 🦙\",\n        \"running\": \"Ollama kjører 🦙\",\n        \"n"
  },
  {
    "path": "src/assets/locale/no/settings.json",
    "chars": 14114,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Generelle Innstillinger\",\n    \"settings\": {\n      \"heading\": \"Web UI Innstillinge"
  },
  {
    "path": "src/assets/locale/no/sidepanel.json",
    "chars": 220,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"Det kan ta noen minutter å bygge din siden. Vennligst vent...\",\n        \"clear\": \"S"
  },
  {
    "path": "src/assets/locale/pt-BR/chrome.json",
    "chars": 1271,
    "preview": "{\n    \"heading\": \"Configurar Chrome AI\",\n    \"status\": {\n        \"label\": \"Ativar ou Desativar o Suporte do Chrome AI no"
  },
  {
    "path": "src/assets/locale/pt-BR/common.json",
    "chars": 4994,
    "preview": "{\n  \"pageAssist\": \"Page Assist\",\n  \"selectAModel\": \"Selecionar um Modelo\",\n  \"save\": \"Salvar\",\n  \"saved\": \"Salvo\",\n  \"ca"
  },
  {
    "path": "src/assets/locale/pt-BR/knowledge.json",
    "chars": 1404,
    "preview": "{\n    \"addBtn\": \"Adicionar Novo Conhecimento\",\n    \"columns\": {\n        \"title\": \"Título\",\n        \"status\": \"Status\",\n "
  },
  {
    "path": "src/assets/locale/pt-BR/openai.json",
    "chars": 4108,
    "preview": "{\n    \"settings\": \"API Compatível com OpenAI\",\n    \"heading\": \"API compatível com OpenAI\",\n    \"subheading\": \"Gerencie e"
  },
  {
    "path": "src/assets/locale/pt-BR/option.json",
    "chars": 977,
    "preview": "{\n    \"newChat\": \"Novo Chat\",\n    \"selectAPrompt\": \"Selecionar um Prompt\",\n    \"githubRepository\": \"Repositório GitHub\","
  },
  {
    "path": "src/assets/locale/pt-BR/playground.json",
    "chars": 1158,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Procurando por seu Ollama 🦙\",\n        \"running\": \"Ollama está em execução 🦙"
  },
  {
    "path": "src/assets/locale/pt-BR/settings.json",
    "chars": 15207,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Configurações Gerais\",\n    \"settings\": {\n      \"heading\": \"Configurações da Inter"
  },
  {
    "path": "src/assets/locale/pt-BR/sidepanel.json",
    "chars": 240,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"A incorporação da página pode levar alguns minutos. Por favor, aguarde...\",\n       "
  },
  {
    "path": "src/assets/locale/ru/chrome.json",
    "chars": 1230,
    "preview": "{\n    \"heading\": \"Настройка Chrome AI\",\n    \"status\": {\n      \"label\": \"Включить или отключить поддержку Chrome AI в пом"
  },
  {
    "path": "src/assets/locale/ru/common.json",
    "chars": 5651,
    "preview": "{\n    \"pageAssist\": \"Помощник страницы\",\n    \"selectAModel\": \"Выберите модель\",\n    \"save\": \"Сохранить\",\n    \"saved\": \"С"
  },
  {
    "path": "src/assets/locale/ru/knowledge.json",
    "chars": 1302,
    "preview": "{\n    \"addBtn\": \"Добавить новое знание\",\n    \"columns\": {\n        \"title\": \"Название\",\n        \"status\": \"Статус\",\n     "
  },
  {
    "path": "src/assets/locale/ru/openai.json",
    "chars": 4050,
    "preview": "{\n    \"settings\": \"API, совместимый с OpenAI\",\n    \"heading\": \"API, совместимый с OpenAI\",\n    \"subheading\": \"Управляйте"
  },
  {
    "path": "src/assets/locale/ru/option.json",
    "chars": 962,
    "preview": "{\n    \"newChat\": \"Новый чат\",\n    \"selectAPrompt\": \"Выберите подсказку\",\n    \"githubRepository\": \"Репозиторий GitHub\",\n "
  },
  {
    "path": "src/assets/locale/ru/playground.json",
    "chars": 1153,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Поиск вашего Ollama 🦙\",\n        \"running\": \"Ollama работает 🦙\",\n        \"no"
  },
  {
    "path": "src/assets/locale/ru/settings.json",
    "chars": 14802,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Общие настройки\",\n    \"settings\": {\n      \"heading\": \"Настройки веб-интерфейса\",\n"
  },
  {
    "path": "src/assets/locale/ru/sidepanel.json",
    "chars": 242,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"Внедрение страницы может занять несколько минут. Пожалуйста, подождите...\",\n       "
  },
  {
    "path": "src/assets/locale/sv/chrome.json",
    "chars": 1301,
    "preview": "{\n    \"heading\": \"Konfigurera Chrome AI\",\n    \"status\": {\n        \"label\": \"Aktivera eller inaktivera Chrome AI-stöd på "
  },
  {
    "path": "src/assets/locale/sv/common.json",
    "chars": 5606,
    "preview": "{\n    \"pageAssist\": \"Page Assist\",\n    \"selectAModel\": \"Välj en modell\",\n    \"save\": \"Spara\",\n    \"saved\": \"Sparad\",\n   "
  },
  {
    "path": "src/assets/locale/sv/knowledge.json",
    "chars": 1322,
    "preview": "{\n    \"addBtn\": \"Lägg till ny kunskap\",\n    \"columns\": {\n        \"title\": \"Titel\",\n        \"status\": \"Status\",\n        \""
  },
  {
    "path": "src/assets/locale/sv/openai.json",
    "chars": 3875,
    "preview": "{\n    \"settings\": \"OpenAI-kompatibel API\",\n    \"heading\": \"OpenAI-kompatibel API\",\n    \"subheading\": \"Hantera och konfig"
  },
  {
    "path": "src/assets/locale/sv/option.json",
    "chars": 924,
    "preview": "{\n    \"newChat\": \"Ny chatt\",\n    \"selectAPrompt\": \"Välj en fråga\",\n    \"githubRepository\": \"GitHu repository\",\n    \"sett"
  },
  {
    "path": "src/assets/locale/sv/playground.json",
    "chars": 1085,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Söker efter din Ollama 🦙\",\n        \"running\": \"Ollama körs 🦙\",\n        \"not"
  },
  {
    "path": "src/assets/locale/sv/settings.json",
    "chars": 14373,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Allmänna Inställningar\",\n    \"settings\": {\n      \"heading\": \"Webbgränssnitt Instä"
  },
  {
    "path": "src/assets/locale/sv/sidepanel.json",
    "chars": 212,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"Det kan ta några minuter att bädda in sidan. Vänta...\",\n        \"clear\": \"Radera ch"
  },
  {
    "path": "src/assets/locale/uk/chrome.json",
    "chars": 1311,
    "preview": "{\n    \"heading\": \"Налаштування Chrome AI\",\n    \"status\": {\n        \"label\": \"Ввімкнути або вимкнути підтримку Chrome AI "
  },
  {
    "path": "src/assets/locale/uk/common.json",
    "chars": 5880,
    "preview": "{\n    \"pageAssist\": \"Допомога на сторінці\",\n    \"selectAModel\": \"Виберіть модель\",\n    \"save\": \"Зберегти\",\n    \"saved\": "
  },
  {
    "path": "src/assets/locale/uk/knowledge.json",
    "chars": 1285,
    "preview": "{\n    \"addBtn\": \"Додати нове знання\",\n    \"columns\": {\n        \"title\": \"Назва\",\n        \"status\": \"Статус\",\n        \"em"
  },
  {
    "path": "src/assets/locale/uk/openai.json",
    "chars": 4064,
    "preview": "{\n    \"settings\": \"Сумісний з OpenAI API\",\n    \"heading\": \"Сумісний з OpenAI API\",\n    \"subheading\": \"Тут керування та н"
  },
  {
    "path": "src/assets/locale/uk/option.json",
    "chars": 950,
    "preview": "{\n    \"newChat\": \"Новий чат\",\n    \"selectAPrompt\": \"Виберіть запит\",\n    \"githubRepository\": \"Репозиторій GitHub\",\n    \""
  },
  {
    "path": "src/assets/locale/uk/playground.json",
    "chars": 1143,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"Пошук вашого Ollama 🦙\",\n        \"running\": \"Ollama працює 🦙\",\n        \"notR"
  },
  {
    "path": "src/assets/locale/uk/settings.json",
    "chars": 14780,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"Загальні налаштування\",\n    \"settings\": {\n      \"heading\": \"Налаштування веб-інте"
  },
  {
    "path": "src/assets/locale/uk/sidepanel.json",
    "chars": 254,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"Може знадобитися кілька хвилин для вкладення сторінки у базу. Будь ласка, зачекайте"
  },
  {
    "path": "src/assets/locale/zh/chrome.json",
    "chars": 708,
    "preview": "{\n  \"heading\": \"配置Chrome人工智能\",\n  \"status\": {\n      \"label\": \"在页面辅助功能中启用或禁用Chrome人工智能支持\"\n  },\n  \"error\": {\n      \"browser"
  },
  {
    "path": "src/assets/locale/zh/common.json",
    "chars": 5050,
    "preview": "{\n    \"pageAssist\": \"Page Assist\",\n    \"selectAModel\": \"选择一个模型\",\n    \"save\": \"保存\",\n    \"saved\": \"已保存\",\n    \"cancel\": \"取消"
  },
  {
    "path": "src/assets/locale/zh/knowledge.json",
    "chars": 953,
    "preview": "{\n    \"addBtn\": \"添加新知识\",\n    \"columns\": {\n        \"title\": \"标题\",\n        \"status\": \"状态\",\n        \"embeddings\": \"嵌入模型\",\n "
  },
  {
    "path": "src/assets/locale/zh/openai.json",
    "chars": 3011,
    "preview": "{\n    \"settings\": \"OpenAI 兼容 API\",\n    \"heading\": \"OpenAI 兼容 API\",\n    \"subheading\": \"在此管理和配置您的 OpenAI API 兼容提供商。\",\n    "
  },
  {
    "path": "src/assets/locale/zh/option.json",
    "chars": 774,
    "preview": "{\n    \"newChat\": \"新聊天\",\n    \"selectAPrompt\": \"选择一个提示词\",\n    \"githubRepository\": \"GitHub 仓库\",\n    \"settings\": \"设置\",\n    \""
  },
  {
    "path": "src/assets/locale/zh/playground.json",
    "chars": 838,
    "preview": "{\n    \"ollamaState\": {\n        \"searching\": \"正在搜索您的Ollama 🦙\",\n        \"running\": \"Ollama正在运行 🦙\",\n        \"notRunning\": \""
  },
  {
    "path": "src/assets/locale/zh/settings.json",
    "chars": 10254,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"一般设置\",\n    \"settings\": {\n      \"heading\": \"Web UI 设置\",\n      \"speechRecognitionLa"
  },
  {
    "path": "src/assets/locale/zh/sidepanel.json",
    "chars": 153,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"可能需要几分钟才能嵌入搜索结果。请稍候...\",\n        \"clear\": \"清除对话历史\",\n        \"history\": \"对话历史\",\n    "
  },
  {
    "path": "src/assets/locale/zh-TW/chrome.json",
    "chars": 1199,
    "preview": "{\n    \"heading\": \"設定 Chrome AI\",\n    \"status\": {\n        \"label\": \"在頁面輔助功能中啟用或停用 Chrome AI 支援\"\n    },\n    \"error\": {\n   "
  },
  {
    "path": "src/assets/locale/zh-TW/common.json",
    "chars": 4900,
    "preview": "{\n  \"pageAssist\": \"Page Assist\",\n  \"selectAModel\": \"選擇一個模型\",\n  \"save\": \"儲存\",\n  \"saved\": \"已儲存\",\n  \"cancel\": \"取消\",\n  \"retr"
  },
  {
    "path": "src/assets/locale/zh-TW/knowledge.json",
    "chars": 2634,
    "preview": "{\n    \"addBtn\": \"新增知識\",\n    \"columns\": {\n        \"title\": \"標題\",\n        \"status\": \"狀態\",\n        \"embeddings\": \"嵌入模型\",\n  "
  },
  {
    "path": "src/assets/locale/zh-TW/openai.json",
    "chars": 3020,
    "preview": "{\n    \"settings\": \"OpenAI 相容 API\",\n    \"heading\": \"OpenAI 相容 API\",\n    \"subheading\": \"在此管理和設定您與 OpenAI 相容的 API 提供商。\",\n  "
  },
  {
    "path": "src/assets/locale/zh-TW/option.json",
    "chars": 795,
    "preview": "{\n  \"newChat\": \"新聊天\",\n  \"selectAPrompt\": \"選擇一個提示詞\",\n  \"githubRepository\": \"GitHub Repo\",\n  \"settings\": \"設定\",\n  \"sidebarT"
  },
  {
    "path": "src/assets/locale/zh-TW/playground.json",
    "chars": 979,
    "preview": "{\n  \"ollamaState\": {\n    \"searching\": \"正在搜尋您的 Ollama 🦙\",\n    \"running\": \"Ollama 正在運行 🦙\",\n    \"notRunning\": \"無法連接到 Ollama"
  },
  {
    "path": "src/assets/locale/zh-TW/settings.json",
    "chars": 12584,
    "preview": "{\n  \"generalSettings\": {\n    \"title\": \"一般設定\",\n    \"settings\": {\n      \"heading\": \"Web UI 設定\",\n      \"speechRecognitionLa"
  },
  {
    "path": "src/assets/locale/zh-TW/sidepanel.json",
    "chars": 149,
    "preview": "{\n    \"tooltip\": {\n        \"embed\": \"嵌入頁面可能需要幾分鐘,請稍候...\",\n        \"clear\": \"刪除聊天紀錄\",\n        \"history\": \"聊天紀錄\",\n        "
  },
  {
    "path": "src/assets/tailwind.css",
    "chars": 8845,
    "preview": "@font-face {\n  font-family: \"Arimo\";\n  src: url(\"fonts/Arimo.ttf\");\n  font-display: swap;\n}\n\n.arimo {\n  font-family: \"Ar"
  },
  {
    "path": "src/chain/chat-with-website.ts",
    "chars": 4673,
    "preview": "//@ts-nocheck\nimport { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport { Document } from \"@langc"
  },
  {
    "path": "src/chain/chat-with-x.ts",
    "chars": 4336,
    "preview": "//@ts-nocheck\nimport { BaseLanguageModel } from \"@langchain/core/language_models/base\"\nimport { Document } from \"@langch"
  },
  {
    "path": "src/components/Common/Beta.tsx",
    "chars": 253,
    "preview": "import { Tag } from \"antd\"\nimport { useTranslation } from \"react-i18next\"\n\nexport const BetaTag = ({className} : {classN"
  },
  {
    "path": "src/components/Common/CodeBlock.tsx",
    "chars": 8474,
    "preview": "import { programmingLanguages } from \"@/utils/langauge-extension\"\nimport { Tooltip } from \"antd\"\nimport {\n  CopyCheckIco"
  },
  {
    "path": "src/components/Common/DocumentCard.tsx",
    "chars": 1234,
    "preview": "import { Spin } from \"antd\"\nimport { FileIcon, Loader2, XIcon } from \"lucide-react\"\n\ntype Props = {\n  name: string\n  onR"
  },
  {
    "path": "src/components/Common/ImageExport.tsx",
    "chars": 2795,
    "preview": "import { Message } from \"@/types/message\"\nimport { removeModelSuffix } from \"@/db/dexie/models\"\nimport Markdown from \"./"
  },
  {
    "path": "src/components/Common/Markdown.tsx",
    "chars": 2137,
    "preview": "import \"katex/dist/katex.min.css\"\n\nimport remarkGfm from \"remark-gfm\"\nimport remarkMath from \"remark-math\"\nimport ReactM"
  },
  {
    "path": "src/components/Common/McpServerToggle.tsx",
    "chars": 5507,
    "preview": "import { Popover, Switch, Tooltip } from \"antd\"\nimport { useState } from \"react\"\nimport { useQuery, useQueryClient } fro"
  },
  {
    "path": "src/components/Common/Mermaid.tsx",
    "chars": 767,
    "preview": "import { useEffect, useRef, useState } from \"react\"\r\nimport mermaid from \"mermaid\"\r\n\r\nfunction Mermaid({ code }: { code:"
  },
  {
    "path": "src/components/Common/Message/ReasoningSection.tsx",
    "chars": 2973,
    "preview": "import React from \"react\"\nimport { Collapse } from \"antd\"\nimport { Brain } from \"lucide-react\"\nimport { useTranslation }"
  },
  {
    "path": "src/components/Common/ModelSelect.tsx",
    "chars": 2353,
    "preview": "import { useQuery } from \"@tanstack/react-query\"\nimport { Avatar, Dropdown, Tooltip } from \"antd\"\nimport { LucideBrain }"
  },
  {
    "path": "src/components/Common/PageAssistLoader.tsx",
    "chars": 318,
    "preview": "\nexport const PageAssistLoader = () => {\n  return (\n    <div className=\"fixed bg-[#1a1a1a] top-0 left-0 right-0 bottom-0"
  },
  {
    "path": "src/components/Common/PageAssistProvider.tsx",
    "chars": 734,
    "preview": "import { PageAssistContext } from \"@/context\"\nimport { Message } from \"@/types/message\"\nimport React from \"react\"\n\nexpor"
  },
  {
    "path": "src/components/Common/Playground/ActionInfo.tsx",
    "chars": 794,
    "preview": "import { useTranslation } from \"react-i18next\"\nimport { ChatActionInfo } from \"@/libs/mcp/types\"\n\ntype Props = {\n  actio"
  },
  {
    "path": "src/components/Common/Playground/DocumentChip.tsx",
    "chars": 1542,
    "preview": "import React from \"react\"\nimport { Globe } from \"lucide-react\"\n\ninterface DocumentChipProps {\n  document: {\n    title: s"
  },
  {
    "path": "src/components/Common/Playground/DocumentFile.tsx",
    "chars": 1102,
    "preview": "import React from \"react\"\nimport { FileIcon, Globe } from \"lucide-react\"\nimport { formatFileSize } from \"@/utils/format-"
  },
  {
    "path": "src/components/Common/Playground/EditMessageForm.tsx",
    "chars": 3248,
    "preview": "import { useForm } from \"@mantine/form\"\nimport React from \"react\"\nimport { useTranslation } from \"react-i18next\"\nimport "
  },
  {
    "path": "src/components/Common/Playground/GenerationInfo.tsx",
    "chars": 1765,
    "preview": "type GenerationMetrics = {\n  total_duration?: number\n  load_duration?: number\n  prompt_eval_count?: number\n  prompt_eval"
  },
  {
    "path": "src/components/Common/Playground/HumanMessge.tsx",
    "chars": 2885,
    "preview": "import { useStorage } from \"@plasmohq/storage/hook\"\nimport { useState } from \"react\"\nimport Markdown from \"../Markdown\"\n"
  }
]

// ... and 380 more files (download for full content)

About this extraction

This page contains the full source code of the n4ze3m/page-assist GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 580 files (2.3 MB), approximately 637.7k tokens, and a symbol index with 729 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!