@librechat/data-schemas 0.0.42 → 0.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/capabilities.cjs +192 -0
- package/dist/admin/capabilities.cjs.map +1 -0
- package/dist/admin/capabilities.es.js +182 -0
- package/dist/admin/capabilities.es.js.map +1 -0
- package/dist/app/agents.cjs +24 -0
- package/dist/app/agents.cjs.map +1 -0
- package/dist/app/agents.es.js +22 -0
- package/dist/app/agents.es.js.map +1 -0
- package/dist/app/assistants.cjs +56 -0
- package/dist/app/assistants.cjs.map +1 -0
- package/dist/app/assistants.es.js +53 -0
- package/dist/app/assistants.es.js.map +1 -0
- package/dist/app/azure.cjs +61 -0
- package/dist/app/azure.cjs.map +1 -0
- package/dist/app/azure.es.js +59 -0
- package/dist/app/azure.es.js.map +1 -0
- package/dist/app/endpoints.cjs +63 -0
- package/dist/app/endpoints.cjs.map +1 -0
- package/dist/app/endpoints.es.js +61 -0
- package/dist/app/endpoints.es.js.map +1 -0
- package/dist/app/interface.cjs +53 -0
- package/dist/app/interface.cjs.map +1 -0
- package/dist/app/interface.es.js +51 -0
- package/dist/app/interface.es.js.map +1 -0
- package/dist/app/memory.cjs +29 -0
- package/dist/app/memory.cjs.map +1 -0
- package/dist/app/memory.es.js +26 -0
- package/dist/app/memory.es.js.map +1 -0
- package/dist/app/ocr.cjs +21 -0
- package/dist/app/ocr.cjs.map +1 -0
- package/dist/app/ocr.es.js +19 -0
- package/dist/app/ocr.es.js.map +1 -0
- package/dist/app/resolution.cjs +51 -0
- package/dist/app/resolution.cjs.map +1 -0
- package/dist/app/resolution.es.js +49 -0
- package/dist/app/resolution.es.js.map +1 -0
- package/dist/app/service.cjs +108 -0
- package/dist/app/service.cjs.map +1 -0
- package/dist/app/service.es.js +106 -0
- package/dist/app/service.es.js.map +1 -0
- package/dist/app/specs.cjs +71 -0
- package/dist/app/specs.cjs.map +1 -0
- package/dist/app/specs.es.js +69 -0
- package/dist/app/specs.es.js.map +1 -0
- package/dist/app/turnstile.cjs +40 -0
- package/dist/app/turnstile.cjs.map +1 -0
- package/dist/app/turnstile.es.js +38 -0
- package/dist/app/turnstile.es.js.map +1 -0
- package/dist/app/vertex.cjs +156 -0
- package/dist/app/vertex.cjs.map +1 -0
- package/dist/app/vertex.es.js +152 -0
- package/dist/app/vertex.es.js.map +1 -0
- package/dist/app/web.cjs +87 -0
- package/dist/app/web.cjs.map +1 -0
- package/dist/app/web.es.js +82 -0
- package/dist/app/web.es.js.map +1 -0
- package/dist/common/enum.cjs +19 -0
- package/dist/common/enum.cjs.map +1 -0
- package/dist/common/enum.es.js +19 -0
- package/dist/common/enum.es.js.map +1 -0
- package/dist/config/meiliLogger.cjs +57 -0
- package/dist/config/meiliLogger.cjs.map +1 -0
- package/dist/config/meiliLogger.es.js +55 -0
- package/dist/config/meiliLogger.es.js.map +1 -0
- package/dist/config/parsers.cjs +224 -0
- package/dist/config/parsers.cjs.map +1 -0
- package/dist/config/parsers.es.js +219 -0
- package/dist/config/parsers.es.js.map +1 -0
- package/dist/config/tenantContext.cjs +30 -0
- package/dist/config/tenantContext.cjs.map +1 -0
- package/dist/config/tenantContext.es.js +25 -0
- package/dist/config/tenantContext.es.js.map +1 -0
- package/dist/config/utils.cjs +37 -0
- package/dist/config/utils.cjs.map +1 -0
- package/dist/config/utils.es.js +35 -0
- package/dist/config/utils.es.js.map +1 -0
- package/dist/config/winston.cjs +93 -0
- package/dist/config/winston.cjs.map +1 -0
- package/dist/config/winston.es.js +91 -0
- package/dist/config/winston.es.js.map +1 -0
- package/dist/crypto/index.cjs +156 -0
- package/dist/crypto/index.cjs.map +1 -0
- package/dist/crypto/index.es.js +145 -0
- package/dist/crypto/index.es.js.map +1 -0
- package/dist/index.cjs +142 -11725
- package/dist/index.cjs.map +1 -1
- package/dist/index.es.js +52 -11644
- package/dist/index.es.js.map +1 -1
- package/dist/methods/accessRole.cjs +210 -0
- package/dist/methods/accessRole.cjs.map +1 -0
- package/dist/methods/accessRole.es.js +208 -0
- package/dist/methods/accessRole.es.js.map +1 -0
- package/dist/methods/aclEntry.cjs +361 -0
- package/dist/methods/aclEntry.cjs.map +1 -0
- package/dist/methods/aclEntry.es.js +359 -0
- package/dist/methods/aclEntry.es.js.map +1 -0
- package/dist/methods/action.cjs +59 -0
- package/dist/methods/action.cjs.map +1 -0
- package/dist/methods/action.es.js +57 -0
- package/dist/methods/action.es.js.map +1 -0
- package/dist/methods/agent.cjs +580 -0
- package/dist/methods/agent.cjs.map +1 -0
- package/dist/methods/agent.es.js +578 -0
- package/dist/methods/agent.es.js.map +1 -0
- package/dist/methods/agentApiKey.cjs +140 -0
- package/dist/methods/agentApiKey.cjs.map +1 -0
- package/dist/methods/agentApiKey.es.js +138 -0
- package/dist/methods/agentApiKey.es.js.map +1 -0
- package/dist/methods/agentCategory.cjs +226 -0
- package/dist/methods/agentCategory.cjs.map +1 -0
- package/dist/methods/agentCategory.es.js +224 -0
- package/dist/methods/agentCategory.es.js.map +1 -0
- package/dist/methods/assistant.cjs +53 -0
- package/dist/methods/assistant.cjs.map +1 -0
- package/dist/methods/assistant.es.js +51 -0
- package/dist/methods/assistant.es.js.map +1 -0
- package/dist/methods/banner.cjs +32 -0
- package/dist/methods/banner.cjs.map +1 -0
- package/dist/methods/banner.es.js +30 -0
- package/dist/methods/banner.es.js.map +1 -0
- package/dist/methods/categories.cjs +33 -0
- package/dist/methods/categories.cjs.map +1 -0
- package/dist/methods/categories.es.js +31 -0
- package/dist/methods/categories.es.js.map +1 -0
- package/dist/methods/config.cjs +106 -0
- package/dist/methods/config.cjs.map +1 -0
- package/dist/methods/config.es.js +104 -0
- package/dist/methods/config.es.js.map +1 -0
- package/dist/methods/conversation.cjs +344 -0
- package/dist/methods/conversation.cjs.map +1 -0
- package/dist/methods/conversation.es.js +342 -0
- package/dist/methods/conversation.es.js.map +1 -0
- package/dist/methods/conversationTag.cjs +234 -0
- package/dist/methods/conversationTag.cjs.map +1 -0
- package/dist/methods/conversationTag.es.js +232 -0
- package/dist/methods/conversationTag.es.js.map +1 -0
- package/dist/methods/file.cjs +315 -0
- package/dist/methods/file.cjs.map +1 -0
- package/dist/methods/file.es.js +313 -0
- package/dist/methods/file.es.js.map +1 -0
- package/dist/methods/index.cjs +135 -0
- package/dist/methods/index.cjs.map +1 -0
- package/dist/methods/index.es.js +130 -0
- package/dist/methods/index.es.js.map +1 -0
- package/dist/methods/key.cjs +136 -0
- package/dist/methods/key.cjs.map +1 -0
- package/dist/methods/key.es.js +134 -0
- package/dist/methods/key.es.js.map +1 -0
- package/dist/methods/mcpServer.cjs +259 -0
- package/dist/methods/mcpServer.cjs.map +1 -0
- package/dist/methods/mcpServer.es.js +257 -0
- package/dist/methods/mcpServer.es.js.map +1 -0
- package/dist/methods/memory.cjs +145 -0
- package/dist/methods/memory.cjs.map +1 -0
- package/dist/methods/memory.es.js +143 -0
- package/dist/methods/memory.es.js.map +1 -0
- package/dist/methods/message.cjs +280 -0
- package/dist/methods/message.cjs.map +1 -0
- package/dist/methods/message.es.js +278 -0
- package/dist/methods/message.es.js.map +1 -0
- package/dist/methods/pluginAuth.cjs +108 -0
- package/dist/methods/pluginAuth.cjs.map +1 -0
- package/dist/methods/pluginAuth.es.js +106 -0
- package/dist/methods/pluginAuth.es.js.map +1 -0
- package/dist/methods/preset.cjs +105 -0
- package/dist/methods/preset.cjs.map +1 -0
- package/dist/methods/preset.es.js +103 -0
- package/dist/methods/preset.es.js.map +1 -0
- package/dist/methods/prompt.cjs +546 -0
- package/dist/methods/prompt.cjs.map +1 -0
- package/dist/methods/prompt.es.js +544 -0
- package/dist/methods/prompt.es.js.map +1 -0
- package/dist/methods/role.cjs +290 -0
- package/dist/methods/role.cjs.map +1 -0
- package/dist/methods/role.es.js +288 -0
- package/dist/methods/role.es.js.map +1 -0
- package/dist/methods/session.cjs +221 -0
- package/dist/methods/session.cjs.map +1 -0
- package/dist/methods/session.es.js +217 -0
- package/dist/methods/session.es.js.map +1 -0
- package/dist/methods/share.cjs +474 -0
- package/dist/methods/share.cjs.map +1 -0
- package/dist/methods/share.es.js +472 -0
- package/dist/methods/share.es.js.map +1 -0
- package/dist/methods/spendTokens.cjs +109 -0
- package/dist/methods/spendTokens.cjs.map +1 -0
- package/dist/methods/spendTokens.es.js +107 -0
- package/dist/methods/spendTokens.es.js.map +1 -0
- package/dist/methods/systemGrant.cjs +190 -0
- package/dist/methods/systemGrant.cjs.map +1 -0
- package/dist/methods/systemGrant.es.js +188 -0
- package/dist/methods/systemGrant.es.js.map +1 -0
- package/dist/methods/token.cjs +117 -0
- package/dist/methods/token.cjs.map +1 -0
- package/dist/methods/token.es.js +115 -0
- package/dist/methods/token.es.js.map +1 -0
- package/dist/methods/toolCall.cjs +91 -0
- package/dist/methods/toolCall.cjs.map +1 -0
- package/dist/methods/toolCall.es.js +89 -0
- package/dist/methods/toolCall.es.js.map +1 -0
- package/dist/methods/transaction.cjs +305 -0
- package/dist/methods/transaction.cjs.map +1 -0
- package/dist/methods/transaction.es.js +303 -0
- package/dist/methods/transaction.es.js.map +1 -0
- package/dist/methods/tx.cjs +443 -0
- package/dist/methods/tx.cjs.map +1 -0
- package/dist/methods/tx.es.js +437 -0
- package/dist/methods/tx.es.js.map +1 -0
- package/dist/methods/user.cjs +269 -0
- package/dist/methods/user.cjs.map +1 -0
- package/dist/methods/user.es.js +266 -0
- package/dist/methods/user.es.js.map +1 -0
- package/dist/methods/userGroup.cjs +518 -0
- package/dist/methods/userGroup.cjs.map +1 -0
- package/dist/methods/userGroup.es.js +516 -0
- package/dist/methods/userGroup.es.js.map +1 -0
- package/dist/migrations/tenantIndexes.cjs +85 -0
- package/dist/migrations/tenantIndexes.cjs.map +1 -0
- package/dist/migrations/tenantIndexes.es.js +82 -0
- package/dist/migrations/tenantIndexes.es.js.map +1 -0
- package/dist/models/accessRole.cjs +12 -0
- package/dist/models/accessRole.cjs.map +1 -0
- package/dist/models/accessRole.es.js +10 -0
- package/dist/models/accessRole.es.js.map +1 -0
- package/dist/models/aclEntry.cjs +12 -0
- package/dist/models/aclEntry.cjs.map +1 -0
- package/dist/models/aclEntry.es.js +10 -0
- package/dist/models/aclEntry.es.js.map +1 -0
- package/dist/models/action.cjs +12 -0
- package/dist/models/action.cjs.map +1 -0
- package/dist/models/action.es.js +10 -0
- package/dist/models/action.es.js.map +1 -0
- package/dist/models/agent.cjs +12 -0
- package/dist/models/agent.cjs.map +1 -0
- package/dist/models/agent.es.js +10 -0
- package/dist/models/agent.es.js.map +1 -0
- package/dist/models/agentApiKey.cjs +12 -0
- package/dist/models/agentApiKey.cjs.map +1 -0
- package/dist/models/agentApiKey.es.js +10 -0
- package/dist/models/agentApiKey.es.js.map +1 -0
- package/dist/models/agentCategory.cjs +13 -0
- package/dist/models/agentCategory.cjs.map +1 -0
- package/dist/models/agentCategory.es.js +11 -0
- package/dist/models/agentCategory.es.js.map +1 -0
- package/dist/models/assistant.cjs +12 -0
- package/dist/models/assistant.cjs.map +1 -0
- package/dist/models/assistant.es.js +10 -0
- package/dist/models/assistant.es.js.map +1 -0
- package/dist/models/balance.cjs +12 -0
- package/dist/models/balance.cjs.map +1 -0
- package/dist/models/balance.es.js +10 -0
- package/dist/models/balance.es.js.map +1 -0
- package/dist/models/banner.cjs +12 -0
- package/dist/models/banner.cjs.map +1 -0
- package/dist/models/banner.es.js +10 -0
- package/dist/models/banner.es.js.map +1 -0
- package/dist/models/config.cjs +12 -0
- package/dist/models/config.cjs.map +1 -0
- package/dist/models/config.es.js +10 -0
- package/dist/models/config.es.js.map +1 -0
- package/dist/models/conversationTag.cjs +13 -0
- package/dist/models/conversationTag.cjs.map +1 -0
- package/dist/models/conversationTag.es.js +11 -0
- package/dist/models/conversationTag.es.js.map +1 -0
- package/dist/models/convo.cjs +23 -0
- package/dist/models/convo.cjs.map +1 -0
- package/dist/models/convo.es.js +21 -0
- package/dist/models/convo.es.js.map +1 -0
- package/dist/models/file.cjs +12 -0
- package/dist/models/file.cjs.map +1 -0
- package/dist/models/file.es.js +10 -0
- package/dist/models/file.es.js.map +1 -0
- package/dist/models/group.cjs +12 -0
- package/dist/models/group.cjs.map +1 -0
- package/dist/models/group.es.js +10 -0
- package/dist/models/group.es.js.map +1 -0
- package/dist/models/index.cjs +73 -0
- package/dist/models/index.cjs.map +1 -0
- package/dist/models/index.es.js +71 -0
- package/dist/models/index.es.js.map +1 -0
- package/dist/models/key.cjs +12 -0
- package/dist/models/key.cjs.map +1 -0
- package/dist/models/key.es.js +10 -0
- package/dist/models/key.es.js.map +1 -0
- package/dist/models/mcpServer.cjs +12 -0
- package/dist/models/mcpServer.cjs.map +1 -0
- package/dist/models/mcpServer.es.js +10 -0
- package/dist/models/mcpServer.es.js.map +1 -0
- package/dist/models/memory.cjs +12 -0
- package/dist/models/memory.cjs.map +1 -0
- package/dist/models/memory.es.js +10 -0
- package/dist/models/memory.es.js.map +1 -0
- package/dist/models/message.cjs +22 -0
- package/dist/models/message.cjs.map +1 -0
- package/dist/models/message.es.js +20 -0
- package/dist/models/message.es.js.map +1 -0
- package/dist/models/pluginAuth.cjs +12 -0
- package/dist/models/pluginAuth.cjs.map +1 -0
- package/dist/models/pluginAuth.es.js +10 -0
- package/dist/models/pluginAuth.es.js.map +1 -0
- package/dist/models/plugins/mongoMeili.cjs +547 -0
- package/dist/models/plugins/mongoMeili.cjs.map +1 -0
- package/dist/models/plugins/mongoMeili.es.js +545 -0
- package/dist/models/plugins/mongoMeili.es.js.map +1 -0
- package/dist/models/plugins/tenantIsolation.cjs +140 -0
- package/dist/models/plugins/tenantIsolation.cjs.map +1 -0
- package/dist/models/plugins/tenantIsolation.es.js +138 -0
- package/dist/models/plugins/tenantIsolation.es.js.map +1 -0
- package/dist/models/preset.cjs +12 -0
- package/dist/models/preset.cjs.map +1 -0
- package/dist/models/preset.es.js +10 -0
- package/dist/models/preset.es.js.map +1 -0
- package/dist/models/prompt.cjs +12 -0
- package/dist/models/prompt.cjs.map +1 -0
- package/dist/models/prompt.es.js +10 -0
- package/dist/models/prompt.es.js.map +1 -0
- package/dist/models/promptGroup.cjs +13 -0
- package/dist/models/promptGroup.cjs.map +1 -0
- package/dist/models/promptGroup.es.js +11 -0
- package/dist/models/promptGroup.es.js.map +1 -0
- package/dist/models/role.cjs +12 -0
- package/dist/models/role.cjs.map +1 -0
- package/dist/models/role.es.js +10 -0
- package/dist/models/role.es.js.map +1 -0
- package/dist/models/session.cjs +12 -0
- package/dist/models/session.cjs.map +1 -0
- package/dist/models/session.es.js +10 -0
- package/dist/models/session.es.js.map +1 -0
- package/dist/models/sharedLink.cjs +12 -0
- package/dist/models/sharedLink.cjs.map +1 -0
- package/dist/models/sharedLink.es.js +10 -0
- package/dist/models/sharedLink.es.js.map +1 -0
- package/dist/models/systemGrant.cjs +16 -0
- package/dist/models/systemGrant.cjs.map +1 -0
- package/dist/models/systemGrant.es.js +14 -0
- package/dist/models/systemGrant.es.js.map +1 -0
- package/dist/models/token.cjs +12 -0
- package/dist/models/token.cjs.map +1 -0
- package/dist/models/token.es.js +10 -0
- package/dist/models/token.es.js.map +1 -0
- package/dist/models/toolCall.cjs +12 -0
- package/dist/models/toolCall.cjs.map +1 -0
- package/dist/models/toolCall.es.js +10 -0
- package/dist/models/toolCall.es.js.map +1 -0
- package/dist/models/transaction.cjs +12 -0
- package/dist/models/transaction.cjs.map +1 -0
- package/dist/models/transaction.es.js +10 -0
- package/dist/models/transaction.es.js.map +1 -0
- package/dist/models/user.cjs +12 -0
- package/dist/models/user.cjs.map +1 -0
- package/dist/models/user.es.js +10 -0
- package/dist/models/user.es.js.map +1 -0
- package/dist/schema/accessRole.cjs +34 -0
- package/dist/schema/accessRole.cjs.map +1 -0
- package/dist/schema/accessRole.es.js +32 -0
- package/dist/schema/accessRole.es.js.map +1 -0
- package/dist/schema/aclEntry.cjs +74 -0
- package/dist/schema/aclEntry.cjs.map +1 -0
- package/dist/schema/aclEntry.es.js +72 -0
- package/dist/schema/aclEntry.es.js.map +1 -0
- package/dist/schema/action.cjs +54 -0
- package/dist/schema/action.cjs.map +1 -0
- package/dist/schema/action.es.js +52 -0
- package/dist/schema/action.es.js.map +1 -0
- package/dist/schema/agent.cjs +128 -0
- package/dist/schema/agent.cjs.map +1 -0
- package/dist/schema/agent.es.js +126 -0
- package/dist/schema/agent.es.js.map +1 -0
- package/dist/schema/agentApiKey.cjs +50 -0
- package/dist/schema/agentApiKey.cjs.map +1 -0
- package/dist/schema/agentApiKey.es.js +48 -0
- package/dist/schema/agentApiKey.es.js.map +1 -0
- package/dist/schema/agentCategory.cjs +49 -0
- package/dist/schema/agentCategory.cjs.map +1 -0
- package/dist/schema/agentCategory.es.js +47 -0
- package/dist/schema/agentCategory.es.js.map +1 -0
- package/dist/schema/assistant.cjs +42 -0
- package/dist/schema/assistant.cjs.map +1 -0
- package/dist/schema/assistant.es.js +40 -0
- package/dist/schema/assistant.es.js.map +1 -0
- package/dist/schema/balance.cjs +47 -0
- package/dist/schema/balance.cjs.map +1 -0
- package/dist/schema/balance.es.js +45 -0
- package/dist/schema/balance.es.js.map +1 -0
- package/dist/schema/banner.cjs +42 -0
- package/dist/schema/banner.cjs.map +1 -0
- package/dist/schema/banner.es.js +40 -0
- package/dist/schema/banner.es.js.map +1 -0
- package/dist/schema/categories.cjs +23 -0
- package/dist/schema/categories.cjs.map +1 -0
- package/dist/schema/categories.es.js +21 -0
- package/dist/schema/categories.es.js.map +1 -0
- package/dist/schema/config.cjs +59 -0
- package/dist/schema/config.cjs.map +1 -0
- package/dist/schema/config.es.js +57 -0
- package/dist/schema/config.es.js.map +1 -0
- package/dist/schema/conversationTag.cjs +36 -0
- package/dist/schema/conversationTag.cjs.map +1 -0
- package/dist/schema/conversationTag.es.js +34 -0
- package/dist/schema/conversationTag.es.js.map +1 -0
- package/dist/schema/convo.cjs +52 -0
- package/dist/schema/convo.cjs.map +1 -0
- package/dist/schema/convo.es.js +50 -0
- package/dist/schema/convo.es.js.map +1 -0
- package/dist/schema/defaults.cjs +168 -0
- package/dist/schema/defaults.cjs.map +1 -0
- package/dist/schema/defaults.es.js +166 -0
- package/dist/schema/defaults.es.js.map +1 -0
- package/dist/schema/file.cjs +92 -0
- package/dist/schema/file.cjs.map +1 -0
- package/dist/schema/file.es.js +90 -0
- package/dist/schema/file.es.js.map +1 -0
- package/dist/schema/group.cjs +56 -0
- package/dist/schema/group.cjs.map +1 -0
- package/dist/schema/group.es.js +54 -0
- package/dist/schema/group.es.js.map +1 -0
- package/dist/schema/key.cjs +30 -0
- package/dist/schema/key.cjs.map +1 -0
- package/dist/schema/key.es.js +28 -0
- package/dist/schema/key.es.js.map +1 -0
- package/dist/schema/mcpServer.cjs +33 -0
- package/dist/schema/mcpServer.cjs.map +1 -0
- package/dist/schema/mcpServer.es.js +31 -0
- package/dist/schema/mcpServer.es.js.map +1 -0
- package/dist/schema/memory.cjs +39 -0
- package/dist/schema/memory.cjs.map +1 -0
- package/dist/schema/memory.es.js +37 -0
- package/dist/schema/memory.es.js.map +1 -0
- package/dist/schema/message.cjs +167 -0
- package/dist/schema/message.cjs.map +1 -0
- package/dist/schema/message.es.js +165 -0
- package/dist/schema/message.es.js.map +1 -0
- package/dist/schema/pluginAuth.cjs +28 -0
- package/dist/schema/pluginAuth.cjs.map +1 -0
- package/dist/schema/pluginAuth.es.js +26 -0
- package/dist/schema/pluginAuth.es.js.map +1 -0
- package/dist/schema/preset.cjs +36 -0
- package/dist/schema/preset.cjs.map +1 -0
- package/dist/schema/preset.es.js +34 -0
- package/dist/schema/preset.es.js.map +1 -0
- package/dist/schema/prompt.cjs +36 -0
- package/dist/schema/prompt.cjs.map +1 -0
- package/dist/schema/prompt.es.js +34 -0
- package/dist/schema/prompt.es.js.map +1 -0
- package/dist/schema/promptGroup.cjs +65 -0
- package/dist/schema/promptGroup.cjs.map +1 -0
- package/dist/schema/promptGroup.es.js +63 -0
- package/dist/schema/promptGroup.es.js.map +1 -0
- package/dist/schema/role.cjs +84 -0
- package/dist/schema/role.cjs.map +1 -0
- package/dist/schema/role.es.js +82 -0
- package/dist/schema/role.es.js.map +1 -0
- package/dist/schema/session.cjs +27 -0
- package/dist/schema/session.cjs.map +1 -0
- package/dist/schema/session.es.js +25 -0
- package/dist/schema/session.es.js.map +1 -0
- package/dist/schema/share.cjs +40 -0
- package/dist/schema/share.cjs.map +1 -0
- package/dist/schema/share.es.js +38 -0
- package/dist/schema/share.es.js.map +1 -0
- package/dist/schema/systemGrant.cjs +66 -0
- package/dist/schema/systemGrant.cjs.map +1 -0
- package/dist/schema/systemGrant.es.js +64 -0
- package/dist/schema/systemGrant.es.js.map +1 -0
- package/dist/schema/token.cjs +45 -0
- package/dist/schema/token.cjs.map +1 -0
- package/dist/schema/token.es.js +43 -0
- package/dist/schema/token.es.js.map +1 -0
- package/dist/schema/toolCall.cjs +44 -0
- package/dist/schema/toolCall.cjs.map +1 -0
- package/dist/schema/toolCall.es.js +42 -0
- package/dist/schema/toolCall.es.js.map +1 -0
- package/dist/schema/transaction.cjs +48 -0
- package/dist/schema/transaction.cjs.map +1 -0
- package/dist/schema/transaction.es.js +46 -0
- package/dist/schema/transaction.es.js.map +1 -0
- package/dist/schema/user.cjs +165 -0
- package/dist/schema/user.cjs.map +1 -0
- package/dist/schema/user.es.js +163 -0
- package/dist/schema/user.es.js.map +1 -0
- package/dist/types/admin/capabilities.d.ts +2 -0
- package/dist/types/methods/config.d.ts +1 -0
- package/dist/utils/object-traverse.cjs +158 -0
- package/dist/utils/object-traverse.cjs.map +1 -0
- package/dist/utils/object-traverse.es.js +156 -0
- package/dist/utils/object-traverse.es.js.map +1 -0
- package/dist/utils/principal.cjs +24 -0
- package/dist/utils/principal.cjs.map +1 -0
- package/dist/utils/principal.es.js +22 -0
- package/dist/utils/principal.es.js.map +1 -0
- package/dist/utils/string.cjs +11 -0
- package/dist/utils/string.cjs.map +1 -0
- package/dist/utils/string.es.js +9 -0
- package/dist/utils/string.es.js.map +1 -0
- package/dist/utils/tempChatRetention.cjs +70 -0
- package/dist/utils/tempChatRetention.cjs.map +1 -0
- package/dist/utils/tempChatRetention.es.js +64 -0
- package/dist/utils/tempChatRetention.es.js.map +1 -0
- package/dist/utils/transactions.cjs +60 -0
- package/dist/utils/transactions.cjs.map +1 -0
- package/dist/utils/transactions.es.js +56 -0
- package/dist/utils/transactions.es.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import { Types } from 'mongoose';
|
|
2
|
+
import { PrincipalType } from 'librechat-data-provider';
|
|
3
|
+
|
|
4
|
+
function createUserGroupMethods(mongoose) {
|
|
5
|
+
/**
|
|
6
|
+
* Find a group by its ID
|
|
7
|
+
* @param groupId - The group ID
|
|
8
|
+
* @param projection - Optional projection of fields to return
|
|
9
|
+
* @param session - Optional MongoDB session for transactions
|
|
10
|
+
* @returns The group document or null if not found
|
|
11
|
+
*/
|
|
12
|
+
async function findGroupById(groupId, projection = {}, session) {
|
|
13
|
+
const Group = mongoose.models.Group;
|
|
14
|
+
const query = Group.findOne({ _id: groupId }, projection);
|
|
15
|
+
if (session) {
|
|
16
|
+
query.session(session);
|
|
17
|
+
}
|
|
18
|
+
return await query.lean();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Find a group by its external ID (e.g., Entra ID)
|
|
22
|
+
* @param idOnTheSource - The external ID
|
|
23
|
+
* @param source - The source ('entra' or 'local')
|
|
24
|
+
* @param projection - Optional projection of fields to return
|
|
25
|
+
* @param session - Optional MongoDB session for transactions
|
|
26
|
+
* @returns The group document or null if not found
|
|
27
|
+
*/
|
|
28
|
+
async function findGroupByExternalId(idOnTheSource, source = 'entra', projection = {}, session) {
|
|
29
|
+
const Group = mongoose.models.Group;
|
|
30
|
+
const query = Group.findOne({ idOnTheSource, source }, projection);
|
|
31
|
+
if (session) {
|
|
32
|
+
query.session(session);
|
|
33
|
+
}
|
|
34
|
+
return await query.lean();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Find groups by name pattern (case-insensitive partial match)
|
|
38
|
+
* @param namePattern - The name pattern to search for
|
|
39
|
+
* @param source - Optional source filter ('entra', 'local', or null for all)
|
|
40
|
+
* @param limit - Maximum number of results to return
|
|
41
|
+
* @param session - Optional MongoDB session for transactions
|
|
42
|
+
* @returns Array of matching groups
|
|
43
|
+
*/
|
|
44
|
+
async function findGroupsByNamePattern(namePattern, source = null, limit = 20, session) {
|
|
45
|
+
const Group = mongoose.models.Group;
|
|
46
|
+
const regex = new RegExp(namePattern, 'i');
|
|
47
|
+
const query = {
|
|
48
|
+
$or: [{ name: regex }, { email: regex }, { description: regex }],
|
|
49
|
+
};
|
|
50
|
+
if (source) {
|
|
51
|
+
query.source = source;
|
|
52
|
+
}
|
|
53
|
+
const dbQuery = Group.find(query).limit(limit);
|
|
54
|
+
if (session) {
|
|
55
|
+
dbQuery.session(session);
|
|
56
|
+
}
|
|
57
|
+
return await dbQuery.lean();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Find all groups a user is a member of by their ID or idOnTheSource
|
|
61
|
+
* @param userId - The user ID
|
|
62
|
+
* @param session - Optional MongoDB session for transactions
|
|
63
|
+
* @returns Array of groups the user is a member of
|
|
64
|
+
*/
|
|
65
|
+
async function findGroupsByMemberId(userId, session) {
|
|
66
|
+
const User = mongoose.models.User;
|
|
67
|
+
const Group = mongoose.models.Group;
|
|
68
|
+
const userQuery = User.findById(userId, 'idOnTheSource');
|
|
69
|
+
if (session) {
|
|
70
|
+
userQuery.session(session);
|
|
71
|
+
}
|
|
72
|
+
const user = (await userQuery.lean());
|
|
73
|
+
if (!user) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
const userIdOnTheSource = user.idOnTheSource || userId.toString();
|
|
77
|
+
const query = Group.find({ memberIds: userIdOnTheSource });
|
|
78
|
+
if (session) {
|
|
79
|
+
query.session(session);
|
|
80
|
+
}
|
|
81
|
+
return await query.lean();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Create a new group
|
|
85
|
+
* @param groupData - Group data including name, source, and optional idOnTheSource
|
|
86
|
+
* @param session - Optional MongoDB session for transactions
|
|
87
|
+
* @returns The created group
|
|
88
|
+
*/
|
|
89
|
+
async function createGroup(groupData, session) {
|
|
90
|
+
const Group = mongoose.models.Group;
|
|
91
|
+
const options = session ? { session } : {};
|
|
92
|
+
return await Group.create([groupData], options).then((groups) => groups[0]);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Update or create a group by external ID
|
|
96
|
+
* @param idOnTheSource - The external ID
|
|
97
|
+
* @param source - The source ('entra' or 'local')
|
|
98
|
+
* @param updateData - Data to update or set if creating
|
|
99
|
+
* @param session - Optional MongoDB session for transactions
|
|
100
|
+
* @returns The updated or created group
|
|
101
|
+
*/
|
|
102
|
+
async function upsertGroupByExternalId(idOnTheSource, source, updateData, session) {
|
|
103
|
+
const Group = mongoose.models.Group;
|
|
104
|
+
const options = {
|
|
105
|
+
new: true,
|
|
106
|
+
upsert: true,
|
|
107
|
+
...(session ? { session } : {}),
|
|
108
|
+
};
|
|
109
|
+
return await Group.findOneAndUpdate({ idOnTheSource, source }, { $set: updateData }, options);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Add a user to a group
|
|
113
|
+
* Only updates Group.memberIds (one-way relationship)
|
|
114
|
+
* Note: memberIds stores idOnTheSource values, not ObjectIds
|
|
115
|
+
*
|
|
116
|
+
* @param userId - The user ID
|
|
117
|
+
* @param groupId - The group ID to add
|
|
118
|
+
* @param session - Optional MongoDB session for transactions
|
|
119
|
+
* @returns The user and updated group documents
|
|
120
|
+
*/
|
|
121
|
+
async function addUserToGroup(userId, groupId, session) {
|
|
122
|
+
const User = mongoose.models.User;
|
|
123
|
+
const Group = mongoose.models.Group;
|
|
124
|
+
const options = { new: true, ...(session ? { session } : {}) };
|
|
125
|
+
const user = (await User.findById(userId, 'idOnTheSource', options).lean());
|
|
126
|
+
if (!user) {
|
|
127
|
+
throw new Error(`User not found: ${userId}`);
|
|
128
|
+
}
|
|
129
|
+
const userIdOnTheSource = user.idOnTheSource || userId.toString();
|
|
130
|
+
const updatedGroup = await Group.findByIdAndUpdate(groupId, { $addToSet: { memberIds: userIdOnTheSource } }, options).lean();
|
|
131
|
+
return { user: user, group: updatedGroup };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Remove a user from a group
|
|
135
|
+
* Only updates Group.memberIds (one-way relationship)
|
|
136
|
+
* Note: memberIds stores idOnTheSource values, not ObjectIds
|
|
137
|
+
*
|
|
138
|
+
* @param userId - The user ID
|
|
139
|
+
* @param groupId - The group ID to remove
|
|
140
|
+
* @param session - Optional MongoDB session for transactions
|
|
141
|
+
* @returns The user and updated group documents
|
|
142
|
+
*/
|
|
143
|
+
async function removeUserFromGroup(userId, groupId, session) {
|
|
144
|
+
const User = mongoose.models.User;
|
|
145
|
+
const Group = mongoose.models.Group;
|
|
146
|
+
const options = { new: true, ...(session ? { session } : {}) };
|
|
147
|
+
const user = (await User.findById(userId, 'idOnTheSource', options).lean());
|
|
148
|
+
if (!user) {
|
|
149
|
+
throw new Error(`User not found: ${userId}`);
|
|
150
|
+
}
|
|
151
|
+
const userIdOnTheSource = user.idOnTheSource || userId.toString();
|
|
152
|
+
const updatedGroup = await Group.findByIdAndUpdate(groupId, { $pullAll: { memberIds: [userIdOnTheSource] } }, options).lean();
|
|
153
|
+
return { user: user, group: updatedGroup };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get all groups a user is a member of
|
|
157
|
+
* @param userId - The user ID
|
|
158
|
+
* @param session - Optional MongoDB session for transactions
|
|
159
|
+
* @returns Array of group documents
|
|
160
|
+
*/
|
|
161
|
+
async function getUserGroups(userId, session) {
|
|
162
|
+
return await findGroupsByMemberId(userId, session);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get a list of all principal identifiers for a user (user ID + group IDs + public)
|
|
166
|
+
* For use in permission checks
|
|
167
|
+
* @param params - Parameters object
|
|
168
|
+
* @param params.userId - The user ID
|
|
169
|
+
* @param params.role - Optional user role (if not provided, will query from DB)
|
|
170
|
+
* @param session - Optional MongoDB session for transactions
|
|
171
|
+
* @returns Array of principal objects with type and id
|
|
172
|
+
*/
|
|
173
|
+
/**
|
|
174
|
+
* TODO(#12091): This method has no tenantId parameter — it returns ALL group
|
|
175
|
+
* memberships for a user regardless of tenant. In multi-tenant mode, group
|
|
176
|
+
* principals from other tenants will be included in capability checks, which
|
|
177
|
+
* could grant cross-tenant capabilities. Add tenantId filtering here when
|
|
178
|
+
* tenant isolation is activated.
|
|
179
|
+
*/
|
|
180
|
+
async function getUserPrincipals(params, session) {
|
|
181
|
+
const { userId, role } = params;
|
|
182
|
+
/** `userId` must be an `ObjectId` for USER principal since ACL entries store `ObjectId`s */
|
|
183
|
+
const userObjectId = typeof userId === 'string' ? new Types.ObjectId(userId) : userId;
|
|
184
|
+
const principals = [
|
|
185
|
+
{ principalType: PrincipalType.USER, principalId: userObjectId },
|
|
186
|
+
];
|
|
187
|
+
// If role is not provided, query user to get it
|
|
188
|
+
let userRole = role;
|
|
189
|
+
if (userRole === undefined) {
|
|
190
|
+
const User = mongoose.models.User;
|
|
191
|
+
const query = User.findById(userId).select('role');
|
|
192
|
+
if (session) {
|
|
193
|
+
query.session(session);
|
|
194
|
+
}
|
|
195
|
+
const user = await query.lean();
|
|
196
|
+
userRole = user === null || user === void 0 ? void 0 : user.role;
|
|
197
|
+
}
|
|
198
|
+
// Add role as a principal if user has one
|
|
199
|
+
if (userRole && userRole.trim()) {
|
|
200
|
+
principals.push({ principalType: PrincipalType.ROLE, principalId: userRole });
|
|
201
|
+
}
|
|
202
|
+
const userGroups = await getUserGroups(userId, session);
|
|
203
|
+
if (userGroups && userGroups.length > 0) {
|
|
204
|
+
userGroups.forEach((group) => {
|
|
205
|
+
principals.push({ principalType: PrincipalType.GROUP, principalId: group._id });
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
principals.push({ principalType: PrincipalType.PUBLIC });
|
|
209
|
+
return principals;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Sync a user's Entra ID group memberships
|
|
213
|
+
* @param userId - The user ID
|
|
214
|
+
* @param entraGroups - Array of Entra groups with id and name
|
|
215
|
+
* @param session - Optional MongoDB session for transactions
|
|
216
|
+
* @returns The updated user with new group memberships
|
|
217
|
+
*/
|
|
218
|
+
async function syncUserEntraGroups(userId, entraGroups, session) {
|
|
219
|
+
var _a;
|
|
220
|
+
const User = mongoose.models.User;
|
|
221
|
+
const Group = mongoose.models.Group;
|
|
222
|
+
const query = User.findById(userId, { idOnTheSource: 1 });
|
|
223
|
+
if (session) {
|
|
224
|
+
query.session(session);
|
|
225
|
+
}
|
|
226
|
+
const user = (await query.lean());
|
|
227
|
+
if (!user) {
|
|
228
|
+
throw new Error(`User not found: ${userId}`);
|
|
229
|
+
}
|
|
230
|
+
/** Get user's idOnTheSource for storing in group.memberIds */
|
|
231
|
+
const userIdOnTheSource = user.idOnTheSource || userId.toString();
|
|
232
|
+
const entraIdMap = new Map();
|
|
233
|
+
const addedGroups = [];
|
|
234
|
+
const removedGroups = [];
|
|
235
|
+
for (const entraGroup of entraGroups) {
|
|
236
|
+
entraIdMap.set(entraGroup.id, true);
|
|
237
|
+
let group = await findGroupByExternalId(entraGroup.id, 'entra', {}, session);
|
|
238
|
+
if (!group) {
|
|
239
|
+
group = await createGroup({
|
|
240
|
+
name: entraGroup.name,
|
|
241
|
+
description: entraGroup.description,
|
|
242
|
+
email: entraGroup.email,
|
|
243
|
+
idOnTheSource: entraGroup.id,
|
|
244
|
+
source: 'entra',
|
|
245
|
+
memberIds: [userIdOnTheSource],
|
|
246
|
+
}, session);
|
|
247
|
+
addedGroups.push(group);
|
|
248
|
+
}
|
|
249
|
+
else if (!((_a = group.memberIds) === null || _a === void 0 ? void 0 : _a.includes(userIdOnTheSource))) {
|
|
250
|
+
const { group: updatedGroup } = await addUserToGroup(userId, group._id, session);
|
|
251
|
+
if (updatedGroup) {
|
|
252
|
+
addedGroups.push(updatedGroup);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const groupsQuery = Group.find({ source: 'entra', memberIds: userIdOnTheSource }, { _id: 1, idOnTheSource: 1 });
|
|
257
|
+
if (session) {
|
|
258
|
+
groupsQuery.session(session);
|
|
259
|
+
}
|
|
260
|
+
const existingGroups = (await groupsQuery.lean());
|
|
261
|
+
for (const group of existingGroups) {
|
|
262
|
+
if (group.idOnTheSource && !entraIdMap.has(group.idOnTheSource)) {
|
|
263
|
+
const { group: removedGroup } = await removeUserFromGroup(userId, group._id, session);
|
|
264
|
+
if (removedGroup) {
|
|
265
|
+
removedGroups.push(removedGroup);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const userQuery = User.findById(userId);
|
|
270
|
+
if (session) {
|
|
271
|
+
userQuery.session(session);
|
|
272
|
+
}
|
|
273
|
+
const updatedUser = await userQuery.lean();
|
|
274
|
+
if (!updatedUser) {
|
|
275
|
+
throw new Error(`User not found after update: ${userId}`);
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
user: updatedUser,
|
|
279
|
+
addedGroups,
|
|
280
|
+
removedGroups,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Calculate relevance score for a search result
|
|
285
|
+
* @param item - The search result item
|
|
286
|
+
* @param searchPattern - The search pattern
|
|
287
|
+
* @returns Relevance score (0-100)
|
|
288
|
+
*/
|
|
289
|
+
function calculateRelevanceScore(item, searchPattern) {
|
|
290
|
+
const exactRegex = new RegExp(`^${searchPattern}$`, 'i');
|
|
291
|
+
const startsWithPattern = searchPattern.toLowerCase();
|
|
292
|
+
/** Get searchable text based on type */
|
|
293
|
+
const searchableFields = item.type === PrincipalType.USER
|
|
294
|
+
? [item.name, item.email, item.username].filter(Boolean)
|
|
295
|
+
: [item.name, item.email, item.description].filter(Boolean);
|
|
296
|
+
let maxScore = 0;
|
|
297
|
+
for (const field of searchableFields) {
|
|
298
|
+
if (!field)
|
|
299
|
+
continue;
|
|
300
|
+
const fieldLower = field.toLowerCase();
|
|
301
|
+
let score = 0;
|
|
302
|
+
/** Exact match gets highest score */
|
|
303
|
+
if (exactRegex.test(field)) {
|
|
304
|
+
score = 100;
|
|
305
|
+
}
|
|
306
|
+
else if (fieldLower.startsWith(startsWithPattern)) {
|
|
307
|
+
/** Starts with query gets high score */
|
|
308
|
+
score = 80;
|
|
309
|
+
}
|
|
310
|
+
else if (fieldLower.includes(startsWithPattern)) {
|
|
311
|
+
/** Contains query gets medium score */
|
|
312
|
+
score = 50;
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
/** Default score for regex match */
|
|
316
|
+
score = 10;
|
|
317
|
+
}
|
|
318
|
+
maxScore = Math.max(maxScore, score);
|
|
319
|
+
}
|
|
320
|
+
return maxScore;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Sort principals by relevance score and type priority
|
|
324
|
+
* @param results - Array of results with _searchScore property
|
|
325
|
+
* @returns Sorted array
|
|
326
|
+
*/
|
|
327
|
+
function sortPrincipalsByRelevance(results) {
|
|
328
|
+
return results.sort((a, b) => {
|
|
329
|
+
if (b._searchScore !== a._searchScore) {
|
|
330
|
+
return (b._searchScore || 0) - (a._searchScore || 0);
|
|
331
|
+
}
|
|
332
|
+
if (a.type !== b.type) {
|
|
333
|
+
return a.type === PrincipalType.USER ? -1 : 1;
|
|
334
|
+
}
|
|
335
|
+
const aName = a.name || a.email || '';
|
|
336
|
+
const bName = b.name || b.email || '';
|
|
337
|
+
return aName.localeCompare(bName);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Transform user object to TPrincipalSearchResult format
|
|
342
|
+
* @param user - User object from database
|
|
343
|
+
* @returns Transformed user result
|
|
344
|
+
*/
|
|
345
|
+
function transformUserToTPrincipalSearchResult(user) {
|
|
346
|
+
return {
|
|
347
|
+
id: user.id,
|
|
348
|
+
type: PrincipalType.USER,
|
|
349
|
+
name: user.name || user.email,
|
|
350
|
+
email: user.email,
|
|
351
|
+
username: user.username,
|
|
352
|
+
avatar: user.avatar,
|
|
353
|
+
provider: user.provider,
|
|
354
|
+
source: 'local',
|
|
355
|
+
idOnTheSource: user.idOnTheSource || user.id,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Transform group object to TPrincipalSearchResult format
|
|
360
|
+
* @param group - Group object from database
|
|
361
|
+
* @returns Transformed group result
|
|
362
|
+
*/
|
|
363
|
+
function transformGroupToTPrincipalSearchResult(group) {
|
|
364
|
+
var _a, _b;
|
|
365
|
+
return {
|
|
366
|
+
id: (_a = group._id) === null || _a === void 0 ? void 0 : _a.toString(),
|
|
367
|
+
type: PrincipalType.GROUP,
|
|
368
|
+
name: group.name,
|
|
369
|
+
email: group.email,
|
|
370
|
+
avatar: group.avatar,
|
|
371
|
+
description: group.description,
|
|
372
|
+
source: group.source || 'local',
|
|
373
|
+
memberCount: group.memberIds ? group.memberIds.length : 0,
|
|
374
|
+
idOnTheSource: group.idOnTheSource || ((_b = group._id) === null || _b === void 0 ? void 0 : _b.toString()),
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Search for principals (users and groups) by pattern matching on name/email
|
|
379
|
+
* Returns combined results in TPrincipalSearchResult format without sorting
|
|
380
|
+
* @param searchPattern - The pattern to search for
|
|
381
|
+
* @param limitPerType - Maximum number of results to return
|
|
382
|
+
* @param typeFilter - Optional array of types to filter by, or null for all types
|
|
383
|
+
* @param session - Optional MongoDB session for transactions
|
|
384
|
+
* @returns Array of principals in TPrincipalSearchResult format
|
|
385
|
+
*/
|
|
386
|
+
async function searchPrincipals(searchPattern, limitPerType = 10, typeFilter = null, session) {
|
|
387
|
+
if (!searchPattern || searchPattern.trim().length === 0) {
|
|
388
|
+
return [];
|
|
389
|
+
}
|
|
390
|
+
const trimmedPattern = searchPattern.trim();
|
|
391
|
+
const promises = [];
|
|
392
|
+
if (!typeFilter || typeFilter.includes(PrincipalType.USER)) {
|
|
393
|
+
/** Note: searchUsers is imported from ~/models and needs to be passed in or implemented */
|
|
394
|
+
const userFields = 'name email username avatar provider idOnTheSource';
|
|
395
|
+
/** For now, we'll use a direct query instead of searchUsers */
|
|
396
|
+
const User = mongoose.models.User;
|
|
397
|
+
const regex = new RegExp(trimmedPattern, 'i');
|
|
398
|
+
const userQuery = User.find({
|
|
399
|
+
$or: [{ name: regex }, { email: regex }, { username: regex }],
|
|
400
|
+
})
|
|
401
|
+
.select(userFields)
|
|
402
|
+
.limit(limitPerType);
|
|
403
|
+
if (session) {
|
|
404
|
+
userQuery.session(session);
|
|
405
|
+
}
|
|
406
|
+
promises.push(userQuery.lean().then((users) => users.map((user) => {
|
|
407
|
+
var _a;
|
|
408
|
+
const userWithId = user;
|
|
409
|
+
return transformUserToTPrincipalSearchResult({
|
|
410
|
+
id: ((_a = userWithId._id) === null || _a === void 0 ? void 0 : _a.toString()) || '',
|
|
411
|
+
name: userWithId.name,
|
|
412
|
+
email: userWithId.email,
|
|
413
|
+
username: userWithId.username,
|
|
414
|
+
avatar: userWithId.avatar,
|
|
415
|
+
provider: userWithId.provider,
|
|
416
|
+
});
|
|
417
|
+
})));
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
promises.push(Promise.resolve([]));
|
|
421
|
+
}
|
|
422
|
+
if (!typeFilter || typeFilter.includes(PrincipalType.GROUP)) {
|
|
423
|
+
promises.push(findGroupsByNamePattern(trimmedPattern, null, limitPerType, session).then((groups) => groups.map(transformGroupToTPrincipalSearchResult)));
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
promises.push(Promise.resolve([]));
|
|
427
|
+
}
|
|
428
|
+
if (!typeFilter || typeFilter.includes(PrincipalType.ROLE)) {
|
|
429
|
+
const Role = mongoose.models.Role;
|
|
430
|
+
if (Role) {
|
|
431
|
+
const regex = new RegExp(trimmedPattern, 'i');
|
|
432
|
+
const roleQuery = Role.find({ name: regex }).select('name').limit(limitPerType);
|
|
433
|
+
if (session) {
|
|
434
|
+
roleQuery.session(session);
|
|
435
|
+
}
|
|
436
|
+
promises.push(roleQuery.lean().then((roles) => roles.map((role) => ({
|
|
437
|
+
/** Role name as ID */
|
|
438
|
+
id: role.name,
|
|
439
|
+
type: PrincipalType.ROLE,
|
|
440
|
+
name: role.name,
|
|
441
|
+
source: 'local',
|
|
442
|
+
idOnTheSource: role.name,
|
|
443
|
+
}))));
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
promises.push(Promise.resolve([]));
|
|
448
|
+
}
|
|
449
|
+
const results = await Promise.all(promises);
|
|
450
|
+
const combined = results.flat();
|
|
451
|
+
return combined;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Removes a user from all groups they belong to.
|
|
455
|
+
* @param userId - The user ID (or ObjectId) of the member to remove
|
|
456
|
+
*/
|
|
457
|
+
async function removeUserFromAllGroups(userId) {
|
|
458
|
+
const Group = mongoose.models.Group;
|
|
459
|
+
await Group.updateMany({ memberIds: userId }, { $pullAll: { memberIds: [userId] } });
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Finds a single group matching the given filter.
|
|
463
|
+
* @param filter - MongoDB filter query
|
|
464
|
+
*/
|
|
465
|
+
async function findGroupByQuery(filter, session) {
|
|
466
|
+
const Group = mongoose.models.Group;
|
|
467
|
+
const query = Group.findOne(filter);
|
|
468
|
+
if (session) {
|
|
469
|
+
query.session(session);
|
|
470
|
+
}
|
|
471
|
+
return query.lean();
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Updates a group by its ID.
|
|
475
|
+
* @param groupId - The group's ObjectId
|
|
476
|
+
* @param data - Fields to set via $set
|
|
477
|
+
*/
|
|
478
|
+
async function updateGroupById(groupId, data, session) {
|
|
479
|
+
const Group = mongoose.models.Group;
|
|
480
|
+
const options = { new: true, ...(session ? { session } : {}) };
|
|
481
|
+
return Group.findByIdAndUpdate(groupId, { $set: data }, options).lean();
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Bulk-updates groups matching a filter.
|
|
485
|
+
* @param filter - MongoDB filter query
|
|
486
|
+
* @param update - Update operations
|
|
487
|
+
* @param options - Optional query options (e.g., { session })
|
|
488
|
+
*/
|
|
489
|
+
async function bulkUpdateGroups(filter, update, options) {
|
|
490
|
+
const Group = mongoose.models.Group;
|
|
491
|
+
return Group.updateMany(filter, update, options || {});
|
|
492
|
+
}
|
|
493
|
+
return {
|
|
494
|
+
findGroupById,
|
|
495
|
+
findGroupByExternalId,
|
|
496
|
+
findGroupsByNamePattern,
|
|
497
|
+
findGroupsByMemberId,
|
|
498
|
+
createGroup,
|
|
499
|
+
upsertGroupByExternalId,
|
|
500
|
+
addUserToGroup,
|
|
501
|
+
removeUserFromGroup,
|
|
502
|
+
removeUserFromAllGroups,
|
|
503
|
+
findGroupByQuery,
|
|
504
|
+
updateGroupById,
|
|
505
|
+
bulkUpdateGroups,
|
|
506
|
+
getUserGroups,
|
|
507
|
+
getUserPrincipals,
|
|
508
|
+
syncUserEntraGroups,
|
|
509
|
+
searchPrincipals,
|
|
510
|
+
calculateRelevanceScore,
|
|
511
|
+
sortPrincipalsByRelevance,
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
export { createUserGroupMethods };
|
|
516
|
+
//# sourceMappingURL=userGroup.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userGroup.es.js","sources":["../../src/methods/userGroup.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var winston = require('../config/winston.cjs');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Indexes that were superseded by compound tenant-scoped indexes.
|
|
7
|
+
* Each entry maps a collection name to the old index names that must be dropped
|
|
8
|
+
* before multi-tenancy can function (old unique indexes enforce global uniqueness,
|
|
9
|
+
* blocking same-value-different-tenant writes).
|
|
10
|
+
*
|
|
11
|
+
* These are only the indexes whose uniqueness constraints conflict with multi-tenancy.
|
|
12
|
+
* Non-unique indexes that were extended with tenantId are harmless (queries still work,
|
|
13
|
+
* just with slightly less optimal plans) and are not included here.
|
|
14
|
+
*/
|
|
15
|
+
const SUPERSEDED_INDEXES = {
|
|
16
|
+
users: [
|
|
17
|
+
'email_1',
|
|
18
|
+
'googleId_1',
|
|
19
|
+
'facebookId_1',
|
|
20
|
+
'openidId_1',
|
|
21
|
+
'samlId_1',
|
|
22
|
+
'ldapId_1',
|
|
23
|
+
'githubId_1',
|
|
24
|
+
'discordId_1',
|
|
25
|
+
'appleId_1',
|
|
26
|
+
],
|
|
27
|
+
roles: ['name_1'],
|
|
28
|
+
conversations: ['conversationId_1_user_1'],
|
|
29
|
+
messages: ['messageId_1_user_1'],
|
|
30
|
+
agentcategories: ['value_1'],
|
|
31
|
+
accessroles: ['accessRoleId_1'],
|
|
32
|
+
conversationtags: ['tag_1_user_1'],
|
|
33
|
+
mcpservers: ['serverName_1'],
|
|
34
|
+
files: ['filename_1_conversationId_1_context_1'],
|
|
35
|
+
groups: ['idOnTheSource_1_source_1'],
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Drops superseded unique indexes that block multi-tenant operation.
|
|
39
|
+
* Idempotent — skips indexes that don't exist. Safe to run on fresh databases.
|
|
40
|
+
*
|
|
41
|
+
* Call this before enabling multi-tenant middleware on an existing deployment.
|
|
42
|
+
* On a fresh database (no pre-existing data), this is a no-op.
|
|
43
|
+
*/
|
|
44
|
+
async function dropSupersededTenantIndexes(connection) {
|
|
45
|
+
const result = { dropped: [], skipped: [], errors: [] };
|
|
46
|
+
for (const [collectionName, indexNames] of Object.entries(SUPERSEDED_INDEXES)) {
|
|
47
|
+
const collection = connection.db.collection(collectionName);
|
|
48
|
+
let existingIndexes;
|
|
49
|
+
try {
|
|
50
|
+
existingIndexes = await collection.indexes();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
result.skipped.push(...indexNames.map((idx) => `${collectionName}.${idx} (collection does not exist)`));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const existingNames = new Set(existingIndexes.map((idx) => idx.name));
|
|
57
|
+
for (const indexName of indexNames) {
|
|
58
|
+
if (!existingNames.has(indexName)) {
|
|
59
|
+
result.skipped.push(`${collectionName}.${indexName}`);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await collection.dropIndex(indexName);
|
|
64
|
+
result.dropped.push(`${collectionName}.${indexName}`);
|
|
65
|
+
winston.info(`[TenantMigration] Dropped superseded index: ${collectionName}.${indexName}`);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const msg = `${collectionName}.${indexName}: ${err.message}`;
|
|
69
|
+
result.errors.push(msg);
|
|
70
|
+
winston.error(`[TenantMigration] Failed to drop index: ${msg}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (result.dropped.length > 0) {
|
|
75
|
+
winston.info(`[TenantMigration] Migration complete. Dropped ${result.dropped.length} superseded indexes.`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
winston.info('[TenantMigration] No superseded indexes found — database is already migrated or fresh.');
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
exports.SUPERSEDED_INDEXES = SUPERSEDED_INDEXES;
|
|
84
|
+
exports.dropSupersededTenantIndexes = dropSupersededTenantIndexes;
|
|
85
|
+
//# sourceMappingURL=tenantIndexes.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenantIndexes.cjs","sources":["../../src/migrations/tenantIndexes.ts"],"sourcesContent":[null],"names":["logger"],"mappings":";;;;AAGA;;;;;;;;;AASG;AACH,MAAM,kBAAkB,GAA6B;AACnD,IAAA,KAAK,EAAE;QACL,SAAS;QACT,YAAY;QACZ,cAAc;QACd,YAAY;QACZ,UAAU;QACV,UAAU;QACV,YAAY;QACZ,aAAa;QACb,WAAW;AACZ,KAAA;IACD,KAAK,EAAE,CAAC,QAAQ,CAAC;IACjB,aAAa,EAAE,CAAC,yBAAyB,CAAC;IAC1C,QAAQ,EAAE,CAAC,oBAAoB,CAAC;IAChC,eAAe,EAAE,CAAC,SAAS,CAAC;IAC5B,WAAW,EAAE,CAAC,gBAAgB,CAAC;IAC/B,gBAAgB,EAAE,CAAC,cAAc,CAAC;IAClC,UAAU,EAAE,CAAC,cAAc,CAAC;IAC5B,KAAK,EAAE,CAAC,uCAAuC,CAAC;IAChD,MAAM,EAAE,CAAC,0BAA0B,CAAC;;AAStC;;;;;;AAMG;AACI,eAAe,2BAA2B,CAC/C,UAAsB,EAAA;AAEtB,IAAA,MAAM,MAAM,GAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;AAExE,IAAA,KAAK,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;QAC7E,MAAM,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;AAE3D,QAAA,IAAI,eAAyC;AAC7C,QAAA,IAAI;AACF,YAAA,eAAe,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE;QAC9C;AAAE,QAAA,MAAM;YACN,MAAM,CAAC,OAAO,CAAC,IAAI,CACjB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,EAAG,cAAc,IAAI,GAAG,CAAA,4BAAA,CAA8B,CAAC,CACnF;YACD;QACF;AAEA,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;AAErE,QAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBACjC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAC;gBACrD;YACF;AAEA,YAAA,IAAI;AACF,gBAAA,MAAM,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC;gBACrC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAC;gBACrDA,OAAM,CAAC,IAAI,CAAC,CAAA,4CAAA,EAA+C,cAAc,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAC;YAC3F;YAAE,OAAO,GAAG,EAAE;gBACZ,MAAM,GAAG,GAAG,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAM,GAAa,CAAC,OAAO,CAAA,CAAE;AACvE,gBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AACvB,gBAAAA,OAAM,CAAC,KAAK,CAAC,2CAA2C,GAAG,CAAA,CAAE,CAAC;YAChE;QACF;IACF;IAEA,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QAC7BA,OAAM,CAAC,IAAI,CACT,CAAA,8CAAA,EAAiD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAA,oBAAA,CAAsB,CAC7F;IACH;SAAO;AACL,QAAAA,OAAM,CAAC,IAAI,CACT,wFAAwF,CACzF;IACH;AAEA,IAAA,OAAO,MAAM;AACf;;;;;"}
|