@forge/manifest

12.6.0-next.112.6.0-next.2
out/validators/agent-product-context-scopes-validator.js
+out/validators/agent-product-context-scopes-validator.jsNew file
+62
Index: package/out/validators/agent-product-context-scopes-validator.js
===================================================================
--- package/out/validators/agent-product-context-scopes-validator.js
+++ package/out/validators/agent-product-context-scopes-validator.js
@@ -0,0 +1,62 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AgentProductContextScopesValidator = exports.validateAgentProductContextScopes = void 0;
+const types_1 = require("../types");
+const text_1 = require("../text");
+const utils_1 = require("../utils");
+const scopes_1 = require("../scopes");
+async function validateAgentProductContextScopes(productContext, scopes, config) {
+    const emptyRequiredScopes = { current: [] };
+    const requiredScopes = config.mapping.find((entry) => entry.productContext === productContext)?.oAuthScopes || emptyRequiredScopes;
+    const missingScopes = await (0, scopes_1.getMissingScopes)(scopes, requiredScopes);
+    return { requiredScopes, missingScopes };
+}
+exports.validateAgentProductContextScopes = validateAgentProductContextScopes;
+class AgentProductContextScopesValidator {
+    config;
+    constructor(config) {
+        this.config = config;
+    }
+    async validate(manifest) {
+        if (!manifest || !manifest.typedContent) {
+            return {
+                success: false,
+                manifestObject: manifest
+            };
+        }
+        const validationErrors = [];
+        const addValidationError = (scope, agentKey, productContexts) => {
+            validationErrors.push({
+                message: text_1.errors.permissions.missingPermissionFromAgentProductContext(scope, agentKey, productContexts),
+                reference: text_1.References.MissingScopes,
+                level: 'error',
+                metadata: {
+                    missingPermission: scope
+                },
+                ...(0, utils_1.findPosition)('scopes', manifest.yamlContentByLine)
+            });
+        };
+        const rovoAgents = manifest.typedContent.modules?.[types_1.AllModuleTypes.RovoAgentConnector];
+        if (!rovoAgents || !rovoAgents.length) {
+            return {
+                success: true,
+                manifestObject: manifest
+            };
+        }
+        const manifestScopes = manifest.typedContent.permissions?.scopes || [];
+        for (const agent of rovoAgents) {
+            if (!agent.productContexts || !agent.productContexts.length)
+                continue;
+            for (const productContext of agent.productContexts) {
+                const { missingScopes } = await validateAgentProductContextScopes(productContext, manifestScopes, this.config);
+                missingScopes.forEach((scope) => addValidationError(scope, agent.key, agent.productContexts));
+            }
+        }
+        return {
+            success: validationErrors.length === 0,
+            manifestObject: manifest,
+            errors: validationErrors
+        };
+    }
+}
+exports.AgentProductContextScopesValidator = AgentProductContextScopesValidator;