diff --git a/docs/openapi/api.yaml b/docs/openapi/api.yaml index 2a62fc90b..253b29cec 100644 --- a/docs/openapi/api.yaml +++ b/docs/openapi/api.yaml @@ -240,6 +240,10 @@ paths: $ref: './site-opportunities.yaml#/site-opportunity-suggestions-status' /sites/{siteId}/opportunities/{opportunityId}/suggestions/auto-fix: $ref: './site-opportunities.yaml#/site-opportunity-suggestions-auto-fix' + /sites/{siteId}/opportunities/{opportunityId}/suggestions/edge-deploy: + $ref: './site-opportunities.yaml#/site-opportunity-suggestions-edge-deploy' + /sites/{siteId}/opportunities/{opportunityId}/suggestions/edge-deploy/{jobId}/status: + $ref: './site-opportunities.yaml#/site-opportunity-suggestions-edge-deploy-status' /sites/{siteId}/site-enrollments: $ref: './site-enrollments-api.yaml#/site-enrollments-by-site' /sites/{siteId}/user-activities: diff --git a/docs/openapi/site-opportunities.yaml b/docs/openapi/site-opportunities.yaml index ba2dcd4b2..ef3985a8c 100644 --- a/docs/openapi/site-opportunities.yaml +++ b/docs/openapi/site-opportunities.yaml @@ -504,6 +504,171 @@ site-opportunity-suggestions-status: security: - ims_key: [ ] +site-opportunity-suggestions-edge-deploy: + parameters: + - $ref: './parameters.yaml#/siteId' + - $ref: './parameters.yaml#/opportunityId' + post: + operationId: deploySuggestionsToEdge + summary: Deploy suggestions to edge with experiment pre/post analysis + description: | + Initiates an asynchronous edge deployment with DRS experiment analysis. + First submits a pre-analysis to DRS, creates an AsyncJob to track progress, + and returns a 202 Accepted with a poll URL for status updates. + The deployment proceeds through: pre-analysis -> edge deploy -> post-analysis. + tags: + - opportunity-suggestions + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - suggestionIds + properties: + suggestionIds: + type: array + items: + type: string + format: uuid + minItems: 1 + description: Array of suggestion UUIDs to deploy + responses: + '202': + description: Experiment deployment initiated + content: + application/json: + schema: + type: object + properties: + jobId: + type: string + format: uuid + description: AsyncJob ID for tracking + status: + type: string + enum: [pre_analysis_submitted] + experimentId: + type: string + description: Experiment identifier linking pre and post phases + experimentBatchId: + type: string + description: DRS batch ID for the pre-analysis + pollUrl: + type: string + format: uri + description: URL to poll for deployment status + metadata: + type: object + properties: + total: + type: integer + accepted: + type: integer + failed: + type: integer + failedSuggestions: + type: array + items: + type: object + properties: + uuid: + type: string + index: + type: integer + message: + type: string + statusCode: + type: integer + '400': + $ref: './responses.yaml#/400' + '401': + $ref: './responses.yaml#/401' + '403': + $ref: './responses.yaml#/403' + '404': + $ref: './responses.yaml#/404' + '500': + $ref: './responses.yaml#/500' + security: + - ims_key: [ ] + +site-opportunity-suggestions-edge-deploy-status: + parameters: + - $ref: './parameters.yaml#/siteId' + - $ref: './parameters.yaml#/opportunityId' + - name: jobId + in: path + required: true + schema: + type: string + format: uuid + description: The AsyncJob ID returned from edge-deploy + get: + operationId: getEdgeDeployStatus + summary: Get edge deployment experiment status + description: | + Returns the current status of an asynchronous edge deployment experiment, + including the deploy phase, experiment IDs, and any errors. + tags: + - opportunity-suggestions + responses: + '200': + description: Edge deploy job status + content: + application/json: + schema: + type: object + properties: + jobId: + type: string + format: uuid + status: + type: string + enum: [IN_PROGRESS, COMPLETED, FAILED, CANCELLED] + deployStatus: + type: string + enum: + - pre_analysis_submitted + - pre_analysis_done + - deployed + - post_analysis_submitted + - post_analysis_done + - failed + - deployed_post_analysis_failed + experimentId: + type: string + experimentIds: + type: array + items: + type: string + description: DRS experiment batch IDs (pre and/or post) + startedAt: + type: string + format: date-time + endedAt: + type: + - string + - 'null' + format: date-time + error: + type: + - object + - 'null' + '400': + $ref: './responses.yaml#/400' + '401': + $ref: './responses.yaml#/401' + '403': + $ref: './responses.yaml#/403' + '404': + $ref: './responses.yaml#/404' + '500': + $ref: './responses.yaml#/500' + security: + - ims_key: [ ] + site-opportunity-suggestions-auto-fix: parameters: - $ref: './parameters.yaml#/siteId' diff --git a/package-lock.json b/package-lock.json index 1417a4e30..08b4a2e2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,9 +20,9 @@ "@adobe/spacecat-shared-ahrefs-client": "1.10.7", "@adobe/spacecat-shared-athena-client": "1.9.7", "@adobe/spacecat-shared-brand-client": "1.1.38", - "@adobe/spacecat-shared-data-access": "3.20.1", + "@adobe/spacecat-shared-data-access": "https://gist.github.com/dipratap/c893e5f937a62e34bee0a889b0b5287b/raw/e0d032c920c09b19bbd05aef6d63720d39c052af/adobe-spacecat-shared-data-access-3.20.1.tgz", "@adobe/spacecat-shared-data-access-v2": "npm:@adobe/spacecat-shared-data-access@2.109.0", - "@adobe/spacecat-shared-drs-client": "1.3.0", + "@adobe/spacecat-shared-drs-client": "https://gist.github.com/dipratap/c893e5f937a62e34bee0a889b0b5287b/raw/e0d032c920c09b19bbd05aef6d63720d39c052af/adobe-spacecat-shared-drs-client-1.3.0.tgz", "@adobe/spacecat-shared-gpt-client": "1.6.19", "@adobe/spacecat-shared-http-utils": "1.22.2", "@adobe/spacecat-shared-ims-client": "1.11.13", @@ -313,92 +313,16 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.7.tgz", - "integrity": "sha512-goX+axlJ6PQlRnzE2bQisZ8wVrlm6dXJfBzMJhd8LhAIBan/w1Kl73fJnalM/S+18VnpzIHumyV6DtgmvqG5IA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-config-provider": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.7.tgz", - "integrity": "sha512-mvWqvm61bmZUKmmrtl2uWbokqpenY3Mc3Jf4nXB/Hse6gWxLPaCQThmhPBDzsPSV8/Odn8V6ovWt3pZ7vy4BFQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.5.tgz", - "integrity": "sha512-Dp3hqE5W6hG8HQ3Uh+AINx9wjjqYmFHbxede54sGj3akx/haIQrkp85lNdTdC+ouNUcSYNiuGkzmyDREfHX1Gg==", - "dev": true, - "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.973.19", - "@aws-sdk/crc64-nvme": "^3.972.4", - "@aws-sdk/types": "^3.973.5", - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-stream": "^4.5.17", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", - "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.7.tgz", - "integrity": "sha512-vdK1LJfffBp87Lj0Bw3WdK1rJk9OLDYdQpqoKgmpIZPe+4+HawZ6THTbvjhJt4C4MNnRrHTKHQjkwBiIpDBoig==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -406,14 +330,14 @@ } }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", - "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -421,57 +345,16 @@ } }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", - "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.19", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.19.tgz", - "integrity": "sha512-/CtOHHVFg4ZuN6CnLnYkrqWgVEnbOBC4kNiKa+4fldJ9cioDt3dD/f5vpq0cWLOXwmGL2zgVrVxNhjxWpxNMkg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.19", - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.9", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/signature-v4": "^5.3.11", - "@smithy/smithy-client": "^4.12.3", - "@smithy/types": "^4.13.0", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-stream": "^4.5.17", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.7.tgz", - "integrity": "sha512-G9clGVuAml7d8DYzY6DnRi7TIIDRvZ3YpqJPz/8wnWS5fYx/FNWNmkO6iJVlVkQg9BfeMzd+bVPtPJOvC4B+nQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -479,16 +362,16 @@ } }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", - "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/config-resolver": "^4.4.10", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -514,26 +397,13 @@ } }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -558,14 +428,14 @@ } }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", - "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -792,6 +662,7 @@ "resolved": "https://registry.npmjs.org/@adobe/helix-universal/-/helix-universal-5.4.0.tgz", "integrity": "sha512-3ZfFdjYtpv7RCgul9yyOBsRVsxLNapwt0YjASBhyzJGNjnPxrWDlqDtbpBdwAgA1Nuh9nmjzFDFu8CJWv6BMKw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@adobe/fetch": "4.2.3", "aws4": "1.13.2" @@ -1288,6 +1159,133 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-ahrefs-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-ahrefs-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-ahrefs-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-ahrefs-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-ahrefs-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-ahrefs-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-ahrefs-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-ahrefs-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", @@ -1355,6 +1353,23 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-ahrefs-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-ahrefs-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", @@ -1373,6 +1388,18 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-ahrefs-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-ahrefs-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", @@ -1398,9 +1425,9 @@ } }, "node_modules/@adobe/spacecat-shared-ahrefs-client/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -1726,256 +1753,412 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-athena-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==", + "node_modules/@adobe/spacecat-shared-athena-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/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", + "@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-athena-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==", + "node_modules/@adobe/spacecat-shared-athena-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-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-athena-client/node_modules/@aws-sdk/token-providers": { + "node_modules/@adobe/spacecat-shared-athena-client/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.940.0.tgz", - "integrity": "sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==", + "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/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/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-athena-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==", + "node_modules/@adobe/spacecat-shared-athena-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/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-athena-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-brand-client": { - "version": "1.1.38", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-brand-client/-/spacecat-shared-brand-client-1.1.38.tgz", - "integrity": "sha512-KqfMmJ1kPlJG3LnCdY1ovTEAQlYxXR2oy4/YaKVHwe+BG9iAY9G0RoMB2bjU35oUEbAiqNW9T7XHWdG/m2vXkg==", + "node_modules/@adobe/spacecat-shared-athena-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": { - "@adobe/helix-universal": "5.4.0", - "@adobe/spacecat-shared-ims-client": "1.11.10", - "@adobe/spacecat-shared-utils": "1.81.1" + "@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": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-brand-client/node_modules/@adobe/spacecat-shared-ims-client": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-ims-client/-/spacecat-shared-ims-client-1.11.10.tgz", - "integrity": "sha512-8cq0z1I4NRz0XmKXl+ot4VR33FdaI/F9HbmhrPfjrWIPRsMmz0TCd+ZSkcth4zmJOdQOGyzdxVnlu0WcTTh4jA==", + "node_modules/@adobe/spacecat-shared-athena-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": { - "@adobe/fetch": "4.2.3", - "@adobe/helix-universal": "5.4.0", - "@adobe/spacecat-shared-utils": "1.81.1", - "@aws-sdk/client-secrets-manager": "3.940.0", - "aws-xray-sdk": "3.12.0" + "@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": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-brand-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==", + "node_modules/@adobe/spacecat-shared-athena-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": { - "@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" + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-brand-client/node_modules/@aws-sdk/client-s3": { + "node_modules/@adobe/spacecat-shared-athena-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", - "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", + "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-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-brand-client/node_modules/@aws-sdk/client-secrets-manager": { + "node_modules/@adobe/spacecat-shared-athena-client/node_modules/@aws-sdk/nested-clients": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.940.0.tgz", - "integrity": "sha512-fpxSRsGyuXmyNqEwdGJUDWVgN0v8xR7tr32Quls3K+HnYlnBGFmISu5Pcc+BfwmrZHnPaVpPc+S3PUzTnFpOJg==", + "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/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-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-athena-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-athena-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-athena-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-athena-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-athena-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-brand-client": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-brand-client/-/spacecat-shared-brand-client-1.1.38.tgz", + "integrity": "sha512-KqfMmJ1kPlJG3LnCdY1ovTEAQlYxXR2oy4/YaKVHwe+BG9iAY9G0RoMB2bjU35oUEbAiqNW9T7XHWdG/m2vXkg==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/helix-universal": "5.4.0", + "@adobe/spacecat-shared-ims-client": "1.11.10", + "@adobe/spacecat-shared-utils": "1.81.1" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-brand-client/node_modules/@adobe/spacecat-shared-ims-client": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-ims-client/-/spacecat-shared-ims-client-1.11.10.tgz", + "integrity": "sha512-8cq0z1I4NRz0XmKXl+ot4VR33FdaI/F9HbmhrPfjrWIPRsMmz0TCd+ZSkcth4zmJOdQOGyzdxVnlu0WcTTh4jA==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/helix-universal": "5.4.0", + "@adobe/spacecat-shared-utils": "1.81.1", + "@aws-sdk/client-secrets-manager": "3.940.0", + "aws-xray-sdk": "3.12.0" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-brand-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-brand-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==", + "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-brand-client/node_modules/@aws-sdk/client-secrets-manager": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.940.0.tgz", + "integrity": "sha512-fpxSRsGyuXmyNqEwdGJUDWVgN0v8xR7tr32Quls3K+HnYlnBGFmISu5Pcc+BfwmrZHnPaVpPc+S3PUzTnFpOJg==", + "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", @@ -2231,6 +2414,133 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-brand-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-brand-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-brand-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-brand-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-brand-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-brand-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-brand-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-brand-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", @@ -2298,6 +2608,23 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-brand-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-brand-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", @@ -2316,6 +2643,18 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-brand-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-brand-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", @@ -2351,8 +2690,8 @@ }, "node_modules/@adobe/spacecat-shared-data-access": { "version": "3.20.1", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-data-access/-/spacecat-shared-data-access-3.20.1.tgz", - "integrity": "sha512-nqdegtIedbzEbGY4Y/7CgBFkKN83nVWUUOu7bZ9WnDiMDBZHr8n/DIqciE5DKLzOyyqiAia239x0gcyG9g01JQ==", + "resolved": "https://gist.github.com/dipratap/c893e5f937a62e34bee0a889b0b5287b/raw/e0d032c920c09b19bbd05aef6d63720d39c052af/adobe-spacecat-shared-data-access-3.20.1.tgz", + "integrity": "sha512-m7lazP0FoJEBH/QC0CE+6lThEPHBKSSiFP7xlhnkQmMmnUcACH6KIVQTIVOM+ud6vw1xpBHhIxOxmFajj1sIEg==", "license": "Apache-2.0", "dependencies": { "@adobe/fetch": "^4.2.3", @@ -2696,66 +3035,56 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access-v2/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==", + "node_modules/@adobe/spacecat-shared-data-access-v2/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/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", + "@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-data-access-v2/node_modules/@aws-sdk/nested-clients": { + "node_modules/@adobe/spacecat-shared-data-access-v2/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-data-access-v2/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz", - "integrity": "sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==", + "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/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", + "@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/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/is-array-buffer": "^4.2.0", "@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", "tslib": "^2.6.2" }, @@ -2763,17 +3092,13 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access-v2/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==", + "node_modules/@adobe/spacecat-shared-data-access-v2/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/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" }, @@ -2781,43 +3106,213 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access-v2/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-data-access-v2/node_modules/@aws-sdk/middleware-sdk-s3": { "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==", + "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/middleware-user-agent": "3.940.0", + "@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" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@adobe/spacecat-shared-data-access-v2/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-data-access/node_modules/@adobe/spacecat-shared-utils": { - "version": "1.101.0", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.101.0.tgz", - "integrity": "sha512-b2JOlFieT6Q0+lvtkU/3SD2iV8pEEwpBaUvyNzbeR4uCgLBsYgvmrMJptpHD9pAqC+FOrePVjTZt2WhEKYo+aQ==", + "node_modules/@adobe/spacecat-shared-data-access-v2/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-data-access-v2/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-data-access-v2/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-data-access-v2/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-data-access-v2/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-data-access-v2/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-data-access-v2/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-data-access-v2/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-data-access-v2/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-data-access/node_modules/@adobe/spacecat-shared-utils": { + "version": "1.101.0", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.101.0.tgz", + "integrity": "sha512-b2JOlFieT6Q0+lvtkU/3SD2iV8pEEwpBaUvyNzbeR4uCgLBsYgvmrMJptpHD9pAqC+FOrePVjTZt2WhEKYo+aQ==", "license": "Apache-2.0", "dependencies": { "@adobe/fetch": "4.2.3", @@ -2865,9 +3360,9 @@ } }, "node_modules/@adobe/spacecat-shared-data-access/node_modules/undici": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.1.tgz", - "integrity": "sha512-5xoBibbmnjlcR3jdqtY2Lnx7WbrD/tHlT01TmvqZUFVc9Q1w4+j5hbnapTqbcXITMH1ovjq/W7BkqBilHiVAaA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -2884,8 +3379,8 @@ }, "node_modules/@adobe/spacecat-shared-drs-client": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-drs-client/-/spacecat-shared-drs-client-1.3.0.tgz", - "integrity": "sha512-4EzFiFK+9SPoQcZAz1y5glcrOzGOGQe9HhKpTevxrIeqhlIBSCij8TFIVjsr0s5/uMVTzCrmY8WbKy8RVDRaEg==", + "resolved": "https://gist.github.com/dipratap/c893e5f937a62e34bee0a889b0b5287b/raw/e0d032c920c09b19bbd05aef6d63720d39c052af/adobe-spacecat-shared-drs-client-1.3.0.tgz", + "integrity": "sha512-KT+arxU5V8nJzHuvuIIBp+1JKAnqBJwq6+BvD28sdgRvqJAtSNtxzICeWmN+pJNCYOJJpfMNgakl8Bb74xhPQA==", "license": "Apache-2.0", "dependencies": { "@adobe/spacecat-shared-utils": "1.98.1" @@ -3038,87 +3533,15 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.7.tgz", - "integrity": "sha512-goX+axlJ6PQlRnzE2bQisZ8wVrlm6dXJfBzMJhd8LhAIBan/w1Kl73fJnalM/S+18VnpzIHumyV6DtgmvqG5IA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-config-provider": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.7.tgz", - "integrity": "sha512-mvWqvm61bmZUKmmrtl2uWbokqpenY3Mc3Jf4nXB/Hse6gWxLPaCQThmhPBDzsPSV8/Odn8V6ovWt3pZ7vy4BFQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.5.tgz", - "integrity": "sha512-Dp3hqE5W6hG8HQ3Uh+AINx9wjjqYmFHbxede54sGj3akx/haIQrkp85lNdTdC+ouNUcSYNiuGkzmyDREfHX1Gg==", - "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.973.19", - "@aws-sdk/crc64-nvme": "^3.972.4", - "@aws-sdk/types": "^3.973.5", - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-stream": "^4.5.17", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", - "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.7.tgz", - "integrity": "sha512-vdK1LJfffBp87Lj0Bw3WdK1rJk9OLDYdQpqoKgmpIZPe+4+HawZ6THTbvjhJt4C4MNnRrHTKHQjkwBiIpDBoig==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -3126,13 +3549,13 @@ } }, "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", - "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -3140,71 +3563,15 @@ } }, "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", - "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.19", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.19.tgz", - "integrity": "sha512-/CtOHHVFg4ZuN6CnLnYkrqWgVEnbOBC4kNiKa+4fldJ9cioDt3dD/f5vpq0cWLOXwmGL2zgVrVxNhjxWpxNMkg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.19", - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.9", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/signature-v4": "^5.3.11", - "@smithy/smithy-client": "^4.12.3", - "@smithy/types": "^4.13.0", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-stream": "^4.5.17", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-sdk-sqs": { - "version": "3.972.14", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.14.tgz", - "integrity": "sha512-MmN/j0D3MLkR0cca8/V2GXjGAkcgp1tlrQZZduLb6G+UhfOJuzFW3rSrCeiXTBgiXSIIZ6sc/gsuACpg/5TL1Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/smithy-client": "^4.12.3", - "@smithy/types": "^4.13.0", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.7.tgz", - "integrity": "sha512-G9clGVuAml7d8DYzY6DnRi7TIIDRvZ3YpqJPz/8wnWS5fYx/FNWNmkO6iJVlVkQg9BfeMzd+bVPtPJOvC4B+nQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -3212,32 +3579,15 @@ } }, "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", - "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/config-resolver": "^4.4.10", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.7.tgz", - "integrity": "sha512-mYhh7FY+7OOqjkYkd6+6GgJOsXK1xBWmuR+c5mxJPj2kr5TBNeZq+nUvE9kANWAux5UxDVrNOSiEM/wlHzC3Lg==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.19", - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/signature-v4": "^5.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -3245,24 +3595,12 @@ } }, "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -3270,15 +3608,15 @@ } }, "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", - "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "version": "3.996.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-endpoints": "^3.3.2", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-endpoints": "^3.3.3", "tslib": "^2.6.2" }, "engines": { @@ -3286,13 +3624,13 @@ } }, "node_modules/@adobe/spacecat-shared-drs-client/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", - "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -3323,9 +3661,9 @@ } }, "node_modules/@adobe/spacecat-shared-drs-client/node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -3728,6 +4066,133 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-gpt-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-gpt-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-gpt-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-gpt-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-gpt-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-gpt-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-gpt-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-gpt-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", @@ -3795,6 +4260,23 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-gpt-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-gpt-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", @@ -3813,6 +4295,18 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-gpt-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-gpt-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", @@ -4166,6 +4660,133 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-http-utils/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-http-utils/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-http-utils/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-http-utils/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-http-utils/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-http-utils/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-http-utils/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-http-utils/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", @@ -4233,6 +4854,23 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-http-utils/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-http-utils/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", @@ -4251,6 +4889,18 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-http-utils/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-http-utils/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", @@ -4276,9 +4926,9 @@ } }, "node_modules/@adobe/spacecat-shared-http-utils/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -4391,95 +5041,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-s3/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-ims-client/node_modules/@aws-sdk/client-s3/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-ims-client/node_modules/@aws-sdk/client-s3/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-ims-client/node_modules/@aws-sdk/client-s3/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-ims-client/node_modules/@aws-sdk/client-secrets-manager": { "version": "3.1009.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1009.0.tgz", @@ -4530,6 +5091,188 @@ "node": ">=20.0.0" } }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/core": { + "version": "3.973.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.20.tgz", + "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/xml-builder": "^3.972.11", + "@smithy/core": "^3.23.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.18.tgz", + "integrity": "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.20.tgz", + "integrity": "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.19", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.20.tgz", + "integrity": "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/credential-provider-env": "^3.972.18", + "@aws-sdk/credential-provider-http": "^3.972.20", + "@aws-sdk/credential-provider-login": "^3.972.20", + "@aws-sdk/credential-provider-process": "^3.972.18", + "@aws-sdk/credential-provider-sso": "^3.972.20", + "@aws-sdk/credential-provider-web-identity": "^3.972.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz", + "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.21.tgz", + "integrity": "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.18", + "@aws-sdk/credential-provider-http": "^3.972.20", + "@aws-sdk/credential-provider-ini": "^3.972.20", + "@aws-sdk/credential-provider-process": "^3.972.18", + "@aws-sdk/credential-provider-sso": "^3.972.20", + "@aws-sdk/credential-provider-web-identity": "^3.972.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.18.tgz", + "integrity": "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.20.tgz", + "integrity": "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/token-providers": "3.1009.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.20.tgz", + "integrity": "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/middleware-host-header": { "version": "3.972.8", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", @@ -4575,6 +5318,74 @@ "node": ">=20.0.0" } }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz", + "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@smithy/core": "^3.23.11", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-retry": "^4.2.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/nested-clients": { + "version": "3.996.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz", + "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/middleware-host-header": "^3.972.8", + "@aws-sdk/middleware-logger": "^3.972.8", + "@aws-sdk/middleware-recursion-detection": "^3.972.8", + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/region-config-resolver": "^3.972.8", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@aws-sdk/util-user-agent-browser": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.973.7", + "@smithy/config-resolver": "^4.4.11", + "@smithy/core": "^3.23.11", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/hash-node": "^4.2.12", + "@smithy/invalid-dependency": "^4.2.12", + "@smithy/middleware-content-length": "^4.2.12", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-retry": "^4.4.42", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.41", + "@smithy/util-defaults-mode-node": "^4.2.44", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/region-config-resolver": { "version": "3.972.8", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", @@ -4591,6 +5402,24 @@ "node": ">=20.0.0" } }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/token-providers": { + "version": "3.1009.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1009.0.tgz", + "integrity": "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/types": { "version": "3.973.6", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", @@ -4632,6 +5461,45 @@ "tslib": "^2.6.2" } }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.973.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz", + "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/types": "^3.973.6", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/xml-builder": { + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz", + "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "fast-xml-parser": "5.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@adobe/spacecat-shared-ims-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", @@ -4684,7 +5552,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-ims-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==", @@ -4708,71 +5576,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-sqs/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-ims-client/node_modules/@aws-sdk/client-sqs/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-ims-client/node_modules/@aws-sdk/client-sqs/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-ims-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", @@ -4789,30 +5592,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-env/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-ims-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", @@ -4834,30 +5613,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-http/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-ims-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", @@ -4883,24 +5638,23 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", + "@smithy/credential-provider-imds": "^4.2.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/shared-ini-file-loader": "^4.4.0", "@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": { @@ -4924,39 +5678,33 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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", - "@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/shared-ini-file-loader": "^4.4.0", "@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-ims-client/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-web-identity": { "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==", + "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/client-sso": "3.940.0", "@aws-sdk/core": "3.940.0", - "@aws-sdk/token-providers": "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", @@ -4967,41 +5715,32 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-sso/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==", + "node_modules/@adobe/spacecat-shared-ims-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/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", + "@aws-sdk/util-arn-parser": "3.893.0", "@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", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-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==", + "node_modules/@adobe/spacecat-shared-ims-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/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/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -5009,23 +5748,23 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", + "@smithy/is-array-buffer": "^4.2.0", "@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-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -5033,48 +5772,38 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/nested-clients": { + "node_modules/@adobe/spacecat-shared-ims-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-ims-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz", - "integrity": "sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==", + "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-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", + "@aws-sdk/util-arn-parser": "3.893.0", "@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/signature-v4": "^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-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -5082,23 +5811,16 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/nested-clients/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==", + "node_modules/@adobe/spacecat-shared-ims-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", - "@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-hex-encoding": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -5106,7 +5828,21 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-ims-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-ims-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==", @@ -5124,28 +5860,70 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/nested-clients": { "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==", + "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-ims-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" }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/token-providers": { @@ -5166,34 +5944,65 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-ims-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-ims-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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", - "@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" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/fast-xml-parser": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.0.0", + "strnum": "^2.1.2" + }, + "bin": { + "fxparser": "src/cli/cli.js" } }, "node_modules/@adobe/spacecat-shared-ims-client/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -5523,6 +6332,133 @@ "node": ">=18.0.0" } }, + "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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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", @@ -5590,6 +6526,23 @@ "node": ">=18.0.0" } }, + "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==", + "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-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", @@ -5608,6 +6561,18 @@ "node": ">=18.0.0" } }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "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", @@ -5633,9 +6598,9 @@ } }, "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==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -5961,6 +6926,133 @@ "node": ">=18.0.0" } }, + "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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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", @@ -6028,6 +7120,23 @@ "node": ">=18.0.0" } }, + "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==", + "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-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", @@ -6046,6 +7155,18 @@ "node": ">=18.0.0" } }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "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", @@ -6071,9 +7192,9 @@ } }, "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==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -6399,6 +7520,133 @@ "node": ">=18.0.0" } }, + "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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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==", + "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-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", @@ -6466,6 +7714,23 @@ "node": ">=18.0.0" } }, + "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==", + "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-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", @@ -6484,6 +7749,18 @@ "node": ">=18.0.0" } }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "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", @@ -6533,9 +7810,9 @@ } }, "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==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -6860,6 +8137,133 @@ "node": ">=18.0.0" } }, + "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==", + "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-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==", + "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-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", @@ -6927,6 +8331,23 @@ "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", @@ -6945,6 +8366,18 @@ "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", @@ -6970,9 +8403,9 @@ } }, "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==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -7087,23 +8520,56 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/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/@adobe/spacecat-shared-utils/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/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", + "@smithy/is-array-buffer": "^4.2.0", "@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-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -7111,22 +8577,13 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/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==", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/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/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" }, @@ -7134,17 +8591,38 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-sdk-s3": { "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==", + "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-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/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/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" }, @@ -7152,28 +8630,21 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/signature-v4-multi-region": { "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==", + "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-user-agent": "3.940.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", + "@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" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3": { @@ -7242,32 +8713,39 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz", - "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { + "version": "3.973.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.20.tgz", + "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-arn-parser": "^3.972.3", + "@aws-sdk/xml-builder": "^3.972.11", + "@smithy/core": "^3.23.11", "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz", - "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.18.tgz", + "integrity": "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "^3.973.20", "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", + "@smithy/property-provider": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, @@ -7275,39 +8753,141 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.973.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.6.tgz", - "integrity": "sha512-0nYEgkJH7Yt9k+nZJyllTghnkKaz17TWFcr5Mi0XMVMzYlF4ytDZADQpF2/iJo36cKL5AYSzRsvlykE4M/ErTA==", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.20.tgz", + "integrity": "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==", "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.973.20", - "@aws-sdk/crc64-nvme": "^3.972.5", "@aws-sdk/types": "^3.973.6", - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/node-config-provider": "^4.3.12", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", - "@smithy/util-middleware": "^4.2.12", "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", - "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.20.tgz", + "integrity": "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/credential-provider-env": "^3.972.18", + "@aws-sdk/credential-provider-http": "^3.972.20", + "@aws-sdk/credential-provider-login": "^3.972.20", + "@aws-sdk/credential-provider-process": "^3.972.18", + "@aws-sdk/credential-provider-sso": "^3.972.20", + "@aws-sdk/credential-provider-web-identity": "^3.972.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz", + "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.21.tgz", + "integrity": "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.18", + "@aws-sdk/credential-provider-http": "^3.972.20", + "@aws-sdk/credential-provider-ini": "^3.972.20", + "@aws-sdk/credential-provider-process": "^3.972.18", + "@aws-sdk/credential-provider-sso": "^3.972.20", + "@aws-sdk/credential-provider-web-identity": "^3.972.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.18.tgz", + "integrity": "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.20.tgz", + "integrity": "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/token-providers": "3.1009.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.20.tgz", + "integrity": "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, @@ -7315,13 +8895,14 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-location-constraint": { + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz", - "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, @@ -7359,39 +8940,68 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.20.tgz", - "integrity": "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz", + "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-arn-parser": "^3.972.3", + "@aws-sdk/util-endpoints": "^3.996.5", "@smithy/core": "^3.23.11", - "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", + "@smithy/util-retry": "^4.2.12", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz", - "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/nested-clients": { + "version": "3.996.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz", + "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/middleware-host-header": "^3.972.8", + "@aws-sdk/middleware-logger": "^3.972.8", + "@aws-sdk/middleware-recursion-detection": "^3.972.8", + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/region-config-resolver": "^3.972.8", "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@aws-sdk/util-user-agent-browser": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.973.7", + "@smithy/config-resolver": "^4.4.11", + "@smithy/core": "^3.23.11", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/hash-node": "^4.2.12", + "@smithy/invalid-dependency": "^4.2.12", + "@smithy/middleware-content-length": "^4.2.12", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-retry": "^4.4.42", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.41", + "@smithy/util-defaults-mode-node": "^4.2.44", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -7414,16 +9024,17 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.8.tgz", - "integrity": "sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg==", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { + "version": "3.1009.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1009.0.tgz", + "integrity": "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.20", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, @@ -7472,6 +9083,45 @@ "tslib": "^2.6.2" } }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.973.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz", + "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/types": "^3.973.6", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/xml-builder": { + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz", + "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "fast-xml-parser": "5.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.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", @@ -7524,7 +9174,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/core": { + "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==", @@ -7548,71 +9198,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/client-sqs/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/client-sqs/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-tokowaka-client/node_modules/@aws-sdk/client-sqs/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-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", @@ -7629,30 +9214,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-env/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-http": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz", @@ -7674,30 +9235,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-http/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-ini": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz", @@ -7723,24 +9260,23 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/core": { + "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/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", + "@smithy/credential-provider-imds": "^4.2.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/shared-ini-file-loader": "^4.4.0", "@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": { @@ -7764,30 +9300,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-process/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-sso": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz", @@ -7807,66 +9319,53 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/core": { + "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/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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", - "@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/shared-ini-file-loader": "^4.4.0", "@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-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==", + "node_modules/@adobe/spacecat-shared-tokowaka-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/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/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-tokowaka-client/node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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/xml-builder": "3.930.0", + "@aws-sdk/util-endpoints": "3.936.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": { @@ -7922,49 +9421,37 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/@aws-sdk/token-providers": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "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", - "@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/shared-ini-file-loader": "^4.4.0", "@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/nested-clients/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==", + "node_modules/@adobe/spacecat-shared-tokowaka-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": { - "@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-tokowaka-client/node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-tokowaka-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==", @@ -7988,58 +9475,23 @@ } } }, - "node_modules/@adobe/spacecat-shared-tokowaka-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-tokowaka-client/node_modules/@aws-sdk/token-providers/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/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", - "license": "Apache-2.0", + "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/fast-xml-parser": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "fast-xml-builder": "^1.0.0", + "strnum": "^2.1.2" }, - "engines": { - "node": ">=20.0.0" + "bin": { + "fxparser": "src/cli/cli.js" } }, "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/mdast-util-from-markdown": { @@ -8101,9 +9553,9 @@ } }, "node_modules/@adobe/spacecat-shared-tokowaka-client/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -8252,64 +9704,6 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz", - "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz", - "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.973.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.6.tgz", - "integrity": "sha512-0nYEgkJH7Yt9k+nZJyllTghnkKaz17TWFcr5Mi0XMVMzYlF4ytDZADQpF2/iJo36cKL5AYSzRsvlykE4M/ErTA==", - "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.973.20", - "@aws-sdk/crc64-nvme": "^3.972.5", - "@aws-sdk/types": "^3.973.6", - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-host-header": { "version": "3.972.8", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", @@ -8325,20 +9719,6 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz", - "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-logger": { "version": "3.972.8", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", @@ -8369,62 +9749,6 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.20", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.20.tgz", - "integrity": "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.20", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.11", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.19", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-sdk-sqs": { - "version": "3.972.15", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.15.tgz", - "integrity": "sha512-X7yt+gJzZEK247nppuUVWS1i83q8zhZdBk1H2b6/qeXNv1ILgw0bQLNbFNG4gJi3P7vZV+PhtPkax0nwXAvRtg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/smithy-client": "^4.12.5", - "@smithy/types": "^4.13.1", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz", - "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/region-config-resolver": { "version": "3.972.8", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", @@ -8441,23 +9765,6 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.8.tgz", - "integrity": "sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.20", - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/types": { "version": "3.973.6", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", @@ -8471,18 +9778,6 @@ "node": ">=20.0.0" } }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/util-endpoints": { "version": "3.996.5", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", @@ -8537,18 +9832,18 @@ } }, "node_modules/@adobe/spacecat-shared-utils/node_modules/undici": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.3.tgz", - "integrity": "sha512-eJdUmK/Wrx2d+mnWWmwwLRyA7OQCkLap60sk3dOK4ViZR7DKwwptwuIvFBg2HaiP9ESaEdhtpSymQPvytpmkCA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", "license": "MIT", "engines": { "node": ">=20.18.1" } }, "node_modules/@adobe/spacecat-shared-utils/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -8832,15 +10127,15 @@ } }, "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", - "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -8848,14 +10143,14 @@ } }, "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", - "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -8863,16 +10158,16 @@ } }, "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", - "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -8880,16 +10175,16 @@ } }, "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", - "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -8897,13 +10192,13 @@ } }, "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/types": { - "version": "3.973.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", - "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -8928,14 +10223,14 @@ } }, "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", - "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -9251,6 +10546,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.940.0.tgz", "integrity": "sha512-u2sXsNJazJbuHeWICvsj6RvNyJh3isedEfPvB21jK/kxcriK+dE/izlKC2cyxUjERCmku0zTFNzY9FhrLbYHjQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -9627,15 +10923,15 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", - "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9643,14 +10939,14 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", - "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9658,16 +10954,16 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", - "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9675,16 +10971,16 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", - "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9692,13 +10988,13 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { - "version": "3.973.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", - "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9723,14 +11019,14 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", - "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -9801,87 +11097,15 @@ "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.7.tgz", - "integrity": "sha512-goX+axlJ6PQlRnzE2bQisZ8wVrlm6dXJfBzMJhd8LhAIBan/w1Kl73fJnalM/S+18VnpzIHumyV6DtgmvqG5IA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-config-provider": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.7.tgz", - "integrity": "sha512-mvWqvm61bmZUKmmrtl2uWbokqpenY3Mc3Jf4nXB/Hse6gWxLPaCQThmhPBDzsPSV8/Odn8V6ovWt3pZ7vy4BFQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.973.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.4.tgz", - "integrity": "sha512-7CH2jcGmkvkHc5Buz9IGbdjq1729AAlgYJiAvGq7qhCHqYleCsriWdSnmsqWTwdAfXHMT+pkxX3w6v5tJNcSug==", - "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.973.18", - "@aws-sdk/crc64-nvme": "^3.972.4", - "@aws-sdk/types": "^3.973.5", - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-stream": "^4.5.17", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", - "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.7.tgz", - "integrity": "sha512-vdK1LJfffBp87Lj0Bw3WdK1rJk9OLDYdQpqoKgmpIZPe+4+HawZ6THTbvjhJt4C4MNnRrHTKHQjkwBiIpDBoig==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9889,13 +11113,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", - "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9903,54 +11127,15 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", - "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.18.tgz", - "integrity": "sha512-5E3XxaElrdyk6ZJ0TjH7Qm6ios4b/qQCiLr6oQ8NK7e4Kn6JBTJCaYioQCQ65BpZ1+l1mK5wTAac2+pEz0Smpw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.8", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/signature-v4": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-stream": "^4.5.17", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.7.tgz", - "integrity": "sha512-G9clGVuAml7d8DYzY6DnRi7TIIDRvZ3YpqJPz/8wnWS5fYx/FNWNmkO6iJVlVkQg9BfeMzd+bVPtPJOvC4B+nQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9958,32 +11143,15 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", - "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/config-resolver": "^4.4.10", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.6.tgz", - "integrity": "sha512-NnsOQsVmJXy4+IdPFUjRCWPn9qNH1TzS/f7MiWgXeoHs903tJpAWQWQtoFvLccyPoBgomKP9L89RRr2YsT/L0g==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.18", - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/signature-v4": "^5.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -9991,24 +11159,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10016,15 +11172,15 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", - "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "version": "3.996.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-endpoints": "^3.3.2", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-endpoints": "^3.3.3", "tslib": "^2.6.2" }, "engines": { @@ -10032,13 +11188,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", - "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -10094,14 +11250,14 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", - "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10109,13 +11265,13 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", - "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10123,15 +11279,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", - "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10139,15 +11295,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", - "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/config-resolver": "^4.4.10", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10155,12 +11311,12 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10168,15 +11324,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", - "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "version": "3.996.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-endpoints": "^3.3.2", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-endpoints": "^3.3.3", "tslib": "^2.6.2" }, "engines": { @@ -10184,13 +11340,13 @@ } }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", - "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -10246,14 +11402,14 @@ } }, "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", - "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10261,13 +11417,13 @@ } }, "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", - "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10275,15 +11431,15 @@ } }, "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", - "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10291,15 +11447,15 @@ } }, "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", - "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/config-resolver": "^4.4.10", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10307,12 +11463,12 @@ } }, "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10320,15 +11476,15 @@ } }, "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", - "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "version": "3.996.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-endpoints": "^3.3.2", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-endpoints": "^3.3.3", "tslib": "^2.6.2" }, "engines": { @@ -10336,13 +11492,13 @@ } }, "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", - "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -10400,14 +11556,14 @@ } }, "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", - "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10415,13 +11571,13 @@ } }, "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", - "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10429,32 +11585,15 @@ } }, "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", - "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/middleware-sdk-sqs": { - "version": "3.972.13", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.13.tgz", - "integrity": "sha512-DiGD+Q636hk1+nTq/zSZe1Ih5GhEwmOzH/3oR3A+0/53hVK8E4OWFqAf9dwPE9pufp4mCmn/bE6qU8mE9Q6sig==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10462,15 +11601,15 @@ } }, "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", - "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/config-resolver": "^4.4.10", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10478,12 +11617,12 @@ } }, "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10491,15 +11630,15 @@ } }, "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", - "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "version": "3.996.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-endpoints": "^3.3.2", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-endpoints": "^3.3.3", "tslib": "^2.6.2" }, "engines": { @@ -10507,13 +11646,13 @@ } }, "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", - "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -10571,15 +11710,15 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", - "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10587,14 +11726,14 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", - "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10602,16 +11741,16 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", - "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10619,16 +11758,16 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", - "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10636,13 +11775,13 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/types": { - "version": "3.973.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", - "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10667,14 +11806,14 @@ } }, "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", - "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -10846,15 +11985,15 @@ } }, "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", - "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10862,14 +12001,14 @@ } }, "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", - "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10877,16 +12016,16 @@ } }, "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", - "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", + "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10894,16 +12033,16 @@ } }, "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", - "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10911,13 +12050,13 @@ } }, "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { - "version": "3.973.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", - "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -10942,14 +12081,14 @@ } }, "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", - "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } @@ -11478,21 +12617,34 @@ } }, "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==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz", + "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", "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", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { @@ -11513,66 +12665,69 @@ } }, "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==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz", + "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, "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==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.6.tgz", + "integrity": "sha512-0nYEgkJH7Yt9k+nZJyllTghnkKaz17TWFcr5Mi0XMVMzYlF4ytDZADQpF2/iJo36cKL5AYSzRsvlykE4M/ErTA==", "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", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/crc64-nvme": "^3.972.5", + "@aws-sdk/types": "^3.973.6", + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.19", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/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==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "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", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { @@ -11591,17 +12746,30 @@ } }, "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==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz", + "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { @@ -11635,83 +12803,98 @@ } }, "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==", + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.20.tgz", + "integrity": "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==", "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", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/core": "^3.23.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.19", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/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==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "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", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "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==", + "version": "3.972.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.15.tgz", + "integrity": "sha512-X7yt+gJzZEK247nppuUVWS1i83q8zhZdBk1H2b6/qeXNv1ILgw0bQLNbFNG4gJi3P7vZV+PhtPkax0nwXAvRtg==", "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", + "@aws-sdk/types": "^3.973.6", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sqs/node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, "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==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz", + "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { @@ -11948,88 +13131,47 @@ "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.18.tgz", - "integrity": "sha512-5E3XxaElrdyk6ZJ0TjH7Qm6ios4b/qQCiLr6oQ8NK7e4Kn6JBTJCaYioQCQ65BpZ1+l1mK5wTAac2+pEz0Smpw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.8", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/signature-v4": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-stream": "^4.5.17", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.6.tgz", - "integrity": "sha512-NnsOQsVmJXy4+IdPFUjRCWPn9qNH1TzS/f7MiWgXeoHs903tJpAWQWQtoFvLccyPoBgomKP9L89RRr2YsT/L0g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.18", - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/signature-v4": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.8.tgz", + "integrity": "sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/middleware-sdk-s3": "^3.972.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "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==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "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", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/token-providers": { @@ -12077,15 +13219,15 @@ } }, "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==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", + "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-dynamodb": { @@ -12120,14 +13262,14 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.7.tgz", - "integrity": "sha512-V+PbnWfUl93GuFwsOHsAq7hY/fnm9kElRqR8IexIJr5Rvif9e614X5sGSyz3mVSf1YAZ+VTy63W1/pGdA55zyA==", + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.8.tgz", + "integrity": "sha512-J6DS9oocrgxM8xlUTTmQOuwRF6rnAGEujAN9SAzllcrQmwn5iJ58ogxy3SEhD0Q7JZvlA5jvIXBkpQRqEqlE9A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/querystring-builder": "^4.2.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -12135,12 +13277,12 @@ } }, "node_modules/@aws-sdk/util-format-url/node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", + "@smithy/types": "^4.13.1", "tslib": "^2.6.2" }, "engines": { @@ -12839,6 +13981,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/config-helpers": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", @@ -12852,7 +14007,7 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "node_modules/@eslint/core": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", @@ -12865,19 +14020,6 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.0.tgz", - "integrity": "sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, "node_modules/@eslint/eslintrc": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", @@ -12939,6 +14081,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { "version": "9.39.4", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", @@ -13515,6 +14670,7 @@ "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.80.tgz", "integrity": "sha512-vcJDV2vk1AlCwSh3aBm/urQ1ZrlXFFBocv11bz/NBUfLWD5/UDNMzwPdaAd2dKvNmTWa9FM2lirLU3+JCf4cRA==", "license": "MIT", + "peer": true, "dependencies": { "@cfworker/json-schema": "^4.0.2", "ansi-styles": "^5.0.0", @@ -13746,6 +14902,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -13952,6 +15109,7 @@ "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -14115,6 +15273,7 @@ "integrity": "sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1", @@ -14352,24 +15511,6 @@ "npm": ">=10" } }, - "node_modules/@redocly/cli/node_modules/ajv": { - "name": "@redocly/ajv", - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-F+LMD2IDIXuHxgpLJh3nkLj9+tSaEzoUWd+7fONGq5pe2169FUDjpEkOfEpoGLz1sbZni/69p07OsecNfAOpqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@redocly/cli/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -14521,9 +15662,9 @@ } }, "node_modules/@redocly/config": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.44.0.tgz", - "integrity": "sha512-UHKkWcCNZrGiKBbrQ1CE08ElrOUGm5H97Zn8+wkp80Uu2AT/go5In1sbqvhHxViPYtu1MLdy7qKiifSyOL3W/A==", + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.44.1.tgz", + "integrity": "sha512-l6/ZE+/RBfNDdhzltau6cbW8+k5PgJbJBMqaBrlQlZQlmGBHMxqGyDaon4dPLj0jdi37gsMQ3yf95JBY/vaDSg==", "dev": true, "license": "MIT", "dependencies": { @@ -14553,24 +15694,6 @@ "npm": ">=10" } }, - "node_modules/@redocly/openapi-core/node_modules/ajv": { - "name": "@redocly/ajv", - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-F+LMD2IDIXuHxgpLJh3nkLj9+tSaEzoUWd+7fONGq5pe2169FUDjpEkOfEpoGLz1sbZni/69p07OsecNfAOpqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@redocly/openapi-core/node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", @@ -14603,24 +15726,6 @@ "npm": ">=10" } }, - "node_modules/@redocly/respect-core/node_modules/ajv": { - "name": "@redocly/ajv", - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-F+LMD2IDIXuHxgpLJh3nkLj9+tSaEzoUWd+7fONGq5pe2169FUDjpEkOfEpoGLz1sbZni/69p07OsecNfAOpqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -16089,6 +17194,7 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", @@ -16390,11 +17496,12 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16436,11 +17543,13 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "name": "@redocly/ajv", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-F+LMD2IDIXuHxgpLJh3nkLj9+tSaEzoUWd+7fONGq5pe2169FUDjpEkOfEpoGLz1sbZni/69p07OsecNfAOpqA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -16916,6 +18025,7 @@ "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.12.0.tgz", "integrity": "sha512-lwalRdxXRy+Sn49/vN7W507qqmBRk5Fy2o0a9U6XTjL9IV+oR5PUiiptoBrOcaYCiVuGld8OEbNqhm6wvV3m6A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "^3.4.1", "@smithy/service-error-classification": "^2.0.4", @@ -17566,6 +18676,7 @@ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -19755,6 +20866,7 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -20006,6 +21118,19 @@ "dev": true, "license": "MIT" }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/esmock": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esmock/-/esmock-2.7.3.tgz", @@ -20283,16 +21408,19 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", - "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.3.tgz", + "integrity": "sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } }, "node_modules/fast-xml-parser": { "version": "5.2.5", @@ -23749,6 +24877,7 @@ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -24748,9 +25877,9 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -24804,6 +25933,7 @@ "integrity": "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==", "dev": true, "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" @@ -27976,6 +29106,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -28645,6 +29776,7 @@ "resolved": "https://registry.npmjs.org/openai/-/openai-5.12.2.tgz", "integrity": "sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ==", "license": "Apache-2.0", + "peer": true, "bin": { "openai": "bin/cli" }, @@ -28662,21 +29794,21 @@ } }, "node_modules/openapi-sampler": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.1.tgz", - "integrity": "sha512-pKFRROcYyxRt9GIn0NmS+GkWPS19l0CLQRYAnHk4m1Qp+G43ssVNcfRMs1sLkGrVMuFWO4P4F6YMXeXnfyFGuQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.2.tgz", + "integrity": "sha512-OKytvqB5XIaTgA9xtw8W8UTar+uymW2xPVpFN0NihMtuHPdPTGxBEhGnfFnJW5g/gOSIvkP+H0Xh3XhVI9/n7g==", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", - "fast-xml-parser": "^5.3.8", + "fast-xml-parser": "^5.5.1", "json-pointer": "0.6.2" } }, "node_modules/openapi-sampler/node_modules/fast-xml-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.2.tgz", - "integrity": "sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.5.tgz", + "integrity": "sha512-NLY+V5NNbdmiEszx9n14mZBseJTC50bRq1VHsaxOmR72JDuZt+5J1Co+dC/4JPnyq+WrIHNM69r0sqf7BMb3Mg==", "dev": true, "funding": [ { @@ -28686,7 +29818,8 @@ ], "license": "MIT", "dependencies": { - "fast-xml-builder": "^1.0.0", + "fast-xml-builder": "^1.1.3", + "path-expression-matcher": "^1.1.3", "strnum": "^2.1.2" }, "bin": { @@ -29083,6 +30216,21 @@ "node": ">=8" } }, + "node_modules/path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -29126,9 +30274,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -29737,6 +30885,7 @@ "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", "devOptional": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -29747,6 +30896,7 @@ "integrity": "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -30456,6 +31606,7 @@ "integrity": "sha512-phCkJ6pjDi9ANdhuF5ElS10GGdAKY6R1Pvt9lT3SFhOwM4T7QZE7MLpBDbNruUx/Q3gFD92/UOFringGipRqZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", @@ -31893,9 +33044,9 @@ } }, "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", "funding": [ { "type": "github", @@ -31917,6 +33068,7 @@ "integrity": "sha512-J72R4ltw0UBVUlEjTzI0gg2STOqlI9JBhQOL4Dxt7aJOnnSesy0qJDn4PYfMCafk9cWOaVg129Pesl5o+DIh0Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@emotion/is-prop-valid": "1.4.0", "@emotion/unitless": "0.10.0", @@ -32558,9 +33710,9 @@ } }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true, "license": "MIT", "engines": { @@ -32597,9 +33749,9 @@ } }, "node_modules/tldts-core": { - "version": "7.0.25", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.25.tgz", - "integrity": "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==", + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.26.tgz", + "integrity": "sha512-5WJ2SqFsv4G2Dwi7ZFVRnz6b2H1od39QME1lc2y5Ew3eWiZMAeqOAfWpRP9jHvhUl881406QtZTODvjttJs+ew==", "license": "MIT" }, "node_modules/to-buffer": { @@ -33000,6 +34152,7 @@ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "license": "MIT", + "peer": true, "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -33726,6 +34879,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -33990,6 +35144,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -33999,6 +35154,7 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", "license": "ISC", + "peer": true, "peerDependencies": { "zod": "^3.25 || ^4" } diff --git a/package.json b/package.json index 78075399c..1e7e967fd 100644 --- a/package.json +++ b/package.json @@ -76,9 +76,9 @@ "@adobe/spacecat-shared-ahrefs-client": "1.10.7", "@adobe/spacecat-shared-athena-client": "1.9.7", "@adobe/spacecat-shared-brand-client": "1.1.38", - "@adobe/spacecat-shared-data-access": "3.20.1", + "@adobe/spacecat-shared-data-access": "https://gist.github.com/dipratap/c893e5f937a62e34bee0a889b0b5287b/raw/e0d032c920c09b19bbd05aef6d63720d39c052af/adobe-spacecat-shared-data-access-3.20.1.tgz", "@adobe/spacecat-shared-data-access-v2": "npm:@adobe/spacecat-shared-data-access@2.109.0", - "@adobe/spacecat-shared-drs-client": "1.3.0", + "@adobe/spacecat-shared-drs-client": "https://gist.github.com/dipratap/c893e5f937a62e34bee0a889b0b5287b/raw/e0d032c920c09b19bbd05aef6d63720d39c052af/adobe-spacecat-shared-drs-client-1.3.0.tgz", "@adobe/spacecat-shared-gpt-client": "1.6.19", "@adobe/spacecat-shared-http-utils": "1.22.2", "@adobe/spacecat-shared-ims-client": "1.11.13", diff --git a/src/controllers/suggestions.js b/src/controllers/suggestions.js index 1ca2078d1..b45486476 100644 --- a/src/controllers/suggestions.js +++ b/src/controllers/suggestions.js @@ -30,6 +30,7 @@ import { import { Suggestion as SuggestionModel } from '@adobe/spacecat-shared-data-access'; import TokowakaClient from '@adobe/spacecat-shared-tokowaka-client'; +import DrsClient from '@adobe/spacecat-shared-drs-client'; import { SuggestionDto, SUGGESTION_VIEWS, SUGGESTION_SKIP_REASONS } from '../dto/suggestion.js'; import { FixDto } from '../dto/fix.js'; import { @@ -173,7 +174,7 @@ function SuggestionsController(ctx, sqs, env) { }; const { - Opportunity, Suggestion, Site, Configuration, + Opportunity, Suggestion, Site, Configuration, AsyncJob, DeploymentExperiment, } = dataAccess; if (!isObject(Opportunity)) { @@ -1397,6 +1398,20 @@ function SuggestionsController(ctx, sqs, env) { * @returns {Promise} Deployment response */ const deploySuggestionToEdge = async (context) => { + const getHeaderCaseInsensitive = (headers, name) => { + if (!isObject(headers)) return null; + const lowerName = name.toLowerCase(); + const foundKey = Object.keys(headers).find((key) => key.toLowerCase() === lowerName); + return foundKey ? headers[foundKey] : null; + }; + + const preferHeaderValue = getHeaderCaseInsensitive(context.pathInfo?.headers, 'prefer') + || getHeaderCaseInsensitive(context.headers, 'prefer'); + const isAsyncExperimentRequested = hasText(preferHeaderValue) + && preferHeaderValue + .split(',') + .some((token) => token.trim().toLowerCase() === 'respond-async'); + const siteId = context.params?.siteId; const opportunityId = context.params?.opportunityId; const { authInfo: { profile } } = context.attributes; @@ -1432,7 +1447,6 @@ function SuggestionsController(ctx, sqs, env) { return badRequest('Opportunity ID required'); } - // validate request body if (!isNonEmptyObject(context.data)) { context.log.warn(`[edge-deploy-failed] site: ${apexBaseUrl}, no request body data provided`); return badRequest('No data provided'); @@ -1459,9 +1473,7 @@ function SuggestionsController(ctx, sqs, env) { return notFound('Opportunity not found'); } - // Fetch all suggestions for this opportunity const allSuggestions = await Suggestion.allByOpportunityId(opportunityId); - context.log.info(`[edge-deploy] allSuggestions count: ${allSuggestions.length}`); // Track valid, failed, and missing suggestions @@ -1513,6 +1525,116 @@ function SuggestionsController(ctx, sqs, env) { context.log.info(`[edge-deploy] validSuggestions count: ${validSuggestions.length} , Failed suggestions count: ${failedSuggestions.length}`); + const validSuggestionIds = [ + ...validSuggestions.map((s) => s.getId()), + ...domainWideSuggestions.map(({ suggestion }) => suggestion.getId()), + ]; + + if (isAsyncExperimentRequested) { + if (validSuggestionIds.length === 0) { + context.log.warn(`[edge-deploy-failed] site: ${apexBaseUrl}, no valid suggestions to deploy`); + return badRequest('No valid suggestions to deploy'); + } + + if (!DeploymentExperiment || typeof DeploymentExperiment.create !== 'function') { + context.log.error('[edge-deploy-failed] DeploymentExperiment data access is not configured'); + return createResponse({ + message: 'Failed to initiate experiment: DeploymentExperiment data access is not configured', + }, 500); + } + + const urls = allSuggestions + .filter((s) => validSuggestionIds.includes(s.getId())) + .map((s) => s.getData()?.url) + .filter(Boolean); + + // domain - oppty type - timestamp + const experimentId = `exp-${site.getBaseURL()}-${opportunity.getType()}-${Date.now()}`; // this is now used across as unique identifier for all runs for a experiment + + try { + const drsClient = DrsClient.createFrom(context); + const drsResult = await drsClient.createExperimentSchedule({ + siteId, + experimentId, + experimentPhase: 'pre', + experimentationUrls: urls, + metadata: { triggered_by: 'spacecat-edge-deploy', opportunityId }, + triggerImmediately: true, + }); + const preScheduleId = drsResult?.schedule?.schedule_id || drsResult?.schedule_id; + + context.log.info(`[edge-deploy] DRS pre-analysis schedule created: ${preScheduleId}`); + + const deploymentExperiment = await DeploymentExperiment.create({ + siteId, + opportunityId, + preDeploymentId: preScheduleId, + status: 'pre_analysis_submitted', + suggestionIds: validSuggestionIds, + metadata: { + jobType: 'experiment-deploy', + experimentId, + urls, + profile: { email: profile?.email }, + }, + updatedBy: profile?.email || 'experiment-deploy', + }); + + const deploymentExperimentId = deploymentExperiment?.getId?.(); + if (!deploymentExperimentId) { + throw new Error('DeploymentExperiment was not created'); + } + + const job = await AsyncJob.create({ + status: 'IN_PROGRESS', + metadata: { + jobType: 'experiment-deploy', + siteId, + opportunityId, + suggestionIds: validSuggestionIds, + experimentId, + deploymentExperimentId, + urls, + profile: { email: profile?.email }, + }, + }); + + const validSuggestionEntities = [ + ...validSuggestions, + ...domainWideSuggestions.map(({ suggestion }) => suggestion), + ]; + + await Promise.all(validSuggestionEntities.map(async (suggestion) => { + const currentData = suggestion.getData(); + suggestion.setData({ + ...currentData, + deploymentExperimentId, + }); + suggestion.setUpdatedBy(profile?.email || 'experiment-deploy'); + return suggestion.save(); + })); + + return accepted({ + jobId: job.getId(), + status: 'pre_analysis_submitted', + experimentId, + experimentBatchId: preScheduleId, + deploymentExperimentId, + metadata: { + total: suggestionIds.length, + accepted: validSuggestionIds.length, + failed: failedSuggestions.length, + }, + ...(failedSuggestions.length > 0 && { failedSuggestions }), + }); + } catch (error) { + context.log.error(`[edge-deploy-failed] site: ${apexBaseUrl}, Error creating pre-analysis schedule: ${error.message}`, error); + return createResponse({ + message: `Failed to initiate experiment: ${error.message}`, + }, 500); + } + } + // Filter out validSuggestions that are covered by domain-wide suggestions // in the same deployment if (isNonEmptyArray(domainWideSuggestions) && isNonEmptyArray(validSuggestions)) { @@ -1606,7 +1728,8 @@ function SuggestionsController(ctx, sqs, env) { } suggestion.setData(updatedData); suggestion.setUpdatedBy(profile?.email || 'tokowaka-deployment'); - return suggestion.save(); + await suggestion.save(); + return suggestion; }), ); @@ -1852,6 +1975,71 @@ function SuggestionsController(ctx, sqs, env) { return createResponse(response, 207); }; + /** + * Gets the status of an edge-deploy experiment job. + */ + const getEdgeDeployStatus = async (context) => { + const { siteId, opportunityId, jobId } = context.params; + + if (!isValidUUID(siteId)) { + return badRequest('Site ID required'); + } + if (!isValidUUID(opportunityId)) { + return badRequest('Opportunity ID required'); + } + if (!isValidUUID(jobId)) { + return badRequest('Job ID required'); + } + + const site = await Site.findById(siteId); + if (!site) { + return notFound('Site not found'); + } + + if (!await accessControlUtil.hasAccess(site)) { + return forbidden('User does not have access to this site'); + } + + const job = await AsyncJob.findById(jobId); + if (!job) { + return notFound('Job not found'); + } + + const metadata = job.getMetadata(); + if (metadata?.siteId !== siteId || metadata?.opportunityId !== opportunityId) { + return notFound('Job not found for this site and opportunity'); + } + + const deploymentExperiment = ( + metadata?.deploymentExperimentId + && DeploymentExperiment + && typeof DeploymentExperiment.findById === 'function' + ) + ? await DeploymentExperiment.findById(metadata.deploymentExperimentId) + : null; + + if (!deploymentExperiment) { + return notFound('Deployment experiment not found'); + } + + return ok({ + jobId: job.getId(), + status: job.getStatus(), + deployStatus: deploymentExperiment.getStatus(), + experimentId: metadata.experimentId, + experimentIds: [ + deploymentExperiment.getPreDeploymentId(), + deploymentExperiment.getPostDeploymentId(), + ].filter(Boolean), + deploymentExperimentId: deploymentExperiment.getId(), + deploymentExperimentStatus: deploymentExperiment.getStatus(), + deploymentExperimentError: deploymentExperiment.getError(), + startedAt: job.getStartedAt(), + endedAt: job.getEndedAt(), + error: job.getError(), + }); + }; + const rollbackSuggestionFromEdge = async (context) => { const { siteId, opportunityId } = context.params; const { authInfo: { profile } } = context.attributes; @@ -2224,6 +2412,7 @@ function SuggestionsController(ctx, sqs, env) { autofixSuggestions, createSuggestions, deploySuggestionToEdge, + getEdgeDeployStatus, rollbackSuggestionFromEdge, previewSuggestions, fetchFromEdge, diff --git a/src/routes/index.js b/src/routes/index.js index ed325f352..2cfc13721 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -220,6 +220,7 @@ export default function getRouteHandlers( 'GET /sites/:siteId/opportunities/:opportunityId/suggestions/paged/:limit': suggestionsController.getAllForOpportunityPaged, 'PATCH /sites/:siteId/opportunities/:opportunityId/suggestions/auto-fix': suggestionsController.autofixSuggestions, 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-deploy': suggestionsController.deploySuggestionToEdge, + 'GET /sites/:siteId/opportunities/:opportunityId/suggestions/edge-deploy/:jobId/status': suggestionsController.getEdgeDeployStatus, 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-rollback': suggestionsController.rollbackSuggestionFromEdge, 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-preview': suggestionsController.previewSuggestions, 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-live-preview': suggestionsController.fetchFromEdge, diff --git a/src/routes/required-capabilities.js b/src/routes/required-capabilities.js index bd65c7d72..86592b45c 100644 --- a/src/routes/required-capabilities.js +++ b/src/routes/required-capabilities.js @@ -34,6 +34,7 @@ export const INTERNAL_ROUTES = [ // TODO: Add these back in when we have a S2S consumer that needs them 'PATCH /sites/:siteId/opportunities/:opportunityId/suggestions/auto-fix', 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-deploy', + 'GET /sites/:siteId/opportunities/:opportunityId/suggestions/edge-deploy/:jobId/status', 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-rollback', 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-preview', 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-live-preview', diff --git a/test/controllers/suggestions.test.js b/test/controllers/suggestions.test.js index 2bf26d698..2d372607f 100644 --- a/test/controllers/suggestions.test.js +++ b/test/controllers/suggestions.test.js @@ -21,6 +21,7 @@ import esmock from 'esmock'; import { ValidationError, Site as SiteModel } from '@adobe/spacecat-shared-data-access'; import AuthInfo from '@adobe/spacecat-shared-http-utils/src/auth/auth-info.js'; import TokowakaClient from '@adobe/spacecat-shared-tokowaka-client'; +import DrsClient from '@adobe/spacecat-shared-drs-client'; import SuggestionsController from '../../src/controllers/suggestions.js'; import AccessControlUtil from '../../src/support/access-control-util.js'; @@ -161,6 +162,7 @@ describe('Suggestions Controller', () => { 'getAllForOpportunity', 'getAllForOpportunityPaged', 'deploySuggestionToEdge', + 'getEdgeDeployStatus', 'rollbackSuggestionFromEdge', 'previewSuggestions', 'fetchFromEdge', @@ -469,6 +471,20 @@ describe('Suggestions Controller', () => { Suggestion: mockSuggestion, Site: mockSite, Configuration: mockConfiguration, + AsyncJob: { + create: sandbox.stub(), + findById: sandbox.stub(), + }, + DeploymentExperiment: { + create: sandbox.stub(), + findById: sandbox.stub().resolves({ + getId: () => 'dep-exp-001', + getStatus: () => 'pre_analysis_submitted', + getPreDeploymentId: () => 'batch-pre-001', + getPostDeploymentId: () => null, + getError: () => null, + }), + }, }; mockSqs = { sendMessage: sandbox.stub().resolves(), @@ -4647,17 +4663,18 @@ describe('Suggestions Controller', () => { }); }); - describe('deploySuggestionToEdge (Tokowaka)', () => { - let s3ClientSendStub; - let tokowakaSuggestions; - let headingsOpportunity; + describe('deploySuggestionToEdge (Experiment Async Flow)', () => { + let edgeSuggestions; + let mockDrsClient; + const JOB_ID = 'c3a7b5e2-1234-4abc-9def-567890abcdef'; beforeEach(() => { - // Default: allow LLMO administrator access (can be overridden in specific tests) + context.pathInfo = { headers: { prefer: 'respond-async' } }; + context.attributes.authInfo.profile = { email: 'default-owner@example.com' }; sandbox.stub(AccessControlUtil.prototype, 'isLLMOAdministrator').returns(true); sandbox.stub(AccessControlUtil.prototype, 'isOwnerOfSite').resolves(true); - tokowakaSuggestions = [ + edgeSuggestions = [ { getId: () => SUGGESTION_IDS[0], getType: () => 'headings', @@ -4667,11 +4684,6 @@ describe('Suggestions Controller', () => { getData: () => ({ url: 'https://example.com/page1', recommendedAction: 'New Heading Title', - checkType: 'heading-empty', - transformRules: { - action: 'replace', - selector: 'h1.test-selector', - }, }), getKpiDeltas: () => ({}), getCreatedAt: () => '2025-01-15T10:00:00Z', @@ -4679,7 +4691,7 @@ describe('Suggestions Controller', () => { getUpdatedBy: () => 'system', setData: sandbox.stub().returnsThis(), setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), }, { getId: () => SUGGESTION_IDS[1], @@ -4688,13 +4700,8 @@ describe('Suggestions Controller', () => { getStatus: () => 'NEW', getRank: () => 2, getData: () => ({ - url: 'https://example.com/page1', + url: 'https://example.com/page2', recommendedAction: 'New Subtitle', - checkType: 'heading-empty', - transformRules: { - action: 'replace', - selector: 'h2.test-selector', - }, }), getKpiDeltas: () => ({}), getCreatedAt: () => '2025-01-15T10:00:00Z', @@ -4702,1441 +4709,1674 @@ describe('Suggestions Controller', () => { getUpdatedBy: () => 'system', setData: sandbox.stub().returnsThis(), setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), }, ]; - headingsOpportunity = { + const headingsOpportunity = { getId: sandbox.stub().returns(OPPORTUNITY_ID), getSiteId: sandbox.stub().returns(SITE_ID), getType: sandbox.stub().returns('headings'), }; - site.getConfig = sandbox.stub().returns({ - getTokowakaConfig: () => ({ apiKey: 'test-api-key-123' }), - }); site.getBaseURL = sandbox.stub().returns('https://example.com'); site.getId = sandbox.stub().returns(SITE_ID); + mockOpportunity.findById.resetBehavior(); mockOpportunity.findById.withArgs(OPPORTUNITY_ID).resolves(headingsOpportunity); - mockOpportunity.findById.withArgs(OPPORTUNITY_ID_NOT_ENABLED).resolves(opportunityNotEnabled); mockOpportunity.findById.withArgs(OPPORTUNITY_ID_NOT_FOUND).resolves(null); mockSuggestion.allByOpportunityId.resetBehavior(); - mockSuggestion.allByOpportunityId.resolves(tokowakaSuggestions); + mockSuggestion.allByOpportunityId.resolves(edgeSuggestions); - s3ClientSendStub = sandbox.stub().callsFake((command) => { - // Handle GetObjectCommand - if (command.constructor.name === 'GetObjectCommand') { - const { Key } = command.input; - // If fetching metaconfig (path ends with /config without base64 path) - if (Key && Key.match(/^opportunities\/[^/]+\/config$/)) { - // Return existing metaconfig - return Promise.resolve({ - Body: { - transformToString: async () => JSON.stringify({ - siteId: SITE_ID, - prerender: false, - apiKeys: ['test-api-key-123'], - }), - }, - }); - } - // For URL configs (with base64 path), return NoSuchKey to simulate no existing config - const error = new Error('NoSuchKey'); - error.name = 'NoSuchKey'; - return Promise.reject(error); - } - // Handle PutObjectCommand (uploadConfig) - simulate successful upload - return Promise.resolve(); - }); - context.s3 = { - s3Client: { - send: s3ClientSendStub, - }, - }; - context.env = { - TOKOWAKA_SITE_CONFIG_BUCKET: 'test-tokowaka-bucket', - TOKOWAKA_PREVIEW_BUCKET: 'test-tokowaka-preview-bucket', - TOKOWAKA_CDN_PROVIDER: 'test-cdn-provider', - TOKOWAKA_EDGE_URL: 'https://edge-dev.tokowaka.now', - TOKOWAKA_CDN_CONFIG: JSON.stringify({ - cloudfront: { - distributionId: 'E123456', - region: 'us-east-1', + mockDrsClient = { + createExperimentSchedule: sandbox.stub().resolves({ + schedule: { + schedule_id: 'sched-pre-001', }, }), }; - context.log = { - info: sandbox.stub(), - warn: sandbox.stub(), - error: sandbox.stub(), - debug: sandbox.stub(), - }; - }); + sandbox.stub(DrsClient, 'createFrom').returns(mockDrsClient); - it('uses base URL fallback when getHostName returns null (deploy)', async () => { - site.getBaseURL = sandbox.stub().returns(''); - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { + mockSuggestionDataAccess.AsyncJob.create.resolves({ + getId: () => JOB_ID, + getStatus: () => 'IN_PROGRESS', + getMetadata: () => ({ + jobType: 'experiment-deploy', siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + deployStatus: 'pre_analysis_submitted', + preExperimentBatchId: 'batch-pre-001', + }), + }); + mockSuggestionDataAccess.DeploymentExperiment.create.resolves({ + getId: () => 'dep-exp-001', }); - expect(response.status).to.equal(207); - const body = await response.json(); - expect(body.metadata).to.have.property('total'); }); - it('should deploy headings suggestions successfully', async () => { + it('returns badRequest for invalid siteId', async () => { const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + params: { siteId: 'invalid', opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - - expect(response.status).to.equal(207); - const body = await response.json(); - - // Check metadata - expect(body.metadata).to.deep.equal({ - total: 2, - success: 2, - failed: 0, - }); - - // Check individual suggestions - expect(body.suggestions).to.have.length(2); - expect(body.suggestions[0].uuid).to.equal(SUGGESTION_IDS[0]); - expect(body.suggestions[0].statusCode).to.equal(200); - expect(body.suggestions[1].uuid).to.equal(SUGGESTION_IDS[1]); - expect(body.suggestions[1].statusCode).to.equal(200); - - // Verify S3 was called (GET to fetch metaconfig and config, PUT to upload config and metaconfig) - expect(s3ClientSendStub.callCount).to.be.at.least(1); - // Verify PutObjectCommand was called for upload - // Both suggestions are for same URL, so 1 config file is created + 1 metaconfig update - const putObjectCalls = s3ClientSendStub.getCalls().filter((call) => call.args[0].constructor.name === 'PutObjectCommand'); - expect(putObjectCalls).to.have.length(2); // 1 for config, 1 for metaconfig with patches - - // Verify suggestion data was updated with deployment timestamp - const firstSugg = tokowakaSuggestions[0]; - const secondSugg = tokowakaSuggestions[1]; - - expect(firstSugg.setData.calledOnce).to.be.true; - expect(secondSugg.setData.calledOnce).to.be.true; - - // Verify edgeDeployed field was added - const firstCallArgs = firstSugg.setData.firstCall.args[0]; - expect(firstCallArgs).to.have.property('edgeDeployed'); - expect(firstCallArgs.edgeDeployed).to.be.a('number'); - - // Verify updatedBy was set - expect(firstSugg.setUpdatedBy.calledWith('test@test.com')).to.be.true; - expect(secondSugg.setUpdatedBy.calledWith('test@test.com')).to.be.true; - - // Verify save was called - expect(firstSugg.save.calledOnce).to.be.true; - expect(secondSugg.save.calledOnce).to.be.true; + expect(response.status).to.equal(400); }); - it('should remove edgeOptimizeStatus when STALE during deployment', async () => { - // Update suggestions to have edgeOptimizeStatus: STALE - tokowakaSuggestions[0].getData = () => ({ - url: 'https://example.com/page1', - recommendedAction: 'New Heading Title', - checkType: 'heading-empty', - transformRules: { - action: 'replace', - selector: 'h1.test-selector', - }, - edgeOptimizeStatus: 'STALE', - }); - - tokowakaSuggestions[1].getData = () => ({ - url: 'https://example.com/page1', - recommendedAction: 'New Subtitle', - checkType: 'heading-empty', - transformRules: { - action: 'replace', - selector: 'h2.test-selector', - }, - edgeOptimizeStatus: 'STALE', - }); - + it('returns notFound when site does not exist', async () => { const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + params: { siteId: SITE_ID_NOT_FOUND, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - - expect(response.status).to.equal(207); - - // Verify edgeOptimizeStatus was removed from both suggestions - const firstCallArgs = tokowakaSuggestions[0].setData.firstCall.args[0]; - const secondCallArgs = tokowakaSuggestions[1].setData.firstCall.args[0]; - - expect(firstCallArgs).to.not.have.property('edgeOptimizeStatus'); - expect(secondCallArgs).to.not.have.property('edgeOptimizeStatus'); - expect(firstCallArgs).to.have.property('edgeDeployed'); - expect(secondCallArgs).to.have.property('edgeDeployed'); + expect(response.status).to.equal(404); }); - it('should preserve edgeOptimizeStatus when not STALE during deployment', async () => { - // Update suggestions to have edgeOptimizeStatus with other values - tokowakaSuggestions[0].getData = () => ({ - url: 'https://example.com/page1', - recommendedAction: 'New Heading Title', - checkType: 'heading-empty', - transformRules: { - action: 'replace', - selector: 'h1.test-selector', - }, - edgeOptimizeStatus: 'ACTIVE', - }); - - tokowakaSuggestions[1].getData = () => ({ - url: 'https://example.com/page1', - recommendedAction: 'New Subtitle', - checkType: 'heading-empty', - transformRules: { - action: 'replace', - selector: 'h2.test-selector', - }, - edgeOptimizeStatus: 'PENDING', - }); + it('returns forbidden when user is not LLMO administrator', async () => { + AccessControlUtil.prototype.isLLMOAdministrator.restore(); + sandbox.stub(AccessControlUtil.prototype, 'isLLMOAdministrator').returns(false); const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - - expect(response.status).to.equal(207); - - // Verify edgeOptimizeStatus was preserved - const firstCallArgs = tokowakaSuggestions[0].setData.firstCall.args[0]; - const secondCallArgs = tokowakaSuggestions[1].setData.firstCall.args[0]; - - expect(firstCallArgs).to.have.property('edgeOptimizeStatus', 'ACTIVE'); - expect(secondCallArgs).to.have.property('edgeOptimizeStatus', 'PENDING'); - expect(firstCallArgs).to.have.property('edgeDeployed'); - expect(secondCallArgs).to.have.property('edgeDeployed'); + expect(response.status).to.equal(403); }); - it('uses tokowaka-deployment when profile email is missing', async () => { + it('returns badRequest for invalid opportunityId', async () => { const response = await suggestionsController.deploySuggestionToEdge({ ...context, - attributes: { - authInfo: new AuthInfo() - .withType('jwt') - .withScopes([{ name: 'admin' }]) - .withAuthenticated(true), - }, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + params: { siteId: SITE_ID, opportunityId: 'invalid-uuid' }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - - expect(response.status).to.equal(207); - expect(tokowakaSuggestions[0].setUpdatedBy.calledWith('tokowaka-deployment')).to.be.true; - expect(tokowakaSuggestions[1].setUpdatedBy.calledWith('tokowaka-deployment')).to.be.true; - expect(context.log.info.calledWithMatch('tokowaka-deployment')).to.be.true; + expect(response.status).to.equal(400); }); - it('should return 400 if siteId is invalid', async () => { + it('uses baseURL fallback when hostname cannot be extracted', async () => { + site.getBaseURL = sandbox.stub().returns(''); + const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: 'invalid-id', - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, + params: { siteId: SITE_ID, opportunityId: 'invalid-uuid' }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); expect(response.status).to.equal(400); - const body = await response.json(); - expect(body.message).to.equal('Site ID required'); }); - it('should return 400 if opportunityId is invalid', async () => { + it('returns badRequest when no data provided', async () => { const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: 'invalid-id', - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: null, + env: {}, }); - expect(response.status).to.equal(400); - const body = await response.json(); - expect(body.message).to.equal('Opportunity ID required'); }); - it('should return 400 if no data provided', async () => { + it('returns badRequest when suggestionIds is empty', async () => { const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: null, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [] }, + env: {}, }); - expect(response.status).to.equal(400); - const body = await response.json(); - expect(body.message).to.equal('No data provided'); }); - it('should return 403 if user is not an LLMO administrator', async () => { - // Restore the default stub and create a new one that returns false - AccessControlUtil.prototype.isLLMOAdministrator.restore(); - sandbox.stub(AccessControlUtil.prototype, 'isLLMOAdministrator').returns(false); + it('returns forbidden when user does not have access to site', async () => { + sandbox.stub(AccessControlUtil.prototype, 'hasAccess').resolves(false); const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - expect(response.status).to.equal(403); - const body = await response.json(); - expect(body.message).to.equal('Only LLMO administrators can deploy suggestions to edge'); }); - it('should return 400 if suggestionIds is empty', async () => { + it('returns forbidden when user is not owner of site', async () => { + AccessControlUtil.prototype.isOwnerOfSite.restore(); + sandbox.stub(AccessControlUtil.prototype, 'isOwnerOfSite').resolves(false); + const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - - expect(response.status).to.equal(400); - const body = await response.json(); - expect(body.message).to.include('non-empty array'); + expect(response.status).to.equal(403); }); - it('should return 404 if site not found', async () => { - mockSite.findById.withArgs(SITE_ID).resolves(null); - + it('returns notFound when opportunity does not exist', async () => { const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID_NOT_FOUND }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - expect(response.status).to.equal(404); - const body = await response.json(); - expect(body.message).to.equal('Site not found'); - }); - - it('should return 403 if user does not have access to site', async () => { - sandbox.stub(AccessControlUtil.prototype, 'hasAccess').returns(false); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); - - expect(response.status).to.equal(403); - const body = await response.json(); - expect(body.message).to.equal('User does not belong to the organization'); }); - it('should return 403 if user cannot deploy for site', async () => { - AccessControlUtil.prototype.isOwnerOfSite.resolves(false); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); - - expect(response.status).to.equal(403); - const body = await response.json(); - expect(body.message).to.equal('User does not have access to deploy edge optimize fixes for this site'); - }); - - it('should return 404 if opportunity not found', async () => { - mockOpportunity.findById.withArgs(OPPORTUNITY_ID).resolves(null); + it('returns notFound when opportunity belongs to different site', async () => { + const wrongSiteOpportunity = { + getId: sandbox.stub().returns(OPPORTUNITY_ID), + getSiteId: sandbox.stub().returns('different-site-id'), + getType: sandbox.stub().returns('headings'), + }; + mockOpportunity.findById.withArgs(OPPORTUNITY_ID).resolves(wrongSiteOpportunity); const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - expect(response.status).to.equal(404); - const body = await response.json(); - expect(body.message).to.equal('Opportunity not found'); }); - it('should return 404 if opportunity does not match siteId', async () => { - const mismatchedOpportunity = { - getId: sandbox.stub().returns(OPPORTUNITY_ID), - getSiteId: sandbox.stub().returns('different-site-id'), - getType: sandbox.stub().returns('headings'), - }; - mockOpportunity.findById.withArgs(OPPORTUNITY_ID).resolves(mismatchedOpportunity); + it('returns badRequest when no valid suggestions found', async () => { + mockSuggestion.allByOpportunityId.resolves([]); const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - - expect(response.status).to.equal(404); - const body = await response.json(); - expect(body.message).to.equal('Opportunity not found'); + expect(response.status).to.equal(400); }); - it('should return 500 if site does not have Tokowaka API key', async () => { - const suggestionsController2 = SuggestionsController({ + it('returns 500 when DeploymentExperiment data access is missing', async () => { + const controllerWithoutDeploymentExperiment = SuggestionsController({ dataAccess: { ...mockSuggestionDataAccess, - Site: { - findById: sandbox.stub().resolves({ - getConfig: sandbox.stub().returns({ - getTokowakaConfig: sandbox.stub().returns({}), - }), - getBaseURL: () => 'https://example.com', - }), - }, + DeploymentExperiment: undefined, }, pathInfo: { headers: { 'x-product': 'llmo' } }, ...authContext, }, mockSqs, { AUTOFIX_JOBS_QUEUE: 'https://autofix-jobs-queue' }); - // Make S3 fetchMetaconfig fail so deployment throws and controller returns 207 with failed: 1, 500 - const originalSend = context.s3.s3Client.send; - context.s3.s3Client.send = sandbox.stub().callsFake((cmd) => { - if (cmd.constructor.name === 'GetObjectCommand') { - return Promise.reject(new Error('Internal server error')); - } - return originalSend(cmd); - }); - const response = await suggestionsController2.deploySuggestionToEdge({ + + const response = await controllerWithoutDeploymentExperiment.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, + pathInfo: { headers: { prefer: 'respond-async' } }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: { AWS_ENV: 'dev' }, }); - expect(response.status).to.equal(207); + expect(response.status).to.equal(500); const body = await response.json(); - expect(body.metadata.total).to.equal(1); - expect(body.metadata.failed).to.equal(1); - expect(body.suggestions[0].statusCode).to.equal(500); - expect(body.suggestions[0].message).to.include('Internal server error'); + expect(body.message).to.include('DeploymentExperiment data access is not configured'); }); - it('should handle S3 upload failure gracefully', async () => { - s3ClientSendStub.rejects(Object.assign(new Error('S3 upload failed', { status: 403 }))); + it('returns 500 when DeploymentExperiment create returns no id', async () => { + mockSuggestionDataAccess.DeploymentExperiment.create.resolves({}); const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + pathInfo: { headers: { prefer: 'respond-async' } }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: { AWS_ENV: 'dev' }, }); - expect(response.status).to.equal(207); + expect(response.status).to.equal(500); const body = await response.json(); - - // All suggestions should fail - expect(body.metadata.success).to.equal(0); - expect(body.metadata.failed).to.equal(2); - expect(body.suggestions[0].statusCode).to.equal(500); - expect(body.suggestions[0].message).to.include('Deployment failed'); + expect(body.message).to.include('DeploymentExperiment was not created'); }); - it('should handle partial success when some suggestions not found', async () => { + it('filters out suggestions not in NEW status (non-domain-wide)', async () => { + const approvedSugg = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'APPROVED', + getData: () => ({ url: 'https://example.com/page1' }), + setData: sandbox.stub(), + setUpdatedBy: sandbox.stub(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([approvedSugg]); + const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], 'not-found-id', SUGGESTION_IDS[1]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - - expect(response.status).to.equal(207); - const body = await response.json(); - - expect(body.metadata.total).to.equal(3); - expect(body.metadata.success).to.equal(2); - expect(body.metadata.failed).to.equal(1); - - const failedSuggestion = body.suggestions.find((s) => s.uuid === 'not-found-id'); - expect(failedSuggestion.statusCode).to.equal(404); - expect(failedSuggestion.message).to.include('not found'); + expect(response.status).to.equal(400); }); - it('should handle suggestions not in NEW status', async () => { - tokowakaSuggestions[0].getStatus = () => 'IN_PROGRESS'; + it('filters out domain-wide suggestions missing allowedRegexPatterns', async () => { + const domainWideSugg = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'APPROVED', + getData: () => ({ isDomainWide: true, url: 'https://example.com' }), + setData: sandbox.stub(), + setUpdatedBy: sandbox.stub(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSugg]); const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: {}, }); - - expect(response.status).to.equal(207); - const body = await response.json(); - - expect(body.metadata.success).to.equal(1); - expect(body.metadata.failed).to.equal(1); - - const failedSuggestion = body.suggestions.find((s) => s.uuid === SUGGESTION_IDS[0]); - expect(failedSuggestion.statusCode).to.equal(400); - expect(failedSuggestion.message).to.include('not in NEW status'); + expect(response.status).to.equal(400); }); - it('should reject non-empty headings for headings opportunity', async () => { - tokowakaSuggestions[0].getData = () => ({ - url: 'https://example.com/page1', - recommendedAction: 'New Heading Title', - checkType: 'heading-missing', // Not eligible checkType - transformRules: { - action: 'replace', - selector: 'h1.test-selector', - }, - }); + it('allows domain-wide suggestions with allowedRegexPatterns', async () => { + const domainWideSugg = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'APPROVED', + getData: () => ({ + isDomainWide: true, + url: 'https://example.com', + allowedRegexPatterns: ['.*\\.html'], + }), + setData: sandbox.stub(), + setUpdatedBy: sandbox.stub(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSugg]); const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: { AWS_ENV: 'dev' }, }); + expect(response.status).to.equal(202); + }); - expect(response.status).to.equal(207); - const body = await response.json(); - - expect(body.metadata.success).to.equal(1); // Only sugg-2 succeeds - expect(body.metadata.failed).to.equal(1); // sugg-1 fails + it('logs warning and continues when domain-wide regex is invalid', async () => { + const domainWideSugg = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['[invalid-regex'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub(), + setUpdatedBy: sandbox.stub(), + save: sandbox.stub().resolves(), + }; + const regularSugg = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ url: 'https://example.com/page2' }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub(), + setUpdatedBy: sandbox.stub(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSugg, regularSugg]); - const failedSuggestion = body.suggestions.find((s) => s.uuid === SUGGESTION_IDS[0]); - expect(failedSuggestion.statusCode).to.equal(400); - expect(failedSuggestion.message).to.include('can be deployed'); - expect(failedSuggestion.message).to.include('heading-missing'); - }); + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [regularSugg], + failedSuggestions: [], + }), + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); - it('should validate generated config structure', async () => { const response = await suggestionsController.deploySuggestionToEdge({ ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]], - }, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, }); expect(response.status).to.equal(207); + expect(context.log.warn.calledWithMatch('Invalid regex pattern')).to.equal(true); + }); - // Find the PutObjectCommand calls (1 config file + 1 metaconfig update) - const putObjectCalls = s3ClientSendStub.getCalls().filter((call) => call.args[0].constructor.name === 'PutObjectCommand'); - expect(putObjectCalls).to.have.length(2); - // First call is for the URL-specific config, second is for metaconfig - const uploadedConfig = JSON.parse(putObjectCalls[0].args[0].input.Body); - console.log(JSON.stringify(uploadedConfig, null, 2)); - // Validate config structure - expect(uploadedConfig).to.have.property('url'); - expect(uploadedConfig).to.have.property('version', '1.0'); - expect(uploadedConfig).to.have.property('forceFail', false); - expect(uploadedConfig).to.have.property('patches'); + it('uses fallback updatedBy for auto-covered suggestions when profile email is missing', async () => { + context.attributes.authInfo.profile = null; - const { patches } = uploadedConfig; - expect(patches).to.have.length(2); - expect(patches[0]).to.have.property('op', 'replace'); - expect(patches[0]).to.have.property('selector'); - expect(patches[0]).to.have.property('value'); - expect(patches[0]).to.have.property('opportunityId', OPPORTUNITY_ID); - expect(patches[0]).to.have.property('suggestionId'); - expect(patches[0]).to.have.property('prerenderRequired', true); - expect(patches[0]).to.have.property('lastUpdated'); + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const coveredSuggestion = { + getId: () => '20f74d47-2ce0-402c-bd7d-f10f7237bfa5', + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ url: 'https://example.com/page1' }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion, coveredSuggestion]); + sandbox.stub(TokowakaClient, 'createFrom').returns({ + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + expect(coveredSuggestion.setUpdatedBy.calledWith('domain-wide-deployment')).to.equal(true); }); - describe('domain-wide suggestions', () => { - let s3ClientSendStub; - let prerenderOpportunity; - let domainWideSuggestion; - let regularSuggestions; - let allSuggestions; + it('uses fallback updatedBy for same-batch skipped suggestions when profile email is missing', async () => { + context.attributes.authInfo.profile = null; - beforeEach(() => { - // Create a domain-wide suggestion - domainWideSuggestion = { - getId: () => SUGGESTION_IDS[0], - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 1, - getData: () => ({ - url: 'https://example.com/* (All Domain URLs)', - isDomainWide: true, - allowedRegexPatterns: ['/*'], - pathPattern: '/*', - scope: 'domain-wide', - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; - - // Create regular suggestions that should be covered by domain-wide - regularSuggestions = [ - { - getId: () => SUGGESTION_IDS[1], - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 2, - getData: () => ({ - url: 'https://example.com/page1', - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }, - { - getId: () => SUGGESTION_IDS[2], - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 3, - getData: () => ({ - url: 'https://example.com/page2', - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }, - ]; + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const skippedSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ url: 'https://example.com/page1' }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion, skippedSuggestion]); + sandbox.stub(TokowakaClient, 'createFrom').returns({ + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [domainWideSuggestion], + failedSuggestions: [], + }), + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + }); - allSuggestions = [domainWideSuggestion, ...regularSuggestions]; + expect(response.status).to.equal(207); + expect(skippedSuggestion.setUpdatedBy.calledWith('domain-wide-deployment')).to.equal(true); + }); - prerenderOpportunity = { - getId: sandbox.stub().returns(OPPORTUNITY_ID), - getSiteId: sandbox.stub().returns(SITE_ID), - getType: sandbox.stub().returns('prerender'), - }; + it('returns 202 accepted with job details on success', async () => { + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + env: { AWS_ENV: 'dev' }, + }); - site.getConfig = sandbox.stub().returns({ - getTokowakaConfig: () => ({ apiKey: 'test-api-key-123' }), - }); - site.getBaseURL = sandbox.stub().returns('https://example.com'); - site.getId = sandbox.stub().returns(SITE_ID); - mockOpportunity.findById.resetBehavior(); - mockOpportunity.findById.withArgs(OPPORTUNITY_ID).resolves(prerenderOpportunity); - mockSuggestion.allByOpportunityId.resetBehavior(); - mockSuggestion.allByOpportunityId.resolves(allSuggestions); - - s3ClientSendStub = sandbox.stub().callsFake((command) => { - // Handle GetObjectCommand (fetchMetaconfig) - if (command.constructor.name === 'GetObjectCommand') { - // Return existing metaconfig - return Promise.resolve({ - Body: { - transformToString: () => Promise.resolve(JSON.stringify({ - siteId: SITE_ID, - existingProperty: 'should-be-preserved', - })), - }, - }); - } - // Handle PutObjectCommand (uploadMetaconfig) - return Promise.resolve(); - }); + expect(response.status).to.equal(202); + const body = await response.json(); + expect(body.jobId).to.equal(JOB_ID); + expect(body.status).to.equal('pre_analysis_submitted'); + expect(body.experimentBatchId).to.equal('sched-pre-001'); + expect(body.deploymentExperimentId).to.equal('dep-exp-001'); + expect(body.metadata.accepted).to.equal(2); + }); - context.s3 = { - s3Client: { - send: s3ClientSendStub, - }, - }; - context.env = { - TOKOWAKA_SITE_CONFIG_BUCKET: 'test-tokowaka-bucket', - TOKOWAKA_PREVIEW_BUCKET: 'test-tokowaka-preview-bucket', - TOKOWAKA_CDN_PROVIDER: 'test-cdn-provider', - TOKOWAKA_EDGE_URL: 'https://edge-dev.tokowaka.now', - TOKOWAKA_CDN_CONFIG: JSON.stringify({ - cloudfront: { - distributionId: 'E123456', - region: 'us-east-1', - }, - }), - }; - context.log = { - info: sandbox.stub(), - warn: sandbox.stub(), - error: sandbox.stub(), - debug: sandbox.stub(), - }; + it('calls DrsClient.createExperimentSchedule with correct params', async () => { + await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + env: { AWS_ENV: 'dev' }, }); - it('should deploy domain-wide suggestion and update metaconfig', async () => { - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); + expect(mockDrsClient.createExperimentSchedule).to.have.been.calledOnce; + const callArgs = mockDrsClient.createExperimentSchedule.firstCall.args[0]; + expect(callArgs.siteId).to.equal(SITE_ID); + expect(callArgs.experimentPhase).to.equal('pre'); + expect(callArgs.experimentationUrls).to.deep.equal([ + 'https://example.com/page1', + 'https://example.com/page2', + ]); + }); - expect(response.status).to.equal(207); - const body = await response.json(); - - // Should successfully deploy domain-wide suggestion - expect(body.metadata.success).to.equal(1); - expect(body.suggestions[0].uuid).to.equal(SUGGESTION_IDS[0]); - expect(body.suggestions[0].statusCode).to.equal(200); - - // Verify metaconfig was updated - const putObjectCalls = s3ClientSendStub.getCalls() - .filter((call) => call.args[0].constructor.name === 'PutObjectCommand'); - expect(putObjectCalls.length).to.be.at.least(1); - - // Verify domain-wide suggestion was marked as deployed - expect(domainWideSuggestion.setData.calledOnce).to.be.true; - const setDataArgs = domainWideSuggestion.setData.firstCall.args[0]; - expect(setDataArgs).to.have.property('edgeDeployed'); - expect(setDataArgs.edgeDeployed).to.be.a('number'); - expect(domainWideSuggestion.setUpdatedBy.calledWith('test@test.com')).to.be.true; - expect(domainWideSuggestion.save.calledOnce).to.be.true; - }); - - it('should filter out regular suggestions covered by domain-wide pattern', async () => { - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1], SUGGESTION_IDS[2]], - }, - }); + it('creates AsyncJob with correct metadata', async () => { + await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: { AWS_ENV: 'dev' }, + }); - expect(response.status).to.equal(207); - const body = await response.json(); + expect(mockSuggestionDataAccess.AsyncJob.create).to.have.been.calledOnce; + const createArg = mockSuggestionDataAccess.AsyncJob.create.firstCall.args[0]; + expect(createArg.status).to.equal('IN_PROGRESS'); + expect(createArg.metadata.jobType).to.equal('experiment-deploy'); + expect(createArg.metadata.siteId).to.equal(SITE_ID); + expect(createArg.metadata.opportunityId).to.equal(OPPORTUNITY_ID); + expect(createArg.metadata.deploymentExperimentId).to.equal('dep-exp-001'); + expect(mockSuggestionDataAccess.DeploymentExperiment.create).to.have.been.calledOnce; - // Domain-wide should be deployed - expect(body.metadata.total).to.equal(3); - expect(body.metadata.success).to.equal(3); // All marked as success + const depExpCreateArg = mockSuggestionDataAccess.DeploymentExperiment.create.firstCall.args[0]; + expect(depExpCreateArg.siteId).to.equal(SITE_ID); + expect(depExpCreateArg.opportunityId).to.equal(OPPORTUNITY_ID); + expect(depExpCreateArg.preDeploymentId).to.equal('sched-pre-001'); + expect(depExpCreateArg.status).to.equal('pre_analysis_submitted'); + }); - // Verify regular suggestions were marked as covered - expect(regularSuggestions[0].setData.calledOnce).to.be.true; - expect(regularSuggestions[1].setData.calledOnce).to.be.true; + it('supports createExperimentSchedule response with top-level schedule_id', async () => { + mockDrsClient.createExperimentSchedule.resolves({ + schedule_id: 'sched-pre-flat-001', + }); - const firstRegularData = regularSuggestions[0].setData.firstCall.args[0]; - expect(firstRegularData).to.have.property('edgeDeployed'); - expect(firstRegularData).to.have.property('coveredByDomainWide'); - expect(firstRegularData).to.have.property('skippedInDeployment', true); + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: { AWS_ENV: 'dev' }, }); - it('should include autoCovered count in metadata when suggestions are auto-marked', async () => { - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1], SUGGESTION_IDS[2]], - }, - }); + expect(response.status).to.equal(202); + const body = await response.json(); + expect(body.experimentBatchId).to.equal('sched-pre-flat-001'); - expect(response.status).to.equal(207); - const body = await response.json(); + const createArg = mockSuggestionDataAccess.AsyncJob.create.firstCall.args[0]; + expect(createArg.metadata.deploymentExperimentId).to.equal('dep-exp-001'); + }); - // Should include autoCovered metadata - expect(body.metadata).to.have.property('autoCovered'); - expect(body.metadata.autoCovered).to.equal(2); // 2 regular suggestions auto-covered - expect(body.metadata).to.have.property('message'); - expect(body.metadata.message).to.include('automatically marked as deployed'); + it('updates valid suggestions with deploy metadata', async () => { + await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + env: { AWS_ENV: 'dev' }, }); - it('should mark other NEW suggestions matching domain-wide pattern as covered', async () => { - // Add another NEW suggestion that matches the pattern but wasn't in deployment - const anotherSuggestion = { - getId: () => 'suggestion-id-4', - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 4, - getData: () => ({ - url: 'https://example.com/page3', - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; - - mockSuggestion.allByOpportunityId.resolves([ - domainWideSuggestion, - ...regularSuggestions, - anotherSuggestion, - ]); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], // Only deploying domain-wide - suggestionsMetadata: [ - { - id: SUGGESTION_IDS[0], - allowedRegexPatterns: ['/*'], - }, - ], - }, - }); + expect(edgeSuggestions[0].setData).to.have.been.calledOnce; + const dataArg = edgeSuggestions[0].setData.firstCall.args[0]; + expect(dataArg.deploymentExperimentId).to.equal('dep-exp-001'); + + expect(edgeSuggestions[0].save).to.have.been.calledOnce; + expect(edgeSuggestions[1].setData).to.have.been.calledOnce; + expect(edgeSuggestions[1].save).to.have.been.calledOnce; + }); - expect(response.status).to.equal(207); - const body = await response.json(); + it('uses profile email as updatedBy in async deploy flow', async () => { + context.attributes.authInfo.profile = { email: 'owner@example.com' }; - // The other suggestion should have been auto-marked - expect(body.metadata.autoCovered).to.be.at.least(3); - expect(anotherSuggestion.setData.called).to.be.true; - const anotherData = anotherSuggestion.setData.firstCall.args[0]; - expect(anotherData).to.have.property('coveredByDomainWide', SUGGESTION_IDS[0]); - expect(anotherSuggestion.setUpdatedBy.calledWith('test@test.com')).to.be.true; + await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: { AWS_ENV: 'dev' }, }); - it('uses fallback updatedBy for domain-wide deployment and coverage', async () => { - const extraSuggestion = { - getId: () => 'suggestion-id-5', - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 4, - getData: () => ({ - url: 'https://example.com/page3', - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; - - mockSuggestion.allByOpportunityId.resolves([ - domainWideSuggestion, - ...regularSuggestions, - extraSuggestion, - ]); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - attributes: { - authInfo: new AuthInfo() - .withType('jwt') - .withScopes([{ name: 'admin' }]) - .withAuthenticated(true), - }, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1], SUGGESTION_IDS[2]], - }, - }); + expect(edgeSuggestions[0].setUpdatedBy.calledWith('owner@example.com')).to.equal(true); + }); - expect(response.status).to.equal(207); - expect(domainWideSuggestion.setUpdatedBy.calledWith('tokowaka-deployment')).to.be.true; - expect(regularSuggestions[0].setUpdatedBy.calledWith('domain-wide-deployment')).to.be.true; - expect(regularSuggestions[1].setUpdatedBy.calledWith('domain-wide-deployment')).to.be.true; - expect(extraSuggestion.setUpdatedBy.calledWith('domain-wide-deployment')).to.be.true; + it('uses fallback updatedBy in async deploy flow when profile email is missing', async () => { + context.attributes.authInfo.profile = null; - const infoCalls = context.log.info.getCalls(); - const domainWideLog = infoCalls.find((call) => call.args[0].includes('domain-wide suggestion')); - expect(domainWideLog).to.exist; - expect(domainWideLog.args[0]).to.include('tokowaka-deployment'); + await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: { AWS_ENV: 'dev' }, }); - it('should not mark non-NEW suggestions as covered by domain-wide', async () => { - const deployedSuggestion = { - getId: () => 'suggestion-id-5', - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'DEPLOYED', // Not NEW - getRank: () => 5, - getData: () => ({ - url: 'https://example.com/page4', - edgeDeployed: Date.now() - 10000, - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; - - mockSuggestion.allByOpportunityId.resolves([ - domainWideSuggestion, - ...regularSuggestions, - deployedSuggestion, - ]); - - await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); + expect(edgeSuggestions[0].setUpdatedBy.calledWith('experiment-deploy')).to.equal(true); + }); - // Deployed suggestion should NOT be modified - expect(deployedSuggestion.setData.called).to.be.false; - expect(deployedSuggestion.save.called).to.be.false; + it('includes failedSuggestions in response when some are invalid', async () => { + const notFoundId = 'b0b0b0b0-0000-0000-0000-000000000000'; + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], notFoundId] }, + env: { AWS_ENV: 'dev' }, }); - it('should not mark suggestions without URLs as covered', async () => { - const noUrlSuggestion = { - getId: () => 'suggestion-id-6', - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 6, - getData: () => ({}), // No URL - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; - - mockSuggestion.allByOpportunityId.resolves([ - domainWideSuggestion, - noUrlSuggestion, - ]); - - await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); + expect(response.status).to.equal(202); + const body = await response.json(); + expect(body.metadata.accepted).to.equal(1); + expect(body.metadata.failed).to.equal(1); + expect(body.failedSuggestions).to.have.lengthOf(1); + expect(body.failedSuggestions[0].uuid).to.equal(notFoundId); + }); + + it('returns 500 when DRS call fails', async () => { + mockDrsClient.createExperimentSchedule.rejects(new Error('DRS unavailable')); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + env: { AWS_ENV: 'dev' }, + }); + + expect(response.status).to.equal(500); + const body = await response.json(); + expect(body.message).to.include('DRS unavailable'); + }); + + it('uses direct deploy flow when Prefer: respond-async is missing', async () => { + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [edgeSuggestions[0]], + failedSuggestions: [], + }), + }; + const tokowakaCreateFromStub = sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + expect(tokowakaCreateFromStub).to.have.been.calledOnce; + expect(mockTokowakaClient.deploySuggestions).to.have.been.calledOnce; + expect(mockDrsClient.createExperimentSchedule).to.not.have.been.called; + expect(mockSuggestionDataAccess.AsyncJob.create).to.not.have.been.called; + }); + + it('uses profile email in direct deploy success path', async () => { + context.attributes.authInfo.profile = { email: 'owner@example.com' }; + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [edgeSuggestions[0]], + failedSuggestions: [], + }), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + expect(edgeSuggestions[0].setUpdatedBy.calledWith('owner@example.com')).to.equal(true); + expect(context.log.info.calledWithMatch('by owner@example.com')).to.equal(true); + }); + + it('uses fallback updatedBy and log text in direct deploy success path when profile email is missing', async () => { + context.attributes.authInfo.profile = null; + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [edgeSuggestions[0]], + failedSuggestions: [], + }), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + expect(edgeSuggestions[0].setUpdatedBy.calledWith('tokowaka-deployment')).to.equal(true); + expect(context.log.info.calledWithMatch('by tokowaka-deployment')).to.equal(true); + }); + + it('marks suggestions as failed when direct deploy throws', async () => { + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().rejects(new Error('tokowaka deploy failed')), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + const body = await response.json(); + expect(body.suggestions.some((s) => s.message === 'Deployment failed: Internal server error')).to.equal(true); + }); + + it('removes stale edgeOptimizeStatus and returns ineligible suggestions as failed', async () => { + const staleSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + url: 'https://example.com/page1', + edgeOptimizeStatus: 'STALE', + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const ineligibleSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ url: 'https://example.com/page2' }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([staleSuggestion, ineligibleSuggestion]); + + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [staleSuggestion], + failedSuggestions: [ + { suggestion: ineligibleSuggestion, reason: 'Ineligible for edge deployment' }, + ], + }), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + }); + + expect(response.status).to.equal(207); + const staleSetDataArg = staleSuggestion.setData.firstCall.args[0]; + expect(staleSetDataArg.edgeOptimizeStatus).to.equal(undefined); + const body = await response.json(); + expect(body.metadata.failed).to.be.greaterThan(0); + expect(context.log.info.calledWithMatch('is ineligible')).to.equal(true); + }); + + it('includes autoCovered metadata when domain-wide deploy covers other suggestions', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const coveredSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ + url: 'https://example.com/page1', + recommendedAction: 'New Subtitle', + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion, coveredSuggestion]); + + const mockTokowakaClient = { + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + }); + + expect(response.status).to.equal(207); + const body = await response.json(); + expect(body.metadata.autoCovered).to.equal(1); + expect(body.metadata.message).to.equal( + '1 additional suggestion(s) automatically marked as deployed (covered by domain-wide configuration)', + ); + }); + + it('keeps non-covered suggestions when filtering by same-batch domain-wide patterns', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const nonCoveredSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ + url: 'https://example.com/page2', + recommendedAction: 'Keep me deployable', + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion, nonCoveredSuggestion]); + + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [nonCoveredSuggestion], + failedSuggestions: [], + }), + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + }); + + expect(response.status).to.equal(207); + expect(mockTokowakaClient.deploySuggestions).to.have.been.calledOnce; + }); + + it('marks same-batch skipped suggestions as covered after domain-wide deploy', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const skippedSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ + url: 'https://example.com/page1', + recommendedAction: 'New Subtitle', + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion, skippedSuggestion]); + + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [domainWideSuggestion], + failedSuggestions: [], + }), + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + }); + + expect(response.status).to.equal(207); + expect(skippedSuggestion.save).to.have.been.calledOnce; + const body = await response.json(); + expect(body.metadata.autoCovered).to.equal(1); + }); + + it('adds failed result when marking same-batch skipped suggestions fails', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const skippedSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ + url: 'https://example.com/page1', + recommendedAction: 'New Subtitle', + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().rejects(new Error('save failed')), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion, skippedSuggestion]); + + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [domainWideSuggestion], + failedSuggestions: [], + }), + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + }); + + expect(response.status).to.equal(207); + const body = await response.json(); + expect(body.suggestions.some((s) => s.message === 'Failed to mark as covered by domain-wide')).to.equal(true); + }); + + it('continues domain-wide deployment when marking covered suggestions fails', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const coveredSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({ + url: 'https://example.com/page1', + recommendedAction: 'New Subtitle', + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().rejects(new Error('covered save failed')), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion, coveredSuggestion]); + + const mockTokowakaClient = { + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + expect(context.log.error.calledWithMatch('Error marking covered suggestions')).to.equal(true); + }); + + it('skips non-domain suggestions without URL when evaluating domain-wide coverage', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const noUrlSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({}), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion, noUrlSuggestion]); + + const mockTokowakaClient = { + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + }); + + it('handles no-url requested suggestions and auto-covers matching non-requested suggestions', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const noUrlRequestedSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 2, + getData: () => ({}), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const nonRequestedCoveredSuggestion = { + getId: () => '8d86058b-2cc3-4d8d-9a40-b25013f9ad10', + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 3, + getData: () => ({ + url: 'https://example.com/page1', + recommendedAction: 'Auto-covered content', + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([ + domainWideSuggestion, + noUrlRequestedSuggestion, + nonRequestedCoveredSuggestion, + ]); + + const mockTokowakaClient = { + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [domainWideSuggestion, noUrlRequestedSuggestion], + failedSuggestions: [], + }), + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1]] }, + }); + + expect(response.status).to.equal(207); + const body = await response.json(); + expect(body.metadata.autoCovered).to.equal(1); + }); + + it('creates a default metaconfig when fetchMetaconfig returns null', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion]); + + const mockTokowakaClient = { + fetchMetaconfig: sandbox.stub().resolves(null), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + expect(mockTokowakaClient.uploadMetaconfig).to.have.been.calledOnce; + }); + + it('skips non-NEW and domain-wide suggestions when evaluating covered suggestions', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const approvedSuggestion = { + getId: () => SUGGESTION_IDS[1], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'APPROVED', + getRank: () => 2, + getData: () => ({ url: 'https://example.com/page1' }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + const secondaryDomainWideSuggestion = { + getId: () => 'b67db722-b4ee-45f6-a127-e3b72b621f6a', + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 3, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com/other', + allowedRegexPatterns: ['^https://example\\.com/.*$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([ + domainWideSuggestion, + approvedSuggestion, + secondaryDomainWideSuggestion, + ]); + + const mockTokowakaClient = { + fetchMetaconfig: sandbox.stub().resolves({}), + uploadMetaconfig: sandbox.stub().resolves(), + }; + sandbox.stub(TokowakaClient, 'createFrom').returns(mockTokowakaClient); + + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, + }); + + expect(response.status).to.equal(207); + }); + + it('records domain-wide suggestion failure when domain-wide deploy step throws', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion]); - // Suggestion without URL should NOT be auto-marked - expect(noUrlSuggestion.setData.called).to.be.false; + sandbox.stub(TokowakaClient, 'createFrom').returns({ + deploySuggestions: sandbox.stub().resolves({ + succeededSuggestions: [], + failedSuggestions: [], + }), + fetchMetaconfig: sandbox.stub().rejects(new Error('metaconfig down')), }); - it('should handle domain-wide deployment errors gracefully', async () => { - // Make S3 fail - s3ClientSendStub.rejects(new Error('S3 upload failed')); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); - - expect(response.status).to.equal(207); - const body = await response.json(); - - // Domain-wide suggestion should be marked as failed - expect(body.metadata.failed).to.equal(1); - expect(body.suggestions[0].uuid).to.equal(SUGGESTION_IDS[0]); - expect(body.suggestions[0].statusCode).to.equal(500); - expect(body.suggestions[0].message).to.include('Deployment failed'); + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, }); - it('should handle errors when marking skipped suggestions', async () => { - // Override save to reject for ALL suggestions to trigger the catch block - const saveError = new Error('Database error'); - allSuggestions.forEach((sugg) => { - if (sugg.save && sugg.save.restore) { - sugg.save.restore(); - } - sugg.save = sandbox.stub().rejects(saveError); - }); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[1], SUGGESTION_IDS[2]], - }, - }); - - expect(response.status).to.equal(207); - const body = await response.json(); - - // Should have failed suggestions due to save errors - expect(body.metadata.failed).to.be.at.least(2); - const failedSuggestions = body.suggestions.filter((s) => s.statusCode === 500); - expect(failedSuggestions.length).to.be.at.least(2); - expect(failedSuggestions.some((s) => s.message.includes('Failed to mark as covered'))).to.be.true; - }); + expect(response.status).to.equal(207); + const body = await response.json(); + expect(body.suggestions.some((s) => s.message === 'Deployment failed: metaconfig down')).to.equal(true); + }); - it('should handle errors when auto-marking covered suggestions', async () => { - // Add a suggestion that will fail when auto-marking - const failingSuggestion = { - getId: () => 'failing-suggestion', - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 10, - getData: () => ({ - url: 'https://example.com/failing', - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().rejects(new Error('Failed to save covered suggestion')), - }; - - mockSuggestion.allByOpportunityId.resolves([ - domainWideSuggestion, - failingSuggestion, - ]); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); + it('fails domain-wide suggestions when domain-wide processing setup throws', async () => { + const domainWideSuggestion = { + getId: () => SUGGESTION_IDS[0], + getType: () => 'headings', + getOpportunityId: () => OPPORTUNITY_ID, + getStatus: () => 'NEW', + getRank: () => 1, + getData: () => ({ + isDomainWide: true, + scope: 'domain-wide', + url: 'https://example.com', + allowedRegexPatterns: ['^https://example\\.com/page1$'], + }), + getKpiDeltas: () => ({}), + getCreatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedAt: () => '2025-01-15T10:00:00Z', + getUpdatedBy: () => 'system', + setData: sandbox.stub().returnsThis(), + setUpdatedBy: sandbox.stub().returnsThis(), + save: sandbox.stub().resolves(), + }; + mockSuggestion.allByOpportunityId.resolves([domainWideSuggestion]); - expect(response.status).to.equal(207); - const body = await response.json(); + sandbox.stub(TokowakaClient, 'createFrom').throws(new Error('tokowaka init failed')); - // Domain-wide should still deploy successfully despite auto-mark error - expect(body.metadata.success).to.equal(1); - expect(context.log.error.called).to.be.true; - const errorCalls = context.log.error.getCalls(); - const coverErrorLog = errorCalls.find((call) => call.args[0].includes('Error marking covered suggestions')); - expect(coverErrorLog).to.exist; + const response = await suggestionsController.deploySuggestionToEdge({ + ...context, + pathInfo: { headers: {} }, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID }, + data: { suggestionIds: [SUGGESTION_IDS[0]] }, }); - it('should handle errors at the start of domain-wide deployment', async () => { - // First call (apexBaseUrl) succeeds; second call (domain-wide baseURL) throws - site.getBaseURL.onFirstCall().returns('https://example.com'); - site.getBaseURL.onSecondCall().throws(new Error('Cannot get base URL')); + expect(response.status).to.equal(207); + expect(context.log.error.calledWithMatch('Error deploying domain-wide suggestions')).to.equal(true); + }); + }); - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); + describe('getEdgeDeployStatus', () => { + const JOB_ID = 'c3a7b5e2-1234-4abc-9def-567890abcdef'; - expect(response.status).to.equal(207); - const body = await response.json(); + beforeEach(() => { + site.getBaseURL = sandbox.stub().returns('https://example.com'); + site.getId = sandbox.stub().returns(SITE_ID); + }); - // Domain-wide deployment should fail - expect(body.metadata.failed).to.equal(1); - expect(body.suggestions[0].statusCode).to.equal(500); - expect(body.suggestions[0].message).to.equal('Deployment failed: Internal server error'); + it('returns badRequest for invalid siteId', async () => { + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: 'invalid', opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, }); + expect(response.status).to.equal(400); + }); - it('should create new metaconfig when none exists', async () => { - // Make S3 return NoSuchKey error (no existing metaconfig) - s3ClientSendStub.callsFake((command) => { - if (command.constructor.name === 'GetObjectCommand') { - const error = new Error('NoSuchKey'); - error.name = 'NoSuchKey'; - return Promise.reject(error); - } - return Promise.resolve(); - }); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); - - expect(response.status).to.equal(207); - const body = await response.json(); - expect(body.metadata.success).to.equal(1); + it('returns badRequest for invalid opportunityId', async () => { + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: 'invalid', jobId: JOB_ID }, + }); + expect(response.status).to.equal(400); + }); - // Verify PutObjectCommand was called with new metaconfig - const putCalls = s3ClientSendStub.getCalls() - .filter((call) => call.args[0].constructor.name === 'PutObjectCommand'); - expect(putCalls.length).to.be.at.least(1); + it('returns badRequest for invalid jobId', async () => { + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: 'invalid' }, }); + expect(response.status).to.equal(400); + }); - it('should skip other domain-wide suggestions when auto-marking', async () => { - // Create a second domain-wide suggestion - const secondDomainWide = { - getId: () => 'domain-wide-2', - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 11, - getData: () => ({ - url: 'https://example.com/subdomain/* (Subdomain)', - isDomainWide: true, - allowedRegexPatterns: ['/subdomain/*'], - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; - - mockSuggestion.allByOpportunityId.resolves([ - domainWideSuggestion, - secondDomainWide, - ...regularSuggestions, - ]); - - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0]], - }, - }); + it('returns notFound when site does not exist', async () => { + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID_NOT_FOUND, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, + }); + expect(response.status).to.equal(404); + }); - expect(response.status).to.equal(207); + it('returns forbidden when user does not have access', async () => { + sandbox.stub(AccessControlUtil.prototype, 'hasAccess').resolves(false); - // Second domain-wide should NOT be auto-marked - expect(secondDomainWide.setData.called).to.be.false; - expect(secondDomainWide.save.called).to.be.false; + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, }); + expect(response.status).to.equal(403); + }); - it('should handle suggestions without URLs in filtering logic', async () => { - const suggestionWithoutUrl = { - getId: () => SUGGESTION_IDS[3], - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 12, - getData: () => ({}), // No URL - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; - - mockSuggestion.allByOpportunityId.resolves([ - domainWideSuggestion, - suggestionWithoutUrl, - ]); - - // Deploy both domain-wide and the suggestion without URL - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[3]], - }, - }); + it('returns notFound when job does not exist', async () => { + mockSuggestionDataAccess.AsyncJob.findById.resolves(null); - expect(response.status).to.equal(207); - const body = await response.json(); + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, + }); + expect(response.status).to.equal(404); + }); - // Suggestion without URL should not be filtered out - expect(body.metadata.success).to.be.at.least(1); + it('returns notFound when job belongs to different site', async () => { + mockSuggestionDataAccess.AsyncJob.findById.resolves({ + getId: () => JOB_ID, + getStatus: () => 'IN_PROGRESS', + getMetadata: () => ({ + siteId: 'different-site-id', + opportunityId: OPPORTUNITY_ID, + deployStatus: 'pre_analysis_submitted', + }), + getStartedAt: () => '2025-01-01T00:00:00Z', + getEndedAt: () => null, + getError: () => null, }); - it('should include suggestions not covered by domain-wide pattern', async () => { - const notCoveredSuggestion = { - getId: () => SUGGESTION_IDS[4], - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 13, - getData: () => ({ - url: 'https://different-domain.com/page1', // Different domain - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; - - mockSuggestion.allByOpportunityId.resolves([ - domainWideSuggestion, - notCoveredSuggestion, - ]); - - // Deploy both domain-wide and the non-covered suggestion - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [SUGGESTION_IDS[0], SUGGESTION_IDS[4]], - }, - }); + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, + }); + expect(response.status).to.equal(404); + }); - expect(response.status).to.equal(207); - const body = await response.json(); + it('returns notFound when job belongs to different opportunity', async () => { + mockSuggestionDataAccess.AsyncJob.findById.resolves({ + getId: () => JOB_ID, + getStatus: () => 'IN_PROGRESS', + getMetadata: () => ({ + siteId: SITE_ID, + opportunityId: 'different-opportunity-id', + deployStatus: 'pre_analysis_submitted', + }), + getStartedAt: () => '2025-01-01T00:00:00Z', + getEndedAt: () => null, + getError: () => null, + }); - // Non-covered suggestion should be deployed normally - expect(body.metadata.success).to.be.at.least(2); - expect(notCoveredSuggestion.setData.called).to.be.true; - expect(notCoveredSuggestion.save.called).to.be.true; + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, }); + expect(response.status).to.equal(404); + }); - it('should fail domain-wide suggestion without allowedRegexPatterns', async () => { - const missingPatternsId = 'missing-patterns-uuid'; + it('returns 200 with correct job status details', async () => { + mockSuggestionDataAccess.AsyncJob.findById.resolves({ + getId: () => JOB_ID, + getStatus: () => 'IN_PROGRESS', + getMetadata: () => ({ + siteId: SITE_ID, + opportunityId: OPPORTUNITY_ID, + experimentId: 'exp-test-123', + deploymentExperimentId: 'dep-exp-001', + }), + getStartedAt: () => '2025-01-01T00:00:00Z', + getEndedAt: () => null, + getError: () => null, + }); + mockSuggestionDataAccess.DeploymentExperiment.findById.resolves({ + getId: () => 'dep-exp-001', + getStatus: () => 'pre_analysis_submitted', + getPreDeploymentId: () => 'batch-pre-001', + getPostDeploymentId: () => null, + getError: () => null, + }); - // Mock domain-wide suggestion WITHOUT allowedRegexPatterns in its data - const domainWideWithoutPatterns = { - getId: () => missingPatternsId, - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 999999, - getData: () => ({ - url: 'https://example.com/* (All Domain URLs)', - isDomainWide: true, - // Missing allowedRegexPatterns - }), - save: sandbox.stub().returnsThis(), - }; + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, + }); - mockSuggestion.allByOpportunityId.resolves([domainWideWithoutPatterns]); + expect(response.status).to.equal(200); + const body = await response.json(); + expect(body.jobId).to.equal(JOB_ID); + expect(body.status).to.equal('IN_PROGRESS'); + expect(body.deployStatus).to.equal('pre_analysis_submitted'); + expect(body.experimentId).to.equal('exp-test-123'); + expect(body.experimentIds).to.deep.equal(['batch-pre-001']); + expect(body.startedAt).to.equal('2025-01-01T00:00:00Z'); + expect(body.endedAt).to.be.null; + expect(body.error).to.be.null; + }); + + it('returns both experiment IDs when post-analysis is submitted', async () => { + mockSuggestionDataAccess.AsyncJob.findById.resolves({ + getId: () => JOB_ID, + getStatus: () => 'IN_PROGRESS', + getMetadata: () => ({ + siteId: SITE_ID, + opportunityId: OPPORTUNITY_ID, + experimentId: 'exp-test-123', + deploymentExperimentId: 'dep-exp-001', + }), + getStartedAt: () => '2025-01-01T00:00:00Z', + getEndedAt: () => null, + getError: () => null, + }); + mockSuggestionDataAccess.DeploymentExperiment.findById.resolves({ + getId: () => 'dep-exp-001', + getStatus: () => 'post_analysis_submitted', + getPreDeploymentId: () => 'batch-pre-001', + getPostDeploymentId: () => 'batch-post-002', + getError: () => null, + }); - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [missingPatternsId], - }, - }); + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, + }); - expect(response.status).to.equal(207); - const body = await response.json(); + expect(response.status).to.equal(200); + const body = await response.json(); + expect(body.experimentIds).to.deep.equal(['batch-pre-001', 'batch-post-002']); + }); - // Domain-wide suggestion should fail due to missing allowedRegexPatterns - expect(body.metadata.failed).to.equal(1); - expect(body.suggestions[0].uuid).to.equal(missingPatternsId); - expect(body.suggestions[0].statusCode).to.equal(400); - expect(body.suggestions[0].message).to.include('allowedRegexPatterns'); + it('returns completed job with endedAt and error', async () => { + mockSuggestionDataAccess.AsyncJob.findById.resolves({ + getId: () => JOB_ID, + getStatus: () => 'FAILED', + getMetadata: () => ({ + siteId: SITE_ID, + opportunityId: OPPORTUNITY_ID, + experimentId: 'exp-test-123', + deploymentExperimentId: 'dep-exp-001', + }), + getStartedAt: () => '2025-01-01T00:00:00Z', + getEndedAt: () => '2025-01-01T01:00:00Z', + getError: () => 'Pre-analysis failed at DRS', + }); + mockSuggestionDataAccess.DeploymentExperiment.findById.resolves({ + getId: () => 'dep-exp-001', + getStatus: () => 'failed', + getPreDeploymentId: () => 'batch-pre-001', + getPostDeploymentId: () => null, + getError: () => ({ message: 'Pre-analysis failed at DRS' }), }); - it('should handle invalid regex patterns gracefully', async () => { - const invalidRegexId = 'invalid-regex-uuid'; - const regularId = 'regular-suggestion-uuid'; + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, + }); - // Mock domain-wide suggestion WITH invalid regex patterns in its data - const domainWideWithInvalidRegex = { - getId: () => invalidRegexId, - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 999999, - getData: () => ({ - url: 'https://example.com/* (All Domain URLs)', - isDomainWide: true, - allowedRegexPatterns: ['[invalid(regex'], // Invalid regex - }), - save: sandbox.stub().returnsThis(), - }; + expect(response.status).to.equal(200); + const body = await response.json(); + expect(body.status).to.equal('FAILED'); + expect(body.endedAt).to.equal('2025-01-01T01:00:00Z'); + expect(body.error).to.equal('Pre-analysis failed at DRS'); + }); - const regularSuggestion = { - getId: () => regularId, - getType: () => 'prerender', - getOpportunityId: () => OPPORTUNITY_ID, - getStatus: () => 'NEW', - getRank: () => 2, - getData: () => ({ - url: 'https://example.com/page1', - }), - getKpiDeltas: () => ({}), - getCreatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedAt: () => '2025-01-15T10:00:00Z', - getUpdatedBy: () => 'system', - setData: sandbox.stub().returnsThis(), - setUpdatedBy: sandbox.stub().returnsThis(), - save: sandbox.stub().returnsThis(), - }; + it('returns notFound when deployment experiment does not exist', async () => { + mockSuggestionDataAccess.AsyncJob.findById.resolves({ + getId: () => JOB_ID, + getStatus: () => 'IN_PROGRESS', + getMetadata: () => ({ + siteId: SITE_ID, + opportunityId: OPPORTUNITY_ID, + experimentId: 'exp-test-123', + deploymentExperimentId: 'dep-exp-404', + }), + getStartedAt: () => '2025-01-01T00:00:00Z', + getEndedAt: () => null, + getError: () => null, + }); + mockSuggestionDataAccess.DeploymentExperiment.findById.resolves(null); - mockSuggestion.allByOpportunityId.resolves([domainWideWithInvalidRegex, regularSuggestion]); + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, + }); - const response = await suggestionsController.deploySuggestionToEdge({ - ...context, - params: { - siteId: SITE_ID, - opportunityId: OPPORTUNITY_ID, - }, - data: { - suggestionIds: [invalidRegexId, regularId], - }, - }); + expect(response.status).to.equal(404); + const body = await response.json(); + expect(body.message).to.equal('Deployment experiment not found'); + }); - expect(response.status).to.equal(207); - const body = await response.json(); + it('returns notFound when job metadata has no deploymentExperimentId', async () => { + mockSuggestionDataAccess.AsyncJob.findById.resolves({ + getId: () => JOB_ID, + getStatus: () => 'IN_PROGRESS', + getMetadata: () => ({ + siteId: SITE_ID, + opportunityId: OPPORTUNITY_ID, + experimentId: 'exp-test-123', + }), + getStartedAt: () => '2025-01-01T00:00:00Z', + getEndedAt: () => null, + getError: () => null, + }); - // Should still deploy domain-wide despite invalid regex (will log warning) - expect(body.metadata.success).to.be.at.least(1); - expect(context.log.warn.called).to.be.true; - const warnCalls = context.log.warn.getCalls(); - const regexWarning = warnCalls.find((call) => call.args[0].includes('Invalid regex pattern')); - expect(regexWarning).to.exist; + const response = await suggestionsController.getEdgeDeployStatus({ + ...context, + params: { siteId: SITE_ID, opportunityId: OPPORTUNITY_ID, jobId: JOB_ID }, }); + + expect(response.status).to.equal(404); + const body = await response.json(); + expect(body.message).to.equal('Deployment experiment not found'); }); }); + describe('rollbackSuggestionFromEdge (Tokowaka Rollback)', () => { let s3ClientSendStub; let tokowakaSuggestions; diff --git a/test/routes/index.test.js b/test/routes/index.test.js index afca6053d..c25f2125c 100755 --- a/test/routes/index.test.js +++ b/test/routes/index.test.js @@ -534,6 +534,7 @@ describe('getRouteHandlers', () => { 'GET /sites/:siteId/opportunities/:opportunityId/suggestions/paged/:limit', 'PATCH /sites/:siteId/opportunities/:opportunityId/suggestions/auto-fix', 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-deploy', + 'GET /sites/:siteId/opportunities/:opportunityId/suggestions/edge-deploy/:jobId/status', 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-rollback', 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-preview', 'POST /sites/:siteId/opportunities/:opportunityId/suggestions/edge-live-preview',