From 8e7e116c0c49df287bfd6903e61c16bde3c333e4 Mon Sep 17 00:00:00 2001 From: Ravi Verma Date: Sun, 29 Mar 2026 13:11:16 +0530 Subject: [PATCH 1/5] feat: add read-only admin support to access control Introduce hasAdminReadAccess() to allow read-only admin tokens to access GET/read endpoints while keeping hasAdminAccess() as the write-only guard. Wire readOnlyAdminWrapper into the middleware chain, move API key routes to INTERNAL_ROUTES, and reclassify sheet-data POST routes to site:read. Co-Authored-By: Claude Sonnet 4.6 --- src/controllers/audits.js | 2 +- src/controllers/configuration.js | 4 +- src/controllers/organizations.js | 4 +- src/controllers/plg/plg-onboarding.js | 2 +- src/controllers/project.js | 2 +- src/controllers/sites.js | 10 +-- src/controllers/user-details.js | 2 +- src/index.js | 3 + src/routes/required-capabilities.js | 16 ++--- src/support/access-control-util.js | 8 ++- test/controllers/plg/plg-onboarding.test.js | 4 +- test/controllers/user-details.test.js | 17 ++--- test/routes/required-capabilities.test.js | 35 +++++++++++ test/support/access-control-util.test.js | 69 +++++++++++++++++++++ 14 files changed, 145 insertions(+), 33 deletions(-) diff --git a/src/controllers/audits.js b/src/controllers/audits.js index 8bb4e8586..44ee201ff 100644 --- a/src/controllers/audits.js +++ b/src/controllers/audits.js @@ -96,7 +96,7 @@ function AuditsController(ctx) { return badRequest('Audit type required'); } - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Admin access required'); } diff --git a/src/controllers/configuration.js b/src/controllers/configuration.js index 2ad7a518b..550155e6d 100644 --- a/src/controllers/configuration.js +++ b/src/controllers/configuration.js @@ -57,7 +57,7 @@ function ConfigurationController(ctx) { * @return {Promise} Configuration response. */ const getByVersion = async (context) => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view configurations'); } const configurationVersion = context.params?.version; @@ -79,7 +79,7 @@ function ConfigurationController(ctx) { * @return {Promise} Configuration response. */ const getLatest = async () => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view configurations'); } const configuration = await Configuration.findLatest(); diff --git a/src/controllers/organizations.js b/src/controllers/organizations.js index 7b41770d7..8d55aac4f 100644 --- a/src/controllers/organizations.js +++ b/src/controllers/organizations.js @@ -84,7 +84,7 @@ function OrganizationsController(ctx, env) { * @returns {Promise} Array of organizations response. */ const getAll = async () => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view all Organizations'); } @@ -150,7 +150,7 @@ function OrganizationsController(ctx, env) { * @throws {Error} If IMS org ID is not provided, org not found, or Slack config not found. */ const getSlackConfigByImsOrgID = async (context) => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view Slack configurations'); } const response = await getByImsOrgID(context); diff --git a/src/controllers/plg/plg-onboarding.js b/src/controllers/plg/plg-onboarding.js index a4dce8ced..6fc977078 100644 --- a/src/controllers/plg/plg-onboarding.js +++ b/src/controllers/plg/plg-onboarding.js @@ -567,7 +567,7 @@ function PlgOnboardingController(ctx) { // Admin/API key holders can access any org's status const accessControlUtil = AccessControlUtil.fromContext(context); - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { // Non-admin: validate caller's IMS tenant matches requested imsOrgId const profile = authInfo.getProfile(); diff --git a/src/controllers/project.js b/src/controllers/project.js index b9912fbdb..ff605330b 100644 --- a/src/controllers/project.js +++ b/src/controllers/project.js @@ -77,7 +77,7 @@ function ProjectsController(ctx, env) { * @returns {Promise} Array of projects response. */ const getAll = async () => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view all projects'); } diff --git a/src/controllers/sites.js b/src/controllers/sites.js index d98f589e4..7cbb9e0e9 100755 --- a/src/controllers/sites.js +++ b/src/controllers/sites.js @@ -316,7 +316,7 @@ function SitesController(ctx, log, env) { * @returns {Promise} Array of sites response. */ const getAll = async () => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view all sites'); } @@ -341,7 +341,7 @@ function SitesController(ctx, log, env) { * @returns {Promise} Array of sites response. */ const getAllByDeliveryType = async (context) => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view all sites'); } const deliveryType = context.params?.deliveryType; @@ -365,7 +365,7 @@ function SitesController(ctx, log, env) { * @return {Promise} Array of sites response. */ const getAllWithLatestAudit = async (context) => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view all sites'); } const auditType = context.params?.auditType; @@ -391,7 +391,7 @@ function SitesController(ctx, log, env) { * @returns {Promise} XLS file. */ const getAllAsXLS = async () => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view all sites'); } const sites = await Site.all(); @@ -403,7 +403,7 @@ function SitesController(ctx, log, env) { * @returns {Promise} CSV file. */ const getAllAsCSV = async () => { - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { return forbidden('Only admins can view all sites'); } const sites = await Site.all(); diff --git a/src/controllers/user-details.js b/src/controllers/user-details.js index 858e5684d..51ba8b796 100644 --- a/src/controllers/user-details.js +++ b/src/controllers/user-details.js @@ -53,7 +53,7 @@ function UserDetailsController(ctx) { */ const fetchFromImsIfAdmin = async (externalUserId, organizationId) => { // Check if requestor has admin access - if (!accessControlUtil.hasAdminAccess()) { + if (!accessControlUtil.hasAdminReadAccess()) { log.debug(`User is not admin, returning system defaults for ${externalUserId}`); return { firstName: 'system', diff --git a/src/index.js b/src/index.js index a93cfaef0..a97e53a92 100644 --- a/src/index.js +++ b/src/index.js @@ -27,6 +27,7 @@ import { AdobeImsHandler, JwtHandler, s2sAuthWrapper, + readOnlyAdminWrapper, } from '@adobe/spacecat-shared-http-utils'; import AuthInfo from '@adobe/spacecat-shared-http-utils/src/auth/auth-info.js'; import { imsClientWrapper } from '@adobe/spacecat-shared-ims-client'; @@ -309,7 +310,9 @@ const { WORKSPACE_EXTERNAL } = SLACK_TARGETS; // Wrapper execution order (helix-shared-wrap: last .with() = outermost = runs first): // 1. s2sAuthWrapper — intercepts S2S JWT bearer tokens, passes through non-S2S to authWrapper // 2. authWrapper — handles JWT, IMS, scoped API key, legacy API key +// 3. readOnlyAdminWrapper — enforces read-only access for read-only admin tokens const wrappedMain = wrap(run) + .with(readOnlyAdminWrapper, { routeCapabilities: routeRequiredCapabilities }) .with(authWrapper, { authHandlers: [JwtHandler, AdobeImsHandler, ScopedApiKeyHandler, LegacyApiKeyHandler], }) diff --git a/src/routes/required-capabilities.js b/src/routes/required-capabilities.js index d66a7df76..2662b2663 100644 --- a/src/routes/required-capabilities.js +++ b/src/routes/required-capabilities.js @@ -101,6 +101,11 @@ export const INTERNAL_ROUTES = [ 'POST /consumers/register', 'PATCH /consumers/:consumerId', 'POST /consumers/:consumerId/revoke', + + // API Keys - scoped API key management; end-user/admin flow, not exposed to S2S consumers + 'POST /tools/api-keys', + 'DELETE /tools/api-keys/:id', + 'GET /tools/api-keys', ]; /** @@ -341,11 +346,6 @@ const routeRequiredCapabilities = { // Trigger — GET triggers side effect; consider POST for RFC 7231 semantics (follow-up) 'GET /trigger': 'audit:write', - // API Keys - 'POST /tools/api-keys': 'apiKey:write', - 'DELETE /tools/api-keys/:id': 'apiKey:write', - 'GET /tools/api-keys': 'apiKey:read', - // Import Jobs 'POST /tools/import/jobs': 'importJob:write', 'GET /tools/import/jobs/:jobId': 'importJob:read', @@ -384,9 +384,9 @@ const routeRequiredCapabilities = { 'GET /sites/:siteId/llmo/sheet-data/:dataSource': 'site:read', 'GET /sites/:siteId/llmo/sheet-data/:sheetType/:dataSource': 'site:read', 'GET /sites/:siteId/llmo/sheet-data/:sheetType/:week/:dataSource': 'site:read', - 'POST /sites/:siteId/llmo/sheet-data/:dataSource': 'site:write', - 'POST /sites/:siteId/llmo/sheet-data/:sheetType/:dataSource': 'site:write', - 'POST /sites/:siteId/llmo/sheet-data/:sheetType/:week/:dataSource': 'site:write', + 'POST /sites/:siteId/llmo/sheet-data/:dataSource': 'site:read', + 'POST /sites/:siteId/llmo/sheet-data/:sheetType/:dataSource': 'site:read', + 'POST /sites/:siteId/llmo/sheet-data/:sheetType/:week/:dataSource': 'site:read', 'GET /sites/:siteId/llmo/data': 'site:read', 'GET /sites/:siteId/llmo/data/:dataSource': 'site:read', 'GET /sites/:siteId/llmo/data/:sheetType/:dataSource': 'site:read', diff --git a/src/support/access-control-util.js b/src/support/access-control-util.js index 4c96621dd..14ca06b4d 100644 --- a/src/support/access-control-util.js +++ b/src/support/access-control-util.js @@ -91,6 +91,10 @@ export default class AccessControlUtil { return this.authInfo.isAdmin(); } + hasAdminReadAccess() { + return this.hasAdminAccess() || this.authInfo.isReadOnlyAdmin?.() === true; + } + hasS2SAdminAccess() { return this.authInfo.isS2SAdmin(); } @@ -151,8 +155,8 @@ export default class AccessControlUtil { } const { authInfo } = this; - // Check admin access first - admins bypass product code validation - if (this.hasAdminAccess()) { + // Check admin read access first - full and read-only admins bypass org/product validation + if (this.hasAdminReadAccess()) { return true; } diff --git a/test/controllers/plg/plg-onboarding.test.js b/test/controllers/plg/plg-onboarding.test.js index 01f24f3ab..d624e442d 100644 --- a/test/controllers/plg/plg-onboarding.test.js +++ b/test/controllers/plg/plg-onboarding.test.js @@ -321,7 +321,7 @@ describe('PlgOnboardingController', () => { }, '../../../src/support/access-control-util.js': { default: { - fromContext: () => ({ hasAdminAccess: () => false }), + fromContext: () => ({ hasAdminAccess: () => false, hasAdminReadAccess: () => false }), }, }, }, @@ -1799,7 +1799,7 @@ describe('PlgOnboardingController', () => { }, '../../../src/support/access-control-util.js': { default: { - fromContext: () => ({ hasAdminAccess: () => true }), + fromContext: () => ({ hasAdminAccess: () => true, hasAdminReadAccess: () => true }), }, }, }, diff --git a/test/controllers/user-details.test.js b/test/controllers/user-details.test.js index 2199c98d7..1e50fb216 100644 --- a/test/controllers/user-details.test.js +++ b/test/controllers/user-details.test.js @@ -100,6 +100,7 @@ describe('User Details Controller', () => { mockAccessControlUtil = { hasAccess: sandbox.stub().resolves(true), hasAdminAccess: sandbox.stub().returns(true), + hasAdminReadAccess: sandbox.stub().returns(true), }; sandbox.stub(AccessControlUtil, 'fromContext').returns(mockAccessControlUtil); @@ -192,7 +193,7 @@ describe('User Details Controller', () => { organizationId, externalUserId: 'not-found-user@AdobeOrg', }; - mockAccessControlUtil.hasAdminAccess.returns(true); + mockAccessControlUtil.hasAdminReadAccess.returns(true); const result = await controller.getUserDetailsByExternalUserId(context); @@ -212,7 +213,7 @@ describe('User Details Controller', () => { organizationId, externalUserId: 'not-found-user@AdobeOrg', }; - mockAccessControlUtil.hasAdminAccess.returns(true); + mockAccessControlUtil.hasAdminReadAccess.returns(true); mockImsClient.getImsAdminProfile.rejects(new Error('IMS error')); const result = await controller.getUserDetailsByExternalUserId(context); @@ -233,7 +234,7 @@ describe('User Details Controller', () => { organizationId, externalUserId: 'incomplete-user@AdobeOrg', }; - mockAccessControlUtil.hasAdminAccess.returns(true); + mockAccessControlUtil.hasAdminReadAccess.returns(true); mockImsClient.getImsAdminProfile.resolves({ userId: 'incomplete-user-123', // first_name, last_name, email are missing/null @@ -256,7 +257,7 @@ describe('User Details Controller', () => { organizationId, externalUserId: 'not-found-user@AdobeOrg', }; - mockAccessControlUtil.hasAdminAccess.returns(false); + mockAccessControlUtil.hasAdminReadAccess.returns(false); const result = await controller.getUserDetailsByExternalUserId(context); @@ -370,7 +371,7 @@ describe('User Details Controller', () => { context.data = { userIds: [externalUserId, 'not-found-user@AdobeOrg'], }; - mockAccessControlUtil.hasAdminAccess.returns(true); + mockAccessControlUtil.hasAdminReadAccess.returns(true); const result = await controller.getUserDetailsInBulk(context); @@ -395,7 +396,7 @@ describe('User Details Controller', () => { context.data = { userIds: [externalUserId, 'not-found-user@AdobeOrg'], }; - mockAccessControlUtil.hasAdminAccess.returns(false); + mockAccessControlUtil.hasAdminReadAccess.returns(false); const result = await controller.getUserDetailsInBulk(context); @@ -418,7 +419,7 @@ describe('User Details Controller', () => { context.data = { userIds: ['not-found-user-1@AdobeOrg', 'not-found-user-2@AdobeOrg'], }; - mockAccessControlUtil.hasAdminAccess.returns(true); + mockAccessControlUtil.hasAdminReadAccess.returns(true); mockImsClient.getImsAdminProfile.rejects(new Error('IMS error')); const result = await controller.getUserDetailsInBulk(context); @@ -442,7 +443,7 @@ describe('User Details Controller', () => { context.data = { userIds: ['incomplete-user@AdobeOrg'], }; - mockAccessControlUtil.hasAdminAccess.returns(true); + mockAccessControlUtil.hasAdminReadAccess.returns(true); mockImsClient.getImsAdminProfile.resolves({ userId: 'incomplete-user-123', first_name: null, diff --git a/test/routes/required-capabilities.test.js b/test/routes/required-capabilities.test.js index 3fbf648cc..5b8c5e114 100644 --- a/test/routes/required-capabilities.test.js +++ b/test/routes/required-capabilities.test.js @@ -71,6 +71,41 @@ describe('routeRequiredCapabilities', () => { }); }); + describe('API key routes', () => { + const API_KEY_ROUTES = [ + 'POST /tools/api-keys', + 'DELETE /tools/api-keys/:id', + 'GET /tools/api-keys', + ]; + + it('are in INTERNAL_ROUTES (not exposed to S2S consumers)', () => { + const internalSet = new Set(INTERNAL_ROUTES); + API_KEY_ROUTES.forEach((route) => { + expect(internalSet.has(route), `${route} must be in INTERNAL_ROUTES`).to.be.true; + }); + }); + + it('are not in routeRequiredCapabilities', () => { + API_KEY_ROUTES.forEach((route) => { + expect(routeRequiredCapabilities).to.not.have.property(route); + }); + }); + }); + + describe('sheet-data POST routes', () => { + const SHEET_DATA_POST_ROUTES = [ + 'POST /sites/:siteId/llmo/sheet-data/:dataSource', + 'POST /sites/:siteId/llmo/sheet-data/:sheetType/:dataSource', + 'POST /sites/:siteId/llmo/sheet-data/:sheetType/:week/:dataSource', + ]; + + it('are mapped to site:read (not site:write)', () => { + SHEET_DATA_POST_ROUTES.forEach((route) => { + expect(routeRequiredCapabilities[route], `${route} must map to site:read`).to.equal('site:read'); + }); + }); + }); + describe('route coverage', () => { it('every route from routes/index.js must be in routeRequiredCapabilities or INTERNAL_ROUTES', () => { const routesPath = join(testDir, '../../src/routes/index.js'); diff --git a/test/support/access-control-util.test.js b/test/support/access-control-util.test.js index c6cc00999..8e4a8dd65 100644 --- a/test/support/access-control-util.test.js +++ b/test/support/access-control-util.test.js @@ -1742,4 +1742,73 @@ describe('Access Control Util', () => { .to.not.have.been.called; }); }); + + describe('hasAdminReadAccess', () => { + function makeContext(authInfoOverrides) { + const authInfo = { + getType: () => 'jwt', + isAdmin: () => false, + isReadOnlyAdmin: () => false, + getScopes: () => [], + hasOrganization: sinon.stub().returns(false), + hasScope: sinon.stub().returns(false), + ...authInfoOverrides, + }; + return { + log: { + info: () => {}, error: () => {}, warn: () => {}, debug: () => {}, + }, + pathInfo: { headers: { 'x-product': 'test' } }, + attributes: { authInfo }, + dataAccess: { + Entitlement: {}, + TrialUser: {}, + OrganizationIdentityProvider: {}, + }, + }; + } + + it('returns true when user is a full admin', () => { + const ctx = makeContext({ isAdmin: () => true, isReadOnlyAdmin: () => false }); + const util = AccessControlUtil.fromContext(ctx); + expect(util.hasAdminReadAccess()).to.be.true; + }); + + it('returns true when user is a read-only admin', () => { + const ctx = makeContext({ isAdmin: () => false, isReadOnlyAdmin: () => true }); + const util = AccessControlUtil.fromContext(ctx); + expect(util.hasAdminReadAccess()).to.be.true; + }); + + it('returns false when user is neither admin nor read-only admin', () => { + const ctx = makeContext({ isAdmin: () => false, isReadOnlyAdmin: () => false }); + const util = AccessControlUtil.fromContext(ctx); + expect(util.hasAdminReadAccess()).to.be.false; + }); + + it('hasAdminAccess returns false for read-only admin (write guard is unchanged)', () => { + const ctx = makeContext({ isAdmin: () => false, isReadOnlyAdmin: () => true }); + const util = AccessControlUtil.fromContext(ctx); + expect(util.hasAdminAccess()).to.be.false; + }); + + it('hasAccess bypasses org check for read-only admin', async () => { + const ctx = makeContext({ isAdmin: () => false, isReadOnlyAdmin: () => true }); + const util = AccessControlUtil.fromContext(ctx); + const org = { getImsOrgId: () => 'some-org-id' }; + org.constructor = { ENTITY_NAME: 'Organization' }; + const result = await util.hasAccess(org); + expect(result).to.be.true; + }); + + it('hasAccess still enforces org check for regular non-admin user', async () => { + const ctx = makeContext({ isAdmin: () => false, isReadOnlyAdmin: () => false }); + const util = AccessControlUtil.fromContext(ctx); + const org = { getImsOrgId: () => 'some-org-id' }; + org.constructor = { ENTITY_NAME: 'Organization' }; + // hasOrganization is stubbed to return false → access denied + const result = await util.hasAccess(org); + expect(result).to.be.false; + }); + }); }); From 0ebc757f38ece83e5133f608ed70ea1657782d79 Mon Sep 17 00:00:00 2001 From: Ravi Verma Date: Sun, 29 Mar 2026 13:13:28 +0530 Subject: [PATCH 2/5] chore: update package.json and lock file for read-only admin dependencies Co-Authored-By: Claude Sonnet 4.6 --- package-lock.json | 966 ++++++++++++++++++++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 816 insertions(+), 152 deletions(-) diff --git a/package-lock.json b/package-lock.json index 441760a52..b170bdb01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@adobe/spacecat-shared-data-access-v2": "npm:@adobe/spacecat-shared-data-access@2.109.0", "@adobe/spacecat-shared-drs-client": "1.3.1", "@adobe/spacecat-shared-gpt-client": "1.6.20", - "@adobe/spacecat-shared-http-utils": "1.25.1", + "@adobe/spacecat-shared-http-utils": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/0253e4fc29b6e7d7ce7a66f336a746dd7b5f69fe/adobe-spacecat-shared-http-utils-1.25.1.tgz", "@adobe/spacecat-shared-ims-client": "1.12.2", "@adobe/spacecat-shared-rum-api-client": "2.40.10", "@adobe/spacecat-shared-scrape-client": "2.5.4", @@ -5146,11 +5146,12 @@ }, "node_modules/@adobe/spacecat-shared-http-utils": { "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-http-utils/-/spacecat-shared-http-utils-1.25.1.tgz", - "integrity": "sha512-pTuy6hQPKKaFLht4nwSs91FZrxz8QZj62Fo1XtdRtLeAUb58yZ9RKN/jyS0qnQhAlj57AR/9JXR6XT1AHzFjSQ==", + "resolved": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/0253e4fc29b6e7d7ce7a66f336a746dd7b5f69fe/adobe-spacecat-shared-http-utils-1.25.1.tgz", + "integrity": "sha512-y7lXyS++4QsmaKWToOeiyt+wE1mzpnOZD1htNktfj02G9w9bBL07bYLC/xPQg5Oq1EQXCEm0dnHjeie1mDv3Ag==", "license": "Apache-2.0", "dependencies": { "@adobe/fetch": "4.2.3", + "@adobe/spacecat-shared-launchdarkly-client": "1.0.4", "@adobe/spacecat-shared-utils": "1.81.1", "jose": "6.2.2" }, @@ -6334,26 +6335,22 @@ "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client": { - "version": "2.40.10", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-rum-api-client/-/spacecat-shared-rum-api-client-2.40.10.tgz", - "integrity": "sha512-5vNSei+Um2sFBesyh4JOAqhTnbMtKyF0nn1xmDOjk3SlJ1/vDM0K83A8adEzQGvQ3NHjXT7t2oXMy2SbC2h8KQ==", + "node_modules/@adobe/spacecat-shared-launchdarkly-client": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-launchdarkly-client/-/spacecat-shared-launchdarkly-client-1.0.4.tgz", + "integrity": "sha512-5mw6zDJ1iBPcjv4FuXPhVtP6bQbYX8u8/RTfGo8JLv9+rRsEcnZMzGfX7SuzrOd8KDjwNCBhc0Dllk4tDiqqgg==", "license": "Apache-2.0", "dependencies": { - "@adobe/fetch": "4.2.3", - "@adobe/helix-shared-wrap": "2.0.2", "@adobe/helix-universal": "5.4.0", - "@adobe/rum-distiller": "1.23.0", "@adobe/spacecat-shared-utils": "1.81.1", - "aws4": "1.13.2", - "urijs": "1.19.11" + "@launchdarkly/node-server-sdk": "^9.9.7" }, "engines": { "node": ">=22.0.0 <25.0.0", "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -6377,7 +6374,7 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/client-s3": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", @@ -6443,7 +6440,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -6495,7 +6492,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/core": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", @@ -6519,7 +6516,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-env": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/credential-provider-env": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.940.0.tgz", "integrity": "sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==", @@ -6535,7 +6532,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/credential-provider-http": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz", "integrity": "sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==", @@ -6556,7 +6553,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz", "integrity": "sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==", @@ -6581,7 +6578,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", @@ -6604,7 +6601,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/credential-provider-process": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.940.0.tgz", "integrity": "sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==", @@ -6621,7 +6618,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz", "integrity": "sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==", @@ -6640,7 +6637,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.940.0.tgz", "integrity": "sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==", @@ -6658,7 +6655,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", @@ -6676,7 +6673,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-expect-continue": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", @@ -6691,7 +6688,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", @@ -6715,7 +6712,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-location-constraint": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", @@ -6729,7 +6726,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-sdk-s3": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", @@ -6754,7 +6751,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-sdk-sqs": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/middleware-sdk-sqs": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.936.0.tgz", "integrity": "sha512-39WohFCCPeD6LV8zLQq7CyYbIieetEDDNLsEPeGJSh2Uv9qpY9r6zJRSTjb8hTuQbHDSEOGntHMYKpLoHdoxdQ==", @@ -6771,7 +6768,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-ssec": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/middleware-ssec": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", @@ -6785,7 +6782,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", @@ -6803,7 +6800,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/nested-clients": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/nested-clients": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz", "integrity": "sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==", @@ -6852,7 +6849,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", @@ -6869,7 +6866,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/token-providers": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/token-providers": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.940.0.tgz", "integrity": "sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==", @@ -6887,7 +6884,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/util-arn-parser": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/util-arn-parser": { "version": "3.893.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", @@ -6899,7 +6896,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", @@ -6923,7 +6920,7 @@ } } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/zod": { + "node_modules/@adobe/spacecat-shared-launchdarkly-client/node_modules/zod": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", @@ -6932,22 +6929,26 @@ "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@adobe/spacecat-shared-scrape-client": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-scrape-client/-/spacecat-shared-scrape-client-2.5.4.tgz", - "integrity": "sha512-9VQarIUNxfNiqaLlKmFwX6n+Nzwwv4BwM6Xhp9UPsMRc6GULtDigQbY6aymTUwipas1QraEDxPk23bkWmWiCdA==", + "node_modules/@adobe/spacecat-shared-rum-api-client": { + "version": "2.40.10", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-rum-api-client/-/spacecat-shared-rum-api-client-2.40.10.tgz", + "integrity": "sha512-5vNSei+Um2sFBesyh4JOAqhTnbMtKyF0nn1xmDOjk3SlJ1/vDM0K83A8adEzQGvQ3NHjXT7t2oXMy2SbC2h8KQ==", "license": "Apache-2.0", "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/helix-shared-wrap": "2.0.2", "@adobe/helix-universal": "5.4.0", + "@adobe/rum-distiller": "1.23.0", "@adobe/spacecat-shared-utils": "1.81.1", - "@mysticat/data-service-types": "git+https://github.com/adobe/mysticat-data-service.git#types-ts-v1.11.1" + "aws4": "1.13.2", + "urijs": "1.19.11" }, "engines": { "node": ">=22.0.0 <25.0.0", "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -6971,7 +6972,7 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/client-s3": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", @@ -7037,7 +7038,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -7089,7 +7090,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/core": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", @@ -7113,7 +7114,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-env": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-env": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.940.0.tgz", "integrity": "sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==", @@ -7129,7 +7130,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-http": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz", "integrity": "sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==", @@ -7150,7 +7151,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz", "integrity": "sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==", @@ -7175,7 +7176,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", @@ -7198,7 +7199,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-process": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.940.0.tgz", "integrity": "sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==", @@ -7215,7 +7216,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz", "integrity": "sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==", @@ -7234,7 +7235,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.940.0.tgz", "integrity": "sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==", @@ -7252,7 +7253,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", @@ -7270,7 +7271,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-expect-continue": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", @@ -7285,7 +7286,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", @@ -7309,7 +7310,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-location-constraint": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", @@ -7323,7 +7324,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-sdk-s3": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", @@ -7348,7 +7349,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-sdk-sqs": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-sdk-sqs": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.936.0.tgz", "integrity": "sha512-39WohFCCPeD6LV8zLQq7CyYbIieetEDDNLsEPeGJSh2Uv9qpY9r6zJRSTjb8hTuQbHDSEOGntHMYKpLoHdoxdQ==", @@ -7365,7 +7366,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-ssec": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-ssec": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", @@ -7379,7 +7380,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", @@ -7397,7 +7398,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/nested-clients": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/nested-clients": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz", "integrity": "sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==", @@ -7446,7 +7447,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", @@ -7463,7 +7464,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/token-providers": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/token-providers": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.940.0.tgz", "integrity": "sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==", @@ -7481,7 +7482,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/util-arn-parser": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/util-arn-parser": { "version": "3.893.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", @@ -7493,7 +7494,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", @@ -7517,7 +7518,7 @@ } } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/zod": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/zod": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", @@ -7526,22 +7527,22 @@ "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@adobe/spacecat-shared-slack-client": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-slack-client/-/spacecat-shared-slack-client-1.6.4.tgz", - "integrity": "sha512-Noi9ieXeQQhQmq6OneUmVQc2OOHCV/MfKgIkvo+qUJ715HiJr6XdpMKj1iU+X+U12Bl3VJSLmjIjGOWgaPLAiw==", + "node_modules/@adobe/spacecat-shared-scrape-client": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-scrape-client/-/spacecat-shared-scrape-client-2.5.4.tgz", + "integrity": "sha512-9VQarIUNxfNiqaLlKmFwX6n+Nzwwv4BwM6Xhp9UPsMRc6GULtDigQbY6aymTUwipas1QraEDxPk23bkWmWiCdA==", "license": "Apache-2.0", "dependencies": { "@adobe/helix-universal": "5.4.0", "@adobe/spacecat-shared-utils": "1.81.1", - "@slack/web-api": "7.15.0" + "@mysticat/data-service-types": "git+https://github.com/adobe/mysticat-data-service.git#types-ts-v1.11.1" }, "engines": { "node": ">=22.0.0 <25.0.0", "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -7565,7 +7566,7 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/client-s3": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", @@ -7631,7 +7632,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -7683,7 +7684,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/core": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", @@ -7707,7 +7708,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-env": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-env": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.940.0.tgz", "integrity": "sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==", @@ -7723,7 +7724,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-http": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz", "integrity": "sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==", @@ -7744,7 +7745,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz", "integrity": "sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==", @@ -7769,7 +7770,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", @@ -7792,7 +7793,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-process": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.940.0.tgz", "integrity": "sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==", @@ -7809,7 +7810,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz", "integrity": "sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==", @@ -7828,7 +7829,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.940.0.tgz", "integrity": "sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==", @@ -7846,7 +7847,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", @@ -7864,7 +7865,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-expect-continue": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", @@ -7879,7 +7880,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", @@ -7903,7 +7904,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-location-constraint": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", @@ -7917,7 +7918,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-sdk-s3": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", @@ -7942,7 +7943,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-sdk-sqs": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-sdk-sqs": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.936.0.tgz", "integrity": "sha512-39WohFCCPeD6LV8zLQq7CyYbIieetEDDNLsEPeGJSh2Uv9qpY9r6zJRSTjb8hTuQbHDSEOGntHMYKpLoHdoxdQ==", @@ -7959,7 +7960,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-ssec": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-ssec": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", @@ -7973,7 +7974,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", @@ -7991,7 +7992,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/nested-clients": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/nested-clients": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz", "integrity": "sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==", @@ -8040,7 +8041,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", @@ -8057,7 +8058,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/token-providers": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/token-providers": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.940.0.tgz", "integrity": "sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==", @@ -8075,7 +8076,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/util-arn-parser": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/util-arn-parser": { "version": "3.893.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", @@ -8087,7 +8088,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", @@ -8111,7 +8112,7 @@ } } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/zod": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/zod": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", @@ -8120,21 +8121,22 @@ "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@adobe/spacecat-shared-tier-client": { - "version": "1.3.16", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-tier-client/-/spacecat-shared-tier-client-1.3.16.tgz", - "integrity": "sha512-EK3p5PseHqlZRJ6p+UMDH61FnAiwtTpqQVs+PxmPRJ5ZlM2HJd8VxHC3xyTOaV1HqT3XuNYQz1pohhhLFW5iMQ==", + "node_modules/@adobe/spacecat-shared-slack-client": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-slack-client/-/spacecat-shared-slack-client-1.6.4.tgz", + "integrity": "sha512-Noi9ieXeQQhQmq6OneUmVQc2OOHCV/MfKgIkvo+qUJ715HiJr6XdpMKj1iU+X+U12Bl3VJSLmjIjGOWgaPLAiw==", "license": "Apache-2.0", "dependencies": { + "@adobe/helix-universal": "5.4.0", "@adobe/spacecat-shared-utils": "1.81.1", - "@mysticat/data-service-types": "git+https://github.com/adobe/mysticat-data-service.git#types-ts-v1.11.1" + "@slack/web-api": "7.15.0" }, "engines": { "node": ">=22.0.0 <25.0.0", "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -8158,7 +8160,7 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/client-s3": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", @@ -8224,7 +8226,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -8276,7 +8278,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/core": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", @@ -8300,7 +8302,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-env": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-env": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.940.0.tgz", "integrity": "sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==", @@ -8316,7 +8318,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-http": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz", "integrity": "sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==", @@ -8337,7 +8339,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz", "integrity": "sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==", @@ -8362,7 +8364,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", @@ -8385,7 +8387,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-process": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.940.0.tgz", "integrity": "sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==", @@ -8402,7 +8404,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz", "integrity": "sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==", @@ -8421,7 +8423,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.940.0.tgz", "integrity": "sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==", @@ -8439,7 +8441,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", @@ -8457,7 +8459,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-expect-continue": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", @@ -8472,7 +8474,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", @@ -8496,7 +8498,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-location-constraint": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", @@ -8510,7 +8512,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-sdk-s3": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", @@ -8535,7 +8537,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-sdk-sqs": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-sdk-sqs": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.936.0.tgz", "integrity": "sha512-39WohFCCPeD6LV8zLQq7CyYbIieetEDDNLsEPeGJSh2Uv9qpY9r6zJRSTjb8hTuQbHDSEOGntHMYKpLoHdoxdQ==", @@ -8552,7 +8554,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-ssec": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-ssec": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", @@ -8566,7 +8568,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", @@ -8584,7 +8586,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/nested-clients": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/nested-clients": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz", "integrity": "sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==", @@ -8633,7 +8635,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", @@ -8650,7 +8652,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/token-providers": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/token-providers": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.940.0.tgz", "integrity": "sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==", @@ -8668,7 +8670,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/util-arn-parser": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/util-arn-parser": { "version": "3.893.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", @@ -8680,7 +8682,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", @@ -8704,7 +8706,7 @@ } } }, - "node_modules/@adobe/spacecat-shared-tier-client/node_modules/zod": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/zod": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", @@ -8713,26 +8715,21 @@ "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-tokowaka-client/-/spacecat-shared-tokowaka-client-1.12.3.tgz", - "integrity": "sha512-n1EEDwdnVtgdM6B6o3Gb/iUQsYFIpLHv/xspol9itVftcjD1p3JhaUZqq+vOQ4HNdlYpFTe7u7JLMOPF4+LoGg==", + "node_modules/@adobe/spacecat-shared-tier-client": { + "version": "1.3.16", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-tier-client/-/spacecat-shared-tier-client-1.3.16.tgz", + "integrity": "sha512-EK3p5PseHqlZRJ6p+UMDH61FnAiwtTpqQVs+PxmPRJ5ZlM2HJd8VxHC3xyTOaV1HqT3XuNYQz1pohhhLFW5iMQ==", "license": "Apache-2.0", "dependencies": { "@adobe/spacecat-shared-utils": "1.81.1", - "@aws-sdk/client-cloudfront": "3.1019.0", - "@aws-sdk/client-s3": "3.1019.0", - "hast-util-from-html": "2.0.3", - "mdast-util-from-markdown": "2.0.3", - "mdast-util-to-hast": "13.2.1", - "uuid": "11.1.0" + "@mysticat/data-service-types": "git+https://github.com/adobe/mysticat-data-service.git#types-ts-v1.11.1" }, "engines": { "node": ">=22.0.0 <25.0.0", "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -8756,7 +8753,7 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/client-s3": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", @@ -8822,7 +8819,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -8874,7 +8871,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/core": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", @@ -8898,7 +8895,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-env": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-env": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.940.0.tgz", "integrity": "sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==", @@ -8914,7 +8911,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-http": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz", "integrity": "sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==", @@ -8935,7 +8932,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz", "integrity": "sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==", @@ -8960,7 +8957,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", @@ -8983,7 +8980,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-process": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.940.0.tgz", "integrity": "sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==", @@ -9000,7 +8997,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz", "integrity": "sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==", @@ -9019,7 +9016,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.940.0.tgz", "integrity": "sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==", @@ -9037,7 +9034,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", @@ -9055,7 +9052,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/middleware-expect-continue": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", @@ -9070,7 +9067,605 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-sdk-sqs": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.936.0.tgz", + "integrity": "sha512-39WohFCCPeD6LV8zLQq7CyYbIieetEDDNLsEPeGJSh2Uv9qpY9r6zJRSTjb8hTuQbHDSEOGntHMYKpLoHdoxdQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", + "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/nested-clients": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz", + "integrity": "sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/token-providers": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.940.0.tgz", + "integrity": "sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/nested-clients": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", + "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@adobe/spacecat-shared-tier-client/node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-tokowaka-client/-/spacecat-shared-tokowaka-client-1.12.3.tgz", + "integrity": "sha512-n1EEDwdnVtgdM6B6o3Gb/iUQsYFIpLHv/xspol9itVftcjD1p3JhaUZqq+vOQ4HNdlYpFTe7u7JLMOPF4+LoGg==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/spacecat-shared-utils": "1.81.1", + "@aws-sdk/client-cloudfront": "3.1019.0", + "@aws-sdk/client-s3": "3.1019.0", + "hast-util-from-html": "2.0.3", + "mdast-util-from-markdown": "2.0.3", + "mdast-util-to-hast": "13.2.1", + "uuid": "11.1.0" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils": { + "version": "1.81.1", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", + "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@aws-sdk/client-s3": "3.940.0", + "@aws-sdk/client-sqs": "3.940.0", + "@json2csv/plainjs": "7.0.6", + "aws-xray-sdk": "3.12.0", + "cheerio": "1.1.2", + "date-fns": "4.1.0", + "franc-min": "6.2.0", + "iso-639-3": "3.0.1", + "validator": "^13.15.15", + "world-countries": "5.1.0", + "zod": "^4.1.11" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/client-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-sqs": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", + "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-sqs": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/core": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", + "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.940.0.tgz", + "integrity": "sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz", + "integrity": "sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz", + "integrity": "sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-env": "3.940.0", + "@aws-sdk/credential-provider-http": "3.940.0", + "@aws-sdk/credential-provider-login": "3.940.0", + "@aws-sdk/credential-provider-process": "3.940.0", + "@aws-sdk/credential-provider-sso": "3.940.0", + "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/nested-clients": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", + "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.940.0", + "@aws-sdk/credential-provider-http": "3.940.0", + "@aws-sdk/credential-provider-ini": "3.940.0", + "@aws-sdk/credential-provider-process": "3.940.0", + "@aws-sdk/credential-provider-sso": "3.940.0", + "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.940.0.tgz", + "integrity": "sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz", + "integrity": "sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.940.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/token-providers": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.940.0.tgz", + "integrity": "sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/nested-clients": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", @@ -14412,6 +15007,60 @@ "@langchain/core": ">=0.3.68 <0.4.0" } }, + "node_modules/@launchdarkly/js-sdk-common": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/@launchdarkly/js-sdk-common/-/js-sdk-common-2.24.0.tgz", + "integrity": "sha512-f/xRD8gl/bSOVljat79nAzX0V0QjJ76R54aAbB6PJDWL+7BWBSFMxduaeokzbX53cs3oOVajL8ej/ps7+ojMeQ==", + "license": "Apache-2.0" + }, + "node_modules/@launchdarkly/js-server-sdk-common": { + "version": "2.18.3", + "resolved": "https://registry.npmjs.org/@launchdarkly/js-server-sdk-common/-/js-server-sdk-common-2.18.3.tgz", + "integrity": "sha512-9lf1IRLJSghtDZlUT04KmmJOwRnAUuqXUcn7C2S9jNPDvrsmFJeD9Dpn7PoCUOR5rZgqAEveWdlBw9qjWeY6jw==", + "license": "Apache-2.0", + "dependencies": { + "@launchdarkly/js-sdk-common": "2.24.0", + "semver": "7.5.4" + } + }, + "node_modules/@launchdarkly/js-server-sdk-common/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@launchdarkly/js-server-sdk-common/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@launchdarkly/node-server-sdk": { + "version": "9.10.10", + "resolved": "https://registry.npmjs.org/@launchdarkly/node-server-sdk/-/node-server-sdk-9.10.10.tgz", + "integrity": "sha512-qJNVrHbX+FKUhVUl7FWK9ICsL4lJmHBE7vOCkvERFFODRxYrrf8HdiyYDf79aI8JMSOLCKZgcJJKNXAvRJXThg==", + "license": "Apache-2.0", + "dependencies": { + "@launchdarkly/js-server-sdk-common": "2.18.3", + "https-proxy-agent": "^7.0.6", + "launchdarkly-eventsource": "2.2.0" + } + }, "node_modules/@microsoft/microsoft-graph-client": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.7.tgz", @@ -23918,6 +24567,15 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/launchdarkly-eventsource": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/launchdarkly-eventsource/-/launchdarkly-eventsource-2.2.0.tgz", + "integrity": "sha512-u38fYlLSq/m6oFz0MS1/76Sj2xzlYhTKZ+sf/vju6PA86PMc6fPlY5k8CdU79edLXjNwsvIQTDvDNy3llDqB8A==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -34546,6 +35204,12 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/yaml": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", diff --git a/package.json b/package.json index 728818d97..d608bcff7 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@adobe/spacecat-shared-data-access-v2": "npm:@adobe/spacecat-shared-data-access@2.109.0", "@adobe/spacecat-shared-drs-client": "1.3.1", "@adobe/spacecat-shared-gpt-client": "1.6.20", - "@adobe/spacecat-shared-http-utils": "1.25.1", + "@adobe/spacecat-shared-http-utils": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/0253e4fc29b6e7d7ce7a66f336a746dd7b5f69fe/adobe-spacecat-shared-http-utils-1.25.1.tgz", "@adobe/spacecat-shared-ims-client": "1.12.2", "@adobe/spacecat-shared-rum-api-client": "2.40.10", "@adobe/spacecat-shared-scrape-client": "2.5.4", From d9ed3aa848b8724c54e4396ff1dc5f04c2f3af2c Mon Sep 17 00:00:00 2001 From: Ravi Verma Date: Sun, 29 Mar 2026 13:45:03 +0530 Subject: [PATCH 3/5] test: add read-only admin coverage for controllers, middleware wiring, and IT persona - Controller unit tests: assert read-only admin (is_read_only_admin: true) gets 200 on read endpoints in sites, audits, configurations, organizations, project - index.test.js: verify readOnlyAdminWrapper is wired with routeCapabilities - IT auth: add createReadOnlyAdminToken() persona (is_read_only_admin: true) - IT http-client: expose readOnlyAdmin persona - IT sites: smoke tests for readOnlyAdmin fail-closed behaviour (403 without LD) Co-Authored-By: Claude Sonnet 4.6 --- test/controllers/audits.test.js | 23 ++++++++++++++++++ test/controllers/configurations.test.js | 8 +++++++ test/controllers/organizations.test.js | 11 +++++++++ test/controllers/project.test.js | 7 ++++++ test/controllers/sites.test.js | 11 +++++++++ test/index.test.js | 21 ++++++++++++++++ test/it/shared/auth.js | 32 ++++++++++++++++++++++++- test/it/shared/http-client.js | 7 ++++-- test/it/shared/tests/sites.js | 20 ++++++++++++++++ 9 files changed, 137 insertions(+), 3 deletions(-) diff --git a/test/controllers/audits.test.js b/test/controllers/audits.test.js index c61c6ad7f..ed977091d 100755 --- a/test/controllers/audits.test.js +++ b/test/controllers/audits.test.js @@ -410,6 +410,29 @@ describe('Audits Controller', () => { const result = await controller.getAllLatest({ params: { auditType } }); expect(result.status).to.equal(403); }); + + it('allows read-only admin to get all latest audits', async () => { + const authContextReadOnlyAdmin = { + attributes: { + authInfo: new AuthInfo() + .withType('jwt') + .withScopes([{ name: 'user' }]) + .withProfile({ is_admin: false, is_read_only_admin: true }) + .withAuthenticated(true), + }, + }; + const controller = AuditsController({ + dataAccess: mockDataAccess, + pathInfo: { headers: { 'x-product': 'llmo' } }, + ...authContextReadOnlyAdmin, + }); + + const auditType = 'security'; + mockDataAccess.LatestAudit.allByAuditType.resolves(mockLatestAudits); + + const result = await controller.getAllLatest({ params: { auditType } }); + expect(result.status).to.equal(200); + }); }); describe('getAllLatestForSite', () => { diff --git a/test/controllers/configurations.test.js b/test/controllers/configurations.test.js index 54dfa8fee..811389c98 100644 --- a/test/controllers/configurations.test.js +++ b/test/controllers/configurations.test.js @@ -274,6 +274,14 @@ describe('Configurations Controller', () => { expect(error.message).to.include('Configuration data validation failed'); }); + it('gets latest configuration for read-only admin', async () => { + context.attributes.authInfo.withProfile({ is_admin: false, is_read_only_admin: true }); + + const result = await configurationsController.getLatest(); + + expect(result.status).to.equal(200); + }); + it('gets latest configuration for non admin users', async () => { context.attributes.authInfo.withProfile({ is_admin: false }); const result = await configurationsController.getLatest(); diff --git a/test/controllers/organizations.test.js b/test/controllers/organizations.test.js index 55c4ab0b7..8ffbb30de 100755 --- a/test/controllers/organizations.test.js +++ b/test/controllers/organizations.test.js @@ -453,6 +453,17 @@ describe('Organizations Controller', () => { expect(resultOrganizations[1]).to.have.property('id', '5f3b3626-029c-476e-924b-0c1bba2e871f'); }); + it('gets all organizations for read-only admin', async () => { + context.attributes.authInfo.withProfile({ is_admin: false, is_read_only_admin: true }); + mockDataAccess.Organization.all.resolves(organizations); + + const result = await organizationsController.getAll(); + + expect(result.status).to.equal(200); + const resultOrgs = await result.json(); + expect(resultOrgs).to.be.an('array').with.lengthOf(4); + }); + it('gets all organizations for non admin users', async () => { context.attributes.authInfo.withProfile({ is_admin: false }); mockDataAccess.Organization.all.resolves(organizations); diff --git a/test/controllers/project.test.js b/test/controllers/project.test.js index 33feb277a..73613ca16 100644 --- a/test/controllers/project.test.js +++ b/test/controllers/project.test.js @@ -289,6 +289,13 @@ describe('Projects Controller', () => { const responseBody = await response.json(); expect(responseBody.message).to.equal('Only admins can view all projects'); }); + + it('should allow read-only admin to get all projects', async () => { + context.attributes.authInfo.withProfile({ is_admin: false, is_read_only_admin: true }); + const response = await projectsController.getAll(context); + + expect(response.status).to.equal(200); + }); }); describe('getByID', () => { diff --git a/test/controllers/sites.test.js b/test/controllers/sites.test.js index 0ee19c42a..9aa0c818b 100644 --- a/test/controllers/sites.test.js +++ b/test/controllers/sites.test.js @@ -551,6 +551,17 @@ describe('Sites Controller', () => { expect(resultSites[0]).to.not.have.any.keys('hlxConfig', 'authoringType', 'deliveryConfig', 'pageTypes', 'projectId', 'isPrimaryLocale', 'language', 'code', 'audits', 'updatedBy', 'isLiveToggledAt'); }); + it('gets all sites for a read-only admin user', async () => { + context.attributes.authInfo.withProfile({ is_admin: false, is_read_only_admin: true }); + mockDataAccess.Site.all.resolves(sites); + + const result = await sitesController.getAll(); + const resultSites = await result.json(); + + expect(result.status).to.equal(200); + expect(resultSites).to.be.an('array').with.lengthOf(2); + }); + it('gets all sites for a non-admin user', async () => { context.attributes.authInfo.withProfile({ is_admin: false }); mockDataAccess.Site.all.resolves(sites); diff --git a/test/index.test.js b/test/index.test.js index 894ac5dab..f9f798972 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -297,4 +297,25 @@ describe('Index Tests', () => { expect(resp.status).to.equal(200); expect(context.dataAccess.Audit.findBySiteIdAndAuditTypeAndAuditedAt).to.have.been.calledOnce; }); + + it('wires readOnlyAdminWrapper with routeCapabilities', async () => { + let capturedOpts; + const { main: testMain } = await esmock('../src/index.js', { + '@adobe/spacecat-shared-http-utils': { + readOnlyAdminWrapper: (fn, opts) => { + capturedOpts = opts; + return fn; + }, + s2sAuthWrapper: s2sAuthWrapperStub, + }, + }); + // Trigger a request so the chain initialises (top-level .with() runs at import time, + // but we confirm capturedOpts was populated by the module load) + expect(capturedOpts, 'readOnlyAdminWrapper must receive an options object').to.be.an('object'); + expect(capturedOpts, 'routeCapabilities must be passed to readOnlyAdminWrapper').to.have.property('routeCapabilities'); + expect(capturedOpts.routeCapabilities, 'routeCapabilities must be a non-empty object').to.be.an('object').that.is.not.empty; + // Sanity-check a known read route is present so an accidental empty map is caught + expect(capturedOpts.routeCapabilities).to.have.property('GET /sites/:siteId'); + expect(testMain).to.exist; // reference to satisfy no-unused-vars + }); }); diff --git a/test/it/shared/auth.js b/test/it/shared/auth.js index c7cb5da83..fe2701e78 100644 --- a/test/it/shared/auth.js +++ b/test/it/shared/auth.js @@ -157,9 +157,32 @@ export async function createDelegatedUserNoSourceToken() { }); } +/** + * Read-only admin — is_admin: false, is_read_only_admin: true. + * The readOnlyAdminWrapper evaluates a LaunchDarkly feature flag before granting + * access; without LD configured (e.g. in IT tests) the wrapper is fail-closed + * and returns 403 for all routes. Use this persona to verify fail-closed behaviour + * or in environments where the LD flag is enabled. + */ +export async function createReadOnlyAdminToken() { + return signToken({ + sub: 'test-readonly-admin@adobe.com', + email: 'test-readonly-admin@adobe.com', + is_admin: false, + is_read_only_admin: true, + is_llmo_administrator: false, + tenants: [{ + id: IMS_ORG_IDENT, + subServices: [], + entitlement: {}, + }], + }); +} + export async function createAllTokens() { const [ admin, user, trialUser, delegatedUser, delegatedUserTruncated, delegatedUserNoSource, + readOnlyAdmin, ] = await Promise.all([ createAdminToken(), createUserToken(), @@ -167,8 +190,15 @@ export async function createAllTokens() { createDelegatedUserToken(), createDelegatedUserTruncatedToken(), createDelegatedUserNoSourceToken(), + createReadOnlyAdminToken(), ]); return { - admin, user, trialUser, delegatedUser, delegatedUserTruncated, delegatedUserNoSource, + admin, + user, + trialUser, + delegatedUser, + delegatedUserTruncated, + delegatedUserNoSource, + readOnlyAdmin, }; } diff --git a/test/it/shared/http-client.js b/test/it/shared/http-client.js index 3da22f9b0..3f0c3608e 100644 --- a/test/it/shared/http-client.js +++ b/test/it/shared/http-client.js @@ -15,9 +15,11 @@ * * @param {string} baseUrl - The dev server base URL (e.g., http://localhost:3002) * @param {{ admin: string, user: string, trialUser: string, delegatedUser: string, - * delegatedUserTruncated: string, delegatedUserNoSource: string }} tokens - JWT tokens + * delegatedUserTruncated: string, delegatedUserNoSource: string, + * readOnlyAdmin: string }} tokens - JWT tokens * @returns {{ admin: object, user: object, trialUser: object, delegatedUser: object, - * delegatedUserTruncated: object, delegatedUserNoSource: object }} + * delegatedUserTruncated: object, delegatedUserNoSource: object, + * readOnlyAdmin: object }} */ export function createHttpClient(baseUrl, tokens) { async function request(method, path, body, token, extraHeaders = {}) { @@ -73,5 +75,6 @@ export function createHttpClient(baseUrl, tokens) { delegatedUser: makeMethods(tokens.delegatedUser), delegatedUserTruncated: makeMethods(tokens.delegatedUserTruncated), delegatedUserNoSource: makeMethods(tokens.delegatedUserNoSource), + readOnlyAdmin: makeMethods(tokens.readOnlyAdmin), }; } diff --git a/test/it/shared/tests/sites.js b/test/it/shared/tests/sites.js index 83e9e9a88..e7ab5cb4f 100644 --- a/test/it/shared/tests/sites.js +++ b/test/it/shared/tests/sites.js @@ -173,6 +173,26 @@ export default function siteTests(getHttpClient, resetData) { const res = await http.delegatedUser.get(`/sites/${SITE_3_ID}`); expect(res.status).to.equal(403); }); + + // ── Read-only admin smoke tests ── + // readOnlyAdminWrapper is fail-closed: without a LaunchDarkly SDK key in the + // IT environment the feature-flag evaluation returns false, so ALL routes return + // 403 regardless of HTTP method. These tests verify: + // 1. The token is correctly parsed as a read-only admin identity. + // 2. The readOnlyAdminWrapper is wired and rejects the request (fail-closed). + // In an environment with the LD flag enabled, GET routes would return 200 and + // POST/mutating routes would return 403. + it('readOnlyAdmin: returns 403 for GET /sites/:siteId (fail-closed without LD flag)', async () => { + const http = getHttpClient(); + const res = await http.readOnlyAdmin.get(`/sites/${SITE_1_ID}`); + expect(res.status).to.equal(403); + }); + + it('readOnlyAdmin: returns 403 for POST /sites (fail-closed without LD flag)', async () => { + const http = getHttpClient(); + const res = await http.readOnlyAdmin.post('/sites', { baseURL: 'https://ro-admin-test.example.com' }); + expect(res.status).to.equal(403); + }); }); describe('GET /sites/by-base-url/:baseURL', () => { From 30c2a030e2865e01f185c0b80c8039dd35163adf Mon Sep 17 00:00:00 2001 From: Ravi Verma Date: Mon, 30 Mar 2026 16:25:22 +0530 Subject: [PATCH 4/5] fix: update transit dependency --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b85ccec91..c675092fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@adobe/spacecat-shared-data-access-v2": "npm:@adobe/spacecat-shared-data-access@2.109.0", "@adobe/spacecat-shared-drs-client": "1.3.1", "@adobe/spacecat-shared-gpt-client": "1.6.20", - "@adobe/spacecat-shared-http-utils": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/0253e4fc29b6e7d7ce7a66f336a746dd7b5f69fe/adobe-spacecat-shared-http-utils-1.25.1.tgz", + "@adobe/spacecat-shared-http-utils": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/c039c780f04856012e2c2d7382a4ac7702965fbe/adobe-spacecat-shared-http-utils-1.25.1.tgz", "@adobe/spacecat-shared-ims-client": "1.12.2", "@adobe/spacecat-shared-rum-api-client": "2.40.10", "@adobe/spacecat-shared-scrape-client": "2.5.4", @@ -5146,8 +5146,8 @@ }, "node_modules/@adobe/spacecat-shared-http-utils": { "version": "1.25.1", - "resolved": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/0253e4fc29b6e7d7ce7a66f336a746dd7b5f69fe/adobe-spacecat-shared-http-utils-1.25.1.tgz", - "integrity": "sha512-y7lXyS++4QsmaKWToOeiyt+wE1mzpnOZD1htNktfj02G9w9bBL07bYLC/xPQg5Oq1EQXCEm0dnHjeie1mDv3Ag==", + "resolved": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/c039c780f04856012e2c2d7382a4ac7702965fbe/adobe-spacecat-shared-http-utils-1.25.1.tgz", + "integrity": "sha512-riyqwXS1Sm2EQt8iRvx93wxOp9GXNAf01OMC9Qf1TpGyGt2ITMAhptvlQDHd8uwl18yvg44QcWrdwHmOSokJRw==", "license": "Apache-2.0", "dependencies": { "@adobe/fetch": "4.2.3", diff --git a/package.json b/package.json index 4a9426edf..fcec25919 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@adobe/spacecat-shared-data-access-v2": "npm:@adobe/spacecat-shared-data-access@2.109.0", "@adobe/spacecat-shared-drs-client": "1.3.1", "@adobe/spacecat-shared-gpt-client": "1.6.20", - "@adobe/spacecat-shared-http-utils": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/0253e4fc29b6e7d7ce7a66f336a746dd7b5f69fe/adobe-spacecat-shared-http-utils-1.25.1.tgz", + "@adobe/spacecat-shared-http-utils": "https://gist.github.com/ravverma/73fbd39cad0536f360791528e21c3857/raw/c039c780f04856012e2c2d7382a4ac7702965fbe/adobe-spacecat-shared-http-utils-1.25.1.tgz", "@adobe/spacecat-shared-ims-client": "1.12.2", "@adobe/spacecat-shared-rum-api-client": "2.40.10", "@adobe/spacecat-shared-scrape-client": "2.5.4", From be1b74f546b03507f163b7036d56973075bb174f Mon Sep 17 00:00:00 2001 From: Ravi Verma Date: Thu, 2 Apr 2026 17:18:09 +0530 Subject: [PATCH 5/5] fix: address PR review comments for read-only admin support - Document security invariant in hasAccess(): write protection is enforced by readOnlyAdminWrapper at the HTTP layer, making the org-bypass safe for read-only admins - Update readOnlyAdminWrapper comment to clarify fail-closed behavior for unmapped routes and link companion PR adobe/spacecat-shared#1469 - Add comment to POST sheet-data routes explaining they are non-mutating (POST used for complex query payloads, no side effects) - Add write-endpoint rejection tests for read-only admin on createOrg, createSite, createProject, and removeProject - Add edge case test for isReadOnlyAdmin absent on legacy authInfo Co-Authored-By: Claude Sonnet 4.6 --- src/index.js | 4 +++- src/routes/required-capabilities.js | 4 ++++ src/support/access-control-util.js | 5 ++++- test/controllers/organizations.test.js | 12 ++++++++++++ test/controllers/project.test.js | 24 ++++++++++++++++++++++++ test/controllers/sites.test.js | 10 ++++++++++ test/support/access-control-util.test.js | 10 ++++++++++ 7 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index f3c84c544..e1c2dde24 100644 --- a/src/index.js +++ b/src/index.js @@ -313,7 +313,9 @@ const { WORKSPACE_EXTERNAL } = SLACK_TARGETS; // Wrapper execution order (helix-shared-wrap: last .with() = outermost = runs first): // 1. s2sAuthWrapper — intercepts S2S JWT bearer tokens, passes through non-S2S to authWrapper // 2. authWrapper — handles JWT, IMS, scoped API key, legacy API key -// 3. readOnlyAdminWrapper — enforces read-only access for read-only admin tokens +// 3. readOnlyAdminWrapper — enforces read-only access for read-only admin tokens (see +// adobe/spacecat-shared#1469); routes not present in routeCapabilities default to deny +// (fail-closed), so unmapped routes are blocked for read-only admins const wrappedMain = wrap(run) .with(readOnlyAdminWrapper, { routeCapabilities: routeRequiredCapabilities }) .with(authWrapper, { diff --git a/src/routes/required-capabilities.js b/src/routes/required-capabilities.js index a63891d0f..fec0a38ee 100644 --- a/src/routes/required-capabilities.js +++ b/src/routes/required-capabilities.js @@ -390,6 +390,10 @@ const routeRequiredCapabilities = { 'GET /sites/:siteId/llmo/sheet-data/:dataSource': 'site:read', 'GET /sites/:siteId/llmo/sheet-data/:sheetType/:dataSource': 'site:read', 'GET /sites/:siteId/llmo/sheet-data/:sheetType/:week/:dataSource': 'site:read', + // These POST sheet-data routes use POST only to accommodate complex query payloads that exceed + // URL length limits. They are non-mutating (no side effects) and intentionally require + // only site:read, which also allows read-only admins and S2S consumers with read-only tokens + // to query sheet data. 'POST /sites/:siteId/llmo/sheet-data/:dataSource': 'site:read', 'POST /sites/:siteId/llmo/sheet-data/:sheetType/:dataSource': 'site:read', 'POST /sites/:siteId/llmo/sheet-data/:sheetType/:week/:dataSource': 'site:read', diff --git a/src/support/access-control-util.js b/src/support/access-control-util.js index 8a9b49aa8..a77f81c7b 100644 --- a/src/support/access-control-util.js +++ b/src/support/access-control-util.js @@ -161,7 +161,10 @@ export default class AccessControlUtil { } const { authInfo } = this; - // Check admin read access first - full and read-only admins bypass org/product validation + // Full admins and read-only admins both bypass org/product validation for data reads. + // Write operations are protected separately: the readOnlyAdminWrapper middleware blocks + // all non-GET requests for read-only admin tokens before they reach any controller, + // so a read-only admin can never mutate data even though hasAccess() returns true here. if (this.hasAdminReadAccess()) { return true; } diff --git a/test/controllers/organizations.test.js b/test/controllers/organizations.test.js index e62dece6c..a7bc3fab8 100755 --- a/test/controllers/organizations.test.js +++ b/test/controllers/organizations.test.js @@ -317,6 +317,18 @@ describe('Organizations Controller', () => { expect(error).to.have.property('message', 'Only admins can create new Organizations'); }); + it('returns forbidden for read-only admin when creating an organization', async () => { + context.attributes.authInfo.withProfile({ is_admin: false, is_read_only_admin: true }); + const controller = OrganizationsController(context, env); + const response = await controller.createOrganization({ + data: { name: 'Org 1' }, + ...context, + }); + expect(response.status).to.equal(403); + const error = await response.json(); + expect(error).to.have.property('message', 'Only admins can create new Organizations'); + }); + it('returns bad request when creating an organization fails', async () => { mockDataAccess.Organization.create.rejects(new Error('Failed to create organization')); const response = await organizationsController.createOrganization({ diff --git a/test/controllers/project.test.js b/test/controllers/project.test.js index 73613ca16..3255cf094 100644 --- a/test/controllers/project.test.js +++ b/test/controllers/project.test.js @@ -253,6 +253,18 @@ describe('Projects Controller', () => { expect(responseBody.message).to.equal('Only admins can create new projects'); }); + it('should return forbidden for read-only admin users', async () => { + context.attributes.authInfo.withProfile({ is_admin: false, is_read_only_admin: true }); + const response = await ProjectsController(context, { TEST_ENV: 'true' }).createProject({ + data: { projectName: 'New Project', organizationId: '9033554c-de8a-44ac-a356-09b51af8cc28' }, + ...context, + }); + + expect(response.status).to.equal(403); + const responseBody = await response.json(); + expect(responseBody.message).to.equal('Only admins can create new projects'); + }); + it('should return bad request when creation fails', async () => { mockDataAccess.Project.create.rejects(new Error('Validation failed')); const response = await projectsController.createProject({ @@ -385,6 +397,18 @@ describe('Projects Controller', () => { expect(responseBody.message).to.equal('Only admins can delete projects'); }); + it('should return forbidden for read-only admin users', async () => { + context.attributes.authInfo.withProfile({ is_admin: false, is_read_only_admin: true }); + const response = await ProjectsController(context, { TEST_ENV: 'true' }).removeProject({ + params: { projectId: '550e8400-e29b-41d4-a716-446655440000' }, + ...context, + }); + + expect(response.status).to.equal(403); + const responseBody = await response.json(); + expect(responseBody.message).to.equal('Only admins can delete projects'); + }); + it('should return bad request for invalid project ID', async () => { const response = await projectsController.removeProject({ params: { projectId: 'invalid-id' }, diff --git a/test/controllers/sites.test.js b/test/controllers/sites.test.js index 77bccf32c..ffd0db263 100644 --- a/test/controllers/sites.test.js +++ b/test/controllers/sites.test.js @@ -273,6 +273,16 @@ describe('Sites Controller', () => { expect(error).to.have.property('message', 'Only admins can create new sites'); }); + it('returns forbidden for read-only admin when creating a site', async () => { + context.attributes.authInfo.withProfile({ is_admin: false, is_read_only_admin: true }); + const response = await sitesController.createSite({ data: { baseURL: 'https://site1.com' } }); + + expect(mockDataAccess.Site.create).to.have.not.been.called; + expect(response.status).to.equal(403); + const error = await response.json(); + expect(error).to.have.property('message', 'Only admins can create new sites'); + }); + it('returns bad request when creating a site without baseURL', async () => { const response = await sitesController.createSite({ data: {} }); diff --git a/test/support/access-control-util.test.js b/test/support/access-control-util.test.js index 0cdc25806..1171c91da 100644 --- a/test/support/access-control-util.test.js +++ b/test/support/access-control-util.test.js @@ -1837,5 +1837,15 @@ describe('Access Control Util', () => { const result = await util.hasAccess(org); expect(result).to.be.false; }); + + it('hasAdminReadAccess returns false when isReadOnlyAdmin is absent (legacy authInfo)', () => { + // Legacy authInfo objects may not have isReadOnlyAdmin at all; optional chaining must + // handle the missing method gracefully without throwing. + const ctx = makeContext({ isAdmin: () => false }); + // Ensure the method is truly absent, not just returning false + delete ctx.attributes.authInfo.isReadOnlyAdmin; + const util = AccessControlUtil.fromContext(ctx); + expect(util.hasAdminReadAccess()).to.be.false; + }); }); });