ruflo 3.7.0-alpha.11 → 3.7.0-alpha.13
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 +393 -393
- package/bin/ruflo.js +57 -57
- package/package.json +1 -1
- 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 +1668 -1668
- 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 +1878 -1878
- 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,32 +1,32 @@
|
|
|
1
|
-
import type { Migration } from ".";
|
|
2
|
-
import { collections } from "$lib/server/database";
|
|
3
|
-
import { ObjectId } from "mongodb";
|
|
4
|
-
import { ReviewStatus } from "$lib/types/Review";
|
|
5
|
-
|
|
6
|
-
const updateFeaturedToReview: Migration = {
|
|
7
|
-
_id: new ObjectId("000000000000000000000008"),
|
|
8
|
-
name: "Update featured to review",
|
|
9
|
-
up: async () => {
|
|
10
|
-
const { assistants, tools } = collections;
|
|
11
|
-
|
|
12
|
-
// Update assistants
|
|
13
|
-
await assistants.updateMany({ featured: true }, { $set: { review: ReviewStatus.APPROVED } });
|
|
14
|
-
await assistants.updateMany(
|
|
15
|
-
{ featured: { $ne: true } },
|
|
16
|
-
{ $set: { review: ReviewStatus.PRIVATE } }
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
await assistants.updateMany({}, { $unset: { featured: "" } });
|
|
20
|
-
|
|
21
|
-
// Update tools
|
|
22
|
-
await tools.updateMany({ featured: true }, { $set: { review: ReviewStatus.APPROVED } });
|
|
23
|
-
await tools.updateMany({ featured: { $ne: true } }, { $set: { review: ReviewStatus.PRIVATE } });
|
|
24
|
-
|
|
25
|
-
await tools.updateMany({}, { $unset: { featured: "" } });
|
|
26
|
-
|
|
27
|
-
return true;
|
|
28
|
-
},
|
|
29
|
-
runEveryTime: false,
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
export default updateFeaturedToReview;
|
|
1
|
+
import type { Migration } from ".";
|
|
2
|
+
import { collections } from "$lib/server/database";
|
|
3
|
+
import { ObjectId } from "mongodb";
|
|
4
|
+
import { ReviewStatus } from "$lib/types/Review";
|
|
5
|
+
|
|
6
|
+
const updateFeaturedToReview: Migration = {
|
|
7
|
+
_id: new ObjectId("000000000000000000000008"),
|
|
8
|
+
name: "Update featured to review",
|
|
9
|
+
up: async () => {
|
|
10
|
+
const { assistants, tools } = collections;
|
|
11
|
+
|
|
12
|
+
// Update assistants
|
|
13
|
+
await assistants.updateMany({ featured: true }, { $set: { review: ReviewStatus.APPROVED } });
|
|
14
|
+
await assistants.updateMany(
|
|
15
|
+
{ featured: { $ne: true } },
|
|
16
|
+
{ $set: { review: ReviewStatus.PRIVATE } }
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
await assistants.updateMany({}, { $unset: { featured: "" } });
|
|
20
|
+
|
|
21
|
+
// Update tools
|
|
22
|
+
await tools.updateMany({ featured: true }, { $set: { review: ReviewStatus.APPROVED } });
|
|
23
|
+
await tools.updateMany({ featured: { $ne: true } }, { $set: { review: ReviewStatus.PRIVATE } });
|
|
24
|
+
|
|
25
|
+
await tools.updateMany({}, { $unset: { featured: "" } });
|
|
26
|
+
|
|
27
|
+
return true;
|
|
28
|
+
},
|
|
29
|
+
runEveryTime: false,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default updateFeaturedToReview;
|
|
@@ -1,214 +1,214 @@
|
|
|
1
|
-
import type { Session } from "$lib/types/Session";
|
|
2
|
-
import type { User } from "$lib/types/User";
|
|
3
|
-
import type { Conversation } from "$lib/types/Conversation";
|
|
4
|
-
import { ObjectId } from "mongodb";
|
|
5
|
-
import { deleteConversations } from "./09-delete-empty-conversations";
|
|
6
|
-
import { afterAll, afterEach, beforeAll, describe, expect, test } from "vitest";
|
|
7
|
-
import { collections } from "$lib/server/database";
|
|
8
|
-
|
|
9
|
-
type Message = Conversation["messages"][number];
|
|
10
|
-
|
|
11
|
-
const userData = {
|
|
12
|
-
_id: new ObjectId(),
|
|
13
|
-
createdAt: new Date(),
|
|
14
|
-
updatedAt: new Date(),
|
|
15
|
-
username: "new-username",
|
|
16
|
-
name: "name",
|
|
17
|
-
avatarUrl: "https://example.com/avatar.png",
|
|
18
|
-
hfUserId: "9999999999",
|
|
19
|
-
} satisfies User;
|
|
20
|
-
Object.freeze(userData);
|
|
21
|
-
|
|
22
|
-
const sessionForUser = {
|
|
23
|
-
_id: new ObjectId(),
|
|
24
|
-
createdAt: new Date(),
|
|
25
|
-
updatedAt: new Date(),
|
|
26
|
-
userId: userData._id,
|
|
27
|
-
sessionId: "session-id-9999999999",
|
|
28
|
-
expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24),
|
|
29
|
-
} satisfies Session;
|
|
30
|
-
Object.freeze(sessionForUser);
|
|
31
|
-
|
|
32
|
-
const userMessage = {
|
|
33
|
-
from: "user",
|
|
34
|
-
id: "user-message-id",
|
|
35
|
-
content: "Hello, how are you?",
|
|
36
|
-
} satisfies Message;
|
|
37
|
-
|
|
38
|
-
const assistantMessage = {
|
|
39
|
-
from: "assistant",
|
|
40
|
-
id: "assistant-message-id",
|
|
41
|
-
content: "I'm fine, thank you!",
|
|
42
|
-
} satisfies Message;
|
|
43
|
-
|
|
44
|
-
const systemMessage = {
|
|
45
|
-
from: "system",
|
|
46
|
-
id: "system-message-id",
|
|
47
|
-
content: "This is a system message",
|
|
48
|
-
} satisfies Message;
|
|
49
|
-
|
|
50
|
-
const conversationBase = {
|
|
51
|
-
_id: new ObjectId(),
|
|
52
|
-
createdAt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
|
|
53
|
-
updatedAt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
|
|
54
|
-
model: "model-id",
|
|
55
|
-
|
|
56
|
-
title: "title",
|
|
57
|
-
messages: [],
|
|
58
|
-
} satisfies Conversation;
|
|
59
|
-
|
|
60
|
-
describe.sequential("Deleting discarded conversations", async () => {
|
|
61
|
-
test("a conversation with no messages should get deleted", async () => {
|
|
62
|
-
await collections.conversations.insertOne({
|
|
63
|
-
...conversationBase,
|
|
64
|
-
sessionId: sessionForUser.sessionId,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
const result = await deleteConversations(collections);
|
|
68
|
-
|
|
69
|
-
expect(result).toBe(1);
|
|
70
|
-
});
|
|
71
|
-
test("a conversation with no messages that is less than 1 hour old should not get deleted", async () => {
|
|
72
|
-
await collections.conversations.insertOne({
|
|
73
|
-
...conversationBase,
|
|
74
|
-
sessionId: sessionForUser.sessionId,
|
|
75
|
-
createdAt: new Date(Date.now() - 30 * 60 * 1000),
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
const result = await deleteConversations(collections);
|
|
79
|
-
|
|
80
|
-
expect(result).toBe(0);
|
|
81
|
-
});
|
|
82
|
-
test("a conversation with only system messages should get deleted", async () => {
|
|
83
|
-
await collections.conversations.insertOne({
|
|
84
|
-
...conversationBase,
|
|
85
|
-
sessionId: sessionForUser.sessionId,
|
|
86
|
-
messages: [systemMessage],
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
const result = await deleteConversations(collections);
|
|
90
|
-
|
|
91
|
-
expect(result).toBe(1);
|
|
92
|
-
});
|
|
93
|
-
test("a conversation with a user message should not get deleted", async () => {
|
|
94
|
-
await collections.conversations.insertOne({
|
|
95
|
-
...conversationBase,
|
|
96
|
-
sessionId: sessionForUser.sessionId,
|
|
97
|
-
messages: [userMessage],
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
const result = await deleteConversations(collections);
|
|
101
|
-
|
|
102
|
-
expect(result).toBe(0);
|
|
103
|
-
});
|
|
104
|
-
test("a conversation with an assistant message should not get deleted", async () => {
|
|
105
|
-
await collections.conversations.insertOne({
|
|
106
|
-
...conversationBase,
|
|
107
|
-
sessionId: sessionForUser.sessionId,
|
|
108
|
-
messages: [assistantMessage],
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
const result = await deleteConversations(collections);
|
|
112
|
-
|
|
113
|
-
expect(result).toBe(0);
|
|
114
|
-
});
|
|
115
|
-
test("a conversation with a mix of messages should not get deleted", async () => {
|
|
116
|
-
await collections.conversations.insertOne({
|
|
117
|
-
...conversationBase,
|
|
118
|
-
sessionId: sessionForUser.sessionId,
|
|
119
|
-
messages: [systemMessage, userMessage, assistantMessage, userMessage, assistantMessage],
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
const result = await deleteConversations(collections);
|
|
123
|
-
|
|
124
|
-
expect(result).toBe(0);
|
|
125
|
-
});
|
|
126
|
-
test("a conversation with a userId and no sessionId should not get deleted", async () => {
|
|
127
|
-
await collections.conversations.insertOne({
|
|
128
|
-
...conversationBase,
|
|
129
|
-
messages: [userMessage, assistantMessage],
|
|
130
|
-
userId: userData._id,
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
const result = await deleteConversations(collections);
|
|
134
|
-
|
|
135
|
-
expect(result).toBe(0);
|
|
136
|
-
});
|
|
137
|
-
test("a conversation with no userId or sessionId should get deleted", async () => {
|
|
138
|
-
await collections.conversations.insertOne({
|
|
139
|
-
...conversationBase,
|
|
140
|
-
messages: [userMessage, assistantMessage],
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
const result = await deleteConversations(collections);
|
|
144
|
-
|
|
145
|
-
expect(result).toBe(1);
|
|
146
|
-
});
|
|
147
|
-
test("a conversation with a sessionId that exists should not get deleted", async () => {
|
|
148
|
-
await collections.conversations.insertOne({
|
|
149
|
-
...conversationBase,
|
|
150
|
-
messages: [userMessage, assistantMessage],
|
|
151
|
-
sessionId: sessionForUser.sessionId,
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
const result = await deleteConversations(collections);
|
|
155
|
-
|
|
156
|
-
expect(result).toBe(0);
|
|
157
|
-
});
|
|
158
|
-
test("a conversation with a userId and a sessionId that doesn't exist should NOT get deleted", async () => {
|
|
159
|
-
await collections.conversations.insertOne({
|
|
160
|
-
...conversationBase,
|
|
161
|
-
userId: userData._id,
|
|
162
|
-
messages: [userMessage, assistantMessage],
|
|
163
|
-
sessionId: new ObjectId().toString(),
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
const result = await deleteConversations(collections);
|
|
167
|
-
|
|
168
|
-
expect(result).toBe(0);
|
|
169
|
-
});
|
|
170
|
-
test("a conversation with only a sessionId that doesn't exist, should get deleted", async () => {
|
|
171
|
-
await collections.conversations.insertOne({
|
|
172
|
-
...conversationBase,
|
|
173
|
-
messages: [userMessage, assistantMessage],
|
|
174
|
-
sessionId: new ObjectId().toString(),
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
const result = await deleteConversations(collections);
|
|
178
|
-
|
|
179
|
-
expect(result).toBe(1);
|
|
180
|
-
});
|
|
181
|
-
test("many conversations should get deleted", async () => {
|
|
182
|
-
const conversations = Array.from({ length: 10010 }, () => ({
|
|
183
|
-
...conversationBase,
|
|
184
|
-
_id: new ObjectId(),
|
|
185
|
-
}));
|
|
186
|
-
|
|
187
|
-
await collections.conversations.insertMany(conversations);
|
|
188
|
-
|
|
189
|
-
const result = await deleteConversations(collections);
|
|
190
|
-
|
|
191
|
-
expect(result).toBe(10010);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
beforeAll(async () => {
|
|
196
|
-
await collections.users.insertOne(userData);
|
|
197
|
-
await collections.sessions.insertOne(sessionForUser);
|
|
198
|
-
}, 20000);
|
|
199
|
-
|
|
200
|
-
afterAll(async () => {
|
|
201
|
-
await collections.users.deleteOne({
|
|
202
|
-
_id: userData._id,
|
|
203
|
-
});
|
|
204
|
-
await collections.sessions.deleteOne({
|
|
205
|
-
_id: sessionForUser._id,
|
|
206
|
-
});
|
|
207
|
-
await collections.conversations.deleteMany({});
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
afterEach(async () => {
|
|
211
|
-
await collections.conversations.deleteMany({
|
|
212
|
-
_id: { $in: [conversationBase._id] },
|
|
213
|
-
});
|
|
214
|
-
});
|
|
1
|
+
import type { Session } from "$lib/types/Session";
|
|
2
|
+
import type { User } from "$lib/types/User";
|
|
3
|
+
import type { Conversation } from "$lib/types/Conversation";
|
|
4
|
+
import { ObjectId } from "mongodb";
|
|
5
|
+
import { deleteConversations } from "./09-delete-empty-conversations";
|
|
6
|
+
import { afterAll, afterEach, beforeAll, describe, expect, test } from "vitest";
|
|
7
|
+
import { collections } from "$lib/server/database";
|
|
8
|
+
|
|
9
|
+
type Message = Conversation["messages"][number];
|
|
10
|
+
|
|
11
|
+
const userData = {
|
|
12
|
+
_id: new ObjectId(),
|
|
13
|
+
createdAt: new Date(),
|
|
14
|
+
updatedAt: new Date(),
|
|
15
|
+
username: "new-username",
|
|
16
|
+
name: "name",
|
|
17
|
+
avatarUrl: "https://example.com/avatar.png",
|
|
18
|
+
hfUserId: "9999999999",
|
|
19
|
+
} satisfies User;
|
|
20
|
+
Object.freeze(userData);
|
|
21
|
+
|
|
22
|
+
const sessionForUser = {
|
|
23
|
+
_id: new ObjectId(),
|
|
24
|
+
createdAt: new Date(),
|
|
25
|
+
updatedAt: new Date(),
|
|
26
|
+
userId: userData._id,
|
|
27
|
+
sessionId: "session-id-9999999999",
|
|
28
|
+
expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24),
|
|
29
|
+
} satisfies Session;
|
|
30
|
+
Object.freeze(sessionForUser);
|
|
31
|
+
|
|
32
|
+
const userMessage = {
|
|
33
|
+
from: "user",
|
|
34
|
+
id: "user-message-id",
|
|
35
|
+
content: "Hello, how are you?",
|
|
36
|
+
} satisfies Message;
|
|
37
|
+
|
|
38
|
+
const assistantMessage = {
|
|
39
|
+
from: "assistant",
|
|
40
|
+
id: "assistant-message-id",
|
|
41
|
+
content: "I'm fine, thank you!",
|
|
42
|
+
} satisfies Message;
|
|
43
|
+
|
|
44
|
+
const systemMessage = {
|
|
45
|
+
from: "system",
|
|
46
|
+
id: "system-message-id",
|
|
47
|
+
content: "This is a system message",
|
|
48
|
+
} satisfies Message;
|
|
49
|
+
|
|
50
|
+
const conversationBase = {
|
|
51
|
+
_id: new ObjectId(),
|
|
52
|
+
createdAt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
|
|
53
|
+
updatedAt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
|
|
54
|
+
model: "model-id",
|
|
55
|
+
|
|
56
|
+
title: "title",
|
|
57
|
+
messages: [],
|
|
58
|
+
} satisfies Conversation;
|
|
59
|
+
|
|
60
|
+
describe.sequential("Deleting discarded conversations", async () => {
|
|
61
|
+
test("a conversation with no messages should get deleted", async () => {
|
|
62
|
+
await collections.conversations.insertOne({
|
|
63
|
+
...conversationBase,
|
|
64
|
+
sessionId: sessionForUser.sessionId,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const result = await deleteConversations(collections);
|
|
68
|
+
|
|
69
|
+
expect(result).toBe(1);
|
|
70
|
+
});
|
|
71
|
+
test("a conversation with no messages that is less than 1 hour old should not get deleted", async () => {
|
|
72
|
+
await collections.conversations.insertOne({
|
|
73
|
+
...conversationBase,
|
|
74
|
+
sessionId: sessionForUser.sessionId,
|
|
75
|
+
createdAt: new Date(Date.now() - 30 * 60 * 1000),
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const result = await deleteConversations(collections);
|
|
79
|
+
|
|
80
|
+
expect(result).toBe(0);
|
|
81
|
+
});
|
|
82
|
+
test("a conversation with only system messages should get deleted", async () => {
|
|
83
|
+
await collections.conversations.insertOne({
|
|
84
|
+
...conversationBase,
|
|
85
|
+
sessionId: sessionForUser.sessionId,
|
|
86
|
+
messages: [systemMessage],
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const result = await deleteConversations(collections);
|
|
90
|
+
|
|
91
|
+
expect(result).toBe(1);
|
|
92
|
+
});
|
|
93
|
+
test("a conversation with a user message should not get deleted", async () => {
|
|
94
|
+
await collections.conversations.insertOne({
|
|
95
|
+
...conversationBase,
|
|
96
|
+
sessionId: sessionForUser.sessionId,
|
|
97
|
+
messages: [userMessage],
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const result = await deleteConversations(collections);
|
|
101
|
+
|
|
102
|
+
expect(result).toBe(0);
|
|
103
|
+
});
|
|
104
|
+
test("a conversation with an assistant message should not get deleted", async () => {
|
|
105
|
+
await collections.conversations.insertOne({
|
|
106
|
+
...conversationBase,
|
|
107
|
+
sessionId: sessionForUser.sessionId,
|
|
108
|
+
messages: [assistantMessage],
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const result = await deleteConversations(collections);
|
|
112
|
+
|
|
113
|
+
expect(result).toBe(0);
|
|
114
|
+
});
|
|
115
|
+
test("a conversation with a mix of messages should not get deleted", async () => {
|
|
116
|
+
await collections.conversations.insertOne({
|
|
117
|
+
...conversationBase,
|
|
118
|
+
sessionId: sessionForUser.sessionId,
|
|
119
|
+
messages: [systemMessage, userMessage, assistantMessage, userMessage, assistantMessage],
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const result = await deleteConversations(collections);
|
|
123
|
+
|
|
124
|
+
expect(result).toBe(0);
|
|
125
|
+
});
|
|
126
|
+
test("a conversation with a userId and no sessionId should not get deleted", async () => {
|
|
127
|
+
await collections.conversations.insertOne({
|
|
128
|
+
...conversationBase,
|
|
129
|
+
messages: [userMessage, assistantMessage],
|
|
130
|
+
userId: userData._id,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const result = await deleteConversations(collections);
|
|
134
|
+
|
|
135
|
+
expect(result).toBe(0);
|
|
136
|
+
});
|
|
137
|
+
test("a conversation with no userId or sessionId should get deleted", async () => {
|
|
138
|
+
await collections.conversations.insertOne({
|
|
139
|
+
...conversationBase,
|
|
140
|
+
messages: [userMessage, assistantMessage],
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const result = await deleteConversations(collections);
|
|
144
|
+
|
|
145
|
+
expect(result).toBe(1);
|
|
146
|
+
});
|
|
147
|
+
test("a conversation with a sessionId that exists should not get deleted", async () => {
|
|
148
|
+
await collections.conversations.insertOne({
|
|
149
|
+
...conversationBase,
|
|
150
|
+
messages: [userMessage, assistantMessage],
|
|
151
|
+
sessionId: sessionForUser.sessionId,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const result = await deleteConversations(collections);
|
|
155
|
+
|
|
156
|
+
expect(result).toBe(0);
|
|
157
|
+
});
|
|
158
|
+
test("a conversation with a userId and a sessionId that doesn't exist should NOT get deleted", async () => {
|
|
159
|
+
await collections.conversations.insertOne({
|
|
160
|
+
...conversationBase,
|
|
161
|
+
userId: userData._id,
|
|
162
|
+
messages: [userMessage, assistantMessage],
|
|
163
|
+
sessionId: new ObjectId().toString(),
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
const result = await deleteConversations(collections);
|
|
167
|
+
|
|
168
|
+
expect(result).toBe(0);
|
|
169
|
+
});
|
|
170
|
+
test("a conversation with only a sessionId that doesn't exist, should get deleted", async () => {
|
|
171
|
+
await collections.conversations.insertOne({
|
|
172
|
+
...conversationBase,
|
|
173
|
+
messages: [userMessage, assistantMessage],
|
|
174
|
+
sessionId: new ObjectId().toString(),
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const result = await deleteConversations(collections);
|
|
178
|
+
|
|
179
|
+
expect(result).toBe(1);
|
|
180
|
+
});
|
|
181
|
+
test("many conversations should get deleted", async () => {
|
|
182
|
+
const conversations = Array.from({ length: 10010 }, () => ({
|
|
183
|
+
...conversationBase,
|
|
184
|
+
_id: new ObjectId(),
|
|
185
|
+
}));
|
|
186
|
+
|
|
187
|
+
await collections.conversations.insertMany(conversations);
|
|
188
|
+
|
|
189
|
+
const result = await deleteConversations(collections);
|
|
190
|
+
|
|
191
|
+
expect(result).toBe(10010);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
beforeAll(async () => {
|
|
196
|
+
await collections.users.insertOne(userData);
|
|
197
|
+
await collections.sessions.insertOne(sessionForUser);
|
|
198
|
+
}, 20000);
|
|
199
|
+
|
|
200
|
+
afterAll(async () => {
|
|
201
|
+
await collections.users.deleteOne({
|
|
202
|
+
_id: userData._id,
|
|
203
|
+
});
|
|
204
|
+
await collections.sessions.deleteOne({
|
|
205
|
+
_id: sessionForUser._id,
|
|
206
|
+
});
|
|
207
|
+
await collections.conversations.deleteMany({});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
afterEach(async () => {
|
|
211
|
+
await collections.conversations.deleteMany({
|
|
212
|
+
_id: { $in: [conversationBase._id] },
|
|
213
|
+
});
|
|
214
|
+
});
|
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
import type { Migration } from ".";
|
|
2
|
-
import { collections } from "$lib/server/database";
|
|
3
|
-
import { Collection, FindCursor, ObjectId } from "mongodb";
|
|
4
|
-
import { logger } from "$lib/server/logger";
|
|
5
|
-
import type { Conversation } from "$lib/types/Conversation";
|
|
6
|
-
|
|
7
|
-
const BATCH_SIZE = 1000;
|
|
8
|
-
const DELETE_THRESHOLD_MS = 60 * 60 * 1000;
|
|
9
|
-
|
|
10
|
-
async function deleteBatch(conversations: Collection<Conversation>, ids: ObjectId[]) {
|
|
11
|
-
if (ids.length === 0) return 0;
|
|
12
|
-
const deleteResult = await conversations.deleteMany({ _id: { $in: ids } });
|
|
13
|
-
return deleteResult.deletedCount;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async function processCursor<T>(
|
|
17
|
-
cursor: FindCursor<T>,
|
|
18
|
-
processBatchFn: (batch: T[]) => Promise<void>
|
|
19
|
-
) {
|
|
20
|
-
let batch = [];
|
|
21
|
-
while (await cursor.hasNext()) {
|
|
22
|
-
const doc = await cursor.next();
|
|
23
|
-
if (doc) {
|
|
24
|
-
batch.push(doc);
|
|
25
|
-
}
|
|
26
|
-
if (batch.length >= BATCH_SIZE) {
|
|
27
|
-
await processBatchFn(batch);
|
|
28
|
-
batch = [];
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
if (batch.length > 0) {
|
|
32
|
-
await processBatchFn(batch);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export async function deleteConversations(
|
|
37
|
-
collections: typeof import("$lib/server/database").collections
|
|
38
|
-
) {
|
|
39
|
-
let deleteCount = 0;
|
|
40
|
-
const { conversations, sessions } = collections;
|
|
41
|
-
|
|
42
|
-
// First criteria: Delete conversations with no user/assistant messages older than 1 hour
|
|
43
|
-
const emptyConvCursor = conversations
|
|
44
|
-
.find({
|
|
45
|
-
"messages.from": { $not: { $in: ["user", "assistant"] } },
|
|
46
|
-
createdAt: { $lt: new Date(Date.now() - DELETE_THRESHOLD_MS) },
|
|
47
|
-
})
|
|
48
|
-
.batchSize(BATCH_SIZE);
|
|
49
|
-
|
|
50
|
-
await processCursor(emptyConvCursor, async (batch) => {
|
|
51
|
-
const ids = batch.map((doc) => doc._id);
|
|
52
|
-
deleteCount += await deleteBatch(conversations, ids);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
// Second criteria: Process conversations without users in batches and check sessions
|
|
56
|
-
const noUserCursor = conversations.find({ userId: { $exists: false } }).batchSize(BATCH_SIZE);
|
|
57
|
-
|
|
58
|
-
await processCursor(noUserCursor, async (batch) => {
|
|
59
|
-
const sessionIds = [
|
|
60
|
-
...new Set(batch.map((conv) => conv.sessionId).filter((id): id is string => !!id)),
|
|
61
|
-
];
|
|
62
|
-
|
|
63
|
-
const existingSessions = await sessions.find({ sessionId: { $in: sessionIds } }).toArray();
|
|
64
|
-
const validSessionIds = new Set(existingSessions.map((s) => s.sessionId));
|
|
65
|
-
|
|
66
|
-
const invalidConvs = batch.filter(
|
|
67
|
-
(conv) => !conv.sessionId || !validSessionIds.has(conv.sessionId)
|
|
68
|
-
);
|
|
69
|
-
const idsToDelete = invalidConvs.map((conv) => conv._id);
|
|
70
|
-
deleteCount += await deleteBatch(conversations, idsToDelete);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
logger.info(`[MIGRATIONS] Deleted ${deleteCount} conversations in total.`);
|
|
74
|
-
return deleteCount;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const deleteEmptyConversations: Migration = {
|
|
78
|
-
_id: new ObjectId("000000000000000000000009"),
|
|
79
|
-
name: "Delete conversations with no user or assistant messages or valid sessions",
|
|
80
|
-
up: async () => {
|
|
81
|
-
await deleteConversations(collections);
|
|
82
|
-
return true;
|
|
83
|
-
},
|
|
84
|
-
runEveryTime: false,
|
|
85
|
-
runForHuggingChat: "only",
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export default deleteEmptyConversations;
|
|
1
|
+
import type { Migration } from ".";
|
|
2
|
+
import { collections } from "$lib/server/database";
|
|
3
|
+
import { Collection, FindCursor, ObjectId } from "mongodb";
|
|
4
|
+
import { logger } from "$lib/server/logger";
|
|
5
|
+
import type { Conversation } from "$lib/types/Conversation";
|
|
6
|
+
|
|
7
|
+
const BATCH_SIZE = 1000;
|
|
8
|
+
const DELETE_THRESHOLD_MS = 60 * 60 * 1000;
|
|
9
|
+
|
|
10
|
+
async function deleteBatch(conversations: Collection<Conversation>, ids: ObjectId[]) {
|
|
11
|
+
if (ids.length === 0) return 0;
|
|
12
|
+
const deleteResult = await conversations.deleteMany({ _id: { $in: ids } });
|
|
13
|
+
return deleteResult.deletedCount;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function processCursor<T>(
|
|
17
|
+
cursor: FindCursor<T>,
|
|
18
|
+
processBatchFn: (batch: T[]) => Promise<void>
|
|
19
|
+
) {
|
|
20
|
+
let batch = [];
|
|
21
|
+
while (await cursor.hasNext()) {
|
|
22
|
+
const doc = await cursor.next();
|
|
23
|
+
if (doc) {
|
|
24
|
+
batch.push(doc);
|
|
25
|
+
}
|
|
26
|
+
if (batch.length >= BATCH_SIZE) {
|
|
27
|
+
await processBatchFn(batch);
|
|
28
|
+
batch = [];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (batch.length > 0) {
|
|
32
|
+
await processBatchFn(batch);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function deleteConversations(
|
|
37
|
+
collections: typeof import("$lib/server/database").collections
|
|
38
|
+
) {
|
|
39
|
+
let deleteCount = 0;
|
|
40
|
+
const { conversations, sessions } = collections;
|
|
41
|
+
|
|
42
|
+
// First criteria: Delete conversations with no user/assistant messages older than 1 hour
|
|
43
|
+
const emptyConvCursor = conversations
|
|
44
|
+
.find({
|
|
45
|
+
"messages.from": { $not: { $in: ["user", "assistant"] } },
|
|
46
|
+
createdAt: { $lt: new Date(Date.now() - DELETE_THRESHOLD_MS) },
|
|
47
|
+
})
|
|
48
|
+
.batchSize(BATCH_SIZE);
|
|
49
|
+
|
|
50
|
+
await processCursor(emptyConvCursor, async (batch) => {
|
|
51
|
+
const ids = batch.map((doc) => doc._id);
|
|
52
|
+
deleteCount += await deleteBatch(conversations, ids);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Second criteria: Process conversations without users in batches and check sessions
|
|
56
|
+
const noUserCursor = conversations.find({ userId: { $exists: false } }).batchSize(BATCH_SIZE);
|
|
57
|
+
|
|
58
|
+
await processCursor(noUserCursor, async (batch) => {
|
|
59
|
+
const sessionIds = [
|
|
60
|
+
...new Set(batch.map((conv) => conv.sessionId).filter((id): id is string => !!id)),
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
const existingSessions = await sessions.find({ sessionId: { $in: sessionIds } }).toArray();
|
|
64
|
+
const validSessionIds = new Set(existingSessions.map((s) => s.sessionId));
|
|
65
|
+
|
|
66
|
+
const invalidConvs = batch.filter(
|
|
67
|
+
(conv) => !conv.sessionId || !validSessionIds.has(conv.sessionId)
|
|
68
|
+
);
|
|
69
|
+
const idsToDelete = invalidConvs.map((conv) => conv._id);
|
|
70
|
+
deleteCount += await deleteBatch(conversations, idsToDelete);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
logger.info(`[MIGRATIONS] Deleted ${deleteCount} conversations in total.`);
|
|
74
|
+
return deleteCount;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const deleteEmptyConversations: Migration = {
|
|
78
|
+
_id: new ObjectId("000000000000000000000009"),
|
|
79
|
+
name: "Delete conversations with no user or assistant messages or valid sessions",
|
|
80
|
+
up: async () => {
|
|
81
|
+
await deleteConversations(collections);
|
|
82
|
+
return true;
|
|
83
|
+
},
|
|
84
|
+
runEveryTime: false,
|
|
85
|
+
runForHuggingChat: "only",
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export default deleteEmptyConversations;
|