ruflo 3.10.36 → 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
|
@@ -1,282 +1,282 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { onMount, tick } from "svelte";
|
|
3
|
-
import { base } from "$app/paths";
|
|
4
|
-
import { afterNavigate, goto } from "$app/navigation";
|
|
5
|
-
import { page } from "$app/state";
|
|
6
|
-
import { useSettingsStore } from "$lib/stores/settings";
|
|
7
|
-
import IconOmni from "$lib/components/icons/IconOmni.svelte";
|
|
8
|
-
import IconBurger from "$lib/components/icons/IconBurger.svelte";
|
|
9
|
-
import IconFast from "$lib/components/icons/IconFast.svelte";
|
|
10
|
-
import IconCheap from "$lib/components/icons/IconCheap.svelte";
|
|
11
|
-
import CarbonClose from "~icons/carbon/close";
|
|
12
|
-
import CarbonTextLongParagraph from "~icons/carbon/text-long-paragraph";
|
|
13
|
-
import CarbonChevronLeft from "~icons/carbon/chevron-left";
|
|
14
|
-
import LucideImage from "~icons/lucide/image";
|
|
15
|
-
import LucideHammer from "~icons/lucide/hammer";
|
|
16
|
-
import IconGear from "~icons/bi/gear-fill";
|
|
17
|
-
import { PROVIDERS_HUB_ORGS } from "@huggingface/inference";
|
|
18
|
-
import { usePublicConfig } from "$lib/utils/PublicConfig.svelte";
|
|
19
|
-
|
|
20
|
-
const publicConfig = usePublicConfig();
|
|
21
|
-
|
|
22
|
-
import type { LayoutData } from "../$types";
|
|
23
|
-
import { browser } from "$app/environment";
|
|
24
|
-
import { isDesktop } from "$lib/utils/isDesktop";
|
|
25
|
-
import { debounce } from "$lib/utils/debounce";
|
|
26
|
-
|
|
27
|
-
interface Props {
|
|
28
|
-
data: LayoutData;
|
|
29
|
-
children?: import("svelte").Snippet;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
let { data, children }: Props = $props();
|
|
33
|
-
|
|
34
|
-
let previousPage: string = $state(base || "/");
|
|
35
|
-
let showContent: boolean = $state(false);
|
|
36
|
-
|
|
37
|
-
let navContainer: HTMLDivElement | undefined = $state();
|
|
38
|
-
|
|
39
|
-
async function scrollSelectedModelIntoView() {
|
|
40
|
-
await tick();
|
|
41
|
-
const container = navContainer;
|
|
42
|
-
if (!container) return;
|
|
43
|
-
const currentModelId = page.params.model as string | undefined;
|
|
44
|
-
if (!currentModelId) return;
|
|
45
|
-
const buttons = container.querySelectorAll<HTMLButtonElement>("button[data-model-id]");
|
|
46
|
-
let target: HTMLElement | null = null;
|
|
47
|
-
for (const btn of buttons) {
|
|
48
|
-
if (btn.dataset.modelId === currentModelId) {
|
|
49
|
-
target = btn;
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (!target) return;
|
|
54
|
-
// Use minimal movement; keep within view if needed
|
|
55
|
-
target.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function checkDesktopRedirect() {
|
|
59
|
-
if (
|
|
60
|
-
browser &&
|
|
61
|
-
isDesktop(window) &&
|
|
62
|
-
page.url.pathname === `${base}/settings` &&
|
|
63
|
-
!page.url.pathname.endsWith("/application")
|
|
64
|
-
) {
|
|
65
|
-
goto(`${base}/settings/application`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
onMount(() => {
|
|
70
|
-
// Show content when not on the root settings page
|
|
71
|
-
showContent = page.url.pathname !== `${base}/settings`;
|
|
72
|
-
// Initial desktop redirect check
|
|
73
|
-
checkDesktopRedirect();
|
|
74
|
-
|
|
75
|
-
// Ensure the selected model (if any) is visible in the nav
|
|
76
|
-
void scrollSelectedModelIntoView();
|
|
77
|
-
|
|
78
|
-
// Add resize listener for desktop redirect
|
|
79
|
-
if (browser) {
|
|
80
|
-
const debouncedCheck = debounce(checkDesktopRedirect, 100);
|
|
81
|
-
window.addEventListener("resize", debouncedCheck);
|
|
82
|
-
return () => window.removeEventListener("resize", debouncedCheck);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
afterNavigate(({ from }) => {
|
|
87
|
-
if (from?.url && !from.url.pathname.includes("settings")) {
|
|
88
|
-
previousPage = from.url.toString() || previousPage || base || "/";
|
|
89
|
-
}
|
|
90
|
-
// Show content when not on the root settings page
|
|
91
|
-
showContent = page.url.pathname !== `${base}/settings`;
|
|
92
|
-
// Check desktop redirect after navigation
|
|
93
|
-
checkDesktopRedirect();
|
|
94
|
-
// After navigation, keep the selected model in view
|
|
95
|
-
void scrollSelectedModelIntoView();
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
const settings = useSettingsStore();
|
|
99
|
-
|
|
100
|
-
// Local filter for model list (hyphen/space insensitive)
|
|
101
|
-
let modelFilter = $state("");
|
|
102
|
-
const normalize = (s: string) => s.toLowerCase().replace(/[^a-z0-9]+/g, " ");
|
|
103
|
-
let queryTokens = $derived(normalize(modelFilter).trim().split(/\s+/).filter(Boolean));
|
|
104
|
-
</script>
|
|
105
|
-
|
|
106
|
-
<div
|
|
107
|
-
class="mx-auto grid h-full w-full max-w-[1400px] grid-cols-1 grid-rows-[auto,1fr] content-start gap-x-6 overflow-hidden p-4 text-gray-800 dark:text-gray-300 md:grid-cols-3 md:grid-rows-[auto,1fr] md:p-4"
|
|
108
|
-
>
|
|
109
|
-
<div class="col-span-1 mb-3 flex items-center justify-between md:col-span-3 md:mb-4">
|
|
110
|
-
{#if showContent && browser}
|
|
111
|
-
<button
|
|
112
|
-
class="btn rounded-lg md:hidden"
|
|
113
|
-
aria-label="Back to menu"
|
|
114
|
-
onclick={() => {
|
|
115
|
-
showContent = false;
|
|
116
|
-
goto(`${base}/settings`);
|
|
117
|
-
}}
|
|
118
|
-
>
|
|
119
|
-
<IconBurger
|
|
120
|
-
classNames="text-xl text-gray-900 hover:text-black dark:text-gray-200 dark:hover:text-white sm:hidden"
|
|
121
|
-
/>
|
|
122
|
-
<CarbonChevronLeft
|
|
123
|
-
class="text-xl text-gray-900 hover:text-black dark:text-gray-200 dark:hover:text-white max-sm:hidden"
|
|
124
|
-
/>
|
|
125
|
-
</button>
|
|
126
|
-
{/if}
|
|
127
|
-
<h2 class=" left-0 right-0 mx-auto w-fit text-center text-xl font-bold md:hidden">Settings</h2>
|
|
128
|
-
<button
|
|
129
|
-
class="btn rounded-lg"
|
|
130
|
-
aria-label="Close settings"
|
|
131
|
-
onclick={() => {
|
|
132
|
-
goto(previousPage);
|
|
133
|
-
}}
|
|
134
|
-
>
|
|
135
|
-
<CarbonClose
|
|
136
|
-
class="text-xl text-gray-900 hover:text-black dark:text-gray-200 dark:hover:text-white"
|
|
137
|
-
/>
|
|
138
|
-
</button>
|
|
139
|
-
</div>
|
|
140
|
-
{#if !(showContent && browser && !isDesktop(window))}
|
|
141
|
-
<div
|
|
142
|
-
class="scrollbar-custom col-span-1 flex flex-col overflow-y-auto whitespace-nowrap rounded-r-xl bg-gradient-to-l from-gray-50 to-10% dark:from-gray-700/40 max-md:-mx-4 max-md:h-full md:pr-6"
|
|
143
|
-
class:max-md:hidden={showContent && browser}
|
|
144
|
-
bind:this={navContainer}
|
|
145
|
-
>
|
|
146
|
-
<!-- Section Headers -->
|
|
147
|
-
<h3
|
|
148
|
-
class="px-3 pb-1 pt-2 text-xs font-semibold tracking-wide text-gray-600 dark:text-gray-400 md:text-left"
|
|
149
|
-
>
|
|
150
|
-
Models
|
|
151
|
-
</h3>
|
|
152
|
-
|
|
153
|
-
<!-- Filter input -->
|
|
154
|
-
<div class="px-2 py-2">
|
|
155
|
-
<input
|
|
156
|
-
bind:value={modelFilter}
|
|
157
|
-
type="search"
|
|
158
|
-
placeholder="Search by name"
|
|
159
|
-
aria-label="Search models by name or id"
|
|
160
|
-
class="w-full rounded-full border border-gray-300 bg-white px-4 py-1 text-sm placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-300 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:placeholder:text-gray-500 dark:focus:ring-gray-700"
|
|
161
|
-
/>
|
|
162
|
-
</div>
|
|
163
|
-
|
|
164
|
-
{#each data.models
|
|
165
|
-
.filter((el) => !el.unlisted)
|
|
166
|
-
.filter((el) => {
|
|
167
|
-
const haystack = normalize(`${el.id} ${el.name ?? ""} ${el.displayName ?? ""}`);
|
|
168
|
-
return queryTokens.every((q) => haystack.includes(q));
|
|
169
|
-
}) as model}
|
|
170
|
-
<button
|
|
171
|
-
type="button"
|
|
172
|
-
onclick={() => goto(`${base}/settings/${model.id}`)}
|
|
173
|
-
class="group flex h-9 w-full flex-none items-center gap-1 rounded-lg px-3 text-[13px] text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800/60 md:rounded-xl md:px-3 {model.id ===
|
|
174
|
-
page.params.model
|
|
175
|
-
? '!bg-gray-100 !text-gray-800 dark:!bg-gray-700 dark:!text-gray-200'
|
|
176
|
-
: ''}"
|
|
177
|
-
data-model-id={model.id}
|
|
178
|
-
aria-label="Configure {model.displayName}"
|
|
179
|
-
>
|
|
180
|
-
<div class="mr-auto flex items-center gap-1 truncate">
|
|
181
|
-
<span class="truncate">{model.displayName}</span>
|
|
182
|
-
{#if model.isRouter}
|
|
183
|
-
<IconOmni />
|
|
184
|
-
{/if}
|
|
185
|
-
</div>
|
|
186
|
-
|
|
187
|
-
{#if publicConfig.isHuggingChat && !model.isRouter && $settings.providerOverrides?.[model.id] && $settings.providerOverrides[model.id] !== "auto"}
|
|
188
|
-
{@const providerOverride = $settings.providerOverrides[model.id]}
|
|
189
|
-
{@const hubOrg =
|
|
190
|
-
PROVIDERS_HUB_ORGS[providerOverride as keyof typeof PROVIDERS_HUB_ORGS]}
|
|
191
|
-
{#if providerOverride === "fastest"}
|
|
192
|
-
<span
|
|
193
|
-
title="Provider: {providerOverride}"
|
|
194
|
-
class="grid size-[21px] flex-none place-items-center rounded-md bg-green-500/10 text-green-600 dark:text-green-500"
|
|
195
|
-
aria-label="Provider: {providerOverride}"
|
|
196
|
-
role="img"
|
|
197
|
-
>
|
|
198
|
-
<IconFast classNames="size-3" />
|
|
199
|
-
</span>
|
|
200
|
-
{:else if providerOverride === "cheapest"}
|
|
201
|
-
<span
|
|
202
|
-
title="Provider: {providerOverride}"
|
|
203
|
-
class="grid size-[21px] flex-none place-items-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-500"
|
|
204
|
-
aria-label="Provider: {providerOverride}"
|
|
205
|
-
role="img"
|
|
206
|
-
>
|
|
207
|
-
<IconCheap classNames="size-3" />
|
|
208
|
-
</span>
|
|
209
|
-
{:else if hubOrg}
|
|
210
|
-
<span
|
|
211
|
-
title="Provider: {providerOverride}"
|
|
212
|
-
class="flex size-[21px] flex-none items-center justify-center rounded-md bg-gray-500/10 p-[0.225rem]"
|
|
213
|
-
>
|
|
214
|
-
<img
|
|
215
|
-
src="https://huggingface.co/api/avatars/{hubOrg}"
|
|
216
|
-
alt={providerOverride}
|
|
217
|
-
class="size-full rounded"
|
|
218
|
-
/>
|
|
219
|
-
</span>
|
|
220
|
-
{/if}
|
|
221
|
-
{/if}
|
|
222
|
-
|
|
223
|
-
{#if $settings.toolsOverrides?.[model.id] ?? (model as { supportsTools?: boolean }).supportsTools}
|
|
224
|
-
<span
|
|
225
|
-
title="Tool calling supported"
|
|
226
|
-
class="grid size-[21px] flex-none place-items-center rounded-md bg-purple-500/10 text-purple-600 dark:text-purple-500"
|
|
227
|
-
aria-label="Model supports tools"
|
|
228
|
-
role="img"
|
|
229
|
-
>
|
|
230
|
-
<LucideHammer class="size-3" />
|
|
231
|
-
</span>
|
|
232
|
-
{/if}
|
|
233
|
-
|
|
234
|
-
{#if $settings.multimodalOverrides?.[model.id] ?? model.multimodal}
|
|
235
|
-
<span
|
|
236
|
-
title="Multimodal support (image inputs)"
|
|
237
|
-
class="grid size-[21px] flex-none place-items-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-500"
|
|
238
|
-
aria-label="Model is multimodal"
|
|
239
|
-
role="img"
|
|
240
|
-
>
|
|
241
|
-
<LucideImage class="size-3" />
|
|
242
|
-
</span>
|
|
243
|
-
{/if}
|
|
244
|
-
|
|
245
|
-
{#if $settings.customPrompts?.[model.id]}
|
|
246
|
-
<CarbonTextLongParagraph
|
|
247
|
-
class="size-6 rounded-md border border-gray-300 p-1 text-gray-800 dark:border-gray-600 dark:text-gray-200"
|
|
248
|
-
/>
|
|
249
|
-
{/if}
|
|
250
|
-
{#if model.id === $settings.activeModel}
|
|
251
|
-
<div
|
|
252
|
-
class="flex h-[21px] items-center rounded-md bg-black/90 px-2 text-[11px] font-semibold leading-none text-white dark:bg-white dark:text-black"
|
|
253
|
-
>
|
|
254
|
-
Active
|
|
255
|
-
</div>
|
|
256
|
-
{/if}
|
|
257
|
-
</button>
|
|
258
|
-
{/each}
|
|
259
|
-
|
|
260
|
-
<button
|
|
261
|
-
type="button"
|
|
262
|
-
onclick={() => goto(`${base}/settings/application`)}
|
|
263
|
-
class="group sticky bottom-0 mt-1 flex h-9 w-full flex-none items-center gap-1 rounded-lg px-3 text-[13px] text-gray-600 dark:text-gray-300 max-md:order-first md:rounded-xl md:px-3 {page
|
|
264
|
-
.url.pathname === `${base}/settings/application`
|
|
265
|
-
? '!bg-gray-100 !text-gray-800 dark:!bg-gray-700 dark:!text-gray-200'
|
|
266
|
-
: 'bg-white dark:bg-gray-800'}"
|
|
267
|
-
aria-label="Configure application settings"
|
|
268
|
-
>
|
|
269
|
-
<IconGear class="mr-0.5 text-xxs" />
|
|
270
|
-
Application Settings
|
|
271
|
-
</button>
|
|
272
|
-
</div>
|
|
273
|
-
{/if}
|
|
274
|
-
{#if showContent}
|
|
275
|
-
<div
|
|
276
|
-
class="scrollbar-custom col-span-1 w-full overflow-y-auto overflow-x-clip px-1 md:col-span-2 md:row-span-2"
|
|
277
|
-
class:max-md:hidden={!showContent && browser}
|
|
278
|
-
>
|
|
279
|
-
{@render children?.()}
|
|
280
|
-
</div>
|
|
281
|
-
{/if}
|
|
282
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount, tick } from "svelte";
|
|
3
|
+
import { base } from "$app/paths";
|
|
4
|
+
import { afterNavigate, goto } from "$app/navigation";
|
|
5
|
+
import { page } from "$app/state";
|
|
6
|
+
import { useSettingsStore } from "$lib/stores/settings";
|
|
7
|
+
import IconOmni from "$lib/components/icons/IconOmni.svelte";
|
|
8
|
+
import IconBurger from "$lib/components/icons/IconBurger.svelte";
|
|
9
|
+
import IconFast from "$lib/components/icons/IconFast.svelte";
|
|
10
|
+
import IconCheap from "$lib/components/icons/IconCheap.svelte";
|
|
11
|
+
import CarbonClose from "~icons/carbon/close";
|
|
12
|
+
import CarbonTextLongParagraph from "~icons/carbon/text-long-paragraph";
|
|
13
|
+
import CarbonChevronLeft from "~icons/carbon/chevron-left";
|
|
14
|
+
import LucideImage from "~icons/lucide/image";
|
|
15
|
+
import LucideHammer from "~icons/lucide/hammer";
|
|
16
|
+
import IconGear from "~icons/bi/gear-fill";
|
|
17
|
+
import { PROVIDERS_HUB_ORGS } from "@huggingface/inference";
|
|
18
|
+
import { usePublicConfig } from "$lib/utils/PublicConfig.svelte";
|
|
19
|
+
|
|
20
|
+
const publicConfig = usePublicConfig();
|
|
21
|
+
|
|
22
|
+
import type { LayoutData } from "../$types";
|
|
23
|
+
import { browser } from "$app/environment";
|
|
24
|
+
import { isDesktop } from "$lib/utils/isDesktop";
|
|
25
|
+
import { debounce } from "$lib/utils/debounce";
|
|
26
|
+
|
|
27
|
+
interface Props {
|
|
28
|
+
data: LayoutData;
|
|
29
|
+
children?: import("svelte").Snippet;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let { data, children }: Props = $props();
|
|
33
|
+
|
|
34
|
+
let previousPage: string = $state(base || "/");
|
|
35
|
+
let showContent: boolean = $state(false);
|
|
36
|
+
|
|
37
|
+
let navContainer: HTMLDivElement | undefined = $state();
|
|
38
|
+
|
|
39
|
+
async function scrollSelectedModelIntoView() {
|
|
40
|
+
await tick();
|
|
41
|
+
const container = navContainer;
|
|
42
|
+
if (!container) return;
|
|
43
|
+
const currentModelId = page.params.model as string | undefined;
|
|
44
|
+
if (!currentModelId) return;
|
|
45
|
+
const buttons = container.querySelectorAll<HTMLButtonElement>("button[data-model-id]");
|
|
46
|
+
let target: HTMLElement | null = null;
|
|
47
|
+
for (const btn of buttons) {
|
|
48
|
+
if (btn.dataset.modelId === currentModelId) {
|
|
49
|
+
target = btn;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!target) return;
|
|
54
|
+
// Use minimal movement; keep within view if needed
|
|
55
|
+
target.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function checkDesktopRedirect() {
|
|
59
|
+
if (
|
|
60
|
+
browser &&
|
|
61
|
+
isDesktop(window) &&
|
|
62
|
+
page.url.pathname === `${base}/settings` &&
|
|
63
|
+
!page.url.pathname.endsWith("/application")
|
|
64
|
+
) {
|
|
65
|
+
goto(`${base}/settings/application`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
onMount(() => {
|
|
70
|
+
// Show content when not on the root settings page
|
|
71
|
+
showContent = page.url.pathname !== `${base}/settings`;
|
|
72
|
+
// Initial desktop redirect check
|
|
73
|
+
checkDesktopRedirect();
|
|
74
|
+
|
|
75
|
+
// Ensure the selected model (if any) is visible in the nav
|
|
76
|
+
void scrollSelectedModelIntoView();
|
|
77
|
+
|
|
78
|
+
// Add resize listener for desktop redirect
|
|
79
|
+
if (browser) {
|
|
80
|
+
const debouncedCheck = debounce(checkDesktopRedirect, 100);
|
|
81
|
+
window.addEventListener("resize", debouncedCheck);
|
|
82
|
+
return () => window.removeEventListener("resize", debouncedCheck);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
afterNavigate(({ from }) => {
|
|
87
|
+
if (from?.url && !from.url.pathname.includes("settings")) {
|
|
88
|
+
previousPage = from.url.toString() || previousPage || base || "/";
|
|
89
|
+
}
|
|
90
|
+
// Show content when not on the root settings page
|
|
91
|
+
showContent = page.url.pathname !== `${base}/settings`;
|
|
92
|
+
// Check desktop redirect after navigation
|
|
93
|
+
checkDesktopRedirect();
|
|
94
|
+
// After navigation, keep the selected model in view
|
|
95
|
+
void scrollSelectedModelIntoView();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const settings = useSettingsStore();
|
|
99
|
+
|
|
100
|
+
// Local filter for model list (hyphen/space insensitive)
|
|
101
|
+
let modelFilter = $state("");
|
|
102
|
+
const normalize = (s: string) => s.toLowerCase().replace(/[^a-z0-9]+/g, " ");
|
|
103
|
+
let queryTokens = $derived(normalize(modelFilter).trim().split(/\s+/).filter(Boolean));
|
|
104
|
+
</script>
|
|
105
|
+
|
|
106
|
+
<div
|
|
107
|
+
class="mx-auto grid h-full w-full max-w-[1400px] grid-cols-1 grid-rows-[auto,1fr] content-start gap-x-6 overflow-hidden p-4 text-gray-800 dark:text-gray-300 md:grid-cols-3 md:grid-rows-[auto,1fr] md:p-4"
|
|
108
|
+
>
|
|
109
|
+
<div class="col-span-1 mb-3 flex items-center justify-between md:col-span-3 md:mb-4">
|
|
110
|
+
{#if showContent && browser}
|
|
111
|
+
<button
|
|
112
|
+
class="btn rounded-lg md:hidden"
|
|
113
|
+
aria-label="Back to menu"
|
|
114
|
+
onclick={() => {
|
|
115
|
+
showContent = false;
|
|
116
|
+
goto(`${base}/settings`);
|
|
117
|
+
}}
|
|
118
|
+
>
|
|
119
|
+
<IconBurger
|
|
120
|
+
classNames="text-xl text-gray-900 hover:text-black dark:text-gray-200 dark:hover:text-white sm:hidden"
|
|
121
|
+
/>
|
|
122
|
+
<CarbonChevronLeft
|
|
123
|
+
class="text-xl text-gray-900 hover:text-black dark:text-gray-200 dark:hover:text-white max-sm:hidden"
|
|
124
|
+
/>
|
|
125
|
+
</button>
|
|
126
|
+
{/if}
|
|
127
|
+
<h2 class=" left-0 right-0 mx-auto w-fit text-center text-xl font-bold md:hidden">Settings</h2>
|
|
128
|
+
<button
|
|
129
|
+
class="btn rounded-lg"
|
|
130
|
+
aria-label="Close settings"
|
|
131
|
+
onclick={() => {
|
|
132
|
+
goto(previousPage);
|
|
133
|
+
}}
|
|
134
|
+
>
|
|
135
|
+
<CarbonClose
|
|
136
|
+
class="text-xl text-gray-900 hover:text-black dark:text-gray-200 dark:hover:text-white"
|
|
137
|
+
/>
|
|
138
|
+
</button>
|
|
139
|
+
</div>
|
|
140
|
+
{#if !(showContent && browser && !isDesktop(window))}
|
|
141
|
+
<div
|
|
142
|
+
class="scrollbar-custom col-span-1 flex flex-col overflow-y-auto whitespace-nowrap rounded-r-xl bg-gradient-to-l from-gray-50 to-10% dark:from-gray-700/40 max-md:-mx-4 max-md:h-full md:pr-6"
|
|
143
|
+
class:max-md:hidden={showContent && browser}
|
|
144
|
+
bind:this={navContainer}
|
|
145
|
+
>
|
|
146
|
+
<!-- Section Headers -->
|
|
147
|
+
<h3
|
|
148
|
+
class="px-3 pb-1 pt-2 text-xs font-semibold tracking-wide text-gray-600 dark:text-gray-400 md:text-left"
|
|
149
|
+
>
|
|
150
|
+
Models
|
|
151
|
+
</h3>
|
|
152
|
+
|
|
153
|
+
<!-- Filter input -->
|
|
154
|
+
<div class="px-2 py-2">
|
|
155
|
+
<input
|
|
156
|
+
bind:value={modelFilter}
|
|
157
|
+
type="search"
|
|
158
|
+
placeholder="Search by name"
|
|
159
|
+
aria-label="Search models by name or id"
|
|
160
|
+
class="w-full rounded-full border border-gray-300 bg-white px-4 py-1 text-sm placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-300 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:placeholder:text-gray-500 dark:focus:ring-gray-700"
|
|
161
|
+
/>
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
{#each data.models
|
|
165
|
+
.filter((el) => !el.unlisted)
|
|
166
|
+
.filter((el) => {
|
|
167
|
+
const haystack = normalize(`${el.id} ${el.name ?? ""} ${el.displayName ?? ""}`);
|
|
168
|
+
return queryTokens.every((q) => haystack.includes(q));
|
|
169
|
+
}) as model}
|
|
170
|
+
<button
|
|
171
|
+
type="button"
|
|
172
|
+
onclick={() => goto(`${base}/settings/${model.id}`)}
|
|
173
|
+
class="group flex h-9 w-full flex-none items-center gap-1 rounded-lg px-3 text-[13px] text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800/60 md:rounded-xl md:px-3 {model.id ===
|
|
174
|
+
page.params.model
|
|
175
|
+
? '!bg-gray-100 !text-gray-800 dark:!bg-gray-700 dark:!text-gray-200'
|
|
176
|
+
: ''}"
|
|
177
|
+
data-model-id={model.id}
|
|
178
|
+
aria-label="Configure {model.displayName}"
|
|
179
|
+
>
|
|
180
|
+
<div class="mr-auto flex items-center gap-1 truncate">
|
|
181
|
+
<span class="truncate">{model.displayName}</span>
|
|
182
|
+
{#if model.isRouter}
|
|
183
|
+
<IconOmni />
|
|
184
|
+
{/if}
|
|
185
|
+
</div>
|
|
186
|
+
|
|
187
|
+
{#if publicConfig.isHuggingChat && !model.isRouter && $settings.providerOverrides?.[model.id] && $settings.providerOverrides[model.id] !== "auto"}
|
|
188
|
+
{@const providerOverride = $settings.providerOverrides[model.id]}
|
|
189
|
+
{@const hubOrg =
|
|
190
|
+
PROVIDERS_HUB_ORGS[providerOverride as keyof typeof PROVIDERS_HUB_ORGS]}
|
|
191
|
+
{#if providerOverride === "fastest"}
|
|
192
|
+
<span
|
|
193
|
+
title="Provider: {providerOverride}"
|
|
194
|
+
class="grid size-[21px] flex-none place-items-center rounded-md bg-green-500/10 text-green-600 dark:text-green-500"
|
|
195
|
+
aria-label="Provider: {providerOverride}"
|
|
196
|
+
role="img"
|
|
197
|
+
>
|
|
198
|
+
<IconFast classNames="size-3" />
|
|
199
|
+
</span>
|
|
200
|
+
{:else if providerOverride === "cheapest"}
|
|
201
|
+
<span
|
|
202
|
+
title="Provider: {providerOverride}"
|
|
203
|
+
class="grid size-[21px] flex-none place-items-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-500"
|
|
204
|
+
aria-label="Provider: {providerOverride}"
|
|
205
|
+
role="img"
|
|
206
|
+
>
|
|
207
|
+
<IconCheap classNames="size-3" />
|
|
208
|
+
</span>
|
|
209
|
+
{:else if hubOrg}
|
|
210
|
+
<span
|
|
211
|
+
title="Provider: {providerOverride}"
|
|
212
|
+
class="flex size-[21px] flex-none items-center justify-center rounded-md bg-gray-500/10 p-[0.225rem]"
|
|
213
|
+
>
|
|
214
|
+
<img
|
|
215
|
+
src="https://huggingface.co/api/avatars/{hubOrg}"
|
|
216
|
+
alt={providerOverride}
|
|
217
|
+
class="size-full rounded"
|
|
218
|
+
/>
|
|
219
|
+
</span>
|
|
220
|
+
{/if}
|
|
221
|
+
{/if}
|
|
222
|
+
|
|
223
|
+
{#if $settings.toolsOverrides?.[model.id] ?? (model as { supportsTools?: boolean }).supportsTools}
|
|
224
|
+
<span
|
|
225
|
+
title="Tool calling supported"
|
|
226
|
+
class="grid size-[21px] flex-none place-items-center rounded-md bg-purple-500/10 text-purple-600 dark:text-purple-500"
|
|
227
|
+
aria-label="Model supports tools"
|
|
228
|
+
role="img"
|
|
229
|
+
>
|
|
230
|
+
<LucideHammer class="size-3" />
|
|
231
|
+
</span>
|
|
232
|
+
{/if}
|
|
233
|
+
|
|
234
|
+
{#if $settings.multimodalOverrides?.[model.id] ?? model.multimodal}
|
|
235
|
+
<span
|
|
236
|
+
title="Multimodal support (image inputs)"
|
|
237
|
+
class="grid size-[21px] flex-none place-items-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-500"
|
|
238
|
+
aria-label="Model is multimodal"
|
|
239
|
+
role="img"
|
|
240
|
+
>
|
|
241
|
+
<LucideImage class="size-3" />
|
|
242
|
+
</span>
|
|
243
|
+
{/if}
|
|
244
|
+
|
|
245
|
+
{#if $settings.customPrompts?.[model.id]}
|
|
246
|
+
<CarbonTextLongParagraph
|
|
247
|
+
class="size-6 rounded-md border border-gray-300 p-1 text-gray-800 dark:border-gray-600 dark:text-gray-200"
|
|
248
|
+
/>
|
|
249
|
+
{/if}
|
|
250
|
+
{#if model.id === $settings.activeModel}
|
|
251
|
+
<div
|
|
252
|
+
class="flex h-[21px] items-center rounded-md bg-black/90 px-2 text-[11px] font-semibold leading-none text-white dark:bg-white dark:text-black"
|
|
253
|
+
>
|
|
254
|
+
Active
|
|
255
|
+
</div>
|
|
256
|
+
{/if}
|
|
257
|
+
</button>
|
|
258
|
+
{/each}
|
|
259
|
+
|
|
260
|
+
<button
|
|
261
|
+
type="button"
|
|
262
|
+
onclick={() => goto(`${base}/settings/application`)}
|
|
263
|
+
class="group sticky bottom-0 mt-1 flex h-9 w-full flex-none items-center gap-1 rounded-lg px-3 text-[13px] text-gray-600 dark:text-gray-300 max-md:order-first md:rounded-xl md:px-3 {page
|
|
264
|
+
.url.pathname === `${base}/settings/application`
|
|
265
|
+
? '!bg-gray-100 !text-gray-800 dark:!bg-gray-700 dark:!text-gray-200'
|
|
266
|
+
: 'bg-white dark:bg-gray-800'}"
|
|
267
|
+
aria-label="Configure application settings"
|
|
268
|
+
>
|
|
269
|
+
<IconGear class="mr-0.5 text-xxs" />
|
|
270
|
+
Application Settings
|
|
271
|
+
</button>
|
|
272
|
+
</div>
|
|
273
|
+
{/if}
|
|
274
|
+
{#if showContent}
|
|
275
|
+
<div
|
|
276
|
+
class="scrollbar-custom col-span-1 w-full overflow-y-auto overflow-x-clip px-1 md:col-span-2 md:row-span-2"
|
|
277
|
+
class:max-md:hidden={!showContent && browser}
|
|
278
|
+
>
|
|
279
|
+
{@render children?.()}
|
|
280
|
+
</div>
|
|
281
|
+
{/if}
|
|
282
|
+
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const ssr = false;
|
|
1
|
+
export const ssr = false;
|