ruflo 3.10.35 → 3.10.37
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/README.md +416 -416
- package/bin/ruflo.js +77 -77
- package/package.json +113 -113
- package/src/chat-ui/Dockerfile +25 -25
- package/src/chat-ui/patch-mcp-url-safety.sh +28 -28
- package/src/config/config.example.json +76 -76
- package/src/mcp-bridge/Dockerfile +45 -45
- package/src/mcp-bridge/index.js +1692 -1692
- package/src/mcp-bridge/mcp-stdio-kernel.js +159 -159
- package/src/mcp-bridge/package.json +17 -17
- package/src/mcp-bridge/test-harness.js +470 -470
- package/src/nginx/Dockerfile +10 -10
- package/src/nginx/nginx.conf +67 -67
- package/src/nginx/static/favicon-dark.svg +4 -4
- package/src/nginx/static/favicon.svg +4 -4
- package/src/nginx/static/icon.svg +5 -5
- package/src/nginx/static/logo.svg +9 -9
- package/src/nginx/static/manifest.json +22 -22
- package/src/nginx/static/welcome.js +184 -184
- package/src/ruvocal/.claude/skills/add-model-descriptions/SKILL.md +73 -73
- package/src/ruvocal/.devcontainer/Dockerfile +9 -9
- package/src/ruvocal/.devcontainer/devcontainer.json +36 -36
- package/src/ruvocal/.dockerignore +16 -16
- package/src/ruvocal/.eslintignore +13 -13
- package/src/ruvocal/.eslintrc.cjs +45 -45
- package/src/ruvocal/.gcloudignore +18 -18
- package/src/ruvocal/.github/ISSUE_TEMPLATE/bug-report--chat-ui-.md +43 -43
- package/src/ruvocal/.github/ISSUE_TEMPLATE/config-support.md +9 -9
- package/src/ruvocal/.github/ISSUE_TEMPLATE/feature-request--chat-ui-.md +17 -17
- package/src/ruvocal/.github/ISSUE_TEMPLATE/huggingchat.md +11 -11
- package/src/ruvocal/.github/release.yml +16 -16
- package/src/ruvocal/.github/workflows/build-docs.yml +18 -18
- package/src/ruvocal/.github/workflows/build-image.yml +142 -142
- package/src/ruvocal/.github/workflows/build-pr-docs.yml +20 -20
- package/src/ruvocal/.github/workflows/deploy-dev.yml +63 -63
- package/src/ruvocal/.github/workflows/deploy-prod.yml +78 -78
- package/src/ruvocal/.github/workflows/lint-and-test.yml +84 -84
- package/src/ruvocal/.github/workflows/slugify.yaml +72 -72
- package/src/ruvocal/.github/workflows/trufflehog.yml +17 -17
- package/src/ruvocal/.github/workflows/upload-pr-documentation.yml +16 -16
- package/src/ruvocal/.husky/lint-stage-config.js +4 -4
- package/src/ruvocal/.husky/pre-commit +2 -2
- package/src/ruvocal/.prettierignore +14 -14
- package/src/ruvocal/.prettierrc +7 -7
- package/src/ruvocal/CLAUDE.md +126 -126
- package/src/ruvocal/Dockerfile +96 -96
- package/src/ruvocal/LICENSE +202 -202
- package/src/ruvocal/PRIVACY.md +41 -41
- package/src/ruvocal/README.md +164 -164
- package/src/ruvocal/chart/Chart.yaml +5 -5
- package/src/ruvocal/chart/env/dev.yaml +260 -260
- package/src/ruvocal/chart/env/prod.yaml +273 -273
- package/src/ruvocal/chart/templates/_helpers.tpl +22 -22
- package/src/ruvocal/chart/templates/config.yaml +10 -10
- package/src/ruvocal/chart/templates/deployment.yaml +81 -81
- package/src/ruvocal/chart/templates/hpa.yaml +45 -45
- package/src/ruvocal/chart/templates/infisical.yaml +24 -24
- package/src/ruvocal/chart/templates/ingress-internal.yaml +32 -32
- package/src/ruvocal/chart/templates/ingress.yaml +32 -32
- package/src/ruvocal/chart/templates/network-policy.yaml +36 -36
- package/src/ruvocal/chart/templates/service-account.yaml +13 -13
- package/src/ruvocal/chart/templates/service-monitor.yaml +17 -17
- package/src/ruvocal/chart/templates/service.yaml +21 -21
- package/src/ruvocal/chart/values.yaml +73 -73
- package/src/ruvocal/cloudbuild.yaml +68 -68
- package/src/ruvocal/config/branding.env.example +19 -19
- package/src/ruvocal/docker-compose.yml +21 -21
- package/src/ruvocal/docs/adr/ADR-029-HUGGINGFACE-CHAT-UI-CLOUD-RUN.md +1236 -1236
- package/src/ruvocal/docs/adr/ADR-033-RUVECTOR-RUFLO-MCP-INTEGRATION.md +111 -111
- package/src/ruvocal/docs/adr/ADR-034-OPTIONAL-MCP-BACKENDS.md +117 -117
- package/src/ruvocal/docs/adr/ADR-035-MCP-TOOL-GROUPS.md +186 -186
- package/src/ruvocal/docs/adr/ADR-037-AUTOPILOT-CHAT-MODE.md +1500 -1500
- package/src/ruvocal/docs/adr/ADR-038-RUVOCAL-FORK.md +286 -286
- package/src/ruvocal/docs/source/_toctree.yml +30 -30
- package/src/ruvocal/docs/source/configuration/common-issues.md +38 -38
- package/src/ruvocal/docs/source/configuration/llm-router.md +105 -105
- package/src/ruvocal/docs/source/configuration/mcp-tools.md +84 -84
- package/src/ruvocal/docs/source/configuration/metrics.md +9 -9
- package/src/ruvocal/docs/source/configuration/open-id.md +57 -57
- package/src/ruvocal/docs/source/configuration/overview.md +89 -89
- package/src/ruvocal/docs/source/configuration/theming.md +20 -20
- package/src/ruvocal/docs/source/developing/architecture.md +48 -48
- package/src/ruvocal/docs/source/index.md +53 -53
- package/src/ruvocal/docs/source/installation/docker.md +43 -43
- package/src/ruvocal/docs/source/installation/helm.md +43 -43
- package/src/ruvocal/docs/source/installation/local.md +62 -62
- package/src/ruvocal/entrypoint.sh +18 -18
- package/src/ruvocal/mcp-bridge/Dockerfile +45 -45
- package/src/ruvocal/mcp-bridge/cloudbuild.yaml +49 -49
- package/src/ruvocal/mcp-bridge/index.js +1902 -1902
- package/src/ruvocal/mcp-bridge/mcp-stdio-kernel.js +159 -159
- package/src/ruvocal/mcp-bridge/package-lock.json +762 -762
- package/src/ruvocal/mcp-bridge/package.json +17 -17
- package/src/ruvocal/mcp-bridge/test-harness.js +470 -470
- package/src/ruvocal/package-lock.json +11741 -11741
- package/src/ruvocal/package.json +121 -121
- package/src/ruvocal/postcss.config.js +6 -6
- package/src/ruvocal/rvf.manifest.json +204 -204
- package/src/ruvocal/scripts/config.ts +64 -64
- package/src/ruvocal/scripts/generate-welcome.mjs +181 -181
- package/src/ruvocal/scripts/populate.ts +288 -288
- package/src/ruvocal/scripts/samples.txt +194 -194
- package/src/ruvocal/scripts/setups/vitest-setup-server.ts +44 -44
- package/src/ruvocal/scripts/updateLocalEnv.ts +48 -48
- package/src/ruvocal/src/ambient.d.ts +7 -7
- package/src/ruvocal/src/app.d.ts +29 -29
- package/src/ruvocal/src/app.html +53 -53
- package/src/ruvocal/src/hooks.server.ts +32 -32
- package/src/ruvocal/src/hooks.ts +6 -6
- package/src/ruvocal/src/lib/APIClient.ts +148 -148
- package/src/ruvocal/src/lib/actions/clickOutside.ts +18 -18
- package/src/ruvocal/src/lib/actions/snapScrollToBottom.ts +346 -346
- package/src/ruvocal/src/lib/buildPrompt.ts +33 -33
- package/src/ruvocal/src/lib/components/AnnouncementBanner.svelte +20 -20
- package/src/ruvocal/src/lib/components/BackgroundGenerationPoller.svelte +168 -168
- package/src/ruvocal/src/lib/components/CodeBlock.svelte +73 -73
- package/src/ruvocal/src/lib/components/CopyToClipBoardBtn.svelte +92 -92
- package/src/ruvocal/src/lib/components/DeleteConversationModal.svelte +75 -75
- package/src/ruvocal/src/lib/components/EditConversationModal.svelte +100 -100
- package/src/ruvocal/src/lib/components/ExpandNavigation.svelte +22 -22
- package/src/ruvocal/src/lib/components/FoundationBackground.svelte +242 -242
- package/src/ruvocal/src/lib/components/HoverTooltip.svelte +44 -44
- package/src/ruvocal/src/lib/components/HtmlPreviewModal.svelte +143 -143
- package/src/ruvocal/src/lib/components/InfiniteScroll.svelte +50 -50
- package/src/ruvocal/src/lib/components/MobileNav.svelte +300 -300
- package/src/ruvocal/src/lib/components/Modal.svelte +115 -115
- package/src/ruvocal/src/lib/components/ModelCardMetadata.svelte +71 -71
- package/src/ruvocal/src/lib/components/NavConversationItem.svelte +151 -151
- package/src/ruvocal/src/lib/components/NavMenu.svelte +313 -313
- package/src/ruvocal/src/lib/components/Pagination.svelte +97 -97
- package/src/ruvocal/src/lib/components/PaginationArrow.svelte +27 -27
- package/src/ruvocal/src/lib/components/Portal.svelte +24 -24
- package/src/ruvocal/src/lib/components/RetryBtn.svelte +18 -18
- package/src/ruvocal/src/lib/components/RuFloUniverse.svelte +185 -185
- package/src/ruvocal/src/lib/components/RufloHelpModal.svelte +411 -411
- package/src/ruvocal/src/lib/components/ScrollToBottomBtn.svelte +47 -47
- package/src/ruvocal/src/lib/components/ScrollToPreviousBtn.svelte +77 -77
- package/src/ruvocal/src/lib/components/ShareConversationModal.svelte +182 -182
- package/src/ruvocal/src/lib/components/StopGeneratingBtn.svelte +69 -69
- package/src/ruvocal/src/lib/components/SubscribeModal.svelte +87 -87
- package/src/ruvocal/src/lib/components/Switch.svelte +36 -36
- package/src/ruvocal/src/lib/components/SystemPromptModal.svelte +44 -44
- package/src/ruvocal/src/lib/components/Toast.svelte +27 -27
- package/src/ruvocal/src/lib/components/Tooltip.svelte +30 -30
- package/src/ruvocal/src/lib/components/WelcomeModal.svelte +46 -46
- package/src/ruvocal/src/lib/components/chat/Alternatives.svelte +77 -77
- package/src/ruvocal/src/lib/components/chat/BlockWrapper.svelte +72 -72
- package/src/ruvocal/src/lib/components/chat/ChatInput.svelte +490 -490
- package/src/ruvocal/src/lib/components/chat/ChatIntroduction.svelte +123 -123
- package/src/ruvocal/src/lib/components/chat/ChatMessage.svelte +548 -548
- package/src/ruvocal/src/lib/components/chat/ChatWindow.svelte +1057 -1057
- package/src/ruvocal/src/lib/components/chat/FileDropzone.svelte +92 -92
- package/src/ruvocal/src/lib/components/chat/ImageLightbox.svelte +66 -66
- package/src/ruvocal/src/lib/components/chat/MarkdownBlock.svelte +23 -23
- package/src/ruvocal/src/lib/components/chat/MarkdownRenderer.svelte +69 -69
- package/src/ruvocal/src/lib/components/chat/MarkdownRenderer.svelte.test.ts +58 -58
- package/src/ruvocal/src/lib/components/chat/MessageAvatar.svelte +103 -103
- package/src/ruvocal/src/lib/components/chat/ModelSwitch.svelte +64 -64
- package/src/ruvocal/src/lib/components/chat/OpenReasoningResults.svelte +81 -81
- package/src/ruvocal/src/lib/components/chat/TaskGroup.svelte +88 -88
- package/src/ruvocal/src/lib/components/chat/ToolUpdate.svelte +273 -273
- package/src/ruvocal/src/lib/components/chat/UploadedFile.svelte +253 -253
- package/src/ruvocal/src/lib/components/chat/UrlFetchModal.svelte +203 -203
- package/src/ruvocal/src/lib/components/chat/VoiceRecorder.svelte +214 -214
- package/src/ruvocal/src/lib/components/icons/IconBurger.svelte +20 -20
- package/src/ruvocal/src/lib/components/icons/IconCheap.svelte +20 -20
- package/src/ruvocal/src/lib/components/icons/IconChevron.svelte +24 -24
- package/src/ruvocal/src/lib/components/icons/IconDazzled.svelte +40 -40
- package/src/ruvocal/src/lib/components/icons/IconFast.svelte +20 -20
- package/src/ruvocal/src/lib/components/icons/IconLoading.svelte +22 -22
- package/src/ruvocal/src/lib/components/icons/IconMCP.svelte +28 -28
- package/src/ruvocal/src/lib/components/icons/IconMoon.svelte +21 -21
- package/src/ruvocal/src/lib/components/icons/IconNew.svelte +20 -20
- package/src/ruvocal/src/lib/components/icons/IconOmni.svelte +90 -90
- package/src/ruvocal/src/lib/components/icons/IconPaperclip.svelte +24 -24
- package/src/ruvocal/src/lib/components/icons/IconPro.svelte +37 -37
- package/src/ruvocal/src/lib/components/icons/IconShare.svelte +21 -21
- package/src/ruvocal/src/lib/components/icons/IconSun.svelte +93 -93
- package/src/ruvocal/src/lib/components/icons/Logo.svelte +68 -68
- package/src/ruvocal/src/lib/components/icons/LogoHuggingFaceBorderless.svelte +54 -54
- package/src/ruvocal/src/lib/components/mcp/AddServerForm.svelte +250 -250
- package/src/ruvocal/src/lib/components/mcp/MCPServerManager.svelte +185 -185
- package/src/ruvocal/src/lib/components/mcp/ServerCard.svelte +203 -203
- package/src/ruvocal/src/lib/components/players/AudioPlayer.svelte +82 -82
- package/src/ruvocal/src/lib/components/voice/AudioWaveform.svelte +96 -96
- package/src/ruvocal/src/lib/components/wasm/GalleryPanel.svelte +357 -357
- package/src/ruvocal/src/lib/constants/mcpExamples.ts +114 -114
- package/src/ruvocal/src/lib/constants/mime.ts +11 -11
- package/src/ruvocal/src/lib/constants/pagination.ts +1 -1
- package/src/ruvocal/src/lib/constants/publicSepToken.ts +1 -1
- package/src/ruvocal/src/lib/constants/routerExamples.ts +133 -133
- package/src/ruvocal/src/lib/constants/rvagentPresets.ts +206 -206
- package/src/ruvocal/src/lib/createShareLink.ts +27 -27
- package/src/ruvocal/src/lib/jobs/refresh-conversation-stats.ts +297 -297
- package/src/ruvocal/src/lib/migrations/lock.ts +56 -56
- package/src/ruvocal/src/lib/migrations/migrations.spec.ts +74 -74
- package/src/ruvocal/src/lib/migrations/migrations.ts +109 -109
- package/src/ruvocal/src/lib/migrations/routines/01-update-search-assistants.ts +50 -50
- package/src/ruvocal/src/lib/migrations/routines/02-update-assistants-models.ts +48 -48
- package/src/ruvocal/src/lib/migrations/routines/04-update-message-updates.ts +151 -151
- package/src/ruvocal/src/lib/migrations/routines/05-update-message-files.ts +56 -56
- package/src/ruvocal/src/lib/migrations/routines/06-trim-message-updates.ts +56 -56
- package/src/ruvocal/src/lib/migrations/routines/08-update-featured-to-review.ts +32 -32
- package/src/ruvocal/src/lib/migrations/routines/09-delete-empty-conversations.spec.ts +214 -214
- package/src/ruvocal/src/lib/migrations/routines/09-delete-empty-conversations.ts +88 -88
- package/src/ruvocal/src/lib/migrations/routines/10-update-reports-assistantid.ts +29 -29
- package/src/ruvocal/src/lib/migrations/routines/index.ts +15 -15
- package/src/ruvocal/src/lib/server/__tests__/conversation-stop-generating.spec.ts +103 -103
- package/src/ruvocal/src/lib/server/abortRegistry.ts +57 -57
- package/src/ruvocal/src/lib/server/abortedGenerations.ts +43 -43
- package/src/ruvocal/src/lib/server/adminToken.ts +62 -62
- package/src/ruvocal/src/lib/server/api/__tests__/conversations-id.spec.ts +296 -296
- package/src/ruvocal/src/lib/server/api/__tests__/conversations-message.spec.ts +216 -216
- package/src/ruvocal/src/lib/server/api/__tests__/conversations.spec.ts +235 -235
- package/src/ruvocal/src/lib/server/api/__tests__/misc.spec.ts +72 -72
- package/src/ruvocal/src/lib/server/api/__tests__/testHelpers.ts +86 -86
- package/src/ruvocal/src/lib/server/api/__tests__/user-reports.spec.ts +78 -78
- package/src/ruvocal/src/lib/server/api/__tests__/user.spec.ts +239 -239
- package/src/ruvocal/src/lib/server/api/types.ts +37 -37
- package/src/ruvocal/src/lib/server/api/utils/requireAuth.ts +22 -22
- package/src/ruvocal/src/lib/server/api/utils/resolveConversation.ts +69 -69
- package/src/ruvocal/src/lib/server/api/utils/resolveModel.ts +27 -27
- package/src/ruvocal/src/lib/server/api/utils/superjsonResponse.ts +15 -15
- package/src/ruvocal/src/lib/server/apiToken.ts +11 -11
- package/src/ruvocal/src/lib/server/auth.ts +554 -554
- package/src/ruvocal/src/lib/server/config.ts +187 -187
- package/src/ruvocal/src/lib/server/conversation.ts +83 -83
- package/src/ruvocal/src/lib/server/database/__tests__/rvf.spec.ts +709 -709
- package/src/ruvocal/src/lib/server/database/postgres.ts +700 -700
- package/src/ruvocal/src/lib/server/database/rvf.ts +1078 -1078
- package/src/ruvocal/src/lib/server/database.ts +145 -145
- package/src/ruvocal/src/lib/server/endpoints/document.ts +68 -68
- package/src/ruvocal/src/lib/server/endpoints/endpoints.ts +43 -43
- package/src/ruvocal/src/lib/server/endpoints/images.ts +211 -211
- package/src/ruvocal/src/lib/server/endpoints/openai/endpointOai.ts +266 -266
- package/src/ruvocal/src/lib/server/endpoints/openai/openAIChatToTextGenerationStream.ts +212 -212
- package/src/ruvocal/src/lib/server/endpoints/openai/openAICompletionToTextGenerationStream.ts +32 -32
- package/src/ruvocal/src/lib/server/endpoints/preprocessMessages.ts +61 -61
- package/src/ruvocal/src/lib/server/exitHandler.ts +59 -59
- package/src/ruvocal/src/lib/server/files/downloadFile.ts +34 -34
- package/src/ruvocal/src/lib/server/files/uploadFile.ts +29 -29
- package/src/ruvocal/src/lib/server/findRepoRoot.ts +13 -13
- package/src/ruvocal/src/lib/server/generateFromDefaultEndpoint.ts +46 -46
- package/src/ruvocal/src/lib/server/hooks/error.ts +37 -37
- package/src/ruvocal/src/lib/server/hooks/fetch.ts +22 -22
- package/src/ruvocal/src/lib/server/hooks/handle.ts +250 -250
- package/src/ruvocal/src/lib/server/hooks/init.ts +51 -51
- package/src/ruvocal/src/lib/server/isURLLocal.spec.ts +31 -31
- package/src/ruvocal/src/lib/server/isURLLocal.ts +74 -74
- package/src/ruvocal/src/lib/server/logger.ts +42 -42
- package/src/ruvocal/src/lib/server/mcp/clientPool.spec.ts +175 -175
- package/src/ruvocal/src/lib/server/mcp/hf.ts +32 -32
- package/src/ruvocal/src/lib/server/mcp/httpClient.ts +122 -122
- package/src/ruvocal/src/lib/server/mcp/registry.ts +76 -76
- package/src/ruvocal/src/lib/server/mcp/tools.ts +196 -196
- package/src/ruvocal/src/lib/server/metrics.ts +255 -255
- package/src/ruvocal/src/lib/server/models.ts +518 -518
- package/src/ruvocal/src/lib/server/requestContext.ts +55 -55
- package/src/ruvocal/src/lib/server/router/arch.ts +230 -230
- package/src/ruvocal/src/lib/server/router/endpoint.ts +316 -316
- package/src/ruvocal/src/lib/server/router/multimodal.ts +28 -28
- package/src/ruvocal/src/lib/server/router/policy.ts +49 -49
- package/src/ruvocal/src/lib/server/router/toolsRoute.ts +51 -51
- package/src/ruvocal/src/lib/server/router/types.ts +21 -21
- package/src/ruvocal/src/lib/server/sendSlack.ts +23 -23
- package/src/ruvocal/src/lib/server/textGeneration/generate.ts +258 -258
- package/src/ruvocal/src/lib/server/textGeneration/index.ts +96 -96
- package/src/ruvocal/src/lib/server/textGeneration/mcp/fileRefs.ts +155 -155
- package/src/ruvocal/src/lib/server/textGeneration/mcp/routerResolution.ts +108 -108
- package/src/ruvocal/src/lib/server/textGeneration/mcp/runMcpFlow.ts +831 -831
- package/src/ruvocal/src/lib/server/textGeneration/mcp/toolInvocation.ts +349 -349
- package/src/ruvocal/src/lib/server/textGeneration/mcp/wasmTools.test.ts +633 -633
- package/src/ruvocal/src/lib/server/textGeneration/reasoning.ts +23 -23
- package/src/ruvocal/src/lib/server/textGeneration/title.ts +83 -83
- package/src/ruvocal/src/lib/server/textGeneration/types.ts +28 -28
- package/src/ruvocal/src/lib/server/textGeneration/utils/prepareFiles.ts +88 -88
- package/src/ruvocal/src/lib/server/textGeneration/utils/routing.ts +21 -21
- package/src/ruvocal/src/lib/server/textGeneration/utils/toolPrompt.ts +49 -49
- package/src/ruvocal/src/lib/server/urlSafety.ts +77 -77
- package/src/ruvocal/src/lib/server/usageLimits.ts +30 -30
- package/src/ruvocal/src/lib/stores/autopilotStore.svelte.ts +175 -175
- package/src/ruvocal/src/lib/stores/backgroundGenerations.svelte.ts +32 -32
- package/src/ruvocal/src/lib/stores/backgroundGenerations.ts +1 -1
- package/src/ruvocal/src/lib/stores/errors.ts +9 -9
- package/src/ruvocal/src/lib/stores/isAborted.ts +3 -3
- package/src/ruvocal/src/lib/stores/isPro.ts +4 -4
- package/src/ruvocal/src/lib/stores/loading.ts +3 -3
- package/src/ruvocal/src/lib/stores/mcpServers.ts +534 -534
- package/src/ruvocal/src/lib/stores/pendingChatInput.ts +3 -3
- package/src/ruvocal/src/lib/stores/pendingMessage.ts +9 -9
- package/src/ruvocal/src/lib/stores/settings.ts +182 -182
- package/src/ruvocal/src/lib/stores/shareModal.ts +13 -13
- package/src/ruvocal/src/lib/stores/titleUpdate.ts +8 -8
- package/src/ruvocal/src/lib/stores/wasmMcp.ts +472 -472
- package/src/ruvocal/src/lib/switchTheme.ts +124 -124
- package/src/ruvocal/src/lib/types/AbortedGeneration.ts +8 -8
- package/src/ruvocal/src/lib/types/Assistant.ts +31 -31
- package/src/ruvocal/src/lib/types/AssistantStats.ts +11 -11
- package/src/ruvocal/src/lib/types/ConfigKey.ts +4 -4
- package/src/ruvocal/src/lib/types/ConvSidebar.ts +9 -9
- package/src/ruvocal/src/lib/types/Conversation.ts +27 -27
- package/src/ruvocal/src/lib/types/ConversationStats.ts +13 -13
- package/src/ruvocal/src/lib/types/Message.ts +41 -41
- package/src/ruvocal/src/lib/types/MessageEvent.ts +10 -10
- package/src/ruvocal/src/lib/types/MessageUpdate.ts +139 -139
- package/src/ruvocal/src/lib/types/MigrationResult.ts +7 -7
- package/src/ruvocal/src/lib/types/Model.ts +23 -23
- package/src/ruvocal/src/lib/types/Report.ts +12 -12
- package/src/ruvocal/src/lib/types/Review.ts +6 -6
- package/src/ruvocal/src/lib/types/Semaphore.ts +19 -19
- package/src/ruvocal/src/lib/types/Session.ts +22 -22
- package/src/ruvocal/src/lib/types/Settings.ts +93 -93
- package/src/ruvocal/src/lib/types/SharedConversation.ts +9 -9
- package/src/ruvocal/src/lib/types/Template.ts +6 -6
- package/src/ruvocal/src/lib/types/Timestamps.ts +4 -4
- package/src/ruvocal/src/lib/types/TokenCache.ts +6 -6
- package/src/ruvocal/src/lib/types/Tool.ts +77 -77
- package/src/ruvocal/src/lib/types/UrlDependency.ts +5 -5
- package/src/ruvocal/src/lib/types/User.ts +14 -14
- package/src/ruvocal/src/lib/utils/PublicConfig.svelte.ts +75 -75
- package/src/ruvocal/src/lib/utils/auth.ts +17 -17
- package/src/ruvocal/src/lib/utils/chunk.ts +33 -33
- package/src/ruvocal/src/lib/utils/cookiesAreEnabled.ts +13 -13
- package/src/ruvocal/src/lib/utils/debounce.ts +17 -17
- package/src/ruvocal/src/lib/utils/deepestChild.ts +6 -6
- package/src/ruvocal/src/lib/utils/favicon.ts +21 -21
- package/src/ruvocal/src/lib/utils/fetchJSON.ts +23 -23
- package/src/ruvocal/src/lib/utils/file2base64.ts +14 -14
- package/src/ruvocal/src/lib/utils/formatUserCount.ts +37 -37
- package/src/ruvocal/src/lib/utils/generationState.spec.ts +75 -75
- package/src/ruvocal/src/lib/utils/generationState.ts +26 -26
- package/src/ruvocal/src/lib/utils/getHref.ts +41 -41
- package/src/ruvocal/src/lib/utils/getReturnFromGenerator.ts +7 -7
- package/src/ruvocal/src/lib/utils/haptics.ts +64 -64
- package/src/ruvocal/src/lib/utils/hashConv.ts +12 -12
- package/src/ruvocal/src/lib/utils/hf.ts +17 -17
- package/src/ruvocal/src/lib/utils/isDesktop.ts +7 -7
- package/src/ruvocal/src/lib/utils/isUrl.ts +8 -8
- package/src/ruvocal/src/lib/utils/isVirtualKeyboard.ts +16 -16
- package/src/ruvocal/src/lib/utils/loadAttachmentsFromUrls.ts +115 -115
- package/src/ruvocal/src/lib/utils/marked.spec.ts +96 -96
- package/src/ruvocal/src/lib/utils/marked.ts +531 -531
- package/src/ruvocal/src/lib/utils/mcpValidation.ts +147 -147
- package/src/ruvocal/src/lib/utils/mergeAsyncGenerators.ts +38 -38
- package/src/ruvocal/src/lib/utils/messageUpdates.spec.ts +262 -262
- package/src/ruvocal/src/lib/utils/messageUpdates.ts +324 -324
- package/src/ruvocal/src/lib/utils/mime.ts +56 -56
- package/src/ruvocal/src/lib/utils/models.ts +14 -14
- package/src/ruvocal/src/lib/utils/parseBlocks.ts +120 -120
- package/src/ruvocal/src/lib/utils/parseIncompleteMarkdown.ts +644 -644
- package/src/ruvocal/src/lib/utils/parseStringToList.ts +10 -10
- package/src/ruvocal/src/lib/utils/randomUuid.ts +14 -14
- package/src/ruvocal/src/lib/utils/searchTokens.ts +33 -33
- package/src/ruvocal/src/lib/utils/sha256.ts +7 -7
- package/src/ruvocal/src/lib/utils/stringifyError.ts +12 -12
- package/src/ruvocal/src/lib/utils/sum.ts +3 -3
- package/src/ruvocal/src/lib/utils/template.spec.ts +59 -59
- package/src/ruvocal/src/lib/utils/template.ts +53 -53
- package/src/ruvocal/src/lib/utils/timeout.ts +9 -9
- package/src/ruvocal/src/lib/utils/toolProgress.spec.ts +46 -46
- package/src/ruvocal/src/lib/utils/toolProgress.ts +11 -11
- package/src/ruvocal/src/lib/utils/tree/addChildren.spec.ts +102 -102
- package/src/ruvocal/src/lib/utils/tree/addChildren.ts +48 -48
- package/src/ruvocal/src/lib/utils/tree/addSibling.spec.ts +81 -81
- package/src/ruvocal/src/lib/utils/tree/addSibling.ts +41 -41
- package/src/ruvocal/src/lib/utils/tree/buildSubtree.spec.ts +110 -110
- package/src/ruvocal/src/lib/utils/tree/buildSubtree.ts +24 -24
- package/src/ruvocal/src/lib/utils/tree/convertLegacyConversation.spec.ts +31 -31
- package/src/ruvocal/src/lib/utils/tree/convertLegacyConversation.ts +36 -36
- package/src/ruvocal/src/lib/utils/tree/isMessageId.spec.ts +15 -15
- package/src/ruvocal/src/lib/utils/tree/isMessageId.ts +5 -5
- package/src/ruvocal/src/lib/utils/tree/tree.d.ts +14 -14
- package/src/ruvocal/src/lib/utils/tree/treeHelpers.spec.ts +167 -167
- package/src/ruvocal/src/lib/utils/updates.ts +39 -39
- package/src/ruvocal/src/lib/utils/urlParams.ts +13 -13
- package/src/ruvocal/src/lib/wasm/idb.ts +438 -438
- package/src/ruvocal/src/lib/wasm/index.ts +1213 -1213
- package/src/ruvocal/src/lib/wasm/tests/wasm-capabilities.test.ts +565 -565
- package/src/ruvocal/src/lib/wasm/wasm.worker.ts +332 -332
- package/src/ruvocal/src/lib/wasm/workerClient.ts +166 -166
- package/src/ruvocal/src/lib/workers/autopilotWorker.ts +221 -221
- package/src/ruvocal/src/lib/workers/detailFetchWorker.ts +100 -100
- package/src/ruvocal/src/lib/workers/markdownWorker.ts +61 -61
- package/src/ruvocal/src/routes/+error.svelte +20 -20
- package/src/ruvocal/src/routes/+layout.svelte +324 -324
- package/src/ruvocal/src/routes/+layout.ts +91 -91
- package/src/ruvocal/src/routes/+page.svelte +168 -168
- package/src/ruvocal/src/routes/.well-known/oauth-cimd/+server.ts +37 -37
- package/src/ruvocal/src/routes/__debug/openai/+server.ts +21 -21
- package/src/ruvocal/src/routes/admin/export/+server.ts +159 -159
- package/src/ruvocal/src/routes/admin/stats/compute/+server.ts +16 -16
- package/src/ruvocal/src/routes/api/conversation/[id]/+server.ts +40 -40
- package/src/ruvocal/src/routes/api/conversation/[id]/message/[messageId]/+server.ts +42 -42
- package/src/ruvocal/src/routes/api/conversations/+server.ts +48 -48
- package/src/ruvocal/src/routes/api/fetch-url/+server.ts +147 -147
- package/src/ruvocal/src/routes/api/mcp/health/+server.ts +292 -292
- package/src/ruvocal/src/routes/api/mcp/servers/+server.ts +32 -32
- package/src/ruvocal/src/routes/api/models/+server.ts +25 -25
- package/src/ruvocal/src/routes/api/transcribe/+server.ts +104 -104
- package/src/ruvocal/src/routes/api/user/+server.ts +15 -15
- package/src/ruvocal/src/routes/api/user/validate-token/+server.ts +20 -20
- package/src/ruvocal/src/routes/api/v2/conversations/+server.ts +48 -48
- package/src/ruvocal/src/routes/api/v2/conversations/[id]/+server.ts +94 -94
- package/src/ruvocal/src/routes/api/v2/conversations/[id]/message/[messageId]/+server.ts +43 -43
- package/src/ruvocal/src/routes/api/v2/conversations/import-share/+server.ts +23 -23
- package/src/ruvocal/src/routes/api/v2/debug/config/+server.ts +16 -16
- package/src/ruvocal/src/routes/api/v2/debug/refresh/+server.ts +30 -30
- package/src/ruvocal/src/routes/api/v2/export/+server.ts +196 -196
- package/src/ruvocal/src/routes/api/v2/feature-flags/+server.ts +14 -14
- package/src/ruvocal/src/routes/api/v2/models/+server.ts +38 -38
- package/src/ruvocal/src/routes/api/v2/models/[namespace]/+server.ts +8 -8
- package/src/ruvocal/src/routes/api/v2/models/[namespace]/[model]/+server.ts +8 -8
- package/src/ruvocal/src/routes/api/v2/models/[namespace]/[model]/subscribe/+server.ts +28 -28
- package/src/ruvocal/src/routes/api/v2/models/[namespace]/subscribe/+server.ts +28 -28
- package/src/ruvocal/src/routes/api/v2/models/old/+server.ts +7 -7
- package/src/ruvocal/src/routes/api/v2/models/refresh/+server.ts +33 -33
- package/src/ruvocal/src/routes/api/v2/public-config/+server.ts +7 -7
- package/src/ruvocal/src/routes/api/v2/user/+server.ts +17 -17
- package/src/ruvocal/src/routes/api/v2/user/billing-orgs/+server.ts +73 -73
- package/src/ruvocal/src/routes/api/v2/user/reports/+server.ts +17 -17
- package/src/ruvocal/src/routes/api/v2/user/settings/+server.ts +110 -110
- package/src/ruvocal/src/routes/conversation/+server.ts +115 -115
- package/src/ruvocal/src/routes/conversation/[id]/+page.svelte +586 -586
- package/src/ruvocal/src/routes/conversation/[id]/+page.ts +60 -60
- package/src/ruvocal/src/routes/conversation/[id]/+server.ts +740 -740
- package/src/ruvocal/src/routes/conversation/[id]/message/[messageId]/prompt/+server.ts +66 -66
- package/src/ruvocal/src/routes/conversation/[id]/share/+server.ts +69 -69
- package/src/ruvocal/src/routes/conversation/[id]/stop-generating/+server.ts +35 -35
- package/src/ruvocal/src/routes/healthcheck/+server.ts +3 -3
- package/src/ruvocal/src/routes/login/+server.ts +5 -5
- package/src/ruvocal/src/routes/login/callback/+server.ts +103 -103
- package/src/ruvocal/src/routes/login/callback/updateUser.spec.ts +157 -157
- package/src/ruvocal/src/routes/login/callback/updateUser.ts +215 -215
- package/src/ruvocal/src/routes/logout/+server.ts +18 -18
- package/src/ruvocal/src/routes/metrics/+server.ts +18 -18
- package/src/ruvocal/src/routes/models/+page.svelte +233 -233
- package/src/ruvocal/src/routes/models/[...model]/+page.svelte +161 -161
- package/src/ruvocal/src/routes/models/[...model]/+page.ts +14 -14
- package/src/ruvocal/src/routes/models/[...model]/thumbnail.png/+server.ts +64 -64
- package/src/ruvocal/src/routes/models/[...model]/thumbnail.png/ModelThumbnail.svelte +28 -28
- package/src/ruvocal/src/routes/privacy/+page.svelte +11 -11
- package/src/ruvocal/src/routes/r/[id]/+page.ts +34 -34
- package/src/ruvocal/src/routes/settings/(nav)/+layout.svelte +282 -282
- package/src/ruvocal/src/routes/settings/(nav)/+layout.ts +1 -1
- package/src/ruvocal/src/routes/settings/(nav)/+server.ts +59 -59
- package/src/ruvocal/src/routes/settings/(nav)/[...model]/+page.svelte +464 -464
- package/src/ruvocal/src/routes/settings/(nav)/[...model]/+page.ts +14 -14
- package/src/ruvocal/src/routes/settings/(nav)/application/+page.svelte +362 -362
- package/src/ruvocal/src/routes/settings/+layout.svelte +40 -40
- package/src/ruvocal/src/styles/highlight-js.css +195 -195
- package/src/ruvocal/src/styles/main.css +144 -144
- package/src/ruvocal/static/chatui/favicon-dark.svg +3 -3
- package/src/ruvocal/static/chatui/favicon-dev.svg +3 -3
- package/src/ruvocal/static/chatui/favicon.svg +3 -3
- package/src/ruvocal/static/chatui/icon.svg +3 -3
- package/src/ruvocal/static/chatui/logo.svg +7 -7
- package/src/ruvocal/static/chatui/manifest.json +54 -54
- package/src/ruvocal/static/chatui/welcome.js +184 -184
- package/src/ruvocal/static/huggingchat/favicon-dark.svg +4 -4
- package/src/ruvocal/static/huggingchat/favicon-dev.svg +4 -4
- package/src/ruvocal/static/huggingchat/favicon.svg +4 -4
- package/src/ruvocal/static/huggingchat/fulltext-logo.svg +1 -1
- package/src/ruvocal/static/huggingchat/icon.svg +4 -4
- package/src/ruvocal/static/huggingchat/logo.svg +4 -4
- package/src/ruvocal/static/huggingchat/manifest.json +54 -54
- package/src/ruvocal/static/huggingchat/routes.chat.json +226 -226
- package/src/ruvocal/static/robots.txt +10 -10
- package/src/ruvocal/static/wasm/rvagent_wasm.js +1539 -1539
- package/src/ruvocal/stub/@reflink/reflink/package.json +5 -5
- package/src/ruvocal/svelte.config.js +53 -53
- package/src/ruvocal/tailwind.config.cjs +30 -30
- package/src/ruvocal/tsconfig.json +19 -19
- package/src/ruvocal/vite.config.ts +87 -87
- package/src/scripts/deploy.sh +116 -116
- package/src/scripts/generate-config.js +245 -245
- package/src/scripts/generate-welcome.js +187 -187
- package/src/scripts/package-rvf.sh +116 -116
- package/src/ruvocal/.claude-flow/daemon-state.json +0 -135
- package/src/ruvocal/.claude-flow/data/pending-insights.jsonl +0 -0
- package/src/ruvocal/.claude-flow/data/ranked-context.json +0 -5
- package/src/ruvocal/.claude-flow/logs/daemon.log +0 -31
- package/src/ruvocal/.claude-flow/logs/headless/audit_1777949411822_juxau0_prompt.log +0 -989
- package/src/ruvocal/.claude-flow/logs/headless/audit_1777949411822_juxau0_result.log +0 -67
- package/src/ruvocal/.claude-flow/logs/headless/audit_1777950042278_jvj5xq_prompt.log +0 -989
- package/src/ruvocal/.claude-flow/logs/headless/audit_1777950042278_jvj5xq_result.log +0 -93
- package/src/ruvocal/.claude-flow/logs/headless/optimize_1777949531823_yt5yc2_prompt.log +0 -1498
- package/src/ruvocal/.claude-flow/logs/headless/optimize_1777949531823_yt5yc2_result.log +0 -93
- package/src/ruvocal/.claude-flow/logs/headless/testgaps_1777949771821_elw1j4_prompt.log +0 -1498
- package/src/ruvocal/.claude-flow/logs/headless/testgaps_1777949771821_elw1j4_result.log +0 -100
- package/src/ruvocal/.claude-flow/metrics/codebase-map.json +0 -11
- package/src/ruvocal/.claude-flow/metrics/consolidation.json +0 -6
- package/src/ruvocal/.claude-flow/neural/stats.json +0 -6
- package/src/ruvocal/.claude-flow/sessions/current.json +0 -13
- package/src/ruvocal/.swarm/attestation.db +0 -0
- package/src/ruvocal/.swarm/hnsw.index +0 -0
- package/src/ruvocal/.swarm/hnsw.metadata.json +0 -1
- package/src/ruvocal/.swarm/memory.db +0 -0
- package/src/ruvocal/.swarm/schema.sql +0 -305
package/src/ruvocal/CLAUDE.md
CHANGED
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
Chat UI is a SvelteKit application that provides a chat interface for LLMs. It powers HuggingChat (hf.co/chat). The app speaks exclusively to OpenAI-compatible APIs via `OPENAI_BASE_URL`.
|
|
8
|
-
|
|
9
|
-
## Commands
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm run dev # Start dev server on localhost:5173
|
|
13
|
-
npm run build # Production build
|
|
14
|
-
npm run preview # Preview production build
|
|
15
|
-
npm run check # TypeScript validation (svelte-kit sync + svelte-check)
|
|
16
|
-
npm run lint # Check formatting (Prettier) and linting (ESLint)
|
|
17
|
-
npm run format # Auto-format with Prettier
|
|
18
|
-
npm run test # Run all tests (Vitest)
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
### Running a Single Test
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
npx vitest run path/to/file.spec.ts # Run specific test file
|
|
25
|
-
npx vitest run -t "test name" # Run test by name
|
|
26
|
-
npx vitest --watch path/to/file.spec.ts # Watch mode for single file
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### Test Environments
|
|
30
|
-
|
|
31
|
-
Tests are split into three workspaces (configured in vite.config.ts):
|
|
32
|
-
|
|
33
|
-
- **Client tests** (`*.svelte.test.ts`): Browser environment with Playwright
|
|
34
|
-
- **SSR tests** (`*.ssr.test.ts`): Node environment for server-side rendering
|
|
35
|
-
- **Server tests** (`*.test.ts`, `*.spec.ts`): Node environment for utilities
|
|
36
|
-
|
|
37
|
-
## Architecture
|
|
38
|
-
|
|
39
|
-
### Stack
|
|
40
|
-
|
|
41
|
-
- **SvelteKit 2** with Svelte 5 (uses runes: `$state`, `$effect`, `$bindable`)
|
|
42
|
-
- **MongoDB** for persistence (auto-fallback to in-memory with MongoMemoryServer when `MONGODB_URL` not set)
|
|
43
|
-
- **TailwindCSS** for styling
|
|
44
|
-
|
|
45
|
-
### Key Directories
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
src/
|
|
49
|
-
├── lib/
|
|
50
|
-
│ ├── components/ # Svelte components (chat/, mcp/, voice/, icons/)
|
|
51
|
-
│ ├── server/
|
|
52
|
-
│ │ ├── api/utils/ # Shared API helpers (auth, superjson, model/conversation resolvers)
|
|
53
|
-
│ │ ├── textGeneration/ # LLM streaming pipeline
|
|
54
|
-
│ │ ├── mcp/ # Model Context Protocol integration
|
|
55
|
-
│ │ ├── router/ # Smart model routing (Omni)
|
|
56
|
-
│ │ ├── database.ts # MongoDB collections
|
|
57
|
-
│ │ ├── models.ts # Model registry from OPENAI_BASE_URL/models
|
|
58
|
-
│ │ └── auth.ts # OpenID Connect authentication
|
|
59
|
-
│ ├── types/ # TypeScript interfaces (Conversation, Message, User, Model, etc.)
|
|
60
|
-
│ ├── stores/ # Svelte stores for reactive state
|
|
61
|
-
│ └── utils/ # Helpers (tree/, marked.ts, auth.ts, etc.)
|
|
62
|
-
├── routes/ # SvelteKit file-based routing
|
|
63
|
-
│ ├── conversation/[id]/ # Chat page + streaming endpoint
|
|
64
|
-
│ ├── settings/ # User settings pages
|
|
65
|
-
│ ├── api/ # Legacy v1 API endpoints (mcp, transcribe, fetch-url)
|
|
66
|
-
│ ├── api/v2/ # REST API endpoints (+server.ts)
|
|
67
|
-
│ └── r/[id]/ # Shared conversation view
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Text Generation Flow
|
|
71
|
-
|
|
72
|
-
1. User sends message via `POST /conversation/[id]`
|
|
73
|
-
2. Server validates user, fetches conversation history
|
|
74
|
-
3. Builds message tree structure (see `src/lib/utils/tree/`)
|
|
75
|
-
4. Calls LLM endpoint via OpenAI client
|
|
76
|
-
5. Streams response back, stores in MongoDB
|
|
77
|
-
|
|
78
|
-
### Model Context Protocol (MCP)
|
|
79
|
-
|
|
80
|
-
MCP servers are configured via `MCP_SERVERS` env var. When enabled, tools are exposed as OpenAI function calls. The router can auto-select tools-capable models when `LLM_ROUTER_ENABLE_TOOLS=true`.
|
|
81
|
-
|
|
82
|
-
### LLM Router (Omni)
|
|
83
|
-
|
|
84
|
-
Smart routing via Arch-Router model. Configured with:
|
|
85
|
-
|
|
86
|
-
- `LLM_ROUTER_ROUTES_PATH`: JSON file defining routes
|
|
87
|
-
- `LLM_ROUTER_ARCH_BASE_URL`: Router endpoint
|
|
88
|
-
- Shortcuts: multimodal routes bypass router if `LLM_ROUTER_ENABLE_MULTIMODAL=true`
|
|
89
|
-
|
|
90
|
-
### Database Collections
|
|
91
|
-
|
|
92
|
-
- `conversations` - Chat sessions with nested messages
|
|
93
|
-
- `users` - User accounts (OIDC-backed)
|
|
94
|
-
- `sessions` - Session data
|
|
95
|
-
- `sharedConversations` - Public share links
|
|
96
|
-
- `settings` - User preferences
|
|
97
|
-
|
|
98
|
-
## Environment Setup
|
|
99
|
-
|
|
100
|
-
Copy `.env` to `.env.local` and configure:
|
|
101
|
-
|
|
102
|
-
```env
|
|
103
|
-
OPENAI_BASE_URL=https://router.huggingface.co/v1
|
|
104
|
-
OPENAI_API_KEY=hf_***
|
|
105
|
-
# MONGODB_URL is optional; omit for in-memory DB persisted to ./db
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
See `.env` for full list of variables including router config, MCP servers, auth, and feature flags.
|
|
109
|
-
|
|
110
|
-
## Code Conventions
|
|
111
|
-
|
|
112
|
-
- TypeScript strict mode enabled
|
|
113
|
-
- ESLint: no `any`, no non-null assertions
|
|
114
|
-
- Prettier: tabs, 100 char width, Tailwind class sorting
|
|
115
|
-
- Server vs client separation via SvelteKit conventions (`+page.server.ts` vs `+page.ts`)
|
|
116
|
-
|
|
117
|
-
## Feature Development Checklist
|
|
118
|
-
|
|
119
|
-
When building new features, consider:
|
|
120
|
-
|
|
121
|
-
1. **HuggingChat vs self-hosted**: Wrap HuggingChat-specific features with `publicConfig.isHuggingChat`
|
|
122
|
-
2. **Settings persistence**: Add new fields to `src/lib/types/Settings.ts`, update API endpoint at `src/routes/api/v2/user/settings/+server.ts`
|
|
123
|
-
3. **Rich dropdowns**: Use `bits-ui` (Select, DropdownMenu) instead of native elements when you need icons/images in options
|
|
124
|
-
4. **Scrollbars**: Use `scrollbar-custom` class for styled scrollbars
|
|
125
|
-
5. **Icons**: Custom icons in `$lib/components/icons/`, use Carbon (`~icons/carbon/*`) or Lucide (`~icons/lucide/*`) for standard icons
|
|
126
|
-
6. **Provider avatars**: Use `PROVIDERS_HUB_ORGS` from `@huggingface/inference` for HF provider avatar URLs
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Chat UI is a SvelteKit application that provides a chat interface for LLMs. It powers HuggingChat (hf.co/chat). The app speaks exclusively to OpenAI-compatible APIs via `OPENAI_BASE_URL`.
|
|
8
|
+
|
|
9
|
+
## Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm run dev # Start dev server on localhost:5173
|
|
13
|
+
npm run build # Production build
|
|
14
|
+
npm run preview # Preview production build
|
|
15
|
+
npm run check # TypeScript validation (svelte-kit sync + svelte-check)
|
|
16
|
+
npm run lint # Check formatting (Prettier) and linting (ESLint)
|
|
17
|
+
npm run format # Auto-format with Prettier
|
|
18
|
+
npm run test # Run all tests (Vitest)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Running a Single Test
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx vitest run path/to/file.spec.ts # Run specific test file
|
|
25
|
+
npx vitest run -t "test name" # Run test by name
|
|
26
|
+
npx vitest --watch path/to/file.spec.ts # Watch mode for single file
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Test Environments
|
|
30
|
+
|
|
31
|
+
Tests are split into three workspaces (configured in vite.config.ts):
|
|
32
|
+
|
|
33
|
+
- **Client tests** (`*.svelte.test.ts`): Browser environment with Playwright
|
|
34
|
+
- **SSR tests** (`*.ssr.test.ts`): Node environment for server-side rendering
|
|
35
|
+
- **Server tests** (`*.test.ts`, `*.spec.ts`): Node environment for utilities
|
|
36
|
+
|
|
37
|
+
## Architecture
|
|
38
|
+
|
|
39
|
+
### Stack
|
|
40
|
+
|
|
41
|
+
- **SvelteKit 2** with Svelte 5 (uses runes: `$state`, `$effect`, `$bindable`)
|
|
42
|
+
- **MongoDB** for persistence (auto-fallback to in-memory with MongoMemoryServer when `MONGODB_URL` not set)
|
|
43
|
+
- **TailwindCSS** for styling
|
|
44
|
+
|
|
45
|
+
### Key Directories
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
src/
|
|
49
|
+
├── lib/
|
|
50
|
+
│ ├── components/ # Svelte components (chat/, mcp/, voice/, icons/)
|
|
51
|
+
│ ├── server/
|
|
52
|
+
│ │ ├── api/utils/ # Shared API helpers (auth, superjson, model/conversation resolvers)
|
|
53
|
+
│ │ ├── textGeneration/ # LLM streaming pipeline
|
|
54
|
+
│ │ ├── mcp/ # Model Context Protocol integration
|
|
55
|
+
│ │ ├── router/ # Smart model routing (Omni)
|
|
56
|
+
│ │ ├── database.ts # MongoDB collections
|
|
57
|
+
│ │ ├── models.ts # Model registry from OPENAI_BASE_URL/models
|
|
58
|
+
│ │ └── auth.ts # OpenID Connect authentication
|
|
59
|
+
│ ├── types/ # TypeScript interfaces (Conversation, Message, User, Model, etc.)
|
|
60
|
+
│ ├── stores/ # Svelte stores for reactive state
|
|
61
|
+
│ └── utils/ # Helpers (tree/, marked.ts, auth.ts, etc.)
|
|
62
|
+
├── routes/ # SvelteKit file-based routing
|
|
63
|
+
│ ├── conversation/[id]/ # Chat page + streaming endpoint
|
|
64
|
+
│ ├── settings/ # User settings pages
|
|
65
|
+
│ ├── api/ # Legacy v1 API endpoints (mcp, transcribe, fetch-url)
|
|
66
|
+
│ ├── api/v2/ # REST API endpoints (+server.ts)
|
|
67
|
+
│ └── r/[id]/ # Shared conversation view
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Text Generation Flow
|
|
71
|
+
|
|
72
|
+
1. User sends message via `POST /conversation/[id]`
|
|
73
|
+
2. Server validates user, fetches conversation history
|
|
74
|
+
3. Builds message tree structure (see `src/lib/utils/tree/`)
|
|
75
|
+
4. Calls LLM endpoint via OpenAI client
|
|
76
|
+
5. Streams response back, stores in MongoDB
|
|
77
|
+
|
|
78
|
+
### Model Context Protocol (MCP)
|
|
79
|
+
|
|
80
|
+
MCP servers are configured via `MCP_SERVERS` env var. When enabled, tools are exposed as OpenAI function calls. The router can auto-select tools-capable models when `LLM_ROUTER_ENABLE_TOOLS=true`.
|
|
81
|
+
|
|
82
|
+
### LLM Router (Omni)
|
|
83
|
+
|
|
84
|
+
Smart routing via Arch-Router model. Configured with:
|
|
85
|
+
|
|
86
|
+
- `LLM_ROUTER_ROUTES_PATH`: JSON file defining routes
|
|
87
|
+
- `LLM_ROUTER_ARCH_BASE_URL`: Router endpoint
|
|
88
|
+
- Shortcuts: multimodal routes bypass router if `LLM_ROUTER_ENABLE_MULTIMODAL=true`
|
|
89
|
+
|
|
90
|
+
### Database Collections
|
|
91
|
+
|
|
92
|
+
- `conversations` - Chat sessions with nested messages
|
|
93
|
+
- `users` - User accounts (OIDC-backed)
|
|
94
|
+
- `sessions` - Session data
|
|
95
|
+
- `sharedConversations` - Public share links
|
|
96
|
+
- `settings` - User preferences
|
|
97
|
+
|
|
98
|
+
## Environment Setup
|
|
99
|
+
|
|
100
|
+
Copy `.env` to `.env.local` and configure:
|
|
101
|
+
|
|
102
|
+
```env
|
|
103
|
+
OPENAI_BASE_URL=https://router.huggingface.co/v1
|
|
104
|
+
OPENAI_API_KEY=hf_***
|
|
105
|
+
# MONGODB_URL is optional; omit for in-memory DB persisted to ./db
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
See `.env` for full list of variables including router config, MCP servers, auth, and feature flags.
|
|
109
|
+
|
|
110
|
+
## Code Conventions
|
|
111
|
+
|
|
112
|
+
- TypeScript strict mode enabled
|
|
113
|
+
- ESLint: no `any`, no non-null assertions
|
|
114
|
+
- Prettier: tabs, 100 char width, Tailwind class sorting
|
|
115
|
+
- Server vs client separation via SvelteKit conventions (`+page.server.ts` vs `+page.ts`)
|
|
116
|
+
|
|
117
|
+
## Feature Development Checklist
|
|
118
|
+
|
|
119
|
+
When building new features, consider:
|
|
120
|
+
|
|
121
|
+
1. **HuggingChat vs self-hosted**: Wrap HuggingChat-specific features with `publicConfig.isHuggingChat`
|
|
122
|
+
2. **Settings persistence**: Add new fields to `src/lib/types/Settings.ts`, update API endpoint at `src/routes/api/v2/user/settings/+server.ts`
|
|
123
|
+
3. **Rich dropdowns**: Use `bits-ui` (Select, DropdownMenu) instead of native elements when you need icons/images in options
|
|
124
|
+
4. **Scrollbars**: Use `scrollbar-custom` class for styled scrollbars
|
|
125
|
+
5. **Icons**: Custom icons in `$lib/components/icons/`, use Carbon (`~icons/carbon/*`) or Lucide (`~icons/lucide/*`) for standard icons
|
|
126
|
+
6. **Provider avatars**: Use `PROVIDERS_HUB_ORGS` from `@huggingface/inference` for HF provider avatar URLs
|
package/src/ruvocal/Dockerfile
CHANGED
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
# syntax=docker/dockerfile:1
|
|
2
|
-
ARG INCLUDE_DB=false
|
|
3
|
-
|
|
4
|
-
FROM node:24-slim AS base
|
|
5
|
-
|
|
6
|
-
# install dotenv-cli
|
|
7
|
-
RUN npm install -g dotenv-cli
|
|
8
|
-
|
|
9
|
-
# switch to a user that works for spaces
|
|
10
|
-
RUN userdel -r node
|
|
11
|
-
RUN useradd -m -u 1000 user
|
|
12
|
-
USER user
|
|
13
|
-
|
|
14
|
-
ENV HOME=/home/user \
|
|
15
|
-
PATH=/home/user/.local/bin:$PATH
|
|
16
|
-
|
|
17
|
-
WORKDIR /app
|
|
18
|
-
|
|
19
|
-
# add a .env.local if the user doesn't bind a volume to it
|
|
20
|
-
RUN touch /app/.env.local
|
|
21
|
-
|
|
22
|
-
USER root
|
|
23
|
-
RUN apt-get update
|
|
24
|
-
RUN apt-get install -y libgomp1 libcurl4 curl dnsutils nano
|
|
25
|
-
|
|
26
|
-
# ensure npm cache dir exists before adjusting ownership
|
|
27
|
-
RUN mkdir -p /home/user/.npm && chown -R 1000:1000 /home/user/.npm
|
|
28
|
-
|
|
29
|
-
USER user
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
COPY --chown=1000 .env /app/.env
|
|
33
|
-
# Remove empty placeholder values that block .env.local overrides via dotenv-cli -c
|
|
34
|
-
RUN sed -i 's/^MODELS=$/# MODELS=/' /app/.env && \
|
|
35
|
-
sed -i 's/^TASK_MODEL=$/# TASK_MODEL=/' /app/.env
|
|
36
|
-
COPY --chown=1000 entrypoint.sh /app/entrypoint.sh
|
|
37
|
-
COPY --chown=1000 package.json /app/package.json
|
|
38
|
-
COPY --chown=1000 package-lock.json /app/package-lock.json
|
|
39
|
-
|
|
40
|
-
RUN chmod +x /app/entrypoint.sh
|
|
41
|
-
|
|
42
|
-
FROM node:24 AS builder
|
|
43
|
-
|
|
44
|
-
WORKDIR /app
|
|
45
|
-
|
|
46
|
-
COPY --link --chown=1000 package-lock.json package.json ./
|
|
47
|
-
|
|
48
|
-
ARG APP_BASE=
|
|
49
|
-
ARG PUBLIC_APP_COLOR=
|
|
50
|
-
ENV BODY_SIZE_LIMIT=15728640
|
|
51
|
-
|
|
52
|
-
RUN --mount=type=cache,target=/app/.npm \
|
|
53
|
-
npm set cache /app/.npm && \
|
|
54
|
-
npm ci
|
|
55
|
-
|
|
56
|
-
COPY --link --chown=1000 . .
|
|
57
|
-
|
|
58
|
-
RUN git config --global --add safe.directory /app && \
|
|
59
|
-
npm run build
|
|
60
|
-
|
|
61
|
-
# mongo image
|
|
62
|
-
FROM mongo:7 AS mongo
|
|
63
|
-
|
|
64
|
-
# image to be used if INCLUDE_DB is false
|
|
65
|
-
FROM base AS local_db_false
|
|
66
|
-
|
|
67
|
-
# image to be used if INCLUDE_DB is true
|
|
68
|
-
FROM base AS local_db_true
|
|
69
|
-
|
|
70
|
-
# copy mongo from the other stage
|
|
71
|
-
COPY --from=mongo /usr/bin/mongo* /usr/bin/
|
|
72
|
-
|
|
73
|
-
ENV MONGODB_URL=mongodb://localhost:27017
|
|
74
|
-
USER root
|
|
75
|
-
RUN mkdir -p /data/db
|
|
76
|
-
RUN chown -R 1000:1000 /data/db
|
|
77
|
-
USER user
|
|
78
|
-
# final image
|
|
79
|
-
FROM local_db_${INCLUDE_DB} AS final
|
|
80
|
-
|
|
81
|
-
# build arg to determine if the database should be included
|
|
82
|
-
ARG INCLUDE_DB=false
|
|
83
|
-
ENV INCLUDE_DB=${INCLUDE_DB}
|
|
84
|
-
|
|
85
|
-
# svelte requires APP_BASE at build time so it must be passed as a build arg
|
|
86
|
-
ARG APP_BASE=
|
|
87
|
-
ARG PUBLIC_APP_COLOR=
|
|
88
|
-
ARG PUBLIC_COMMIT_SHA=
|
|
89
|
-
ENV PUBLIC_COMMIT_SHA=${PUBLIC_COMMIT_SHA}
|
|
90
|
-
ENV BODY_SIZE_LIMIT=15728640
|
|
91
|
-
|
|
92
|
-
#import the build & dependencies
|
|
93
|
-
COPY --from=builder --chown=1000 /app/build /app/build
|
|
94
|
-
COPY --from=builder --chown=1000 /app/node_modules /app/node_modules
|
|
95
|
-
|
|
96
|
-
CMD ["/bin/bash", "-c", "/app/entrypoint.sh"]
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
ARG INCLUDE_DB=false
|
|
3
|
+
|
|
4
|
+
FROM node:24-slim AS base
|
|
5
|
+
|
|
6
|
+
# install dotenv-cli
|
|
7
|
+
RUN npm install -g dotenv-cli
|
|
8
|
+
|
|
9
|
+
# switch to a user that works for spaces
|
|
10
|
+
RUN userdel -r node
|
|
11
|
+
RUN useradd -m -u 1000 user
|
|
12
|
+
USER user
|
|
13
|
+
|
|
14
|
+
ENV HOME=/home/user \
|
|
15
|
+
PATH=/home/user/.local/bin:$PATH
|
|
16
|
+
|
|
17
|
+
WORKDIR /app
|
|
18
|
+
|
|
19
|
+
# add a .env.local if the user doesn't bind a volume to it
|
|
20
|
+
RUN touch /app/.env.local
|
|
21
|
+
|
|
22
|
+
USER root
|
|
23
|
+
RUN apt-get update
|
|
24
|
+
RUN apt-get install -y libgomp1 libcurl4 curl dnsutils nano
|
|
25
|
+
|
|
26
|
+
# ensure npm cache dir exists before adjusting ownership
|
|
27
|
+
RUN mkdir -p /home/user/.npm && chown -R 1000:1000 /home/user/.npm
|
|
28
|
+
|
|
29
|
+
USER user
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
COPY --chown=1000 .env /app/.env
|
|
33
|
+
# Remove empty placeholder values that block .env.local overrides via dotenv-cli -c
|
|
34
|
+
RUN sed -i 's/^MODELS=$/# MODELS=/' /app/.env && \
|
|
35
|
+
sed -i 's/^TASK_MODEL=$/# TASK_MODEL=/' /app/.env
|
|
36
|
+
COPY --chown=1000 entrypoint.sh /app/entrypoint.sh
|
|
37
|
+
COPY --chown=1000 package.json /app/package.json
|
|
38
|
+
COPY --chown=1000 package-lock.json /app/package-lock.json
|
|
39
|
+
|
|
40
|
+
RUN chmod +x /app/entrypoint.sh
|
|
41
|
+
|
|
42
|
+
FROM node:24 AS builder
|
|
43
|
+
|
|
44
|
+
WORKDIR /app
|
|
45
|
+
|
|
46
|
+
COPY --link --chown=1000 package-lock.json package.json ./
|
|
47
|
+
|
|
48
|
+
ARG APP_BASE=
|
|
49
|
+
ARG PUBLIC_APP_COLOR=
|
|
50
|
+
ENV BODY_SIZE_LIMIT=15728640
|
|
51
|
+
|
|
52
|
+
RUN --mount=type=cache,target=/app/.npm \
|
|
53
|
+
npm set cache /app/.npm && \
|
|
54
|
+
npm ci
|
|
55
|
+
|
|
56
|
+
COPY --link --chown=1000 . .
|
|
57
|
+
|
|
58
|
+
RUN git config --global --add safe.directory /app && \
|
|
59
|
+
npm run build
|
|
60
|
+
|
|
61
|
+
# mongo image
|
|
62
|
+
FROM mongo:7 AS mongo
|
|
63
|
+
|
|
64
|
+
# image to be used if INCLUDE_DB is false
|
|
65
|
+
FROM base AS local_db_false
|
|
66
|
+
|
|
67
|
+
# image to be used if INCLUDE_DB is true
|
|
68
|
+
FROM base AS local_db_true
|
|
69
|
+
|
|
70
|
+
# copy mongo from the other stage
|
|
71
|
+
COPY --from=mongo /usr/bin/mongo* /usr/bin/
|
|
72
|
+
|
|
73
|
+
ENV MONGODB_URL=mongodb://localhost:27017
|
|
74
|
+
USER root
|
|
75
|
+
RUN mkdir -p /data/db
|
|
76
|
+
RUN chown -R 1000:1000 /data/db
|
|
77
|
+
USER user
|
|
78
|
+
# final image
|
|
79
|
+
FROM local_db_${INCLUDE_DB} AS final
|
|
80
|
+
|
|
81
|
+
# build arg to determine if the database should be included
|
|
82
|
+
ARG INCLUDE_DB=false
|
|
83
|
+
ENV INCLUDE_DB=${INCLUDE_DB}
|
|
84
|
+
|
|
85
|
+
# svelte requires APP_BASE at build time so it must be passed as a build arg
|
|
86
|
+
ARG APP_BASE=
|
|
87
|
+
ARG PUBLIC_APP_COLOR=
|
|
88
|
+
ARG PUBLIC_COMMIT_SHA=
|
|
89
|
+
ENV PUBLIC_COMMIT_SHA=${PUBLIC_COMMIT_SHA}
|
|
90
|
+
ENV BODY_SIZE_LIMIT=15728640
|
|
91
|
+
|
|
92
|
+
#import the build & dependencies
|
|
93
|
+
COPY --from=builder --chown=1000 /app/build /app/build
|
|
94
|
+
COPY --from=builder --chown=1000 /app/node_modules /app/node_modules
|
|
95
|
+
|
|
96
|
+
CMD ["/bin/bash", "-c", "/app/entrypoint.sh"]
|