From 150361273f823a9d58b6ddc23f20ac30f5202442 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Sat, 21 Mar 2026 14:30:46 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=BD=20chore:=20Resolve=20TypeScript=20?= =?UTF-8?q?errors=20and=20test=20failures=20in=20agent/prompt=20deletion?= =?UTF-8?q?=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Type AclEntry model as Model instead of Model in deleteUserAgents and deleteUserPrompts, wire getSoleOwnedResourceIds into agent.spec.ts via createAclEntryMethods, replace permissionService calls with direct AclEntry.create, and add missing principalModel field. --- .../data-schemas/src/methods/agent.spec.ts | 69 ++++++++++++++----- packages/data-schemas/src/methods/agent.ts | 10 ++- packages/data-schemas/src/methods/prompt.ts | 14 ++-- 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/packages/data-schemas/src/methods/agent.spec.ts b/packages/data-schemas/src/methods/agent.spec.ts index f828c8c325..3184f51fa1 100644 --- a/packages/data-schemas/src/methods/agent.spec.ts +++ b/packages/data-schemas/src/methods/agent.spec.ts @@ -17,6 +17,7 @@ import type { } from 'mongoose'; import type { IAgent, IAclEntry, IUser, IAccessRole } from '..'; import { createAgentMethods, type AgentMethods } from './agent'; +import { createAclEntryMethods } from './aclEntry'; import { createModels } from '~/models'; /** Version snapshot stored in `IAgent.versions[]`. Extends the base omit with runtime-only fields. */ @@ -76,7 +77,14 @@ beforeAll(async () => { await AclEntry.deleteMany({ resourceType, resourceId }); }; - methods = createAgentMethods(mongoose, { removeAllPermissions, getActions }); + const aclEntryMethods = createAclEntryMethods(mongoose); + const { getSoleOwnedResourceIds } = aclEntryMethods; + + methods = createAgentMethods(mongoose, { + removeAllPermissions, + getActions, + getSoleOwnedResourceIds, + }); createAgent = methods.createAgent; getAgent = methods.getAgent; updateAgent = methods.updateAgent; @@ -932,21 +940,27 @@ describe('Agent Methods', () => { author: otherAuthorId, }); - await permissionService.grantPermission({ + const ownerBits = + PermissionBits.VIEW | PermissionBits.EDIT | PermissionBits.DELETE | PermissionBits.SHARE; + await AclEntry.create({ principalType: PrincipalType.USER, principalId: authorId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: agent1._id, - accessRoleId: AccessRoleIds.AGENT_OWNER, + permBits: ownerBits, grantedBy: authorId, + grantedAt: new Date(), }); - await permissionService.grantPermission({ + await AclEntry.create({ principalType: PrincipalType.USER, principalId: authorId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: agent2._id, - accessRoleId: AccessRoleIds.AGENT_OWNER, + permBits: ownerBits, grantedBy: authorId, + grantedAt: new Date(), }); await User.create({ @@ -1016,21 +1030,27 @@ describe('Agent Methods', () => { author: authorId, }); - await permissionService.grantPermission({ + const ownerBits = + PermissionBits.VIEW | PermissionBits.EDIT | PermissionBits.DELETE | PermissionBits.SHARE; + await AclEntry.create({ principalType: PrincipalType.USER, principalId: authorId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: agent1._id, - accessRoleId: AccessRoleIds.AGENT_OWNER, + permBits: ownerBits, grantedBy: authorId, + grantedAt: new Date(), }); - await permissionService.grantPermission({ + await AclEntry.create({ principalType: PrincipalType.USER, principalId: authorId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: agent2._id, - accessRoleId: AccessRoleIds.AGENT_OWNER, + permBits: ownerBits, grantedBy: authorId, + grantedAt: new Date(), }); await User.create({ @@ -1096,13 +1116,17 @@ describe('Agent Methods', () => { author: otherAuthorId, }); - await permissionService.grantPermission({ + const ownerBits = + PermissionBits.VIEW | PermissionBits.EDIT | PermissionBits.DELETE | PermissionBits.SHARE; + await AclEntry.create({ principalType: PrincipalType.USER, principalId: otherAuthorId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: existingAgent._id, - accessRoleId: AccessRoleIds.AGENT_OWNER, + permBits: ownerBits, grantedBy: otherAuthorId, + grantedAt: new Date(), }); await User.create({ @@ -1150,21 +1174,27 @@ describe('Agent Methods', () => { author: authorId, }); - await permissionService.grantPermission({ + const ownerBits = + PermissionBits.VIEW | PermissionBits.EDIT | PermissionBits.DELETE | PermissionBits.SHARE; + await AclEntry.create({ principalType: PrincipalType.USER, principalId: authorId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: agent1._id, - accessRoleId: AccessRoleIds.AGENT_OWNER, + permBits: ownerBits, grantedBy: authorId, + grantedAt: new Date(), }); - await permissionService.grantPermission({ + await AclEntry.create({ principalType: PrincipalType.USER, principalId: authorId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: agent2._id, - accessRoleId: AccessRoleIds.AGENT_OWNER, + permBits: ownerBits, grantedBy: authorId, + grantedAt: new Date(), }); await User.create({ @@ -1216,24 +1246,27 @@ describe('Agent Methods', () => { await AclEntry.create({ principalType: PrincipalType.USER, principalId: deletingUserId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: (soleAgent as unknown as { _id: mongoose.Types.ObjectId })._id, - permBits: PermissionBits.DELETE | PermissionBits.READ | PermissionBits.WRITE, + permBits: PermissionBits.DELETE | PermissionBits.VIEW | PermissionBits.EDIT, }); await AclEntry.create({ principalType: PrincipalType.USER, principalId: deletingUserId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: (multiAgent as unknown as { _id: mongoose.Types.ObjectId })._id, - permBits: PermissionBits.DELETE | PermissionBits.READ | PermissionBits.WRITE, + permBits: PermissionBits.DELETE | PermissionBits.VIEW | PermissionBits.EDIT, }); await AclEntry.create({ principalType: PrincipalType.USER, principalId: otherOwnerId, + principalModel: PrincipalModel.USER, resourceType: ResourceType.AGENT, resourceId: (multiAgent as unknown as { _id: mongoose.Types.ObjectId })._id, - permBits: PermissionBits.DELETE | PermissionBits.READ | PermissionBits.WRITE, + permBits: PermissionBits.DELETE | PermissionBits.VIEW | PermissionBits.EDIT, }); await deleteUserAgents(deletingUserId.toString()); diff --git a/packages/data-schemas/src/methods/agent.ts b/packages/data-schemas/src/methods/agent.ts index 43147eaea9..f4371dd15c 100644 --- a/packages/data-schemas/src/methods/agent.ts +++ b/packages/data-schemas/src/methods/agent.ts @@ -1,8 +1,8 @@ import crypto from 'node:crypto'; -import type { FilterQuery, Model, Types } from 'mongoose'; import { Constants, ResourceType, actionDelimiter } from 'librechat-data-provider'; +import type { FilterQuery, Model, Types } from 'mongoose'; +import type { IAgent, IAclEntry } from '~/types'; import logger from '~/config/winston'; -import type { IAgent } from '~/types'; const { mcp_delimiter } = Constants; @@ -525,7 +525,7 @@ export function createAgentMethods(mongoose: typeof import('mongoose'), deps: Ag */ async function deleteUserAgents(userId: string): Promise { const Agent = mongoose.models.Agent as Model; - const AclEntry = mongoose.models.AclEntry as Model; + const AclEntry = mongoose.models.AclEntry as Model; const User = mongoose.models.User as Model; try { @@ -546,9 +546,7 @@ export function createAgentMethods(mongoose: typeof import('mongoose'), deps: Ag .select('resourceId') .lean() : []; - const migratedIds = new Set( - (migratedEntries as Array<{ resourceId: Types.ObjectId }>).map((e) => e.resourceId.toString()), - ); + const migratedIds = new Set(migratedEntries.map((e) => e.resourceId.toString())); const legacyAgents = authoredAgents.filter((a) => !migratedIds.has(a._id.toString())); const soleOwnedAgents = diff --git a/packages/data-schemas/src/methods/prompt.ts b/packages/data-schemas/src/methods/prompt.ts index 4edfc9f408..8fa8fd1a53 100644 --- a/packages/data-schemas/src/methods/prompt.ts +++ b/packages/data-schemas/src/methods/prompt.ts @@ -1,6 +1,6 @@ -import type { Model, Types } from 'mongoose'; import { ResourceType, SystemCategories } from 'librechat-data-provider'; -import type { IPrompt, IPromptGroup, IPromptGroupDocument } from '~/types'; +import type { Model, Types } from 'mongoose'; +import type { IAclEntry, IPrompt, IPromptGroup, IPromptGroupDocument } from '~/types'; import { escapeRegExp } from '~/utils/string'; import logger from '~/config/winston'; @@ -544,7 +544,7 @@ export function createPromptMethods(mongoose: typeof import('mongoose'), deps: P try { const PromptGroup = mongoose.models.PromptGroup as Model; const Prompt = mongoose.models.Prompt as Model; - const AclEntry = mongoose.models.AclEntry; + const AclEntry = mongoose.models.AclEntry as Model; const userObjectId = new ObjectId(userId); const soleOwnedIds = await getSoleOwnedResourceIds(userObjectId, ResourceType.PROMPTGROUP); @@ -561,12 +561,8 @@ export function createPromptMethods(mongoose: typeof import('mongoose'), deps: P .select('resourceId') .lean() : []; - const migratedIds = new Set( - (migratedEntries as Array<{ resourceId: Types.ObjectId }>).map((e) => e.resourceId.toString()), - ); - const legacyGroupIds = authoredGroupIds.filter( - (id) => !migratedIds.has(id.toString()), - ); + const migratedIds = new Set(migratedEntries.map((e) => e.resourceId.toString())); + const legacyGroupIds = authoredGroupIds.filter((id) => !migratedIds.has(id.toString())); const allGroupIdsToDelete = [...soleOwnedIds, ...legacyGroupIds];