ruflo 3.10.45 → 3.11.0
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 +412 -412
- 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/.claude-flow/daemon-state.json +135 -0
- package/src/ruvocal/.claude-flow/data/pending-insights.jsonl +0 -0
- package/src/ruvocal/.claude-flow/data/ranked-context.json +5 -0
- package/src/ruvocal/.claude-flow/logs/daemon.log +31 -0
- package/src/ruvocal/.claude-flow/logs/headless/audit_1777949411822_juxau0_prompt.log +989 -0
- package/src/ruvocal/.claude-flow/logs/headless/audit_1777949411822_juxau0_result.log +67 -0
- package/src/ruvocal/.claude-flow/logs/headless/audit_1777950042278_jvj5xq_prompt.log +989 -0
- package/src/ruvocal/.claude-flow/logs/headless/audit_1777950042278_jvj5xq_result.log +93 -0
- package/src/ruvocal/.claude-flow/logs/headless/optimize_1777949531823_yt5yc2_prompt.log +1498 -0
- package/src/ruvocal/.claude-flow/logs/headless/optimize_1777949531823_yt5yc2_result.log +93 -0
- package/src/ruvocal/.claude-flow/logs/headless/testgaps_1777949771821_elw1j4_prompt.log +1498 -0
- package/src/ruvocal/.claude-flow/logs/headless/testgaps_1777949771821_elw1j4_result.log +100 -0
- package/src/ruvocal/.claude-flow/metrics/codebase-map.json +11 -0
- package/src/ruvocal/.claude-flow/metrics/consolidation.json +6 -0
- package/src/ruvocal/.claude-flow/neural/stats.json +6 -0
- package/src/ruvocal/.claude-flow/sessions/current.json +13 -0
- 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/.swarm/attestation.db +0 -0
- package/src/ruvocal/.swarm/hnsw.index +0 -0
- package/src/ruvocal/.swarm/hnsw.metadata.json +1 -0
- package/src/ruvocal/.swarm/memory.db +0 -0
- package/src/ruvocal/.swarm/schema.sql +305 -0
- 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
|
@@ -1,362 +1,362 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import CarbonTrashCan from "~icons/carbon/trash-can";
|
|
3
|
-
import CarbonArrowUpRight from "~icons/carbon/arrow-up-right";
|
|
4
|
-
import CarbonLogoGithub from "~icons/carbon/logo-github";
|
|
5
|
-
|
|
6
|
-
import { useSettingsStore } from "$lib/stores/settings";
|
|
7
|
-
import type { StreamingMode } from "$lib/types/Settings";
|
|
8
|
-
import Switch from "$lib/components/Switch.svelte";
|
|
9
|
-
|
|
10
|
-
import { goto } from "$app/navigation";
|
|
11
|
-
import { error } from "$lib/stores/errors";
|
|
12
|
-
import { base } from "$app/paths";
|
|
13
|
-
import { page } from "$app/state";
|
|
14
|
-
import { usePublicConfig } from "$lib/utils/PublicConfig.svelte";
|
|
15
|
-
import { useAPIClient, handleResponse } from "$lib/APIClient";
|
|
16
|
-
import { onMount } from "svelte";
|
|
17
|
-
import { browser } from "$app/environment";
|
|
18
|
-
import { getThemePreference, setTheme, type ThemePreference } from "$lib/switchTheme";
|
|
19
|
-
import { supportsHaptics } from "$lib/utils/haptics";
|
|
20
|
-
|
|
21
|
-
const publicConfig = usePublicConfig();
|
|
22
|
-
let settings = useSettingsStore();
|
|
23
|
-
|
|
24
|
-
// Functional bindings for store fields (Svelte 5): avoid mutating $settings directly
|
|
25
|
-
function getShareWithAuthors() {
|
|
26
|
-
return $settings.shareConversationsWithModelAuthors;
|
|
27
|
-
}
|
|
28
|
-
function setShareWithAuthors(v: boolean) {
|
|
29
|
-
settings.update((s) => ({ ...s, shareConversationsWithModelAuthors: v }));
|
|
30
|
-
}
|
|
31
|
-
function getStreamingMode() {
|
|
32
|
-
return $settings.streamingMode;
|
|
33
|
-
}
|
|
34
|
-
function setStreamingMode(v: StreamingMode) {
|
|
35
|
-
settings.update((s) => ({ ...s, streamingMode: v }));
|
|
36
|
-
}
|
|
37
|
-
function getDirectPaste() {
|
|
38
|
-
return $settings.directPaste;
|
|
39
|
-
}
|
|
40
|
-
function setDirectPaste(v: boolean) {
|
|
41
|
-
settings.update((s) => ({ ...s, directPaste: v }));
|
|
42
|
-
}
|
|
43
|
-
function getHapticsEnabled() {
|
|
44
|
-
return $settings.hapticsEnabled;
|
|
45
|
-
}
|
|
46
|
-
function setHapticsEnabled(v: boolean) {
|
|
47
|
-
settings.update((s) => ({ ...s, hapticsEnabled: v }));
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const client = useAPIClient();
|
|
51
|
-
|
|
52
|
-
let OPENAI_BASE_URL = $state<string | null>(null);
|
|
53
|
-
|
|
54
|
-
// Billing organization state
|
|
55
|
-
type BillingOrg = { sub: string; name: string; preferred_username: string };
|
|
56
|
-
let billingOrgs = $state<BillingOrg[]>([]);
|
|
57
|
-
let billingOrgsLoading = $state(false);
|
|
58
|
-
let billingOrgsError = $state<string | null>(null);
|
|
59
|
-
|
|
60
|
-
function getBillingOrganization() {
|
|
61
|
-
return $settings.billingOrganization ?? "";
|
|
62
|
-
}
|
|
63
|
-
function setBillingOrganization(v: string) {
|
|
64
|
-
settings.update((s) => ({ ...s, billingOrganization: v }));
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
onMount(async () => {
|
|
68
|
-
// Fetch debug config
|
|
69
|
-
try {
|
|
70
|
-
const cfg = await client.debug.config.get().then(handleResponse);
|
|
71
|
-
OPENAI_BASE_URL = (cfg as { OPENAI_BASE_URL?: string }).OPENAI_BASE_URL || null;
|
|
72
|
-
} catch (e) {
|
|
73
|
-
// ignore if debug endpoint is unavailable
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Fetch billing organizations (only for HuggingChat + logged in users)
|
|
77
|
-
if (publicConfig.isHuggingChat && page.data.user) {
|
|
78
|
-
billingOrgsLoading = true;
|
|
79
|
-
try {
|
|
80
|
-
const data = (await client.user["billing-orgs"].get().then(handleResponse)) as {
|
|
81
|
-
userCanPay: boolean;
|
|
82
|
-
organizations: BillingOrg[];
|
|
83
|
-
currentBillingOrg?: string;
|
|
84
|
-
};
|
|
85
|
-
billingOrgs = data.organizations ?? [];
|
|
86
|
-
// Update settings if current billing org was cleared by server
|
|
87
|
-
if (data.currentBillingOrg !== getBillingOrganization()) {
|
|
88
|
-
setBillingOrganization(data.currentBillingOrg ?? "");
|
|
89
|
-
}
|
|
90
|
-
} catch {
|
|
91
|
-
billingOrgsError = "Failed to load billing options";
|
|
92
|
-
} finally {
|
|
93
|
-
billingOrgsLoading = false;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
let themePref = $state<ThemePreference>(browser ? getThemePreference() : "system");
|
|
99
|
-
|
|
100
|
-
// Admin: model refresh UI state
|
|
101
|
-
let refreshing = $state(false);
|
|
102
|
-
let refreshMessage = $state<string | null>(null);
|
|
103
|
-
</script>
|
|
104
|
-
|
|
105
|
-
<div class="flex w-full flex-col gap-4">
|
|
106
|
-
<h2 class="text-center text-lg font-semibold text-gray-800 dark:text-gray-200 md:text-left">
|
|
107
|
-
Application Settings
|
|
108
|
-
</h2>
|
|
109
|
-
|
|
110
|
-
{#if OPENAI_BASE_URL !== null}
|
|
111
|
-
<div
|
|
112
|
-
class="mt-1 rounded-lg border border-gray-200 bg-gray-50 px-3 py-2 text-[12px] text-gray-700 dark:border-gray-700 dark:bg-gray-700/80 dark:text-gray-300"
|
|
113
|
-
>
|
|
114
|
-
<span class="font-medium">API Base URL:</span>
|
|
115
|
-
<code class="ml-1 break-all font-mono text-[12px] text-gray-800 dark:text-gray-100"
|
|
116
|
-
>{OPENAI_BASE_URL}</code
|
|
117
|
-
>
|
|
118
|
-
</div>
|
|
119
|
-
{/if}
|
|
120
|
-
{#if !!publicConfig.PUBLIC_COMMIT_SHA}
|
|
121
|
-
<div
|
|
122
|
-
class="flex flex-col items-start justify-between text-xl font-semibold text-gray-800 dark:text-gray-200"
|
|
123
|
-
>
|
|
124
|
-
<a
|
|
125
|
-
href={`https://github.com/huggingface/chat-ui/commit/${publicConfig.PUBLIC_COMMIT_SHA}`}
|
|
126
|
-
target="_blank"
|
|
127
|
-
rel="noreferrer"
|
|
128
|
-
class="text-sm font-light text-gray-500 dark:text-gray-400"
|
|
129
|
-
>
|
|
130
|
-
Latest deployment <span class="gap-2 font-mono"
|
|
131
|
-
>{publicConfig.PUBLIC_COMMIT_SHA.slice(0, 7)}</span
|
|
132
|
-
>
|
|
133
|
-
</a>
|
|
134
|
-
</div>
|
|
135
|
-
{/if}
|
|
136
|
-
{#if page.data.isAdmin}
|
|
137
|
-
<div class="flex items-center gap-2">
|
|
138
|
-
<p
|
|
139
|
-
class="rounded-md bg-red-50 px-2 py-1 text-xs font-medium text-red-700 dark:bg-red-500/10 dark:text-red-300"
|
|
140
|
-
>
|
|
141
|
-
Admin mode
|
|
142
|
-
</p>
|
|
143
|
-
<button
|
|
144
|
-
class="btn rounded-md text-xs"
|
|
145
|
-
class:underline={!refreshing}
|
|
146
|
-
type="button"
|
|
147
|
-
onclick={async () => {
|
|
148
|
-
try {
|
|
149
|
-
refreshing = true;
|
|
150
|
-
refreshMessage = null;
|
|
151
|
-
const res = await client.models.refresh.post().then(handleResponse);
|
|
152
|
-
const delta = `+${res.added.length} −${res.removed.length} ~${res.changed.length}`;
|
|
153
|
-
refreshMessage = `Refreshed in ${res.durationMs} ms • ${delta} • total ${res.total}`;
|
|
154
|
-
await goto(page.url.pathname, { invalidateAll: true });
|
|
155
|
-
} catch (e) {
|
|
156
|
-
console.error(e);
|
|
157
|
-
$error = "Model refresh failed";
|
|
158
|
-
} finally {
|
|
159
|
-
refreshing = false;
|
|
160
|
-
}
|
|
161
|
-
}}
|
|
162
|
-
disabled={refreshing}
|
|
163
|
-
>
|
|
164
|
-
{refreshing ? "Refreshing…" : "Refresh models"}
|
|
165
|
-
</button>
|
|
166
|
-
{#if refreshMessage}
|
|
167
|
-
<span class="text-xs text-gray-600 dark:text-gray-400">{refreshMessage}</span>
|
|
168
|
-
{/if}
|
|
169
|
-
</div>
|
|
170
|
-
{/if}
|
|
171
|
-
<div class="flex h-full flex-col gap-4 max-sm:pt-0">
|
|
172
|
-
<div
|
|
173
|
-
class="rounded-xl border border-gray-200 bg-white px-3 shadow-sm dark:border-gray-700 dark:bg-gray-800"
|
|
174
|
-
>
|
|
175
|
-
<div class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
176
|
-
{#if publicConfig.PUBLIC_APP_DATA_SHARING === "1"}
|
|
177
|
-
<div class="flex items-start justify-between py-3">
|
|
178
|
-
<div>
|
|
179
|
-
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
180
|
-
Share with model authors
|
|
181
|
-
</div>
|
|
182
|
-
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
183
|
-
Sharing your data helps improve open models over time.
|
|
184
|
-
</p>
|
|
185
|
-
</div>
|
|
186
|
-
<Switch
|
|
187
|
-
name="shareConversationsWithModelAuthors"
|
|
188
|
-
bind:checked={getShareWithAuthors, setShareWithAuthors}
|
|
189
|
-
/>
|
|
190
|
-
</div>
|
|
191
|
-
{/if}
|
|
192
|
-
|
|
193
|
-
<div class="flex items-start justify-between py-3">
|
|
194
|
-
<div>
|
|
195
|
-
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
196
|
-
Streaming mode
|
|
197
|
-
</div>
|
|
198
|
-
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
199
|
-
Choose how assistant text appears while generating.
|
|
200
|
-
</p>
|
|
201
|
-
</div>
|
|
202
|
-
<select
|
|
203
|
-
class="rounded-md border border-gray-300 bg-white px-1 py-1 text-xs text-gray-800 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"
|
|
204
|
-
value={getStreamingMode()}
|
|
205
|
-
onchange={(e) => setStreamingMode(e.currentTarget.value as StreamingMode)}
|
|
206
|
-
>
|
|
207
|
-
<option value="smooth">Smooth stream</option>
|
|
208
|
-
<option value="raw">Raw stream</option>
|
|
209
|
-
</select>
|
|
210
|
-
</div>
|
|
211
|
-
|
|
212
|
-
<div class="flex items-start justify-between py-3">
|
|
213
|
-
<div>
|
|
214
|
-
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
215
|
-
Paste text directly
|
|
216
|
-
</div>
|
|
217
|
-
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
218
|
-
Paste long text directly into chat instead of a file.
|
|
219
|
-
</p>
|
|
220
|
-
</div>
|
|
221
|
-
<Switch name="directPaste" bind:checked={getDirectPaste, setDirectPaste} />
|
|
222
|
-
</div>
|
|
223
|
-
|
|
224
|
-
{#if supportsHaptics()}
|
|
225
|
-
<div class="flex items-start justify-between py-3">
|
|
226
|
-
<div>
|
|
227
|
-
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
228
|
-
Haptic feedback
|
|
229
|
-
</div>
|
|
230
|
-
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
231
|
-
Vibrate on taps and actions on supported devices.
|
|
232
|
-
</p>
|
|
233
|
-
</div>
|
|
234
|
-
<Switch name="hapticsEnabled" bind:checked={getHapticsEnabled, setHapticsEnabled} />
|
|
235
|
-
</div>
|
|
236
|
-
{/if}
|
|
237
|
-
|
|
238
|
-
<!-- Theme selector -->
|
|
239
|
-
<div class="flex items-start justify-between py-3">
|
|
240
|
-
<div>
|
|
241
|
-
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">Theme</div>
|
|
242
|
-
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
243
|
-
Choose light, dark, or follow system.
|
|
244
|
-
</p>
|
|
245
|
-
</div>
|
|
246
|
-
<select
|
|
247
|
-
class="rounded-md border border-gray-300 bg-white px-1 py-1 text-xs text-gray-800 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"
|
|
248
|
-
value={themePref}
|
|
249
|
-
onchange={(e) => {
|
|
250
|
-
const v = e.currentTarget.value as ThemePreference;
|
|
251
|
-
setTheme(v);
|
|
252
|
-
themePref = v;
|
|
253
|
-
}}
|
|
254
|
-
>
|
|
255
|
-
<option value="system">System</option>
|
|
256
|
-
<option value="light">Light</option>
|
|
257
|
-
<option value="dark">Dark</option>
|
|
258
|
-
</select>
|
|
259
|
-
</div>
|
|
260
|
-
</div>
|
|
261
|
-
</div>
|
|
262
|
-
|
|
263
|
-
<!-- Billing section (HuggingChat only) -->
|
|
264
|
-
{#if publicConfig.isHuggingChat && page.data.user}
|
|
265
|
-
<div
|
|
266
|
-
class="rounded-xl border border-gray-200 bg-white px-3 shadow-sm dark:border-gray-700 dark:bg-gray-800"
|
|
267
|
-
>
|
|
268
|
-
<div class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
269
|
-
<!-- Bill usage to -->
|
|
270
|
-
<div class="flex items-start justify-between py-3">
|
|
271
|
-
<div>
|
|
272
|
-
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">Billing</div>
|
|
273
|
-
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
274
|
-
Select between personal or organization billing (for eligible organizations).
|
|
275
|
-
</p>
|
|
276
|
-
</div>
|
|
277
|
-
<div class="flex items-center">
|
|
278
|
-
{#if billingOrgsLoading}
|
|
279
|
-
<span class="text-xs text-gray-500 dark:text-gray-400">Loading...</span>
|
|
280
|
-
{:else if billingOrgsError}
|
|
281
|
-
<span class="text-xs text-red-500">{billingOrgsError}</span>
|
|
282
|
-
{:else}
|
|
283
|
-
<select
|
|
284
|
-
class="rounded-md border border-gray-300 bg-white px-1 py-1 text-xs text-gray-800 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"
|
|
285
|
-
value={getBillingOrganization()}
|
|
286
|
-
onchange={(e) => setBillingOrganization(e.currentTarget.value)}
|
|
287
|
-
>
|
|
288
|
-
<option value="">Personal</option>
|
|
289
|
-
{#each billingOrgs as org}
|
|
290
|
-
<option value={org.preferred_username}>{org.name}</option>
|
|
291
|
-
{/each}
|
|
292
|
-
</select>
|
|
293
|
-
{/if}
|
|
294
|
-
</div>
|
|
295
|
-
</div>
|
|
296
|
-
<!-- Providers Usage -->
|
|
297
|
-
<div class="flex items-start justify-between py-3">
|
|
298
|
-
<div>
|
|
299
|
-
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
300
|
-
Providers Usage
|
|
301
|
-
</div>
|
|
302
|
-
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
303
|
-
See which providers you use and choose your preferred ones.
|
|
304
|
-
</p>
|
|
305
|
-
</div>
|
|
306
|
-
<a
|
|
307
|
-
href={getBillingOrganization()
|
|
308
|
-
? `https://huggingface.co/organizations/${getBillingOrganization()}/settings/inference-providers/overview`
|
|
309
|
-
: "https://huggingface.co/settings/inference-providers/overview"}
|
|
310
|
-
target="_blank"
|
|
311
|
-
class="whitespace-nowrap rounded-md border border-gray-300 bg-white px-2.5 py-1 text-xs font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600"
|
|
312
|
-
>
|
|
313
|
-
View Usage
|
|
314
|
-
</a>
|
|
315
|
-
</div>
|
|
316
|
-
</div>
|
|
317
|
-
</div>
|
|
318
|
-
{/if}
|
|
319
|
-
|
|
320
|
-
<div class="mt-6 flex flex-col gap-2 self-start text-[13px]">
|
|
321
|
-
{#if publicConfig.isHuggingChat}
|
|
322
|
-
<a
|
|
323
|
-
href="https://github.com/huggingface/chat-ui"
|
|
324
|
-
target="_blank"
|
|
325
|
-
class="flex items-center underline decoration-gray-300 underline-offset-2 hover:decoration-gray-700 dark:decoration-gray-700 dark:hover:decoration-gray-400"
|
|
326
|
-
><CarbonLogoGithub class="mr-1.5 shrink-0 text-sm " /> Github repository</a
|
|
327
|
-
>
|
|
328
|
-
<a
|
|
329
|
-
href="https://huggingface.co/spaces/huggingchat/chat-ui/discussions/764"
|
|
330
|
-
target="_blank"
|
|
331
|
-
rel="noreferrer"
|
|
332
|
-
class="flex items-center underline decoration-gray-300 underline-offset-2 hover:decoration-gray-700 dark:decoration-gray-700 dark:hover:decoration-gray-400"
|
|
333
|
-
><CarbonArrowUpRight class="mr-1.5 shrink-0 text-sm " /> Share your feedback on HuggingChat</a
|
|
334
|
-
>
|
|
335
|
-
<a
|
|
336
|
-
href="{base}/privacy"
|
|
337
|
-
class="flex items-center underline decoration-gray-300 underline-offset-2 hover:decoration-gray-700 dark:decoration-gray-700 dark:hover:decoration-gray-400"
|
|
338
|
-
><CarbonArrowUpRight class="mr-1.5 shrink-0 text-sm " /> About & Privacy</a
|
|
339
|
-
>
|
|
340
|
-
{/if}
|
|
341
|
-
<button
|
|
342
|
-
onclick={async (e) => {
|
|
343
|
-
e.preventDefault();
|
|
344
|
-
|
|
345
|
-
confirm("Are you sure you want to delete all conversations?") &&
|
|
346
|
-
client.conversations
|
|
347
|
-
.delete()
|
|
348
|
-
.then(async () => {
|
|
349
|
-
await goto(`${base}/`, { invalidateAll: true });
|
|
350
|
-
})
|
|
351
|
-
.catch((err) => {
|
|
352
|
-
console.error(err);
|
|
353
|
-
$error = err.message;
|
|
354
|
-
});
|
|
355
|
-
}}
|
|
356
|
-
type="submit"
|
|
357
|
-
class="flex items-center underline decoration-red-200 underline-offset-2 hover:decoration-red-500 dark:decoration-red-900 dark:hover:decoration-red-700"
|
|
358
|
-
><CarbonTrashCan class="mr-2 inline text-sm text-red-500" />Delete all conversations</button
|
|
359
|
-
>
|
|
360
|
-
</div>
|
|
361
|
-
</div>
|
|
362
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import CarbonTrashCan from "~icons/carbon/trash-can";
|
|
3
|
+
import CarbonArrowUpRight from "~icons/carbon/arrow-up-right";
|
|
4
|
+
import CarbonLogoGithub from "~icons/carbon/logo-github";
|
|
5
|
+
|
|
6
|
+
import { useSettingsStore } from "$lib/stores/settings";
|
|
7
|
+
import type { StreamingMode } from "$lib/types/Settings";
|
|
8
|
+
import Switch from "$lib/components/Switch.svelte";
|
|
9
|
+
|
|
10
|
+
import { goto } from "$app/navigation";
|
|
11
|
+
import { error } from "$lib/stores/errors";
|
|
12
|
+
import { base } from "$app/paths";
|
|
13
|
+
import { page } from "$app/state";
|
|
14
|
+
import { usePublicConfig } from "$lib/utils/PublicConfig.svelte";
|
|
15
|
+
import { useAPIClient, handleResponse } from "$lib/APIClient";
|
|
16
|
+
import { onMount } from "svelte";
|
|
17
|
+
import { browser } from "$app/environment";
|
|
18
|
+
import { getThemePreference, setTheme, type ThemePreference } from "$lib/switchTheme";
|
|
19
|
+
import { supportsHaptics } from "$lib/utils/haptics";
|
|
20
|
+
|
|
21
|
+
const publicConfig = usePublicConfig();
|
|
22
|
+
let settings = useSettingsStore();
|
|
23
|
+
|
|
24
|
+
// Functional bindings for store fields (Svelte 5): avoid mutating $settings directly
|
|
25
|
+
function getShareWithAuthors() {
|
|
26
|
+
return $settings.shareConversationsWithModelAuthors;
|
|
27
|
+
}
|
|
28
|
+
function setShareWithAuthors(v: boolean) {
|
|
29
|
+
settings.update((s) => ({ ...s, shareConversationsWithModelAuthors: v }));
|
|
30
|
+
}
|
|
31
|
+
function getStreamingMode() {
|
|
32
|
+
return $settings.streamingMode;
|
|
33
|
+
}
|
|
34
|
+
function setStreamingMode(v: StreamingMode) {
|
|
35
|
+
settings.update((s) => ({ ...s, streamingMode: v }));
|
|
36
|
+
}
|
|
37
|
+
function getDirectPaste() {
|
|
38
|
+
return $settings.directPaste;
|
|
39
|
+
}
|
|
40
|
+
function setDirectPaste(v: boolean) {
|
|
41
|
+
settings.update((s) => ({ ...s, directPaste: v }));
|
|
42
|
+
}
|
|
43
|
+
function getHapticsEnabled() {
|
|
44
|
+
return $settings.hapticsEnabled;
|
|
45
|
+
}
|
|
46
|
+
function setHapticsEnabled(v: boolean) {
|
|
47
|
+
settings.update((s) => ({ ...s, hapticsEnabled: v }));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const client = useAPIClient();
|
|
51
|
+
|
|
52
|
+
let OPENAI_BASE_URL = $state<string | null>(null);
|
|
53
|
+
|
|
54
|
+
// Billing organization state
|
|
55
|
+
type BillingOrg = { sub: string; name: string; preferred_username: string };
|
|
56
|
+
let billingOrgs = $state<BillingOrg[]>([]);
|
|
57
|
+
let billingOrgsLoading = $state(false);
|
|
58
|
+
let billingOrgsError = $state<string | null>(null);
|
|
59
|
+
|
|
60
|
+
function getBillingOrganization() {
|
|
61
|
+
return $settings.billingOrganization ?? "";
|
|
62
|
+
}
|
|
63
|
+
function setBillingOrganization(v: string) {
|
|
64
|
+
settings.update((s) => ({ ...s, billingOrganization: v }));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
onMount(async () => {
|
|
68
|
+
// Fetch debug config
|
|
69
|
+
try {
|
|
70
|
+
const cfg = await client.debug.config.get().then(handleResponse);
|
|
71
|
+
OPENAI_BASE_URL = (cfg as { OPENAI_BASE_URL?: string }).OPENAI_BASE_URL || null;
|
|
72
|
+
} catch (e) {
|
|
73
|
+
// ignore if debug endpoint is unavailable
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Fetch billing organizations (only for HuggingChat + logged in users)
|
|
77
|
+
if (publicConfig.isHuggingChat && page.data.user) {
|
|
78
|
+
billingOrgsLoading = true;
|
|
79
|
+
try {
|
|
80
|
+
const data = (await client.user["billing-orgs"].get().then(handleResponse)) as {
|
|
81
|
+
userCanPay: boolean;
|
|
82
|
+
organizations: BillingOrg[];
|
|
83
|
+
currentBillingOrg?: string;
|
|
84
|
+
};
|
|
85
|
+
billingOrgs = data.organizations ?? [];
|
|
86
|
+
// Update settings if current billing org was cleared by server
|
|
87
|
+
if (data.currentBillingOrg !== getBillingOrganization()) {
|
|
88
|
+
setBillingOrganization(data.currentBillingOrg ?? "");
|
|
89
|
+
}
|
|
90
|
+
} catch {
|
|
91
|
+
billingOrgsError = "Failed to load billing options";
|
|
92
|
+
} finally {
|
|
93
|
+
billingOrgsLoading = false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
let themePref = $state<ThemePreference>(browser ? getThemePreference() : "system");
|
|
99
|
+
|
|
100
|
+
// Admin: model refresh UI state
|
|
101
|
+
let refreshing = $state(false);
|
|
102
|
+
let refreshMessage = $state<string | null>(null);
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<div class="flex w-full flex-col gap-4">
|
|
106
|
+
<h2 class="text-center text-lg font-semibold text-gray-800 dark:text-gray-200 md:text-left">
|
|
107
|
+
Application Settings
|
|
108
|
+
</h2>
|
|
109
|
+
|
|
110
|
+
{#if OPENAI_BASE_URL !== null}
|
|
111
|
+
<div
|
|
112
|
+
class="mt-1 rounded-lg border border-gray-200 bg-gray-50 px-3 py-2 text-[12px] text-gray-700 dark:border-gray-700 dark:bg-gray-700/80 dark:text-gray-300"
|
|
113
|
+
>
|
|
114
|
+
<span class="font-medium">API Base URL:</span>
|
|
115
|
+
<code class="ml-1 break-all font-mono text-[12px] text-gray-800 dark:text-gray-100"
|
|
116
|
+
>{OPENAI_BASE_URL}</code
|
|
117
|
+
>
|
|
118
|
+
</div>
|
|
119
|
+
{/if}
|
|
120
|
+
{#if !!publicConfig.PUBLIC_COMMIT_SHA}
|
|
121
|
+
<div
|
|
122
|
+
class="flex flex-col items-start justify-between text-xl font-semibold text-gray-800 dark:text-gray-200"
|
|
123
|
+
>
|
|
124
|
+
<a
|
|
125
|
+
href={`https://github.com/huggingface/chat-ui/commit/${publicConfig.PUBLIC_COMMIT_SHA}`}
|
|
126
|
+
target="_blank"
|
|
127
|
+
rel="noreferrer"
|
|
128
|
+
class="text-sm font-light text-gray-500 dark:text-gray-400"
|
|
129
|
+
>
|
|
130
|
+
Latest deployment <span class="gap-2 font-mono"
|
|
131
|
+
>{publicConfig.PUBLIC_COMMIT_SHA.slice(0, 7)}</span
|
|
132
|
+
>
|
|
133
|
+
</a>
|
|
134
|
+
</div>
|
|
135
|
+
{/if}
|
|
136
|
+
{#if page.data.isAdmin}
|
|
137
|
+
<div class="flex items-center gap-2">
|
|
138
|
+
<p
|
|
139
|
+
class="rounded-md bg-red-50 px-2 py-1 text-xs font-medium text-red-700 dark:bg-red-500/10 dark:text-red-300"
|
|
140
|
+
>
|
|
141
|
+
Admin mode
|
|
142
|
+
</p>
|
|
143
|
+
<button
|
|
144
|
+
class="btn rounded-md text-xs"
|
|
145
|
+
class:underline={!refreshing}
|
|
146
|
+
type="button"
|
|
147
|
+
onclick={async () => {
|
|
148
|
+
try {
|
|
149
|
+
refreshing = true;
|
|
150
|
+
refreshMessage = null;
|
|
151
|
+
const res = await client.models.refresh.post().then(handleResponse);
|
|
152
|
+
const delta = `+${res.added.length} −${res.removed.length} ~${res.changed.length}`;
|
|
153
|
+
refreshMessage = `Refreshed in ${res.durationMs} ms • ${delta} • total ${res.total}`;
|
|
154
|
+
await goto(page.url.pathname, { invalidateAll: true });
|
|
155
|
+
} catch (e) {
|
|
156
|
+
console.error(e);
|
|
157
|
+
$error = "Model refresh failed";
|
|
158
|
+
} finally {
|
|
159
|
+
refreshing = false;
|
|
160
|
+
}
|
|
161
|
+
}}
|
|
162
|
+
disabled={refreshing}
|
|
163
|
+
>
|
|
164
|
+
{refreshing ? "Refreshing…" : "Refresh models"}
|
|
165
|
+
</button>
|
|
166
|
+
{#if refreshMessage}
|
|
167
|
+
<span class="text-xs text-gray-600 dark:text-gray-400">{refreshMessage}</span>
|
|
168
|
+
{/if}
|
|
169
|
+
</div>
|
|
170
|
+
{/if}
|
|
171
|
+
<div class="flex h-full flex-col gap-4 max-sm:pt-0">
|
|
172
|
+
<div
|
|
173
|
+
class="rounded-xl border border-gray-200 bg-white px-3 shadow-sm dark:border-gray-700 dark:bg-gray-800"
|
|
174
|
+
>
|
|
175
|
+
<div class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
176
|
+
{#if publicConfig.PUBLIC_APP_DATA_SHARING === "1"}
|
|
177
|
+
<div class="flex items-start justify-between py-3">
|
|
178
|
+
<div>
|
|
179
|
+
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
180
|
+
Share with model authors
|
|
181
|
+
</div>
|
|
182
|
+
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
183
|
+
Sharing your data helps improve open models over time.
|
|
184
|
+
</p>
|
|
185
|
+
</div>
|
|
186
|
+
<Switch
|
|
187
|
+
name="shareConversationsWithModelAuthors"
|
|
188
|
+
bind:checked={getShareWithAuthors, setShareWithAuthors}
|
|
189
|
+
/>
|
|
190
|
+
</div>
|
|
191
|
+
{/if}
|
|
192
|
+
|
|
193
|
+
<div class="flex items-start justify-between py-3">
|
|
194
|
+
<div>
|
|
195
|
+
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
196
|
+
Streaming mode
|
|
197
|
+
</div>
|
|
198
|
+
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
199
|
+
Choose how assistant text appears while generating.
|
|
200
|
+
</p>
|
|
201
|
+
</div>
|
|
202
|
+
<select
|
|
203
|
+
class="rounded-md border border-gray-300 bg-white px-1 py-1 text-xs text-gray-800 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"
|
|
204
|
+
value={getStreamingMode()}
|
|
205
|
+
onchange={(e) => setStreamingMode(e.currentTarget.value as StreamingMode)}
|
|
206
|
+
>
|
|
207
|
+
<option value="smooth">Smooth stream</option>
|
|
208
|
+
<option value="raw">Raw stream</option>
|
|
209
|
+
</select>
|
|
210
|
+
</div>
|
|
211
|
+
|
|
212
|
+
<div class="flex items-start justify-between py-3">
|
|
213
|
+
<div>
|
|
214
|
+
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
215
|
+
Paste text directly
|
|
216
|
+
</div>
|
|
217
|
+
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
218
|
+
Paste long text directly into chat instead of a file.
|
|
219
|
+
</p>
|
|
220
|
+
</div>
|
|
221
|
+
<Switch name="directPaste" bind:checked={getDirectPaste, setDirectPaste} />
|
|
222
|
+
</div>
|
|
223
|
+
|
|
224
|
+
{#if supportsHaptics()}
|
|
225
|
+
<div class="flex items-start justify-between py-3">
|
|
226
|
+
<div>
|
|
227
|
+
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
228
|
+
Haptic feedback
|
|
229
|
+
</div>
|
|
230
|
+
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
231
|
+
Vibrate on taps and actions on supported devices.
|
|
232
|
+
</p>
|
|
233
|
+
</div>
|
|
234
|
+
<Switch name="hapticsEnabled" bind:checked={getHapticsEnabled, setHapticsEnabled} />
|
|
235
|
+
</div>
|
|
236
|
+
{/if}
|
|
237
|
+
|
|
238
|
+
<!-- Theme selector -->
|
|
239
|
+
<div class="flex items-start justify-between py-3">
|
|
240
|
+
<div>
|
|
241
|
+
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">Theme</div>
|
|
242
|
+
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
243
|
+
Choose light, dark, or follow system.
|
|
244
|
+
</p>
|
|
245
|
+
</div>
|
|
246
|
+
<select
|
|
247
|
+
class="rounded-md border border-gray-300 bg-white px-1 py-1 text-xs text-gray-800 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"
|
|
248
|
+
value={themePref}
|
|
249
|
+
onchange={(e) => {
|
|
250
|
+
const v = e.currentTarget.value as ThemePreference;
|
|
251
|
+
setTheme(v);
|
|
252
|
+
themePref = v;
|
|
253
|
+
}}
|
|
254
|
+
>
|
|
255
|
+
<option value="system">System</option>
|
|
256
|
+
<option value="light">Light</option>
|
|
257
|
+
<option value="dark">Dark</option>
|
|
258
|
+
</select>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
</div>
|
|
262
|
+
|
|
263
|
+
<!-- Billing section (HuggingChat only) -->
|
|
264
|
+
{#if publicConfig.isHuggingChat && page.data.user}
|
|
265
|
+
<div
|
|
266
|
+
class="rounded-xl border border-gray-200 bg-white px-3 shadow-sm dark:border-gray-700 dark:bg-gray-800"
|
|
267
|
+
>
|
|
268
|
+
<div class="divide-y divide-gray-200 dark:divide-gray-700">
|
|
269
|
+
<!-- Bill usage to -->
|
|
270
|
+
<div class="flex items-start justify-between py-3">
|
|
271
|
+
<div>
|
|
272
|
+
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">Billing</div>
|
|
273
|
+
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
274
|
+
Select between personal or organization billing (for eligible organizations).
|
|
275
|
+
</p>
|
|
276
|
+
</div>
|
|
277
|
+
<div class="flex items-center">
|
|
278
|
+
{#if billingOrgsLoading}
|
|
279
|
+
<span class="text-xs text-gray-500 dark:text-gray-400">Loading...</span>
|
|
280
|
+
{:else if billingOrgsError}
|
|
281
|
+
<span class="text-xs text-red-500">{billingOrgsError}</span>
|
|
282
|
+
{:else}
|
|
283
|
+
<select
|
|
284
|
+
class="rounded-md border border-gray-300 bg-white px-1 py-1 text-xs text-gray-800 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"
|
|
285
|
+
value={getBillingOrganization()}
|
|
286
|
+
onchange={(e) => setBillingOrganization(e.currentTarget.value)}
|
|
287
|
+
>
|
|
288
|
+
<option value="">Personal</option>
|
|
289
|
+
{#each billingOrgs as org}
|
|
290
|
+
<option value={org.preferred_username}>{org.name}</option>
|
|
291
|
+
{/each}
|
|
292
|
+
</select>
|
|
293
|
+
{/if}
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
<!-- Providers Usage -->
|
|
297
|
+
<div class="flex items-start justify-between py-3">
|
|
298
|
+
<div>
|
|
299
|
+
<div class="text-[13px] font-medium text-gray-800 dark:text-gray-200">
|
|
300
|
+
Providers Usage
|
|
301
|
+
</div>
|
|
302
|
+
<p class="text-[12px] text-gray-500 dark:text-gray-400">
|
|
303
|
+
See which providers you use and choose your preferred ones.
|
|
304
|
+
</p>
|
|
305
|
+
</div>
|
|
306
|
+
<a
|
|
307
|
+
href={getBillingOrganization()
|
|
308
|
+
? `https://huggingface.co/organizations/${getBillingOrganization()}/settings/inference-providers/overview`
|
|
309
|
+
: "https://huggingface.co/settings/inference-providers/overview"}
|
|
310
|
+
target="_blank"
|
|
311
|
+
class="whitespace-nowrap rounded-md border border-gray-300 bg-white px-2.5 py-1 text-xs font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600"
|
|
312
|
+
>
|
|
313
|
+
View Usage
|
|
314
|
+
</a>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
{/if}
|
|
319
|
+
|
|
320
|
+
<div class="mt-6 flex flex-col gap-2 self-start text-[13px]">
|
|
321
|
+
{#if publicConfig.isHuggingChat}
|
|
322
|
+
<a
|
|
323
|
+
href="https://github.com/huggingface/chat-ui"
|
|
324
|
+
target="_blank"
|
|
325
|
+
class="flex items-center underline decoration-gray-300 underline-offset-2 hover:decoration-gray-700 dark:decoration-gray-700 dark:hover:decoration-gray-400"
|
|
326
|
+
><CarbonLogoGithub class="mr-1.5 shrink-0 text-sm " /> Github repository</a
|
|
327
|
+
>
|
|
328
|
+
<a
|
|
329
|
+
href="https://huggingface.co/spaces/huggingchat/chat-ui/discussions/764"
|
|
330
|
+
target="_blank"
|
|
331
|
+
rel="noreferrer"
|
|
332
|
+
class="flex items-center underline decoration-gray-300 underline-offset-2 hover:decoration-gray-700 dark:decoration-gray-700 dark:hover:decoration-gray-400"
|
|
333
|
+
><CarbonArrowUpRight class="mr-1.5 shrink-0 text-sm " /> Share your feedback on HuggingChat</a
|
|
334
|
+
>
|
|
335
|
+
<a
|
|
336
|
+
href="{base}/privacy"
|
|
337
|
+
class="flex items-center underline decoration-gray-300 underline-offset-2 hover:decoration-gray-700 dark:decoration-gray-700 dark:hover:decoration-gray-400"
|
|
338
|
+
><CarbonArrowUpRight class="mr-1.5 shrink-0 text-sm " /> About & Privacy</a
|
|
339
|
+
>
|
|
340
|
+
{/if}
|
|
341
|
+
<button
|
|
342
|
+
onclick={async (e) => {
|
|
343
|
+
e.preventDefault();
|
|
344
|
+
|
|
345
|
+
confirm("Are you sure you want to delete all conversations?") &&
|
|
346
|
+
client.conversations
|
|
347
|
+
.delete()
|
|
348
|
+
.then(async () => {
|
|
349
|
+
await goto(`${base}/`, { invalidateAll: true });
|
|
350
|
+
})
|
|
351
|
+
.catch((err) => {
|
|
352
|
+
console.error(err);
|
|
353
|
+
$error = err.message;
|
|
354
|
+
});
|
|
355
|
+
}}
|
|
356
|
+
type="submit"
|
|
357
|
+
class="flex items-center underline decoration-red-200 underline-offset-2 hover:decoration-red-500 dark:decoration-red-900 dark:hover:decoration-red-700"
|
|
358
|
+
><CarbonTrashCan class="mr-2 inline text-sm text-red-500" />Delete all conversations</button
|
|
359
|
+
>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|