ruflo 3.5.2 → 3.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rvf.manifest.json +295 -0
- package/package.json +16 -2
- package/src/chat-ui/Dockerfile +25 -0
- package/src/chat-ui/patch-mcp-url-safety.sh +28 -0
- package/src/chat-ui/static/chatui/icon-144x144.png +0 -0
- package/src/chat-ui/static/chatui/omni-welcome.gif +0 -0
- package/src/config/config.example.json +76 -0
- package/src/mcp-bridge/Dockerfile +45 -0
- package/src/mcp-bridge/index.js +1668 -0
- package/src/mcp-bridge/mcp-stdio-kernel.js +159 -0
- package/src/mcp-bridge/package.json +17 -0
- package/src/mcp-bridge/test-harness.js +470 -0
- package/src/nginx/Dockerfile +10 -0
- package/src/nginx/nginx.conf +67 -0
- package/src/nginx/static/favicon-dark.svg +4 -0
- package/src/nginx/static/favicon.svg +4 -0
- package/src/nginx/static/icon.svg +5 -0
- package/src/nginx/static/logo.svg +9 -0
- package/src/nginx/static/manifest.json +22 -0
- package/src/nginx/static/welcome.js +184 -0
- package/src/ruvocal/.claude/skills/add-model-descriptions/SKILL.md +73 -0
- package/src/ruvocal/.devcontainer/Dockerfile +9 -0
- package/src/ruvocal/.devcontainer/devcontainer.json +36 -0
- package/src/ruvocal/.dockerignore +13 -0
- package/src/ruvocal/.env +194 -0
- package/src/ruvocal/.env.ci +1 -0
- package/src/ruvocal/.eslintignore +13 -0
- package/src/ruvocal/.eslintrc.cjs +45 -0
- package/src/ruvocal/.github/ISSUE_TEMPLATE/bug-report--chat-ui-.md +43 -0
- package/src/ruvocal/.github/ISSUE_TEMPLATE/config-support.md +9 -0
- package/src/ruvocal/.github/ISSUE_TEMPLATE/feature-request--chat-ui-.md +17 -0
- package/src/ruvocal/.github/ISSUE_TEMPLATE/huggingchat.md +11 -0
- package/src/ruvocal/.github/release.yml +16 -0
- package/src/ruvocal/.github/workflows/build-docs.yml +18 -0
- package/src/ruvocal/.github/workflows/build-image.yml +142 -0
- package/src/ruvocal/.github/workflows/build-pr-docs.yml +20 -0
- package/src/ruvocal/.github/workflows/deploy-dev.yml +63 -0
- package/src/ruvocal/.github/workflows/deploy-prod.yml +78 -0
- package/src/ruvocal/.github/workflows/lint-and-test.yml +84 -0
- package/src/ruvocal/.github/workflows/slugify.yaml +72 -0
- package/src/ruvocal/.github/workflows/trufflehog.yml +17 -0
- package/src/ruvocal/.github/workflows/upload-pr-documentation.yml +16 -0
- package/src/ruvocal/.husky/lint-stage-config.js +4 -0
- package/src/ruvocal/.husky/pre-commit +2 -0
- package/src/ruvocal/.prettierignore +14 -0
- package/src/ruvocal/.prettierrc +7 -0
- package/src/ruvocal/.vscode/launch.json +11 -0
- package/src/ruvocal/.vscode/settings.json +14 -0
- package/src/ruvocal/CLAUDE.md +126 -0
- package/src/ruvocal/Dockerfile +93 -0
- package/src/ruvocal/LICENSE +203 -0
- package/src/ruvocal/PRIVACY.md +41 -0
- package/src/ruvocal/README.md +190 -0
- package/src/ruvocal/chart/Chart.yaml +5 -0
- package/src/ruvocal/chart/env/dev.yaml +260 -0
- package/src/ruvocal/chart/env/prod.yaml +273 -0
- package/src/ruvocal/chart/templates/_helpers.tpl +22 -0
- package/src/ruvocal/chart/templates/config.yaml +10 -0
- package/src/ruvocal/chart/templates/deployment.yaml +81 -0
- package/src/ruvocal/chart/templates/hpa.yaml +45 -0
- package/src/ruvocal/chart/templates/infisical.yaml +24 -0
- package/src/ruvocal/chart/templates/ingress-internal.yaml +32 -0
- package/src/ruvocal/chart/templates/ingress.yaml +32 -0
- package/src/ruvocal/chart/templates/network-policy.yaml +36 -0
- package/src/ruvocal/chart/templates/service-account.yaml +13 -0
- package/src/ruvocal/chart/templates/service-monitor.yaml +17 -0
- package/src/ruvocal/chart/templates/service.yaml +21 -0
- package/src/ruvocal/chart/values.yaml +73 -0
- package/src/ruvocal/docker-compose.yml +21 -0
- package/src/ruvocal/docs/adr/ADR-029-HUGGINGFACE-CHAT-UI-CLOUD-RUN.md +1236 -0
- package/src/ruvocal/docs/adr/ADR-033-RUVECTOR-RUFLO-MCP-INTEGRATION.md +111 -0
- package/src/ruvocal/docs/adr/ADR-034-OPTIONAL-MCP-BACKENDS.md +117 -0
- package/src/ruvocal/docs/adr/ADR-035-MCP-TOOL-GROUPS.md +186 -0
- package/src/ruvocal/docs/adr/ADR-037-AUTOPILOT-CHAT-MODE.md +1500 -0
- package/src/ruvocal/docs/adr/ADR-038-RUVOCAL-FORK.md +286 -0
- package/src/ruvocal/docs/source/_toctree.yml +30 -0
- package/src/ruvocal/docs/source/configuration/common-issues.md +38 -0
- package/src/ruvocal/docs/source/configuration/llm-router.md +105 -0
- package/src/ruvocal/docs/source/configuration/mcp-tools.md +84 -0
- package/src/ruvocal/docs/source/configuration/metrics.md +9 -0
- package/src/ruvocal/docs/source/configuration/open-id.md +57 -0
- package/src/ruvocal/docs/source/configuration/overview.md +89 -0
- package/src/ruvocal/docs/source/configuration/theming.md +20 -0
- package/src/ruvocal/docs/source/developing/architecture.md +48 -0
- package/src/ruvocal/docs/source/index.md +53 -0
- package/src/ruvocal/docs/source/installation/docker.md +43 -0
- package/src/ruvocal/docs/source/installation/helm.md +43 -0
- package/src/ruvocal/docs/source/installation/local.md +62 -0
- package/src/ruvocal/entrypoint.sh +19 -0
- package/src/ruvocal/mcp-bridge/.claude-flow/agents/store.json +27 -0
- package/src/ruvocal/mcp-bridge/.claude-flow/daemon-state.json +130 -0
- package/src/ruvocal/mcp-bridge/.claude-flow/daemon.log +0 -0
- package/src/ruvocal/mcp-bridge/.claude-flow/daemon.pid +1 -0
- package/src/ruvocal/mcp-bridge/.claude-flow/tasks/store.json +21 -0
- package/src/ruvocal/mcp-bridge/.swarm/hnsw.index +0 -0
- package/src/ruvocal/mcp-bridge/.swarm/hnsw.metadata.json +1 -0
- package/src/ruvocal/mcp-bridge/.swarm/memory.db +0 -0
- package/src/ruvocal/mcp-bridge/.swarm/model-router-state.json +14 -0
- package/src/ruvocal/mcp-bridge/.swarm/schema.sql +305 -0
- package/src/ruvocal/mcp-bridge/Dockerfile +45 -0
- package/src/ruvocal/mcp-bridge/cloudbuild.yaml +49 -0
- package/src/ruvocal/mcp-bridge/index.js +1864 -0
- package/src/ruvocal/mcp-bridge/mcp-stdio-kernel.js +159 -0
- package/src/ruvocal/mcp-bridge/package-lock.json +762 -0
- package/src/ruvocal/mcp-bridge/package.json +17 -0
- package/src/ruvocal/mcp-bridge/test-harness.js +470 -0
- package/src/ruvocal/models/add-your-models-here.txt +1 -0
- package/src/ruvocal/package-lock.json +11741 -0
- package/src/ruvocal/package.json +121 -0
- package/src/ruvocal/postcss.config.js +6 -0
- package/src/ruvocal/rvf.manifest.json +204 -0
- package/src/ruvocal/scripts/config.ts +64 -0
- package/src/ruvocal/scripts/generate-welcome.mjs +181 -0
- package/src/ruvocal/scripts/populate.ts +288 -0
- package/src/ruvocal/scripts/samples.txt +194 -0
- package/src/ruvocal/scripts/setups/vitest-setup-client.ts +0 -0
- package/src/ruvocal/scripts/setups/vitest-setup-server.ts +44 -0
- package/src/ruvocal/scripts/updateLocalEnv.ts +48 -0
- package/src/ruvocal/src/ambient.d.ts +7 -0
- package/src/ruvocal/src/app.d.ts +29 -0
- package/src/ruvocal/src/app.html +53 -0
- package/src/ruvocal/src/hooks.server.ts +32 -0
- package/src/ruvocal/src/hooks.ts +6 -0
- package/src/ruvocal/src/lib/APIClient.ts +148 -0
- package/src/ruvocal/src/lib/actions/clickOutside.ts +18 -0
- package/src/ruvocal/src/lib/actions/snapScrollToBottom.ts +346 -0
- package/src/ruvocal/src/lib/buildPrompt.ts +33 -0
- package/src/ruvocal/src/lib/components/AnnouncementBanner.svelte +20 -0
- package/src/ruvocal/src/lib/components/BackgroundGenerationPoller.svelte +168 -0
- package/src/ruvocal/src/lib/components/CodeBlock.svelte +73 -0
- package/src/ruvocal/src/lib/components/CopyToClipBoardBtn.svelte +92 -0
- package/src/ruvocal/src/lib/components/DeleteConversationModal.svelte +75 -0
- package/src/ruvocal/src/lib/components/EditConversationModal.svelte +100 -0
- package/src/ruvocal/src/lib/components/ExpandNavigation.svelte +22 -0
- package/src/ruvocal/src/lib/components/HoverTooltip.svelte +44 -0
- package/src/ruvocal/src/lib/components/HtmlPreviewModal.svelte +143 -0
- package/src/ruvocal/src/lib/components/InfiniteScroll.svelte +50 -0
- package/src/ruvocal/src/lib/components/MobileNav.svelte +300 -0
- package/src/ruvocal/src/lib/components/Modal.svelte +115 -0
- package/src/ruvocal/src/lib/components/ModelCardMetadata.svelte +71 -0
- package/src/ruvocal/src/lib/components/NavConversationItem.svelte +151 -0
- package/src/ruvocal/src/lib/components/NavMenu.svelte +295 -0
- package/src/ruvocal/src/lib/components/Pagination.svelte +97 -0
- package/src/ruvocal/src/lib/components/PaginationArrow.svelte +27 -0
- package/src/ruvocal/src/lib/components/Portal.svelte +24 -0
- package/src/ruvocal/src/lib/components/RetryBtn.svelte +18 -0
- package/src/ruvocal/src/lib/components/RuFloUniverse.svelte +185 -0
- package/src/ruvocal/src/lib/components/ScrollToBottomBtn.svelte +47 -0
- package/src/ruvocal/src/lib/components/ScrollToPreviousBtn.svelte +77 -0
- package/src/ruvocal/src/lib/components/ShareConversationModal.svelte +182 -0
- package/src/ruvocal/src/lib/components/StopGeneratingBtn.svelte +69 -0
- package/src/ruvocal/src/lib/components/SubscribeModal.svelte +87 -0
- package/src/ruvocal/src/lib/components/Switch.svelte +36 -0
- package/src/ruvocal/src/lib/components/SystemPromptModal.svelte +44 -0
- package/src/ruvocal/src/lib/components/Toast.svelte +27 -0
- package/src/ruvocal/src/lib/components/Tooltip.svelte +30 -0
- package/src/ruvocal/src/lib/components/WelcomeModal.svelte +46 -0
- package/src/ruvocal/src/lib/components/chat/Alternatives.svelte +77 -0
- package/src/ruvocal/src/lib/components/chat/BlockWrapper.svelte +72 -0
- package/src/ruvocal/src/lib/components/chat/ChatInput.svelte +490 -0
- package/src/ruvocal/src/lib/components/chat/ChatIntroduction.svelte +123 -0
- package/src/ruvocal/src/lib/components/chat/ChatMessage.svelte +548 -0
- package/src/ruvocal/src/lib/components/chat/ChatWindow.svelte +939 -0
- package/src/ruvocal/src/lib/components/chat/FileDropzone.svelte +92 -0
- package/src/ruvocal/src/lib/components/chat/ImageLightbox.svelte +66 -0
- package/src/ruvocal/src/lib/components/chat/MarkdownBlock.svelte +23 -0
- package/src/ruvocal/src/lib/components/chat/MarkdownRenderer.svelte +69 -0
- package/src/ruvocal/src/lib/components/chat/MarkdownRenderer.svelte.test.ts +58 -0
- package/src/ruvocal/src/lib/components/chat/MessageAvatar.svelte +103 -0
- package/src/ruvocal/src/lib/components/chat/ModelSwitch.svelte +64 -0
- package/src/ruvocal/src/lib/components/chat/OpenReasoningResults.svelte +81 -0
- package/src/ruvocal/src/lib/components/chat/TaskGroup.svelte +88 -0
- package/src/ruvocal/src/lib/components/chat/ToolUpdate.svelte +273 -0
- package/src/ruvocal/src/lib/components/chat/UploadedFile.svelte +253 -0
- package/src/ruvocal/src/lib/components/chat/UrlFetchModal.svelte +203 -0
- package/src/ruvocal/src/lib/components/chat/VoiceRecorder.svelte +214 -0
- package/src/ruvocal/src/lib/components/icons/IconBurger.svelte +20 -0
- package/src/ruvocal/src/lib/components/icons/IconCheap.svelte +20 -0
- package/src/ruvocal/src/lib/components/icons/IconChevron.svelte +24 -0
- package/src/ruvocal/src/lib/components/icons/IconDazzled.svelte +40 -0
- package/src/ruvocal/src/lib/components/icons/IconFast.svelte +20 -0
- package/src/ruvocal/src/lib/components/icons/IconLoading.svelte +22 -0
- package/src/ruvocal/src/lib/components/icons/IconMCP.svelte +28 -0
- package/src/ruvocal/src/lib/components/icons/IconMoon.svelte +21 -0
- package/src/ruvocal/src/lib/components/icons/IconNew.svelte +20 -0
- package/src/ruvocal/src/lib/components/icons/IconOmni.svelte +90 -0
- package/src/ruvocal/src/lib/components/icons/IconPaperclip.svelte +24 -0
- package/src/ruvocal/src/lib/components/icons/IconPro.svelte +37 -0
- package/src/ruvocal/src/lib/components/icons/IconShare.svelte +21 -0
- package/src/ruvocal/src/lib/components/icons/IconSun.svelte +93 -0
- package/src/ruvocal/src/lib/components/icons/Logo.svelte +68 -0
- package/src/ruvocal/src/lib/components/icons/LogoHuggingFaceBorderless.svelte +54 -0
- package/src/ruvocal/src/lib/components/mcp/AddServerForm.svelte +250 -0
- package/src/ruvocal/src/lib/components/mcp/MCPServerManager.svelte +185 -0
- package/src/ruvocal/src/lib/components/mcp/ServerCard.svelte +203 -0
- package/src/ruvocal/src/lib/components/players/AudioPlayer.svelte +82 -0
- package/src/ruvocal/src/lib/components/voice/AudioWaveform.svelte +96 -0
- package/src/ruvocal/src/lib/constants/mcpExamples.ts +135 -0
- package/src/ruvocal/src/lib/constants/mime.ts +11 -0
- package/src/ruvocal/src/lib/constants/pagination.ts +1 -0
- package/src/ruvocal/src/lib/constants/publicSepToken.ts +1 -0
- package/src/ruvocal/src/lib/constants/routerExamples.ts +209 -0
- package/src/ruvocal/src/lib/createShareLink.ts +27 -0
- package/src/ruvocal/src/lib/jobs/refresh-conversation-stats.ts +297 -0
- package/src/ruvocal/src/lib/migrations/lock.ts +56 -0
- package/src/ruvocal/src/lib/migrations/migrations.spec.ts +74 -0
- package/src/ruvocal/src/lib/migrations/migrations.ts +109 -0
- package/src/ruvocal/src/lib/migrations/routines/01-update-search-assistants.ts +50 -0
- package/src/ruvocal/src/lib/migrations/routines/02-update-assistants-models.ts +48 -0
- package/src/ruvocal/src/lib/migrations/routines/04-update-message-updates.ts +151 -0
- package/src/ruvocal/src/lib/migrations/routines/05-update-message-files.ts +56 -0
- package/src/ruvocal/src/lib/migrations/routines/06-trim-message-updates.ts +56 -0
- package/src/ruvocal/src/lib/migrations/routines/08-update-featured-to-review.ts +32 -0
- package/src/ruvocal/src/lib/migrations/routines/09-delete-empty-conversations.spec.ts +214 -0
- package/src/ruvocal/src/lib/migrations/routines/09-delete-empty-conversations.ts +88 -0
- package/src/ruvocal/src/lib/migrations/routines/10-update-reports-assistantid.ts +29 -0
- package/src/ruvocal/src/lib/migrations/routines/index.ts +15 -0
- package/src/ruvocal/src/lib/server/__tests__/conversation-stop-generating.spec.ts +103 -0
- package/src/ruvocal/src/lib/server/abortRegistry.ts +57 -0
- package/src/ruvocal/src/lib/server/abortedGenerations.ts +43 -0
- package/src/ruvocal/src/lib/server/adminToken.ts +62 -0
- package/src/ruvocal/src/lib/server/api/__tests__/conversations-id.spec.ts +296 -0
- package/src/ruvocal/src/lib/server/api/__tests__/conversations-message.spec.ts +216 -0
- package/src/ruvocal/src/lib/server/api/__tests__/conversations.spec.ts +235 -0
- package/src/ruvocal/src/lib/server/api/__tests__/misc.spec.ts +72 -0
- package/src/ruvocal/src/lib/server/api/__tests__/testHelpers.ts +86 -0
- package/src/ruvocal/src/lib/server/api/__tests__/user-reports.spec.ts +78 -0
- package/src/ruvocal/src/lib/server/api/__tests__/user.spec.ts +239 -0
- package/src/ruvocal/src/lib/server/api/types.ts +37 -0
- package/src/ruvocal/src/lib/server/api/utils/requireAuth.ts +22 -0
- package/src/ruvocal/src/lib/server/api/utils/resolveConversation.ts +69 -0
- package/src/ruvocal/src/lib/server/api/utils/resolveModel.ts +27 -0
- package/src/ruvocal/src/lib/server/api/utils/superjsonResponse.ts +15 -0
- package/src/ruvocal/src/lib/server/apiToken.ts +11 -0
- package/src/ruvocal/src/lib/server/auth.ts +554 -0
- package/src/ruvocal/src/lib/server/config.ts +187 -0
- package/src/ruvocal/src/lib/server/conversation.ts +83 -0
- package/src/ruvocal/src/lib/server/database/__tests__/rvf.spec.ts +709 -0
- package/src/ruvocal/src/lib/server/database/postgres.ts +700 -0
- package/src/ruvocal/src/lib/server/database/rvf.ts +1078 -0
- package/src/ruvocal/src/lib/server/database.ts +145 -0
- package/src/ruvocal/src/lib/server/endpoints/document.ts +68 -0
- package/src/ruvocal/src/lib/server/endpoints/endpoints.ts +43 -0
- package/src/ruvocal/src/lib/server/endpoints/images.ts +211 -0
- package/src/ruvocal/src/lib/server/endpoints/openai/endpointOai.ts +266 -0
- package/src/ruvocal/src/lib/server/endpoints/openai/openAIChatToTextGenerationStream.ts +212 -0
- package/src/ruvocal/src/lib/server/endpoints/openai/openAICompletionToTextGenerationStream.ts +32 -0
- package/src/ruvocal/src/lib/server/endpoints/preprocessMessages.ts +61 -0
- package/src/ruvocal/src/lib/server/exitHandler.ts +59 -0
- package/src/ruvocal/src/lib/server/files/downloadFile.ts +34 -0
- package/src/ruvocal/src/lib/server/files/uploadFile.ts +29 -0
- package/src/ruvocal/src/lib/server/findRepoRoot.ts +13 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-Black.ttf +0 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-Bold.ttf +0 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-ExtraBold.ttf +0 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-ExtraLight.ttf +0 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-Light.ttf +0 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-Medium.ttf +0 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-Regular.ttf +0 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-SemiBold.ttf +0 -0
- package/src/ruvocal/src/lib/server/fonts/Inter-Thin.ttf +0 -0
- package/src/ruvocal/src/lib/server/generateFromDefaultEndpoint.ts +46 -0
- package/src/ruvocal/src/lib/server/hooks/error.ts +37 -0
- package/src/ruvocal/src/lib/server/hooks/fetch.ts +22 -0
- package/src/ruvocal/src/lib/server/hooks/handle.ts +250 -0
- package/src/ruvocal/src/lib/server/hooks/init.ts +51 -0
- package/src/ruvocal/src/lib/server/isURLLocal.spec.ts +31 -0
- package/src/ruvocal/src/lib/server/isURLLocal.ts +74 -0
- package/src/ruvocal/src/lib/server/logger.ts +42 -0
- package/src/ruvocal/src/lib/server/mcp/clientPool.ts +70 -0
- package/src/ruvocal/src/lib/server/mcp/hf.ts +32 -0
- package/src/ruvocal/src/lib/server/mcp/httpClient.ts +122 -0
- package/src/ruvocal/src/lib/server/mcp/registry.ts +76 -0
- package/src/ruvocal/src/lib/server/mcp/tools.ts +196 -0
- package/src/ruvocal/src/lib/server/metrics.ts +255 -0
- package/src/ruvocal/src/lib/server/models.ts +518 -0
- package/src/ruvocal/src/lib/server/requestContext.ts +55 -0
- package/src/ruvocal/src/lib/server/router/arch.ts +230 -0
- package/src/ruvocal/src/lib/server/router/endpoint.ts +316 -0
- package/src/ruvocal/src/lib/server/router/multimodal.ts +28 -0
- package/src/ruvocal/src/lib/server/router/policy.ts +49 -0
- package/src/ruvocal/src/lib/server/router/toolsRoute.ts +51 -0
- package/src/ruvocal/src/lib/server/router/types.ts +21 -0
- package/src/ruvocal/src/lib/server/sendSlack.ts +23 -0
- package/src/ruvocal/src/lib/server/textGeneration/generate.ts +258 -0
- package/src/ruvocal/src/lib/server/textGeneration/index.ts +95 -0
- package/src/ruvocal/src/lib/server/textGeneration/mcp/fileRefs.ts +155 -0
- package/src/ruvocal/src/lib/server/textGeneration/mcp/routerResolution.ts +108 -0
- package/src/ruvocal/src/lib/server/textGeneration/mcp/runMcpFlow.ts +822 -0
- package/src/ruvocal/src/lib/server/textGeneration/mcp/toolInvocation.ts +349 -0
- package/src/ruvocal/src/lib/server/textGeneration/reasoning.ts +23 -0
- package/src/ruvocal/src/lib/server/textGeneration/title.ts +83 -0
- package/src/ruvocal/src/lib/server/textGeneration/types.ts +26 -0
- package/src/ruvocal/src/lib/server/textGeneration/utils/prepareFiles.ts +88 -0
- package/src/ruvocal/src/lib/server/textGeneration/utils/routing.ts +21 -0
- package/src/ruvocal/src/lib/server/textGeneration/utils/toolPrompt.ts +49 -0
- package/src/ruvocal/src/lib/server/urlSafety.ts +72 -0
- package/src/ruvocal/src/lib/server/usageLimits.ts +30 -0
- package/src/ruvocal/src/lib/stores/autopilotStore.svelte.ts +175 -0
- package/src/ruvocal/src/lib/stores/backgroundGenerations.svelte.ts +32 -0
- package/src/ruvocal/src/lib/stores/backgroundGenerations.ts +1 -0
- package/src/ruvocal/src/lib/stores/errors.ts +9 -0
- package/src/ruvocal/src/lib/stores/isAborted.ts +3 -0
- package/src/ruvocal/src/lib/stores/isPro.ts +4 -0
- package/src/ruvocal/src/lib/stores/loading.ts +3 -0
- package/src/ruvocal/src/lib/stores/mcpServers.ts +345 -0
- package/src/ruvocal/src/lib/stores/pendingChatInput.ts +3 -0
- package/src/ruvocal/src/lib/stores/pendingMessage.ts +9 -0
- package/src/ruvocal/src/lib/stores/settings.ts +182 -0
- package/src/ruvocal/src/lib/stores/shareModal.ts +13 -0
- package/src/ruvocal/src/lib/stores/titleUpdate.ts +8 -0
- package/src/ruvocal/src/lib/switchTheme.ts +124 -0
- package/src/ruvocal/src/lib/types/AbortedGeneration.ts +8 -0
- package/src/ruvocal/src/lib/types/Assistant.ts +31 -0
- package/src/ruvocal/src/lib/types/AssistantStats.ts +11 -0
- package/src/ruvocal/src/lib/types/ConfigKey.ts +4 -0
- package/src/ruvocal/src/lib/types/ConvSidebar.ts +9 -0
- package/src/ruvocal/src/lib/types/Conversation.ts +27 -0
- package/src/ruvocal/src/lib/types/ConversationStats.ts +13 -0
- package/src/ruvocal/src/lib/types/Message.ts +41 -0
- package/src/ruvocal/src/lib/types/MessageEvent.ts +10 -0
- package/src/ruvocal/src/lib/types/MessageUpdate.ts +139 -0
- package/src/ruvocal/src/lib/types/MigrationResult.ts +7 -0
- package/src/ruvocal/src/lib/types/Model.ts +23 -0
- package/src/ruvocal/src/lib/types/Report.ts +12 -0
- package/src/ruvocal/src/lib/types/Review.ts +6 -0
- package/src/ruvocal/src/lib/types/Semaphore.ts +19 -0
- package/src/ruvocal/src/lib/types/Session.ts +22 -0
- package/src/ruvocal/src/lib/types/Settings.ts +86 -0
- package/src/ruvocal/src/lib/types/SharedConversation.ts +9 -0
- package/src/ruvocal/src/lib/types/Template.ts +6 -0
- package/src/ruvocal/src/lib/types/Timestamps.ts +4 -0
- package/src/ruvocal/src/lib/types/TokenCache.ts +6 -0
- package/src/ruvocal/src/lib/types/Tool.ts +74 -0
- package/src/ruvocal/src/lib/types/UrlDependency.ts +5 -0
- package/src/ruvocal/src/lib/types/User.ts +14 -0
- package/src/ruvocal/src/lib/utils/PublicConfig.svelte.ts +75 -0
- package/src/ruvocal/src/lib/utils/auth.ts +17 -0
- package/src/ruvocal/src/lib/utils/chunk.ts +33 -0
- package/src/ruvocal/src/lib/utils/cookiesAreEnabled.ts +13 -0
- package/src/ruvocal/src/lib/utils/debounce.ts +17 -0
- package/src/ruvocal/src/lib/utils/deepestChild.ts +6 -0
- package/src/ruvocal/src/lib/utils/favicon.ts +21 -0
- package/src/ruvocal/src/lib/utils/fetchJSON.ts +23 -0
- package/src/ruvocal/src/lib/utils/file2base64.ts +14 -0
- package/src/ruvocal/src/lib/utils/formatUserCount.ts +37 -0
- package/src/ruvocal/src/lib/utils/generationState.spec.ts +75 -0
- package/src/ruvocal/src/lib/utils/generationState.ts +26 -0
- package/src/ruvocal/src/lib/utils/getHref.ts +41 -0
- package/src/ruvocal/src/lib/utils/getReturnFromGenerator.ts +7 -0
- package/src/ruvocal/src/lib/utils/haptics.ts +64 -0
- package/src/ruvocal/src/lib/utils/hashConv.ts +12 -0
- package/src/ruvocal/src/lib/utils/hf.ts +17 -0
- package/src/ruvocal/src/lib/utils/isDesktop.ts +7 -0
- package/src/ruvocal/src/lib/utils/isUrl.ts +8 -0
- package/src/ruvocal/src/lib/utils/isVirtualKeyboard.ts +16 -0
- package/src/ruvocal/src/lib/utils/loadAttachmentsFromUrls.ts +115 -0
- package/src/ruvocal/src/lib/utils/marked.spec.ts +96 -0
- package/src/ruvocal/src/lib/utils/marked.ts +531 -0
- package/src/ruvocal/src/lib/utils/mcpValidation.ts +147 -0
- package/src/ruvocal/src/lib/utils/mergeAsyncGenerators.ts +38 -0
- package/src/ruvocal/src/lib/utils/messageUpdates.spec.ts +262 -0
- package/src/ruvocal/src/lib/utils/messageUpdates.ts +324 -0
- package/src/ruvocal/src/lib/utils/mime.ts +56 -0
- package/src/ruvocal/src/lib/utils/models.ts +14 -0
- package/src/ruvocal/src/lib/utils/parseBlocks.ts +120 -0
- package/src/ruvocal/src/lib/utils/parseIncompleteMarkdown.ts +644 -0
- package/src/ruvocal/src/lib/utils/parseStringToList.ts +10 -0
- package/src/ruvocal/src/lib/utils/randomUuid.ts +14 -0
- package/src/ruvocal/src/lib/utils/searchTokens.ts +33 -0
- package/src/ruvocal/src/lib/utils/sha256.ts +7 -0
- package/src/ruvocal/src/lib/utils/stringifyError.ts +12 -0
- package/src/ruvocal/src/lib/utils/sum.ts +3 -0
- package/src/ruvocal/src/lib/utils/template.spec.ts +59 -0
- package/src/ruvocal/src/lib/utils/template.ts +53 -0
- package/src/ruvocal/src/lib/utils/timeout.ts +9 -0
- package/src/ruvocal/src/lib/utils/toolProgress.spec.ts +46 -0
- package/src/ruvocal/src/lib/utils/toolProgress.ts +11 -0
- package/src/ruvocal/src/lib/utils/tree/addChildren.spec.ts +102 -0
- package/src/ruvocal/src/lib/utils/tree/addChildren.ts +48 -0
- package/src/ruvocal/src/lib/utils/tree/addSibling.spec.ts +81 -0
- package/src/ruvocal/src/lib/utils/tree/addSibling.ts +41 -0
- package/src/ruvocal/src/lib/utils/tree/buildSubtree.spec.ts +110 -0
- package/src/ruvocal/src/lib/utils/tree/buildSubtree.ts +24 -0
- package/src/ruvocal/src/lib/utils/tree/convertLegacyConversation.spec.ts +31 -0
- package/src/ruvocal/src/lib/utils/tree/convertLegacyConversation.ts +36 -0
- package/src/ruvocal/src/lib/utils/tree/isMessageId.spec.ts +15 -0
- package/src/ruvocal/src/lib/utils/tree/isMessageId.ts +5 -0
- package/src/ruvocal/src/lib/utils/tree/tree.d.ts +14 -0
- package/src/ruvocal/src/lib/utils/tree/treeHelpers.spec.ts +167 -0
- package/src/ruvocal/src/lib/utils/updates.ts +39 -0
- package/src/ruvocal/src/lib/utils/urlParams.ts +13 -0
- package/src/ruvocal/src/lib/workers/autopilotWorker.ts +221 -0
- package/src/ruvocal/src/lib/workers/detailFetchWorker.ts +100 -0
- package/src/ruvocal/src/lib/workers/markdownWorker.ts +61 -0
- package/src/ruvocal/src/routes/+error.svelte +20 -0
- package/src/ruvocal/src/routes/+layout.svelte +324 -0
- package/src/ruvocal/src/routes/+layout.ts +91 -0
- package/src/ruvocal/src/routes/+page.svelte +168 -0
- package/src/ruvocal/src/routes/.well-known/oauth-cimd/+server.ts +37 -0
- package/src/ruvocal/src/routes/__debug/openai/+server.ts +21 -0
- package/src/ruvocal/src/routes/admin/export/+server.ts +159 -0
- package/src/ruvocal/src/routes/admin/stats/compute/+server.ts +16 -0
- package/src/ruvocal/src/routes/api/conversation/[id]/+server.ts +40 -0
- package/src/ruvocal/src/routes/api/conversation/[id]/message/[messageId]/+server.ts +42 -0
- package/src/ruvocal/src/routes/api/conversations/+server.ts +48 -0
- package/src/ruvocal/src/routes/api/fetch-url/+server.ts +147 -0
- package/src/ruvocal/src/routes/api/mcp/health/+server.ts +292 -0
- package/src/ruvocal/src/routes/api/mcp/servers/+server.ts +32 -0
- package/src/ruvocal/src/routes/api/models/+server.ts +25 -0
- package/src/ruvocal/src/routes/api/transcribe/+server.ts +104 -0
- package/src/ruvocal/src/routes/api/user/+server.ts +15 -0
- package/src/ruvocal/src/routes/api/user/validate-token/+server.ts +20 -0
- package/src/ruvocal/src/routes/api/v2/conversations/+server.ts +48 -0
- package/src/ruvocal/src/routes/api/v2/conversations/[id]/+server.ts +94 -0
- package/src/ruvocal/src/routes/api/v2/conversations/[id]/message/[messageId]/+server.ts +43 -0
- package/src/ruvocal/src/routes/api/v2/conversations/import-share/+server.ts +23 -0
- package/src/ruvocal/src/routes/api/v2/debug/config/+server.ts +16 -0
- package/src/ruvocal/src/routes/api/v2/debug/refresh/+server.ts +30 -0
- package/src/ruvocal/src/routes/api/v2/export/+server.ts +196 -0
- package/src/ruvocal/src/routes/api/v2/feature-flags/+server.ts +14 -0
- package/src/ruvocal/src/routes/api/v2/models/+server.ts +38 -0
- package/src/ruvocal/src/routes/api/v2/models/[namespace]/+server.ts +8 -0
- package/src/ruvocal/src/routes/api/v2/models/[namespace]/[model]/+server.ts +8 -0
- package/src/ruvocal/src/routes/api/v2/models/[namespace]/[model]/subscribe/+server.ts +28 -0
- package/src/ruvocal/src/routes/api/v2/models/[namespace]/subscribe/+server.ts +28 -0
- package/src/ruvocal/src/routes/api/v2/models/old/+server.ts +7 -0
- package/src/ruvocal/src/routes/api/v2/models/refresh/+server.ts +33 -0
- package/src/ruvocal/src/routes/api/v2/public-config/+server.ts +7 -0
- package/src/ruvocal/src/routes/api/v2/user/+server.ts +17 -0
- package/src/ruvocal/src/routes/api/v2/user/billing-orgs/+server.ts +73 -0
- package/src/ruvocal/src/routes/api/v2/user/reports/+server.ts +17 -0
- package/src/ruvocal/src/routes/api/v2/user/settings/+server.ts +103 -0
- package/src/ruvocal/src/routes/conversation/+server.ts +115 -0
- package/src/ruvocal/src/routes/conversation/[id]/+page.svelte +582 -0
- package/src/ruvocal/src/routes/conversation/[id]/+page.ts +60 -0
- package/src/ruvocal/src/routes/conversation/[id]/+server.ts +736 -0
- package/src/ruvocal/src/routes/conversation/[id]/message/[messageId]/prompt/+server.ts +66 -0
- package/src/ruvocal/src/routes/conversation/[id]/output/[sha256]/+server.ts +58 -0
- package/src/ruvocal/src/routes/conversation/[id]/share/+server.ts +69 -0
- package/src/ruvocal/src/routes/conversation/[id]/stop-generating/+server.ts +35 -0
- package/src/ruvocal/src/routes/healthcheck/+server.ts +3 -0
- package/src/ruvocal/src/routes/login/+server.ts +5 -0
- package/src/ruvocal/src/routes/login/callback/+server.ts +103 -0
- package/src/ruvocal/src/routes/login/callback/updateUser.spec.ts +157 -0
- package/src/ruvocal/src/routes/login/callback/updateUser.ts +215 -0
- package/src/ruvocal/src/routes/logout/+server.ts +18 -0
- package/src/ruvocal/src/routes/metrics/+server.ts +18 -0
- package/src/ruvocal/src/routes/models/+page.svelte +233 -0
- package/src/ruvocal/src/routes/models/[...model]/+page.svelte +161 -0
- package/src/ruvocal/src/routes/models/[...model]/+page.ts +14 -0
- package/src/ruvocal/src/routes/models/[...model]/thumbnail.png/+server.ts +64 -0
- package/src/ruvocal/src/routes/models/[...model]/thumbnail.png/ModelThumbnail.svelte +28 -0
- package/src/ruvocal/src/routes/privacy/+page.svelte +11 -0
- package/src/ruvocal/src/routes/r/[id]/+page.ts +34 -0
- package/src/ruvocal/src/routes/settings/(nav)/+layout.svelte +282 -0
- package/src/ruvocal/src/routes/settings/(nav)/+layout.ts +1 -0
- package/src/ruvocal/src/routes/settings/(nav)/+page.svelte +0 -0
- package/src/ruvocal/src/routes/settings/(nav)/+server.ts +53 -0
- package/src/ruvocal/src/routes/settings/(nav)/[...model]/+page.svelte +464 -0
- package/src/ruvocal/src/routes/settings/(nav)/[...model]/+page.ts +14 -0
- package/src/ruvocal/src/routes/settings/(nav)/application/+page.svelte +362 -0
- package/src/ruvocal/src/routes/settings/+layout.svelte +40 -0
- package/src/ruvocal/src/styles/highlight-js.css +195 -0
- package/src/ruvocal/src/styles/main.css +144 -0
- package/src/ruvocal/static/chatui/apple-touch-icon.png +0 -0
- package/src/ruvocal/static/chatui/favicon-dark.svg +3 -0
- package/src/ruvocal/static/chatui/favicon-dev.svg +3 -0
- package/src/ruvocal/static/chatui/favicon.ico +0 -0
- package/src/ruvocal/static/chatui/favicon.svg +3 -0
- package/src/ruvocal/static/chatui/icon-128x128.png +0 -0
- package/src/ruvocal/static/chatui/icon-144x144.png +0 -0
- package/src/ruvocal/static/chatui/icon-192x192.png +0 -0
- package/src/ruvocal/static/chatui/icon-256x256.png +0 -0
- package/src/ruvocal/static/chatui/icon-36x36.png +0 -0
- package/src/ruvocal/static/chatui/icon-48x48.png +0 -0
- package/src/ruvocal/static/chatui/icon-512x512.png +0 -0
- package/src/ruvocal/static/chatui/icon-72x72.png +0 -0
- package/src/ruvocal/static/chatui/icon-96x96.png +0 -0
- package/src/ruvocal/static/chatui/icon.svg +3 -0
- package/src/ruvocal/static/chatui/logo.svg +7 -0
- package/src/ruvocal/static/chatui/manifest.json +54 -0
- package/src/ruvocal/static/chatui/omni-welcome.gif +0 -0
- package/src/ruvocal/static/chatui/omni-welcome.png +0 -0
- package/src/ruvocal/static/chatui/welcome.js +184 -0
- package/src/ruvocal/static/chatui/welcome.svg +1 -0
- package/src/ruvocal/static/huggingchat/apple-touch-icon.png +0 -0
- package/src/ruvocal/static/huggingchat/assistants-thumbnail.png +0 -0
- package/src/ruvocal/static/huggingchat/castle-example.jpg +0 -0
- package/src/ruvocal/static/huggingchat/favicon-dark.svg +4 -0
- package/src/ruvocal/static/huggingchat/favicon-dev.svg +4 -0
- package/src/ruvocal/static/huggingchat/favicon.ico +0 -0
- package/src/ruvocal/static/huggingchat/favicon.svg +4 -0
- package/src/ruvocal/static/huggingchat/fulltext-logo.svg +2 -0
- package/src/ruvocal/static/huggingchat/icon-128x128.png +0 -0
- package/src/ruvocal/static/huggingchat/icon-144x144.png +0 -0
- package/src/ruvocal/static/huggingchat/icon-192x192.png +0 -0
- package/src/ruvocal/static/huggingchat/icon-256x256.png +0 -0
- package/src/ruvocal/static/huggingchat/icon-36x36.png +0 -0
- package/src/ruvocal/static/huggingchat/icon-48x48.png +0 -0
- package/src/ruvocal/static/huggingchat/icon-512x512.png +0 -0
- package/src/ruvocal/static/huggingchat/icon-72x72.png +0 -0
- package/src/ruvocal/static/huggingchat/icon-96x96.png +0 -0
- package/src/ruvocal/static/huggingchat/icon.svg +4 -0
- package/src/ruvocal/static/huggingchat/logo.svg +4 -0
- package/src/ruvocal/static/huggingchat/manifest.json +54 -0
- package/src/ruvocal/static/huggingchat/omni-welcome.gif +0 -0
- package/src/ruvocal/static/huggingchat/routes.chat.json +226 -0
- package/src/ruvocal/static/huggingchat/thumbnail.png +0 -0
- package/src/ruvocal/static/huggingchat/tools-thumbnail.png +0 -0
- package/src/ruvocal/static/robots.txt +10 -0
- package/src/ruvocal/stub/@reflink/reflink/index.js +0 -0
- package/src/ruvocal/stub/@reflink/reflink/package.json +5 -0
- package/src/ruvocal/svelte.config.js +53 -0
- package/src/ruvocal/tailwind.config.cjs +30 -0
- package/src/ruvocal/tsconfig.json +19 -0
- package/src/ruvocal/vite.config.ts +87 -0
- package/src/scripts/deploy.sh +116 -0
- package/src/scripts/generate-config.js +245 -0
- package/src/scripts/generate-welcome.js +187 -0
- package/src/scripts/package-rvf.sh +116 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuVocal Database — self-contained RVF document store.
|
|
3
|
+
*
|
|
4
|
+
* Zero external dependencies. All data persisted to a single
|
|
5
|
+
* RVF JSON file on disk. MongoDB Collection interface preserved
|
|
6
|
+
* so all 56 importing files work unchanged.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Conversation } from "$lib/types/Conversation";
|
|
10
|
+
import type { SharedConversation } from "$lib/types/SharedConversation";
|
|
11
|
+
import type { AbortedGeneration } from "$lib/types/AbortedGeneration";
|
|
12
|
+
import type { Settings } from "$lib/types/Settings";
|
|
13
|
+
import type { User } from "$lib/types/User";
|
|
14
|
+
import type { MessageEvent } from "$lib/types/MessageEvent";
|
|
15
|
+
import type { Session } from "$lib/types/Session";
|
|
16
|
+
import type { Assistant } from "$lib/types/Assistant";
|
|
17
|
+
import type { Report } from "$lib/types/Report";
|
|
18
|
+
import type { ConversationStats } from "$lib/types/ConversationStats";
|
|
19
|
+
import type { MigrationResult } from "$lib/types/MigrationResult";
|
|
20
|
+
import type { Semaphore } from "$lib/types/Semaphore";
|
|
21
|
+
import type { AssistantStats } from "$lib/types/AssistantStats";
|
|
22
|
+
import type { TokenCache } from "$lib/types/TokenCache";
|
|
23
|
+
import type { ConfigKey } from "$lib/types/ConfigKey";
|
|
24
|
+
|
|
25
|
+
import { building } from "$app/environment";
|
|
26
|
+
import { onExit } from "./exitHandler";
|
|
27
|
+
import { join, dirname } from "path";
|
|
28
|
+
import { fileURLToPath } from "url";
|
|
29
|
+
import { existsSync, mkdirSync } from "fs";
|
|
30
|
+
|
|
31
|
+
import {
|
|
32
|
+
RvfCollection,
|
|
33
|
+
RvfGridFSBucket,
|
|
34
|
+
initRvfStore,
|
|
35
|
+
flushToDisk,
|
|
36
|
+
} from "./database/rvf";
|
|
37
|
+
|
|
38
|
+
export const CONVERSATION_STATS_COLLECTION = "conversations.stats";
|
|
39
|
+
|
|
40
|
+
export class Database {
|
|
41
|
+
private static instance: Database;
|
|
42
|
+
private initialized = false;
|
|
43
|
+
|
|
44
|
+
private async init() {
|
|
45
|
+
const dbFolder =
|
|
46
|
+
process.env.RVF_DB_PATH ||
|
|
47
|
+
join(dirname(fileURLToPath(import.meta.url)), "../../../db");
|
|
48
|
+
|
|
49
|
+
if (!existsSync(dbFolder)) {
|
|
50
|
+
mkdirSync(dbFolder, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const dbPath = join(dbFolder, "ruvocal.rvf.json");
|
|
54
|
+
|
|
55
|
+
console.log(`[RuVocal] Database: ${dbPath}`);
|
|
56
|
+
initRvfStore(dbPath);
|
|
57
|
+
this.initialized = true;
|
|
58
|
+
|
|
59
|
+
// Flush to disk on exit
|
|
60
|
+
onExit(async () => {
|
|
61
|
+
console.log("[RuVocal] Flushing database to disk");
|
|
62
|
+
flushToDisk();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public static async getInstance(): Promise<Database> {
|
|
67
|
+
if (!Database.instance) {
|
|
68
|
+
Database.instance = new Database();
|
|
69
|
+
await Database.instance.init();
|
|
70
|
+
}
|
|
71
|
+
return Database.instance;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public getClient() {
|
|
75
|
+
if (!this.initialized) {
|
|
76
|
+
throw new Error("Database not initialized");
|
|
77
|
+
}
|
|
78
|
+
return {}; // No external client — self-contained
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public getCollections() {
|
|
82
|
+
if (!this.initialized) {
|
|
83
|
+
throw new Error("Database not initialized");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const conversations = new RvfCollection<Conversation>("conversations");
|
|
87
|
+
const settings = new RvfCollection<Settings>("settings");
|
|
88
|
+
const users = new RvfCollection<User>("users");
|
|
89
|
+
const sessions = new RvfCollection<Session>("sessions");
|
|
90
|
+
const messageEvents = new RvfCollection<MessageEvent>("messageEvents");
|
|
91
|
+
const abortedGenerations = new RvfCollection<AbortedGeneration>("abortedGenerations");
|
|
92
|
+
const semaphores = new RvfCollection<Semaphore>("semaphores");
|
|
93
|
+
const tokenCaches = new RvfCollection<TokenCache>("tokens");
|
|
94
|
+
const configCollection = new RvfCollection<ConfigKey>("config");
|
|
95
|
+
const migrationResults = new RvfCollection<MigrationResult>("migrationResults");
|
|
96
|
+
const sharedConversations = new RvfCollection<SharedConversation>("sharedConversations");
|
|
97
|
+
const assistants = new RvfCollection<Assistant>("assistants");
|
|
98
|
+
const assistantStats = new RvfCollection<AssistantStats>("assistants.stats");
|
|
99
|
+
const conversationStats = new RvfCollection<ConversationStats>(CONVERSATION_STATS_COLLECTION);
|
|
100
|
+
const reports = new RvfCollection<Report>("reports");
|
|
101
|
+
const tools = new RvfCollection<Record<string, unknown>>("tools");
|
|
102
|
+
const bucket = new RvfGridFSBucket();
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
conversations,
|
|
106
|
+
conversationStats,
|
|
107
|
+
assistants,
|
|
108
|
+
assistantStats,
|
|
109
|
+
reports,
|
|
110
|
+
sharedConversations,
|
|
111
|
+
abortedGenerations,
|
|
112
|
+
settings,
|
|
113
|
+
users,
|
|
114
|
+
sessions,
|
|
115
|
+
messageEvents,
|
|
116
|
+
bucket,
|
|
117
|
+
migrationResults,
|
|
118
|
+
semaphores,
|
|
119
|
+
tokenCaches,
|
|
120
|
+
tools,
|
|
121
|
+
config: configCollection,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export let collections: ReturnType<typeof Database.prototype.getCollections>;
|
|
127
|
+
|
|
128
|
+
export const ready = (async () => {
|
|
129
|
+
if (!building) {
|
|
130
|
+
const db = await Database.getInstance();
|
|
131
|
+
collections = db.getCollections();
|
|
132
|
+
} else {
|
|
133
|
+
collections = {} as unknown as ReturnType<typeof Database.prototype.getCollections>;
|
|
134
|
+
}
|
|
135
|
+
})();
|
|
136
|
+
|
|
137
|
+
export async function getCollectionsEarly(): Promise<
|
|
138
|
+
ReturnType<typeof Database.prototype.getCollections>
|
|
139
|
+
> {
|
|
140
|
+
await ready;
|
|
141
|
+
if (!collections) {
|
|
142
|
+
throw new Error("Database not initialized");
|
|
143
|
+
}
|
|
144
|
+
return collections;
|
|
145
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { MessageFile } from "$lib/types/Message";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
export interface FileProcessorOptions<TMimeType extends string = string> {
|
|
5
|
+
supportedMimeTypes: TMimeType[];
|
|
6
|
+
maxSizeInMB: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// Removed unused ImageProcessor type alias
|
|
10
|
+
|
|
11
|
+
export const createDocumentProcessorOptionsValidator = <TMimeType extends string = string>(
|
|
12
|
+
defaults: FileProcessorOptions<TMimeType>
|
|
13
|
+
) => {
|
|
14
|
+
return z
|
|
15
|
+
.object({
|
|
16
|
+
supportedMimeTypes: z
|
|
17
|
+
.array(
|
|
18
|
+
z.enum<string, [TMimeType, ...TMimeType[]]>([
|
|
19
|
+
defaults.supportedMimeTypes[0],
|
|
20
|
+
...defaults.supportedMimeTypes.slice(1),
|
|
21
|
+
])
|
|
22
|
+
)
|
|
23
|
+
.default(defaults.supportedMimeTypes),
|
|
24
|
+
maxSizeInMB: z.number().positive().default(defaults.maxSizeInMB),
|
|
25
|
+
})
|
|
26
|
+
.default(defaults);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// Removed unused DocumentProcessor type alias
|
|
30
|
+
|
|
31
|
+
export type AsyncDocumentProcessor<TMimeType extends string = string> = (
|
|
32
|
+
file: MessageFile
|
|
33
|
+
) => Promise<{
|
|
34
|
+
file: Buffer;
|
|
35
|
+
mime: TMimeType;
|
|
36
|
+
}>;
|
|
37
|
+
|
|
38
|
+
export function makeDocumentProcessor<TMimeType extends string = string>(
|
|
39
|
+
options: FileProcessorOptions<TMimeType>
|
|
40
|
+
): AsyncDocumentProcessor<TMimeType> {
|
|
41
|
+
return async (file) => {
|
|
42
|
+
const { supportedMimeTypes, maxSizeInMB } = options;
|
|
43
|
+
const { mime, value } = file;
|
|
44
|
+
|
|
45
|
+
const buffer = Buffer.from(value, "base64");
|
|
46
|
+
const tooLargeInBytes = buffer.byteLength > maxSizeInMB * 1000 * 1000;
|
|
47
|
+
|
|
48
|
+
if (tooLargeInBytes) {
|
|
49
|
+
throw Error("Document is too large");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const outputMime = validateMimeType(supportedMimeTypes, mime);
|
|
53
|
+
return { file: buffer, mime: outputMime };
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const validateMimeType = <T extends readonly string[]>(
|
|
58
|
+
supportedMimes: T,
|
|
59
|
+
mime: string
|
|
60
|
+
): T[number] => {
|
|
61
|
+
if (!supportedMimes.includes(mime)) {
|
|
62
|
+
const supportedMimesStr = supportedMimes.join(", ");
|
|
63
|
+
|
|
64
|
+
throw Error(`Mimetype "${mime}" not found in supported mimes: ${supportedMimesStr}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return mime;
|
|
68
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Conversation } from "$lib/types/Conversation";
|
|
2
|
+
import type { Message } from "$lib/types/Message";
|
|
3
|
+
import type {
|
|
4
|
+
TextGenerationStreamOutput,
|
|
5
|
+
TextGenerationStreamToken,
|
|
6
|
+
InferenceProvider,
|
|
7
|
+
} from "@huggingface/inference";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { endpointOAIParametersSchema, endpointOai } from "./openai/endpointOai";
|
|
10
|
+
import type { Model } from "$lib/types/Model";
|
|
11
|
+
import type { ObjectId } from "mongodb";
|
|
12
|
+
|
|
13
|
+
export type EndpointMessage = Omit<Message, "id">;
|
|
14
|
+
|
|
15
|
+
// parameters passed when generating text
|
|
16
|
+
export interface EndpointParameters {
|
|
17
|
+
messages: EndpointMessage[];
|
|
18
|
+
preprompt?: Conversation["preprompt"];
|
|
19
|
+
generateSettings?: Partial<Model["parameters"]>;
|
|
20
|
+
isMultimodal?: boolean;
|
|
21
|
+
conversationId?: ObjectId;
|
|
22
|
+
locals: App.Locals | undefined;
|
|
23
|
+
abortSignal?: AbortSignal;
|
|
24
|
+
/** Inference provider preference: "auto", "fastest", "cheapest", or a specific provider name */
|
|
25
|
+
provider?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type TextGenerationStreamOutputSimplified = TextGenerationStreamOutput & {
|
|
29
|
+
token: TextGenerationStreamToken;
|
|
30
|
+
routerMetadata?: { route?: string; model?: string; provider?: InferenceProvider };
|
|
31
|
+
};
|
|
32
|
+
// type signature for the endpoint
|
|
33
|
+
export type Endpoint = (
|
|
34
|
+
params: EndpointParameters
|
|
35
|
+
) => Promise<AsyncGenerator<TextGenerationStreamOutputSimplified, void, void>>;
|
|
36
|
+
|
|
37
|
+
// list of all endpoint generators
|
|
38
|
+
export const endpoints = {
|
|
39
|
+
openai: endpointOai,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const endpointSchema = z.discriminatedUnion("type", [endpointOAIParametersSchema]);
|
|
43
|
+
export default endpoints;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import type { Sharp } from "sharp";
|
|
2
|
+
import sharp from "sharp";
|
|
3
|
+
import type { MessageFile } from "$lib/types/Message";
|
|
4
|
+
import { z, type util } from "zod";
|
|
5
|
+
|
|
6
|
+
export interface ImageProcessorOptions<TMimeType extends string = string> {
|
|
7
|
+
supportedMimeTypes: TMimeType[];
|
|
8
|
+
preferredMimeType: TMimeType;
|
|
9
|
+
maxSizeInMB: number;
|
|
10
|
+
maxWidth: number;
|
|
11
|
+
maxHeight: number;
|
|
12
|
+
}
|
|
13
|
+
export type ImageProcessor<TMimeType extends string = string> = (file: MessageFile) => Promise<{
|
|
14
|
+
image: Buffer;
|
|
15
|
+
mime: TMimeType;
|
|
16
|
+
}>;
|
|
17
|
+
|
|
18
|
+
export function createImageProcessorOptionsValidator<TMimeType extends string = string>(
|
|
19
|
+
defaults: ImageProcessorOptions<TMimeType>
|
|
20
|
+
) {
|
|
21
|
+
return z
|
|
22
|
+
.object({
|
|
23
|
+
supportedMimeTypes: z
|
|
24
|
+
.array(
|
|
25
|
+
z.enum<string, [TMimeType, ...TMimeType[]]>([
|
|
26
|
+
defaults.supportedMimeTypes[0],
|
|
27
|
+
...defaults.supportedMimeTypes.slice(1),
|
|
28
|
+
])
|
|
29
|
+
)
|
|
30
|
+
.default(defaults.supportedMimeTypes),
|
|
31
|
+
preferredMimeType: z
|
|
32
|
+
.enum([defaults.supportedMimeTypes[0], ...defaults.supportedMimeTypes.slice(1)])
|
|
33
|
+
.default(defaults.preferredMimeType as util.noUndefined<TMimeType>),
|
|
34
|
+
maxSizeInMB: z.number().positive().default(defaults.maxSizeInMB),
|
|
35
|
+
maxWidth: z.number().int().positive().default(defaults.maxWidth),
|
|
36
|
+
maxHeight: z.number().int().positive().default(defaults.maxHeight),
|
|
37
|
+
})
|
|
38
|
+
.default(defaults);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function makeImageProcessor<TMimeType extends string = string>(
|
|
42
|
+
options: ImageProcessorOptions<TMimeType>
|
|
43
|
+
): ImageProcessor<TMimeType> {
|
|
44
|
+
return async (file) => {
|
|
45
|
+
const { supportedMimeTypes, preferredMimeType, maxSizeInMB, maxWidth, maxHeight } = options;
|
|
46
|
+
const { mime, value } = file;
|
|
47
|
+
|
|
48
|
+
const buffer = Buffer.from(value, "base64");
|
|
49
|
+
let sharpInst = sharp(buffer);
|
|
50
|
+
|
|
51
|
+
const metadata = await sharpInst.metadata();
|
|
52
|
+
if (!metadata) throw Error("Failed to read image metadata");
|
|
53
|
+
const { width, height } = metadata;
|
|
54
|
+
if (width === undefined || height === undefined) throw Error("Failed to read image size");
|
|
55
|
+
|
|
56
|
+
const tooLargeInSize = width > maxWidth || height > maxHeight;
|
|
57
|
+
const tooLargeInBytes = buffer.byteLength > maxSizeInMB * 1000 * 1000;
|
|
58
|
+
|
|
59
|
+
const outputMime = chooseMimeType(supportedMimeTypes, preferredMimeType, mime, {
|
|
60
|
+
preferSizeReduction: tooLargeInBytes,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Resize if necessary
|
|
64
|
+
if (tooLargeInSize || tooLargeInBytes) {
|
|
65
|
+
const size = chooseImageSize({
|
|
66
|
+
mime: outputMime,
|
|
67
|
+
width,
|
|
68
|
+
height,
|
|
69
|
+
maxWidth,
|
|
70
|
+
maxHeight,
|
|
71
|
+
maxSizeInMB,
|
|
72
|
+
});
|
|
73
|
+
if (size.width !== width || size.height !== height) {
|
|
74
|
+
sharpInst = resizeImage(sharpInst, size.width, size.height);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Convert format if necessary
|
|
79
|
+
// We always want to convert the image when the file was too large in bytes
|
|
80
|
+
// so we can guarantee that ideal options are used, which are expected when
|
|
81
|
+
// choosing the image size
|
|
82
|
+
if (outputMime !== mime || tooLargeInBytes) {
|
|
83
|
+
sharpInst = convertImage(sharpInst, outputMime);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const processedImage = await sharpInst.toBuffer();
|
|
87
|
+
return { image: processedImage, mime: outputMime };
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const outputFormats = ["png", "jpeg", "webp", "avif", "tiff", "gif"] as const;
|
|
92
|
+
type OutputImgFormat = (typeof outputFormats)[number];
|
|
93
|
+
const isOutputFormat = (format: string): format is (typeof outputFormats)[number] =>
|
|
94
|
+
outputFormats.includes(format as OutputImgFormat);
|
|
95
|
+
|
|
96
|
+
export function convertImage(sharpInst: Sharp, outputMime: string): Sharp {
|
|
97
|
+
const [type, format] = outputMime.split("/");
|
|
98
|
+
if (type !== "image") throw Error(`Requested non-image mime type: ${outputMime}`);
|
|
99
|
+
if (!isOutputFormat(format)) {
|
|
100
|
+
throw Error(`Requested to convert to an unsupported format: ${format}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return sharpInst[format]();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// heic/heif requires proprietary license
|
|
107
|
+
// TODO: blocking heif may be incorrect considering it also supports av1, so we should instead
|
|
108
|
+
// detect the compression method used via sharp().metadata().compression
|
|
109
|
+
// TODO: consider what to do about animated formats: apng, gif, animated webp, ...
|
|
110
|
+
const blocklistedMimes = ["image/heic", "image/heif"];
|
|
111
|
+
|
|
112
|
+
/** Sorted from largest to smallest */
|
|
113
|
+
const mimesBySizeDesc = [
|
|
114
|
+
"image/png",
|
|
115
|
+
"image/tiff",
|
|
116
|
+
"image/gif",
|
|
117
|
+
"image/jpeg",
|
|
118
|
+
"image/webp",
|
|
119
|
+
"image/avif",
|
|
120
|
+
];
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Defaults to preferred format or uses existing mime if supported
|
|
124
|
+
* When preferSizeReduction is true, it will choose the smallest format that is supported
|
|
125
|
+
**/
|
|
126
|
+
function chooseMimeType<T extends readonly string[]>(
|
|
127
|
+
supportedMimes: T,
|
|
128
|
+
preferredMime: string,
|
|
129
|
+
mime: string,
|
|
130
|
+
{ preferSizeReduction }: { preferSizeReduction: boolean }
|
|
131
|
+
): T[number] {
|
|
132
|
+
if (!supportedMimes.includes(preferredMime)) {
|
|
133
|
+
const supportedMimesStr = supportedMimes.join(", ");
|
|
134
|
+
throw Error(
|
|
135
|
+
`Preferred format "${preferredMime}" not found in supported mimes: ${supportedMimesStr}`
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const [type] = mime.split("/");
|
|
140
|
+
if (type !== "image") throw Error(`Received non-image mime type: ${mime}`);
|
|
141
|
+
|
|
142
|
+
if (supportedMimes.includes(mime) && !preferSizeReduction) return mime;
|
|
143
|
+
|
|
144
|
+
if (blocklistedMimes.includes(mime)) throw Error(`Received blocklisted mime type: ${mime}`);
|
|
145
|
+
|
|
146
|
+
const smallestMime = mimesBySizeDesc.findLast((m) => supportedMimes.includes(m));
|
|
147
|
+
return smallestMime ?? preferredMime;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
interface ImageSizeOptions {
|
|
151
|
+
mime: string;
|
|
152
|
+
width: number;
|
|
153
|
+
height: number;
|
|
154
|
+
maxWidth: number;
|
|
155
|
+
maxHeight: number;
|
|
156
|
+
maxSizeInMB: number;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Resizes the image to fit within the specified size in MB by guessing the output size */
|
|
160
|
+
export function chooseImageSize({
|
|
161
|
+
mime,
|
|
162
|
+
width,
|
|
163
|
+
height,
|
|
164
|
+
maxWidth,
|
|
165
|
+
maxHeight,
|
|
166
|
+
maxSizeInMB,
|
|
167
|
+
}: ImageSizeOptions): { width: number; height: number } {
|
|
168
|
+
const biggestDiscrepency = Math.max(1, width / maxWidth, height / maxHeight);
|
|
169
|
+
|
|
170
|
+
let selectedWidth = Math.ceil(width / biggestDiscrepency);
|
|
171
|
+
let selectedHeight = Math.ceil(height / biggestDiscrepency);
|
|
172
|
+
|
|
173
|
+
do {
|
|
174
|
+
const estimatedSize = estimateImageSizeInBytes(mime, selectedWidth, selectedHeight);
|
|
175
|
+
if (estimatedSize < maxSizeInMB * 1024 * 1024) {
|
|
176
|
+
return { width: selectedWidth, height: selectedHeight };
|
|
177
|
+
}
|
|
178
|
+
selectedWidth = Math.floor(selectedWidth / 1.1);
|
|
179
|
+
selectedHeight = Math.floor(selectedHeight / 1.1);
|
|
180
|
+
} while (selectedWidth > 1 && selectedHeight > 1);
|
|
181
|
+
|
|
182
|
+
throw Error(`Failed to resize image to fit within ${maxSizeInMB}MB`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const mimeToCompressionRatio: Record<string, number> = {
|
|
186
|
+
"image/png": 1 / 2,
|
|
187
|
+
"image/jpeg": 1 / 10,
|
|
188
|
+
"image/webp": 1 / 4,
|
|
189
|
+
"image/avif": 1 / 5,
|
|
190
|
+
"image/tiff": 1,
|
|
191
|
+
"image/gif": 1 / 5,
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Guesses the side of an image in MB based on its format and dimensions
|
|
196
|
+
* Should guess the worst case
|
|
197
|
+
**/
|
|
198
|
+
function estimateImageSizeInBytes(mime: string, width: number, height: number): number {
|
|
199
|
+
const compressionRatio = mimeToCompressionRatio[mime];
|
|
200
|
+
if (!compressionRatio) throw Error(`Unsupported image format: ${mime}`);
|
|
201
|
+
|
|
202
|
+
const bitsPerPixel = 32; // Assuming 32-bit color depth for 8-bit R G B A
|
|
203
|
+
const bytesPerPixel = bitsPerPixel / 8;
|
|
204
|
+
const uncompressedSize = width * height * bytesPerPixel;
|
|
205
|
+
|
|
206
|
+
return uncompressedSize * compressionRatio;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function resizeImage(sharpInst: Sharp, maxWidth: number, maxHeight: number): Sharp {
|
|
210
|
+
return sharpInst.resize({ width: maxWidth, height: maxHeight, fit: "inside" });
|
|
211
|
+
}
|