🗂️ feat: Add Deployment Skill Directory (#13523)
Some checks are pending
Docker Dev Branch Images Build / build (Dockerfile, lc-dev, node) (push) Waiting to run
Docker Dev Branch Images Build / build (Dockerfile.multi, lc-dev-api, api-build) (push) Waiting to run
GitNexus Index / index (push) Waiting to run
GitNexus Index / post-index (push) Blocked by required conditions

* feat: Add deployment skill directory

* chore: Address deployment skill review feedback

* fix: Include deployment skill file metadata

* test: Add deployment skills e2e smoke test
This commit is contained in:
Danny Avila 2026-06-05 10:24:28 -04:00 • committed by GitHub
parent 6357ea10c1
commit 2c8d54e18c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 1836 additions and 69 deletions

View file

@ -1,6 +1,7 @@
const { ResourceType } = require('librechat-data-provider');
const { ResourceType, PermissionBits } = require('librechat-data-provider');
const { canAccessResource } = require('./canAccessResource');
const { getSkillById } = require('~/models');
const { getDeploymentSkillById } = require('@librechat/api');
/**
* Skill-specific middleware factory that checks skill access permissions.
@ -19,12 +20,35 @@ const canAccessSkillResource = (options) => {
throw new Error('canAccessSkillResource: requiredPermission is required and must be a number');
}
return canAccessResource({
const aclMiddleware = canAccessResource({
resourceType: ResourceType.SKILL,
requiredPermission,
resourceIdParam,
idResolver: getSkillById,
});
return (req, res, next) => {
const rawResourceId = req.params[resourceIdParam];
const deploymentSkill = rawResourceId ? getDeploymentSkillById(rawResourceId) : null;
if (!deploymentSkill) {
return aclMiddleware(req, res, next);
}
if (requiredPermission !== PermissionBits.VIEW) {
return res.status(403).json({
error: 'Forbidden',
message: 'Deployment skills are read-only',
});
}
req.resourceAccess = {
resourceType: ResourceType.SKILL,
resourceId: deploymentSkill._id,
customResourceId: rawResourceId,
permission: requiredPermission,
userId: req.user?.id,
resourceInfo: deploymentSkill,
};
return next();
};
};
module.exports = {