@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;