diff --git a/.jest/test-setup.js b/.jest/test-setup.js new file mode 100644 index 00000000..ace17311 --- /dev/null +++ b/.jest/test-setup.js @@ -0,0 +1,18 @@ +/* + * Copyright 2023 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +window.matchMedia = window.matchMedia || function() { + return { + matches : false, + addListener : function() {}, + removeListener: function() {} + }; +}; \ No newline at end of file diff --git a/README.md b/README.md index c03eb0d7..3c40f6ae 100644 --- a/README.md +++ b/README.md @@ -17,17 +17,19 @@ See: http://aem.live/docs/sidekick-generate-variations - `aio console workspace select` - Populate the `.env` file in the project root and fill it as shown [below](#env) -### Local Development - -- `npm start` to start your local Dev server - - App will run on `localhost:9080` by default - - Actions will be deployed locally (requires Docker running) - ### Testing - Run `npm run lint && npm test` to run lint and unit tests for ui and actions - Preview the Generate Variations app in the [QA workspace](https://experience-qa.adobe.com/?shell_source=local&devMode=true&shell_ims=prod#/aem/generate-variations/): `npm run preview` +### Debugging + +By default, App Builder stores only failed activations. To enable the storage of all App Builder activations, set the `extraLogging` search query parameter to `true`, as shown in the following example: + +``` +https://experience.adobe.com/?extraLogging=true#/aem/generate-variations/ +``` + ### Deployment - `npm run deploy` to build and deploy all actions on Runtime and static files to CDN diff --git a/actions/AemClient.js b/actions/AemClient.js index c9bfc63f..367b9f73 100644 --- a/actions/AemClient.js +++ b/actions/AemClient.js @@ -86,7 +86,7 @@ class AemClient { logger.debug(`Updating variation with ${updates.length} fields`); - await wretch(updateVariationUrl, true /* retryOnFailure */) + await wretch(updateVariationUrl, { shouldRetry: true } /* retryOnFailure */) .headers({ 'X-Adobe-Accept-Unsupported-API': '1', 'If-Match': eTag, diff --git a/actions/AuthAction.js b/actions/AuthAction.js index 74d8f47e..fd68f307 100644 --- a/actions/AuthAction.js +++ b/actions/AuthAction.js @@ -18,6 +18,45 @@ const { checkForAdobeInternalUser } = require('./ActionUtils.js'); const logger = Core.Logger('AuthAction'); +/** + * Extracts a user access token from either the Authorization header or the request payload + * + * @param {object} params action input parameters + * @returns {string|undefined} the token string, or undefined if not present + */ +function getAccessToken(params) { + // First, check if a bearer user access token is set + if ( + params.__ow_headers + && params.__ow_headers.authorization + && params.__ow_headers.authorization.startsWith('Bearer ') + ) { + return params.__ow_headers.authorization.substring('Bearer '.length); + } + + // Second, check if a token has been passed through the payload + return params.accessToken; +} + +/** + * Extracts an Adobe IMS organization ID from either the 'X-Org-Id' header or the request payload + * + * @param {object} params action input parameters + * @returns {string|undefined} the Adobe IMS organization ID string, or undefined if not present + */ +function getImsOrg(params) { + // First, check if an Adobe IMS organization ID has been passed through the 'X-Org-Id' header + if ( + params.__ow_headers + && params.__ow_headers['x-org-id'] + ) { + return params.__ow_headers['x-org-id']; + } + + // Second, check if an Adobe IMS organization ID has been passed through the payload + return params.imsOrg; +} + async function isValidToken(endpoint, clientId, token) { try { const response = await wretch(`${endpoint}/ims/validate_token/v1`) @@ -114,8 +153,8 @@ function asAuthAction(action) { const earlyAccessToggle = params.FT_EARLY_ACCESS; const ldSdkKey = params.LD_SDK_KEY; - // Extract the token from the params - const { imsOrg, accessToken } = params; + const accessToken = getAccessToken(params); + const imsOrg = getImsOrg(params); // Validate the access token if (!await isValidToken(imsEndpoint, clientId, accessToken)) { diff --git a/actions/FirefallClient.js b/actions/FirefallClient.js index b58d27d2..8569ba48 100644 --- a/actions/FirefallClient.js +++ b/actions/FirefallClient.js @@ -25,7 +25,7 @@ const ERROR_CODES = { function toFirefallError(error, defaultMessage) { const errorMessage = ERROR_CODES[error.status] ?? defaultMessage; - return new InternalError(400, `IS-ERROR: ${errorMessage} (${error.status}).`); + return new InternalError(error.status ?? 500, `IS-ERROR: ${errorMessage} (${error.status}).`); } class FirefallClient { @@ -39,8 +39,12 @@ class FirefallClient { async completion(prompt, temperature = 0.0, model = 'gpt-4') { const startTime = Date.now(); + // must be aligned with the `aem-genai-assistant/generate` AppBuilder action timeout + // (subtracted 5 seconds to allow some buffer for AppBuilder) + const REQUEST_TIMEOUT = 295; + try { - const response = await wretch(`${this.endpoint}/v1/completions`) + const response = await wretch(`${this.endpoint}/v1/completions`, { requestTimeout: REQUEST_TIMEOUT }) .headers({ 'x-gw-ims-org-id': this.org, 'x-api-key': this.apiKey, diff --git a/actions/GenericAction.js b/actions/GenericAction.js index 1d6bdaae..ddce334d 100644 --- a/actions/GenericAction.js +++ b/actions/GenericAction.js @@ -23,8 +23,18 @@ function createResponse(status, body) { }; } +function isObject(obj) { + return typeof obj === 'object' && !Array.isArray(obj) && obj !== null; +} + function createSuccessResponse(body) { - return createResponse(200, body); + if (!isObject(body)) { + return createResponse(200, body); + } + + // If there is a status code in the body, use it; otherwise, default to 200. + const { statusCode, ...response } = body; + return createResponse(statusCode ?? 200, response); } function createErrorResponse(status, message) { diff --git a/actions/Network.js b/actions/Network.js index db74a4bb..027b4523 100644 --- a/actions/Network.js +++ b/actions/Network.js @@ -19,7 +19,12 @@ const { Core } = require('@adobe/aio-sdk'); const logger = Core.Logger('FirefallAction'); -const REQUEST_TIMEOUT = 55 * 1000; +const REQUEST_TIMEOUT = 55; // in seconds +const SHOULD_RETRY = false; +const DEFAULT_OPTIONS = { + shouldRetry: SHOULD_RETRY, + requestTimeout: REQUEST_TIMEOUT, // in seconds +}; function createWretchError(status, message) { const error = new WretchError(); @@ -28,16 +33,18 @@ function createWretchError(status, message) { return error; } -function wretchWithOptions(url, shouldRetry = false) { +function wretchWithOptions(url, options = DEFAULT_OPTIONS) { + // overwrite default options + const finalOptions = { ...DEFAULT_OPTIONS, ...options }; return wretch(url) - .middlewares(shouldRetry ? [retry()] : []) + .middlewares(finalOptions.shouldRetry ? [retry()] : []) .addon(AbortAddon()) - .resolve((resolver) => resolver.setTimeout(REQUEST_TIMEOUT)) + .resolve((resolver) => resolver.setTimeout(finalOptions.requestTimeout * 1000)) .resolve((resolver) => { return resolver.fetchError((error) => { if (error.name === 'AbortError') { logger.error('Request aborted', error); - throw createWretchError(408, 'Request timed out'); + throw createWretchError(504, 'Gateway Timeout'); } logger.error('Network error', error); throw createWretchError(500, 'Network error'); diff --git a/actions/complete/index.js b/actions/complete/index.js index b9a0e4cb..d0a42428 100644 --- a/actions/complete/index.js +++ b/actions/complete/index.js @@ -9,15 +9,52 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ + +const openwhisk = require('openwhisk'); const { asGenericAction } = require('../GenericAction.js'); const { asAuthAction } = require('../AuthAction.js'); -const { asFirefallAction } = require('../FirefallAction.js'); + +const STATUS_RUNNING = 'running'; +const STATUS_COMPLETED = 'completed'; async function main(params) { - const { - prompt, temperature, model, firefallClient, - } = params; - return firefallClient.completion(prompt ?? 'Who are you?', temperature ?? 0.0, model ?? 'gpt-4'); + const { jobId } = params; + + const ow = openwhisk(); + + if (!jobId) { + const activation = await ow.actions.invoke({ + name: 'aem-genai-assistant/generate', + blocking: false, + result: false, + params, + }); + + return { + statusCode: 202, + jobId: activation.activationId, + }; + } else { + try { + const activation = await ow.activations.get(jobId); + + return { + jobId, + status: STATUS_COMPLETED, + result: activation.response.result, + }; + } catch (error) { + if (error instanceof Error && error.constructor.name === 'OpenWhiskError' && error.statusCode === 404) { + // For valid activation IDs that haven't finished yet, App Builder (OpenWhisk) returns a 404 error + // instead of any data or status. Therefore, we will return a status of 'running' to inform the client to wait. + return { + jobId, + status: STATUS_RUNNING, + }; + } + throw error; + } + } } -exports.main = asGenericAction(asAuthAction(asFirefallAction(main))); +exports.main = asGenericAction(asAuthAction(main)); diff --git a/actions/generate/index.js b/actions/generate/index.js new file mode 100644 index 00000000..9014b2e1 --- /dev/null +++ b/actions/generate/index.js @@ -0,0 +1,22 @@ +/* + * Copyright 2024 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +const { asFirefallAction } = require('../FirefallAction.js'); + +function main(params) { + const { + prompt, temperature, model, firefallClient, + } = params; + return firefallClient.completion(prompt ?? 'Who are you?', temperature ?? 0.0, model ?? 'gpt-4'); +} + +exports.main = asFirefallAction(main); diff --git a/app.config.yaml b/app.config.yaml index 7974b0d1..7f696d65 100644 --- a/app.config.yaml +++ b/app.config.yaml @@ -10,8 +10,6 @@ application: web: true runtime: nodejs:18 inputs: - FIREFALL_ENDPOINT: $FIREFALL_ENDPOINT - FIREFALL_API_KEY: $FIREFALL_API_KEY IMS_ENDPOINT: $IMS_ENDPOINT IMS_CLIENT_ID: $IMS_CLIENT_ID IMS_SERVICE_CLIENT_ID: $IMS_SERVICE_CLIENT_ID @@ -20,6 +18,15 @@ application: IMS_PRODUCT_CONTEXT: $IMS_PRODUCT_CONTEXT FT_EARLY_ACCESS: $FT_EARLY_ACCESS LD_SDK_KEY: $LD_SDK_KEY + generate: + function: actions/generate/index.js + web: false + runtime: nodejs:18 + limits: + timeout: 300000 # in ms (300 sec) + inputs: + FIREFALL_ENDPOINT: $FIREFALL_ENDPOINT + FIREFALL_API_KEY: $FIREFALL_API_KEY feedback: function: actions/feedback/index.js web: true diff --git a/jest.config.js b/jest.config.js index 4a45b77a..2cbbf1ab 100644 --- a/jest.config.js +++ b/jest.config.js @@ -17,4 +17,5 @@ module.exports = { '\\.(css|less)$': '/.jest/styleMock.js', }, + setupFiles: ["/.jest/test-setup.js"] }; diff --git a/package-lock.json b/package-lock.json index 4b299590..354bd5ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,8 +31,10 @@ "react-error-boundary": "4.0.11", "react-intl": "6.6.4", "react-simple-code-editor": "0.13.1", + "react-slick": "0.30.2", "react-transition-group": "4.4.5", "recoil": "0.7.7", + "slick-carousel": "1.8.1", "uuid": "9.0.1", "wretch": "2.7.0" }, @@ -185,9 +187,9 @@ } }, "node_modules/@adobe/aio-cli-plugin-app": { - "version": "12.2.1", - "resolved": "https://registry.npmjs.org/@adobe/aio-cli-plugin-app/-/aio-cli-plugin-app-12.2.1.tgz", - "integrity": "sha512-arg+Kf1u1VkDdP0hd8AgwLFRnXyy9fj28mBVZLybjpRaYeKcOQZiSwjpBQ4ySsLGSNBmL1NOFq/ZJqMintRGBw==", + "version": "12.2.2", + "resolved": "https://registry.npmjs.org/@adobe/aio-cli-plugin-app/-/aio-cli-plugin-app-12.2.2.tgz", + "integrity": "sha512-EZqJFPnx7h06LBsslElI0Zqdrf/exgFYMAKScGkoe6WFWBY90y0mR3xTO5Jz8WGP28IdAM/54WZSyExZStE/vg==", "dev": true, "dependencies": { "@adobe/aio-cli-lib-app-config": "^4", @@ -1047,9 +1049,9 @@ } }, "node_modules/@adobe/aio-cli-plugin-app-templates/node_modules/mem-fs-editor/node_modules/@types/node": { - "version": "18.19.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.32.tgz", - "integrity": "sha512-2bkg93YBSDKk8DLmmHnmj/Rwr18TLx7/n+I23BigFwgexUJoMHZOd8X1OFxuF/W3NN0S2W2E5sVabI5CPinNvA==", + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -3002,9 +3004,9 @@ } }, "node_modules/@adobe/aio-lib-console": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@adobe/aio-lib-console/-/aio-lib-console-5.2.0.tgz", - "integrity": "sha512-nQWOfvWM0SujGR+ISe7fBLZyFXxbPHt7g5ktNdaAd53jTyw2+k7OZu9YeESG8fBFpD7jFnP4QKEeXy4tdpRtnw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@adobe/aio-lib-console/-/aio-lib-console-5.3.0.tgz", + "integrity": "sha512-yeyKeqvhvVGc1pgOhmrspbbAOeS++7hppH//ci5789W2uPgYMbgQCJoduJslZuEj+A9hnt+JAzyCSUh1ml5a2Q==", "dev": true, "dependencies": { "@adobe/aio-lib-core-errors": "^4", @@ -4993,33 +4995,33 @@ "dev": true }, "node_modules/@aws-sdk/client-s3": { - "version": "3.569.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.569.0.tgz", - "integrity": "sha512-J+iE1t++9RsqKUidGL/9sOS/NhO7SZBJQGDZq2MilO7pHqo6l2tPUv+hNnIPmmO2D+jfktj/s2Uugxs6xQmv2A==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.572.0.tgz", + "integrity": "sha512-YLtJRVZN+ktOaseWeTtthmimRQoWxygdzRPFlb1HpDPX+akBrGkL7Mz69onpXKfqm9Loz3diUXHqKfpxRX9Pog==", "dev": true, "dependencies": { "@aws-crypto/sha1-browser": "3.0.0", "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sso-oidc": "3.569.0", - "@aws-sdk/client-sts": "3.569.0", - "@aws-sdk/core": "3.567.0", - "@aws-sdk/credential-provider-node": "3.569.0", + "@aws-sdk/client-sso-oidc": "3.572.0", + "@aws-sdk/client-sts": "3.572.0", + "@aws-sdk/core": "3.572.0", + "@aws-sdk/credential-provider-node": "3.572.0", "@aws-sdk/middleware-bucket-endpoint": "3.568.0", - "@aws-sdk/middleware-expect-continue": "3.567.0", - "@aws-sdk/middleware-flexible-checksums": "3.567.0", + "@aws-sdk/middleware-expect-continue": "3.572.0", + "@aws-sdk/middleware-flexible-checksums": "3.572.0", "@aws-sdk/middleware-host-header": "3.567.0", "@aws-sdk/middleware-location-constraint": "3.567.0", "@aws-sdk/middleware-logger": "3.568.0", "@aws-sdk/middleware-recursion-detection": "3.567.0", - "@aws-sdk/middleware-sdk-s3": "3.569.0", - "@aws-sdk/middleware-signing": "3.567.0", + "@aws-sdk/middleware-sdk-s3": "3.572.0", + "@aws-sdk/middleware-signing": "3.572.0", "@aws-sdk/middleware-ssec": "3.567.0", - "@aws-sdk/middleware-user-agent": "3.567.0", - "@aws-sdk/region-config-resolver": "3.567.0", - "@aws-sdk/signature-v4-multi-region": "3.569.0", + "@aws-sdk/middleware-user-agent": "3.572.0", + "@aws-sdk/region-config-resolver": "3.572.0", + "@aws-sdk/signature-v4-multi-region": "3.572.0", "@aws-sdk/types": "3.567.0", - "@aws-sdk/util-endpoints": "3.567.0", + "@aws-sdk/util-endpoints": "3.572.0", "@aws-sdk/util-user-agent-browser": "3.567.0", "@aws-sdk/util-user-agent-node": "3.568.0", "@aws-sdk/xml-builder": "3.567.0", @@ -5062,21 +5064,21 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.568.0.tgz", - "integrity": "sha512-LSD7k0ZBQNWouTN5dYpUkeestoQ+r5u6cp6o+FATKeiFQET85RNA3xJ4WPnOI5rBC1PETKhQXvF44863P3hCaQ==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.572.0.tgz", + "integrity": "sha512-S+xhScao5MD79AkrcHmFpEDk+CgoiuB/31WFcTcnrTio5TOUONAaT0QyscOIwRp7BZ7Aez7TBM+loTteJ+TQvg==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.567.0", + "@aws-sdk/core": "3.572.0", "@aws-sdk/middleware-host-header": "3.567.0", "@aws-sdk/middleware-logger": "3.568.0", "@aws-sdk/middleware-recursion-detection": "3.567.0", - "@aws-sdk/middleware-user-agent": "3.567.0", - "@aws-sdk/region-config-resolver": "3.567.0", + "@aws-sdk/middleware-user-agent": "3.572.0", + "@aws-sdk/region-config-resolver": "3.572.0", "@aws-sdk/types": "3.567.0", - "@aws-sdk/util-endpoints": "3.567.0", + "@aws-sdk/util-endpoints": "3.572.0", "@aws-sdk/util-user-agent-browser": "3.567.0", "@aws-sdk/util-user-agent-node": "3.568.0", "@smithy/config-resolver": "^2.2.0", @@ -5111,23 +5113,23 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.569.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.569.0.tgz", - "integrity": "sha512-u5DEjNEvRvlKKh1QLCDuQ8GIrx+OFvJFLfhorsp4oCxDylvORs+KfyKKnJAw4wYEEHyxyz9GzHD7p6a8+HLVHw==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.572.0.tgz", + "integrity": "sha512-S6C/S6xYesDakEuzYvlY1DMMKLtKQxdbbygq3hfeG2R0jUt9KpRLsQXK8qrBuVCKa3WcnjN/30hp4g/iUWFU/w==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.569.0", - "@aws-sdk/core": "3.567.0", - "@aws-sdk/credential-provider-node": "3.569.0", + "@aws-sdk/client-sts": "3.572.0", + "@aws-sdk/core": "3.572.0", + "@aws-sdk/credential-provider-node": "3.572.0", "@aws-sdk/middleware-host-header": "3.567.0", "@aws-sdk/middleware-logger": "3.568.0", "@aws-sdk/middleware-recursion-detection": "3.567.0", - "@aws-sdk/middleware-user-agent": "3.567.0", - "@aws-sdk/region-config-resolver": "3.567.0", + "@aws-sdk/middleware-user-agent": "3.572.0", + "@aws-sdk/region-config-resolver": "3.572.0", "@aws-sdk/types": "3.567.0", - "@aws-sdk/util-endpoints": "3.567.0", + "@aws-sdk/util-endpoints": "3.572.0", "@aws-sdk/util-user-agent-browser": "3.567.0", "@aws-sdk/util-user-agent-node": "3.568.0", "@smithy/config-resolver": "^2.2.0", @@ -5162,23 +5164,23 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.569.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.569.0.tgz", - "integrity": "sha512-3AyipQ2zHszkcTr8n1Sp7CiMUi28aMf1vOhEo0KKi0DWGo1Z1qJEpWeRP363KG0n9/8U3p1IkXGz5FRbpXZxIw==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.572.0.tgz", + "integrity": "sha512-jCQuH2qkbWoSY4wckLSfzf3OPh7zc7ZckEbIGGVUQar/JVff6EIbpQ+uNG29DDEOpdPPd8rrJsVuUlA/nvJdXA==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sso-oidc": "3.569.0", - "@aws-sdk/core": "3.567.0", - "@aws-sdk/credential-provider-node": "3.569.0", + "@aws-sdk/client-sso-oidc": "3.572.0", + "@aws-sdk/core": "3.572.0", + "@aws-sdk/credential-provider-node": "3.572.0", "@aws-sdk/middleware-host-header": "3.567.0", "@aws-sdk/middleware-logger": "3.568.0", "@aws-sdk/middleware-recursion-detection": "3.567.0", - "@aws-sdk/middleware-user-agent": "3.567.0", - "@aws-sdk/region-config-resolver": "3.567.0", + "@aws-sdk/middleware-user-agent": "3.572.0", + "@aws-sdk/region-config-resolver": "3.572.0", "@aws-sdk/types": "3.567.0", - "@aws-sdk/util-endpoints": "3.567.0", + "@aws-sdk/util-endpoints": "3.572.0", "@aws-sdk/util-user-agent-browser": "3.567.0", "@aws-sdk/util-user-agent-node": "3.568.0", "@smithy/config-resolver": "^2.2.0", @@ -5213,9 +5215,9 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.567.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.567.0.tgz", - "integrity": "sha512-zUDEQhC7blOx6sxhHdT75x98+SXQVdUIMu8z8AjqMWiYK2v4WkOS8i6dOS4E5OjL5J1Ac+ruy8op/Bk4AFqSIw==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.572.0.tgz", + "integrity": "sha512-DBmf94qfN0dfaLl5EnNcq6TakWfOtVXYifHoTbX+VBwESj3rlY4W+W4mAnvBgAqDjlLFy7bBljmx+vnjnV73lg==", "dev": true, "dependencies": { "@smithy/core": "^1.4.2", @@ -5266,14 +5268,14 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.568.0.tgz", - "integrity": "sha512-m5DUN9mpto5DhEvo6w3+8SS6q932ja37rTNvpPqWJIaWhj7OorAwVirSaJQAQB/M8+XCUIrUonxytphZB28qGQ==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.572.0.tgz", + "integrity": "sha512-05KzbAp77fEiQXqMeodXeMbT83FOqSyBrfSEMz6U8uBXeJCy8zPUjN3acqcbG55/HNJHUvg1cftqzy+fUz71gA==", "dev": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.568.0", - "@aws-sdk/credential-provider-process": "3.568.0", - "@aws-sdk/credential-provider-sso": "3.568.0", + "@aws-sdk/credential-provider-process": "3.572.0", + "@aws-sdk/credential-provider-sso": "3.572.0", "@aws-sdk/credential-provider-web-identity": "3.568.0", "@aws-sdk/types": "3.567.0", "@smithy/credential-provider-imds": "^2.3.0", @@ -5286,20 +5288,20 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.568.0" + "@aws-sdk/client-sts": "3.572.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.569.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.569.0.tgz", - "integrity": "sha512-7jH4X2qlPU3PszZP1zvHJorhLARbU1tXvp8ngBe8ArXBrkFpl/dQ2Y/IRAICPm/pyC1IEt8L/CvKp+dz7v/eRw==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.572.0.tgz", + "integrity": "sha512-anlYZnpmVkfp9Gan+LcEkQvmRf/m0KcbR11th8sBEyI5lxMaHKXhnAtC/hEGT7e3L6rgNOrFYTPuSvllITD/Pg==", "dev": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.568.0", "@aws-sdk/credential-provider-http": "3.568.0", - "@aws-sdk/credential-provider-ini": "3.568.0", - "@aws-sdk/credential-provider-process": "3.568.0", - "@aws-sdk/credential-provider-sso": "3.568.0", + "@aws-sdk/credential-provider-ini": "3.572.0", + "@aws-sdk/credential-provider-process": "3.572.0", + "@aws-sdk/credential-provider-sso": "3.572.0", "@aws-sdk/credential-provider-web-identity": "3.568.0", "@aws-sdk/types": "3.567.0", "@smithy/credential-provider-imds": "^2.3.0", @@ -5313,9 +5315,9 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.568.0.tgz", - "integrity": "sha512-r01zbXbanP17D+bQUb7mD8Iu2SuayrrYZ0Slgvx32qgz47msocV9EPCSwI4Hkw2ZtEPCeLQR4XCqFJB1D9P50w==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.572.0.tgz", + "integrity": "sha512-hXcOytf0BadSm/MMy7MV8mmY0+Jv3mkavsHNBx0R82hw5ollD0I3JyOAaCtdUpztF0I72F8K+q8SpJQZ+EwArw==", "dev": true, "dependencies": { "@aws-sdk/types": "3.567.0", @@ -5329,13 +5331,13 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.568.0.tgz", - "integrity": "sha512-+TA77NWOEXMUcfLoOuim6xiyXFg1GqHj55ggI1goTKGVvdHYZ+rhxZbwjI29+ewzPt/qcItDJcvhrjOrg9lCag==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.572.0.tgz", + "integrity": "sha512-iIlnpJiDXFp3XC4hJNSiNurnU24mr3iLB3HoNa9efr944bo6XBl9FQdk3NssIkqzSmgyoB2CEUx/daBHz4XSow==", "dev": true, "dependencies": { - "@aws-sdk/client-sso": "3.568.0", - "@aws-sdk/token-providers": "3.568.0", + "@aws-sdk/client-sso": "3.572.0", + "@aws-sdk/token-providers": "3.572.0", "@aws-sdk/types": "3.567.0", "@smithy/property-provider": "^2.2.0", "@smithy/shared-ini-file-loader": "^2.4.0", @@ -5383,9 +5385,9 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.567.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.567.0.tgz", - "integrity": "sha512-diFpWk0HEkzWMc5+PanwlwiCp8iy9INc2ID/dS0jSQQVH3vIj2F129oX5spRVmCk+N5Dt2zRlVmyrPRYbPWnoA==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.572.0.tgz", + "integrity": "sha512-+NKWVK295rOEANU/ohqEfNjkcEdZao7z6HxkMXX4gu4mDpSsVU8WhYr5hp5k3PUhtaiPU8M1rdfQBrZQc4uttw==", "dev": true, "dependencies": { "@aws-sdk/types": "3.567.0", @@ -5398,9 +5400,9 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.567.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.567.0.tgz", - "integrity": "sha512-HwDONfEbfOgaB7TAKMr194mLyott4djz4QKEGtcR2qUduV5D9yzsDGzth14fyFRVZvdtpeixsXOcQTyqQpRLhA==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.572.0.tgz", + "integrity": "sha512-ysblGDRn1yy8TlKUrwhnFbl3RuMfbVW1rbtePClEYpC/1u9MsqPmm/fmWJJGKat7NclnsgpQyfSQ64DCuaEedg==", "dev": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", @@ -5475,9 +5477,9 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.569.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.569.0.tgz", - "integrity": "sha512-qCmeG3qSq0Tv2sXJmtmEYHUFikRLa8OAkcGW/OXVUHf5XY06YFRPRCL5NFMayXusTEHb0Gb1ek3awZ4gix9gnQ==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.572.0.tgz", + "integrity": "sha512-ygQL1G2hWoJXkUGL/Xr5q9ojXCH8hgt/oKsxJtc5U8ZXw3SRlL6pCVE7+aiD0l8mgIGbW0vrL08Oc/jYWlakdw==", "dev": true, "dependencies": { "@aws-sdk/types": "3.567.0", @@ -5495,9 +5497,9 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.567.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.567.0.tgz", - "integrity": "sha512-aE4/ysosM01di2sGs0q7UfhZ4EXMhEfOKrgQhi6b3h4BuClDdsP7bo3bkHEkx7aCKD6mb5/q4qlbph9FRQeTFg==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.572.0.tgz", + "integrity": "sha512-/pEVgHnf8LsTG0hu9yqqvmLMknlKO5c19NM3J9qTWGLPfySi8tWrFuREAFKAxqJFgDw1IdFWd+dXIkodpbGwew==", "dev": true, "dependencies": { "@aws-sdk/types": "3.567.0", @@ -5527,13 +5529,13 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.567.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.567.0.tgz", - "integrity": "sha512-a7DBGMRBLWJU3BqrQjOtKS4/RcCh/BhhKqwjCE0FEhhm6A/GGuAs/DcBGOl6Y8Wfsby3vejSlppTLH/qtV1E9w==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.572.0.tgz", + "integrity": "sha512-R4bBbLp1ywtF1kJoOX1juDMztKPWeQHNj6XuTvtruFDn1RdfnBlbM3+9rguRfH5s4V+xfl8SSWchnyo2cI00xg==", "dev": true, "dependencies": { "@aws-sdk/types": "3.567.0", - "@aws-sdk/util-endpoints": "3.567.0", + "@aws-sdk/util-endpoints": "3.572.0", "@smithy/protocol-http": "^3.3.0", "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -5543,9 +5545,9 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.567.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.567.0.tgz", - "integrity": "sha512-VMDyYi5Dh2NydDiIARZ19DwMfbyq0llS736cp47qopmO6wzdeul7WRTx8NKfEYN0/AwEaqmTW0ohx58jSB1lYg==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.572.0.tgz", + "integrity": "sha512-xkZMIxek44F4YW5r9otD1O5Y/kDkgAb6JNJePkP1qPVojrkCmin3OFYAOZgGm+T4DZAQ5rWhpaqTAWmnRumYfw==", "dev": true, "dependencies": { "@aws-sdk/types": "3.567.0", @@ -5560,12 +5562,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.569.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.569.0.tgz", - "integrity": "sha512-uCf/7fDPcU3Q0hL+0jzoSodHJW+HZJTMP51egY3W+otMbr+6+JVfjlrKhHKsT3OtG5AUh+4cDU2k83oeGHxHVQ==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.572.0.tgz", + "integrity": "sha512-FD6FIi8py1ZAR53NjD2VXKDvvQUhhZu7CDUfC9gjAa7JDtv+rJvM9ZuoiQjaDnzzqYxTr4pKqqjLsd6+8BCSWA==", "dev": true, "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.569.0", + "@aws-sdk/middleware-sdk-s3": "3.572.0", "@aws-sdk/types": "3.567.0", "@smithy/protocol-http": "^3.3.0", "@smithy/signature-v4": "^2.3.0", @@ -5577,9 +5579,9 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.568.0.tgz", - "integrity": "sha512-mCQElYzY5N2JlXB7LyjOoLvRN/JiSV+E9szLwhYN3dleTUCMbGqWb7RiAR2V3fO+mz8f9kR7DThTExKJbKogKw==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.572.0.tgz", + "integrity": "sha512-IkSu8p32tQZhKqwmfLZLGfYwNhsS/HUQBLnDMHJlr9VifmDqlTurcr+DwMCaMimuFhcLeb45vqTymKf/ro/OBw==", "dev": true, "dependencies": { "@aws-sdk/types": "3.567.0", @@ -5592,7 +5594,7 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.568.0" + "@aws-sdk/client-sso-oidc": "3.572.0" } }, "node_modules/@aws-sdk/types": { @@ -5621,9 +5623,9 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.567.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.567.0.tgz", - "integrity": "sha512-WVhot3qmi0BKL9ZKnUqsvCd++4RF2DsJIG32NlRaml1FT9KaqSzNv0RXeA6k/kYwiiNT7y3YWu3Lbzy7c6vG9g==", + "version": "3.572.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.572.0.tgz", + "integrity": "sha512-AIEC7ItIWBqkJLtqcSd0HG8tvdh3zVwqnKPHNrcfFay0Xonqx3p/qTCDwGosh5CM5hDGzyOSRA5PkacEDBTz9w==", "dev": true, "dependencies": { "@aws-sdk/types": "3.567.0", @@ -8736,16 +8738,16 @@ } }, "node_modules/@launchdarkly/js-sdk-common": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@launchdarkly/js-sdk-common/-/js-sdk-common-2.4.1.tgz", - "integrity": "sha512-bIEiP1+jVlPGwbVn8UYSVBMUDqGEnTevbg+fYD8bApbyFPY0v/vMvUDDhLxZGoj/EI76JfXrgT2/K70Xs1JJkA==" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@launchdarkly/js-sdk-common/-/js-sdk-common-2.4.2.tgz", + "integrity": "sha512-dgxjY8qN7Gyqg/Gn4RZaEyUNmMgORkeVDacWaFb34Wc4m4NFD4cpiABk6hT216IUuhIdKSbG3TV2h6oKlwsAyw==" }, "node_modules/@launchdarkly/js-server-sdk-common": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@launchdarkly/js-server-sdk-common/-/js-server-sdk-common-2.4.0.tgz", - "integrity": "sha512-YNGbPaMdNgR6dcwRmPUzRWoNTCAXeA9/R6y7ZMFtM1GBTUuXiMfU33Q0ITRvHI3LLz9MDlQr15YivkyvoefePA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@launchdarkly/js-server-sdk-common/-/js-server-sdk-common-2.4.1.tgz", + "integrity": "sha512-Gn28Y3OtpXg9lO1tbqNZ5gK8XQ9A4Tx40YoqrN6ki72KNPKG7ltHvjAUTF31Nsglr7B+DyMV59tejp8O2qs4Uw==", "dependencies": { - "@launchdarkly/js-sdk-common": "2.4.1", + "@launchdarkly/js-sdk-common": "2.4.2", "semver": "7.5.4" } }, @@ -8780,13 +8782,13 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@launchdarkly/node-server-sdk": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@launchdarkly/node-server-sdk/-/node-server-sdk-9.4.0.tgz", - "integrity": "sha512-SN3YcGpcEXB3XGi+k7r8X1NPIWnIlG0A/DGvV9zTdENcMAjR1Vq+r+1vLEOaPxVug3fBooAbd4Z3TLXA/N+kuA==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@launchdarkly/node-server-sdk/-/node-server-sdk-9.4.1.tgz", + "integrity": "sha512-NWM/xybLQ/sdXvJyRkSKqjFqkGcASCIQItbvpxEOHLM8TeTX757oIxCi9lPylvE83zq89oXpj0jJ/tYpId8wsw==", "dependencies": { - "@launchdarkly/js-server-sdk-common": "2.4.0", + "@launchdarkly/js-server-sdk-common": "2.4.1", "https-proxy-agent": "^5.0.1", - "launchdarkly-eventsource": "2.0.1" + "launchdarkly-eventsource": "2.0.2" } }, "node_modules/@launchdarkly/node-server-sdk/node_modules/https-proxy-agent": { @@ -16400,24 +16402,26 @@ } }, "node_modules/@sigstore/sign": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.0.tgz", - "integrity": "sha512-tsAyV6FC3R3pHmKS880IXcDJuiFJiKITO1jxR1qbplcsBkZLBmjrEw5GbC7ikD6f5RU1hr7WnmxB/2kKc1qUWQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.1.tgz", + "integrity": "sha512-YZ71wKIOweC8ViUeZXboz0iPLqMkskxuoeN/D1CEpAyZvEepbX9oRMIoO6a/DxUqO1VEaqmcmmqzSiqtOsvSmw==", "dev": true, "dependencies": { "@sigstore/bundle": "^2.3.0", "@sigstore/core": "^1.0.0", "@sigstore/protobuf-specs": "^0.3.1", - "make-fetch-happen": "^13.0.0" + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/sign/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -16638,13 +16642,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", - "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.3.tgz", + "integrity": "sha512-agQhHNkIddXFslkudjV88vTXiAMEyUtso3at6ZHUNJ1agZb7Ze6VW/PddHipdWBu1t+8OWLW5X5yZOPiOnaWJQ==", "dev": true, "dependencies": { "@sigstore/protobuf-specs": "^0.3.0", - "tuf-js": "^2.2.0" + "tuf-js": "^2.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -17461,9 +17465,9 @@ } }, "node_modules/@swc/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.3.tgz", - "integrity": "sha512-pSEglypnBGLHBoBcv3aYS7IM2t2LRinubYMyP88UoFIcD2pear2CeB15CbjJ2IzuvERD0ZL/bthM7cDSR9g+aQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.5.tgz", + "integrity": "sha512-M8O22EEgdSONLd+7KRrXj8pn+RdAZZ7ISnPjE9KCQQlI0kkFNEquWR+uFdlFxQfwlyCe/Zb6uGXGDvtcov4IMg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -17478,16 +17482,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.5.3", - "@swc/core-darwin-x64": "1.5.3", - "@swc/core-linux-arm-gnueabihf": "1.5.3", - "@swc/core-linux-arm64-gnu": "1.5.3", - "@swc/core-linux-arm64-musl": "1.5.3", - "@swc/core-linux-x64-gnu": "1.5.3", - "@swc/core-linux-x64-musl": "1.5.3", - "@swc/core-win32-arm64-msvc": "1.5.3", - "@swc/core-win32-ia32-msvc": "1.5.3", - "@swc/core-win32-x64-msvc": "1.5.3" + "@swc/core-darwin-arm64": "1.5.5", + "@swc/core-darwin-x64": "1.5.5", + "@swc/core-linux-arm-gnueabihf": "1.5.5", + "@swc/core-linux-arm64-gnu": "1.5.5", + "@swc/core-linux-arm64-musl": "1.5.5", + "@swc/core-linux-x64-gnu": "1.5.5", + "@swc/core-linux-x64-musl": "1.5.5", + "@swc/core-win32-arm64-msvc": "1.5.5", + "@swc/core-win32-ia32-msvc": "1.5.5", + "@swc/core-win32-x64-msvc": "1.5.5" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -17499,9 +17503,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.3.tgz", - "integrity": "sha512-kRmmV2XqWegzGXvJfVVOj10OXhLgaVOOBjaX3p3Aqg7Do5ksg+bY5wi1gAN/Eul7B08Oqf7GG7WJevjDQGWPOg==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.5.tgz", + "integrity": "sha512-Ol5ZwZYdTOZsv2NwjcT/qVVALKzVFeh+IJ4GNarr3P99+38Dkwi81OqCI1o/WaDXQYKAQC/V+CzMbkEuJJfq9Q==", "cpu": [ "arm64" ], @@ -17515,9 +17519,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.3.tgz", - "integrity": "sha512-EYs0+ovaRw6ZN9GBr2nIeC7gUXWA0q4RYR+Og3Vo0Qgv2Mt/XudF44A2lPK9X7M3JIfu6JjnxnTuvsK1Lqojfw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.5.tgz", + "integrity": "sha512-XHWpKBIPKYLgh5/lV2PYjO84lkzf5JR51kjiloyz2Pa9HIV8tHoAP8bYdJwm4nUp2I7KcEh3pPH0AVu5LpxMKw==", "cpu": [ "x64" ], @@ -17531,9 +17535,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.3.tgz", - "integrity": "sha512-RBVUTidSf4wgPdv98VrgJ4rMzMDN/3LBWdT7l+R7mNFH+mtID7ZAhTON0o/m1HkECgAgi1xcbTOVAw1xgd5KLA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.5.tgz", + "integrity": "sha512-vtoWNCWAe+CNSqtqIwFnIH48qgPPlUZKoQ4EVFeMM+7/kDi6SeNxoh5TierJs5bKAWxD49VkPvRoWFCk6V62mA==", "cpu": [ "arm" ], @@ -17547,9 +17551,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.3.tgz", - "integrity": "sha512-DCC6El3MiTYfv98CShxz/g2s4Pxn6tV0mldCQ0UdRqaN2ApUn7E+zTrqaj5bk7yII3A43WhE9Mr6wNPbXUeVyg==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.5.tgz", + "integrity": "sha512-L4l7M78U6h/rCAxId+y5Vu+1KfDRF6dJZtitFcaT293guiUQFwJv8gLxI4Jh5wFtZ0fYd0QaCuvh2Ip79CzGMg==", "cpu": [ "arm64" ], @@ -17563,9 +17567,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.3.tgz", - "integrity": "sha512-p04ysjYXEyaCGpJvwHm0T0nkPawXtdKBTThWnlh8M5jYULVNVA1YmC9azG2Avs1GDaLgBPVUgodmFYpdSupOYA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.5.tgz", + "integrity": "sha512-DkzJc13ukXa7oJpyn24BjIgsiOybYrc+IxjsQyfNlDrrs1QXP4elStcpkD02SsIuSyHjZV8Hw2HFBMQB3OHPrA==", "cpu": [ "arm64" ], @@ -17579,9 +17583,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.3.tgz", - "integrity": "sha512-/l4KJu0xwYm6tcVSOvF8RbXrIeIHJAhWnKvuX4ZnYKFkON968kB8Ghx+1yqBQcZf36tMzSuZUC5xBUA9u66lGA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.5.tgz", + "integrity": "sha512-kj4ZwWJGeBEUzHrRQP2VudN+kkkYH7OI1dPVDc6kWQx5X4329JeKOas4qY0l7gDVjBbRwN9IbbPI6TIn2KfAug==", "cpu": [ "x64" ], @@ -17595,9 +17599,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.3.tgz", - "integrity": "sha512-54DmSnrTXq4fYEKNR0nFAImG3+FxsHlQ6Tol/v3l+rxmg2K0FeeDOpH7wTXeWhMGhFlGrLIyLSnA+SzabfoDIA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.5.tgz", + "integrity": "sha512-6pTorCs4mYhPhYtC4jNOnhGgjNd3DZcRoZ9P0tzXXP69aCbYjvlgNH/NRvAROp9AaVFeZ7a7PmCWb6+Rbe7NKg==", "cpu": [ "x64" ], @@ -17611,9 +17615,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.3.tgz", - "integrity": "sha512-piUMqoHNwDXChBfaaFIMzYgoxepfd8Ci1uXXNVEnuiRKz3FiIcNLmvXaBD7lKUwKcnGgVziH/CrndX6SldKQNQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.5.tgz", + "integrity": "sha512-o0/9pstmEjwZyrY/bA+mymF0zH7E+GT/XCVqdKeWW9Wn3gTTyWa5MZnrFgI2THQ+AXwdglMB/Zo76ARQPaz/+A==", "cpu": [ "arm64" ], @@ -17627,9 +17631,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.3.tgz", - "integrity": "sha512-zV5utPYBUzYhBOomCByAjKAvfVBcOCJtnszx7Zlfz7SAv/cGm8D1QzPDCvv6jDhIlUtLj6KyL8JXeFr+f95Fjw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.5.tgz", + "integrity": "sha512-B+nypUwsmCuaH6RtKWgiPCb+ENjxstJPPJeMJvBqlJqyCaIkZzN4M07Ozi3xVv1VG21SRkd6G3xIqRoalrNc0Q==", "cpu": [ "ia32" ], @@ -17643,9 +17647,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.3.tgz", - "integrity": "sha512-QmUiXiPIV5gBADfDh8e2jKynEhyRC+dcKP/zF9y5KqDUErYzlhocLd68uYS4uIegP6AylYlmigHgcaktGEE9VQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.5.tgz", + "integrity": "sha512-ry83ki9ZX0Q+GWGnqc2J618Z+FvKE8Ajn42F8EYi8Wj0q6Jz3mj+pJzgzakk2INm2ldEZ+FaRPipn4ozsZDcBg==", "cpu": [ "x64" ], @@ -18125,9 +18129,9 @@ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, "node_modules/@types/node": { - "version": "20.12.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", - "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", "dependencies": { "undici-types": "~5.26.4" } @@ -19842,9 +19846,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001616", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", - "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", "funding": [ { "type": "opencollective", @@ -20030,6 +20034,11 @@ "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/clean-stack": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", @@ -21705,9 +21714,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.757", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz", - "integrity": "sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==" + "version": "1.4.760", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.760.tgz", + "integrity": "sha512-xF6AWMVM/QGQseTPgXjUewfNjCW2fgUcV/z5cSG0r+SiYcgtvcmRAL3oH/MSZwHBBD+fyKTXdQ4qGENJMSedEQ==" }, "node_modules/emittery": { "version": "0.13.1", @@ -21778,9 +21787,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -21790,6 +21799,11 @@ "node": ">=10.13.0" } }, + "node_modules/enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -23421,9 +23435,9 @@ } }, "node_modules/fly-import/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -23953,9 +23967,9 @@ } }, "node_modules/fly-import/node_modules/pacote": { - "version": "18.0.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.5.tgz", - "integrity": "sha512-AtbhPJE1gFPFdIb04spfX0UprUL0xK2eOBVVQnDNbLg7/VPrK/NkqgZRv7fkPPMM/zxZukjCkuGh+tZh7arrwQ==", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", "dev": true, "dependencies": { "@npmcli/git": "^5.0.0", @@ -27471,6 +27485,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -27698,6 +27718,14 @@ "dev": true, "peer": true }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -27934,9 +27962,9 @@ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "node_modules/launchdarkly-eventsource": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/launchdarkly-eventsource/-/launchdarkly-eventsource-2.0.1.tgz", - "integrity": "sha512-zyceGtRni8ct4es5hH8Q+2evvttItb5lOKMm8JtudZbfQFfVdH55NitgJQoGTRYkIvyMGjcaXnyt0FlzCTfspA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/launchdarkly-eventsource/-/launchdarkly-eventsource-2.0.2.tgz", + "integrity": "sha512-9Aj5KgtbV5E7XGA74Z7Ui2fSwyeNlkGtbPkdTsPOQBzT7/3ZNtOjplg+HWhNMtsM2B9orFebTy3XBGxidyHbQg==", "engines": { "node": ">=0.12.0" } @@ -28497,6 +28525,11 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -29852,6 +29885,13 @@ ], "dev": true, "peer": true, + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^7.2.1", @@ -34643,6 +34683,22 @@ "react-dom": "*" } }, + "node_modules/react-slick": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz", + "integrity": "sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==", + "dependencies": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-stately": { "version": "3.31.0", "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.31.0.tgz", @@ -35361,6 +35417,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -36054,12 +36115,9 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "bin": { "semver": "bin/semver.js" }, @@ -36102,22 +36160,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -36505,6 +36547,14 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "peerDependencies": { + "jquery": ">=1.8.0" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -36950,6 +37000,11 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -37253,9 +37308,9 @@ } }, "node_modules/svgo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", - "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.1.tgz", + "integrity": "sha512-xQQTIGRl3gHTO2PFlZFLl+Xwofj+CMOPitfoByGBNAniQnY6SbGgd31u3C8RTqdlqZqYNl9Sb83VXbimVHcU6w==", "dev": true, "optional": true, "peer": true, @@ -37269,7 +37324,7 @@ "picocolors": "^1.0.0" }, "bin": { - "svgo": "bin/svgo" + "svgo": "bin/svgo.js" }, "engines": { "node": ">=14.0.0" @@ -37994,9 +38049,9 @@ } }, "node_modules/tuf-js/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -39884,9 +39939,9 @@ } }, "node_modules/yeoman-generator/node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dependencies": { "semver": "^7.3.5" }, diff --git a/package.json b/package.json index f77c7770..e82ebd3b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "private": true, "scripts": { "prepare": "husky install", - "start": "npm run prebuild && REACT_APP_VERSION=$npm_package_version aio app run --local", "preview": "npm run prebuild && REACT_APP_VERSION=$npm_package_version aio app run", "grammar": "nearleyc web-src/src/helpers/expressions.ne -o web-src/src/helpers/Parser.generated.js", "prompts": "node scripts/generate-prompts.js", @@ -48,7 +47,9 @@ "react-intl": "6.6.4", "react-simple-code-editor": "0.13.1", "react-transition-group": "4.4.5", + "react-slick": "0.30.2", "recoil": "0.7.7", + "slick-carousel": "1.8.1", "uuid": "9.0.1", "wretch": "2.7.0" }, diff --git a/scripts/deploy.js b/scripts/deploy.js index cd4e3b9d..5d4d1b12 100644 --- a/scripts/deploy.js +++ b/scripts/deploy.js @@ -99,8 +99,8 @@ async function deploy() { try { const currentBranch = await getCurrentGitBranch(); console.log(`Current Git branch: ${currentBranch}`); - if (currentBranch === 'main') { - // If the current branch is 'main', deploy using settings from environment variables (CI/CD pipeline). + if (currentBranch === 'main' || currentBranch.startsWith('/refs/tags/')) { + // If the current branch is 'main' or a tag, deploy using settings from environment variables (CI/CD pipeline). await deployApp(); return; } @@ -149,6 +149,7 @@ async function deploy() { await deployApp(answers.answer); } catch (error) { console.error(`Error during execution: ${error.message}`); + process.exit(1); } } diff --git a/web-src/src/assets/generate.svg b/web-src/src/assets/generate.svg deleted file mode 100644 index 74497443..00000000 --- a/web-src/src/assets/generate.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/web-src/src/assets/prompts.svg b/web-src/src/assets/prompts.svg index b89fa114..41bf04e0 100644 --- a/web-src/src/assets/prompts.svg +++ b/web-src/src/assets/prompts.svg @@ -1,6 +1,4 @@ - - - - - + + + diff --git a/web-src/src/assets/refresh.svg b/web-src/src/assets/refresh.svg new file mode 100644 index 00000000..9fdc61b4 --- /dev/null +++ b/web-src/src/assets/refresh.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/web-src/src/assets/variations-scroll-indicator.svg b/web-src/src/assets/variations-scroll-indicator.svg new file mode 100644 index 00000000..b8397663 --- /dev/null +++ b/web-src/src/assets/variations-scroll-indicator.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web-src/src/components/GenerateButton.js b/web-src/src/components/GenerateButton.js index d71cdc4e..4fa82ef5 100644 --- a/web-src/src/components/GenerateButton.js +++ b/web-src/src/components/GenerateButton.js @@ -34,6 +34,58 @@ import { log } from '../helpers/MetricsHelper.js'; import { sampleRUM } from '../rum.js'; import { contentFragmentState } from '../state/ContentFragmentState.js'; import { RUN_MODE_CF } from '../state/RunMode.js'; +import { FIREFALL_ACTION_TYPES } from '../services/FirefallService.js'; + +const createWaitMessagesController = (intlFn) => { + const displayToast = (msg, timeout = 1500) => { + ToastQueue.info(msg, { timeout }); + }; + + const closeToast = () => { + // Closing an active toast, if any + const toast = document.querySelector('div[class*="spectrum-Toast-buttons"]'); + if (toast !== null) { + const closeBtn = toast.querySelector('button[aria-label="Close"]'); + if (closeBtn !== null) { + closeBtn.click(); + } + } + }; + + const waitMessages = [ + { msg: intlMessages.promptSessionSideView.variationsGeneration15SecondsWaitTimeToast, delay: 15 }, + { msg: intlMessages.promptSessionSideView.variationsGeneration30SecondsWaitTimeToast, delay: 30 }, + { msg: intlMessages.promptSessionSideView.variationsGeneration45SecondsWaitTimeToast, delay: 45 }, + { msg: intlMessages.promptSessionSideView.variationsGeneration60SecondsWaitTimeToast, delay: 60 }, + { msg: intlMessages.promptSessionSideView.variationsGeneration75SecondsWaitTimeToast, delay: 75 }, + { msg: intlMessages.promptSessionSideView.variationsGeneration90SecondsWaitTimeToast, delay: 90 }, + { msg: intlMessages.promptSessionSideView.variationsGeneration105SecondsWaitTimeToast, delay: 105 }, + { msg: intlMessages.promptSessionSideView.variationsGeneration120SecondsWaitTimeToast, delay: 120 }, + { msg: intlMessages.promptSessionSideView.variationsGenerationLongWaitTimeToast, delay: 180 }, + { msg: intlMessages.promptSessionSideView.variationsGenerationLongWaitTimeToast, delay: 240 }, + ]; + const timeoutIds = []; + return { + startDisplaying: () => { + for (const waitMessage of waitMessages) { + timeoutIds.push( + setTimeout(() => { + closeToast(); + displayToast(intlFn(waitMessage.msg)); + }, waitMessage.delay * 1000), + ); + } + }, + stopDisplaying: () => { + if (timeoutIds.length > 0) { + while (timeoutIds.length > 0) { + clearTimeout(timeoutIds.shift()); + } + closeToast(); + } + }, + }; +}; export function GenerateButton() { const { runMode, firefallService } = useApplicationContext(); @@ -52,7 +104,11 @@ export function GenerateButton() { const generateResults = useCallback(async () => { try { const finalPrompt = renderPrompt(prompt, parameters, contentFragment?.model); - const { queryId, response } = await firefallService.complete(finalPrompt, temperature); + const { queryId, response } = await firefallService.complete( + finalPrompt, + temperature, + FIREFALL_ACTION_TYPES.VARIATIONS_GENERATION, + ); const variants = createVariants(uuid, response); setResults((results) => [...results, { id: queryId, @@ -78,11 +134,17 @@ export function GenerateButton() { sampleRUM('genai:prompt:generate', { source: 'GenerateButton#handleGenerate' }); setGenerationInProgress(true); setIsOpenPromptEditor(false); + + const waitMessagesController = createWaitMessagesController(formatMessage); + waitMessagesController.startDisplaying(); + generateResults() .catch((error) => { + waitMessagesController.stopDisplaying(); ToastQueue.negative(error.message, { timeout: 2000 }); }) .finally(() => { + waitMessagesController.stopDisplaying(); setGenerationInProgress(false); }); }, [generateResults, setGenerationInProgress]); @@ -96,7 +158,7 @@ export function GenerateButton() { style="fill" onPress={handleGenerate} isDisabled={generationInProgress}> - {generationInProgress ? : } + {generationInProgress ? : } {formatMessage(intlMessages.promptSessionSideView.generateButtonLabel)} diff --git a/web-src/src/components/MainSidePanel.js b/web-src/src/components/MainSidePanel.js index 1b362ceb..17de573d 100644 --- a/web-src/src/components/MainSidePanel.js +++ b/web-src/src/components/MainSidePanel.js @@ -184,7 +184,7 @@ export function MainSidePanel(props) { && diff --git a/web-src/src/components/PromptEditor.js b/web-src/src/components/PromptEditor.js index 1065edec..81e43391 100644 --- a/web-src/src/components/PromptEditor.js +++ b/web-src/src/components/PromptEditor.js @@ -54,6 +54,7 @@ const style = { position: absolute; background-color: white; box-shadow: 2px 0px 3px 0px rgba(0, 0, 0, 0.12); + z-index:2; &:focus { outline: none; } diff --git a/web-src/src/components/PromptResultCard.js b/web-src/src/components/PromptResultCard.js index 26db2ac7..39be6e0c 100644 --- a/web-src/src/components/PromptResultCard.js +++ b/web-src/src/components/PromptResultCard.js @@ -10,7 +10,7 @@ * governing permissions and limitations under the License. */ import { - ActionButton, Button, Divider, Flex, ProgressCircle, Tooltip, TooltipTrigger, + Button, ActionButton, Tooltip, TooltipTrigger, Flex, ProgressCircle, Divider, Text, Heading, } from '@adobe/react-spectrum'; import React, { useCallback, useEffect, useRef, useState, @@ -21,6 +21,7 @@ import { ToastQueue } from '@react-spectrum/toast'; import { useSetRecoilState } from 'recoil'; import { useIntl } from 'react-intl'; +import Slider from 'react-slick'; import { intlMessages } from './PromptResultCard.l10n.js'; import { EXPRESS_LOAD_TIMEOUT } from './Constants.js'; @@ -55,6 +56,9 @@ import GenAIIcon from '../icons/GenAIIcon.js'; import { ContentFragmentExportButton } from './ContentFragmentExportButton.js'; import { RUN_MODE_CF } from '../state/RunMode.js'; +import 'slick-carousel/slick/slick.css'; +import 'slick-carousel/slick/slick-theme.css'; + const styles = { card: css` display: flex; @@ -64,32 +68,8 @@ const styles = { margin: 0 16px; `, promptSection: css` - display: flex; - flex-direction: column; - justify-content: start; - align-items: start; `, promptContent: css` - --max-lines: 3; - --line-height: 1.4; - max-height: calc(var(--max-lines) * 1em * var(--line-height)); - line-height: var(--line-height); - overflow: hidden; - color: var(--alias-content-neutral-subdued-default, var(--alias-content-neutral-subdued-default, #464646)); - font-family: Adobe Clean, serif; - font-size: 14px; - font-style: normal; - font-weight: 400; - position: relative; - ::before { - content: ""; - position: absolute; - height: calc(1em * var(--line-height)); - width: 100%; - bottom: 0; - pointer-events: none; - background: linear-gradient(to bottom, transparent, white); - } `, promptActions: css` `, @@ -105,18 +85,26 @@ const styles = { background: var(--palette-gray-50, #FFF); `, variantsContainer: css` - display: flex; flex-direction: row; gap: 10px; - justify-content: left; + align-items: center; width: 100%; - overflow: auto; - padding: 10px; + padding-left: 10px; + overflow: hidden; + position: relative; `, + variantLink: css` + cursor: pointer; + display: flex; + justify-content: center; + `, + variant: css` display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; + align-self: center; + max-width: 95%; width: 300px; height: 100px; padding: 8px; @@ -176,7 +164,7 @@ export function PromptResultCard({ result, ...props }) { runMode, firefallService, expressSdkService, } = useApplicationContext(); - const { isExpressAuthorized } = useShellContext(); + const { isExpressAuthorized, user } = useShellContext(); const [selectedVariant, setSelectedVariant] = useState(result.variants[0]); const [imagePromptProgress, setImagePromptProgress] = useState(false); @@ -194,6 +182,15 @@ export function PromptResultCard({ result, ...props }) { const resultsEndRef = useRef(); const { formatMessage } = useIntl(); + /** @see for more details https://react-slick.neostack.com/docs/example/multiple-items */ + const variationCarouselSettings = { + dots: false, + infinite: false, + speed: 500, + slidesToShow: 3, + slidesToScroll: 1, + }; + useEffect(() => { if (resultsEndRef.current) { resultsEndRef.current.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' }); @@ -211,6 +208,15 @@ export function PromptResultCard({ result, ...props }) { }); }, [result, firefallService]); + const formattedTimestamp = new Date(result.timestamp).toLocaleString(user.locale, { + month: 'numeric', + day: 'numeric', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + hour12: true, + }); + const reusePrompt = useCallback(() => { setPrompt(result.promptTemplate); setParameters(result.parameters); @@ -291,69 +297,107 @@ export function PromptResultCard({ result, ...props }) { animate={{ opacity: 1, y: 0 }} transition={{ type: 'easeInOut', duration: 0.3 }}>
-
-
{result.prompt}
-
+
+ + isQuiet + UNSAFE_className="hover-cursor-pointer" + onPress={reusePrompt}> + {formatMessage(intlMessages.promptResultCard.reuseButtonLabel)} {formatMessage(intlMessages.promptResultCard.reuseButtonTooltip)} -
-
-
+ {formattedTimestamp} + +
+ {formatMessage(intlMessages.promptResultCard.variationsHeading)} + { result.variants.map((variant) => { return ( - setSelectedVariant(variant)}> -
- + setSelectedVariant(variant)} className={styles.variantLink}> +
+ ); }) } +
-
-
-
- - {runMode !== RUN_MODE_CF - && - +
+ + + {runMode !== RUN_MODE_CF + && + toggleFavorite(selectedVariant)}> - {isFavorite(selectedVariant) ? : } - - {formatMessage(intlMessages.promptResultCard.favoriteButtonTooltip)} - - } + {isFavorite(selectedVariant) ? : } + + {formatMessage(intlMessages.promptResultCard.favoriteButtonTooltip)} + + } { - log('prompt:copy', { variant: selectedVariant.id }); - sampleRUM('genai:prompt:copy', { source: 'ResultCard#onPress' }); - navigator.clipboard.writeText(toText(selectedVariant.content)); - ToastQueue.positive( - formatMessage(intlMessages.promptResultCard.copyTextSuccessToast), - { timeout: 1000 }, - ); - }}> - + isQuiet + UNSAFE_className="hover-cursor-pointer" + onPress={() => { + log('prompt:copy', { variant: selectedVariant.id }); + sampleRUM('genai:prompt:copy', { source: 'ResultCard#onPress' }); + navigator.clipboard.writeText(toText(selectedVariant.content)); + ToastQueue.positive( + formatMessage(intlMessages.promptResultCard.copyTextSuccessToast), + { timeout: 1000 }, + ); + }}> + {formatMessage(intlMessages.promptResultCard.copyButtonTooltip)} + {runMode !== RUN_MODE_CF + && + deleteVariant(selectedVariant.id)}> + + + {formatMessage(intlMessages.promptResultCard.removeButtonTooltip)} + + } + {runMode === RUN_MODE_CF + && <> + + + + } + + + + {!isExpressAuthorized && } + + + {formatMessage(intlMessages.promptResultCard.poorButtonTooltip)} - {runMode !== RUN_MODE_CF - && - deleteVariant(selectedVariant.id)}> - - - {formatMessage(intlMessages.promptResultCard.removeButtonTooltip)} - - } - {runMode === RUN_MODE_CF - && <> - - - - } - - - - {!isExpressAuthorized && } - -
- +
+
diff --git a/web-src/src/components/PromptResultCard.l10n.js b/web-src/src/components/PromptResultCard.l10n.js index 4a223ffd..75299e0a 100644 --- a/web-src/src/components/PromptResultCard.l10n.js +++ b/web-src/src/components/PromptResultCard.l10n.js @@ -63,7 +63,7 @@ export const intlMessages = { description: 'Description for Save', }, reuseButtonTooltip: { - defaultMessage: 'Re-use', + defaultMessage: 'Load the input values and prompt used to generate variations.', id: 'promptResultCard.reuseButtonTooltip', description: 'Tooltip for Re-use button', }, @@ -114,6 +114,11 @@ export const intlMessages = { id: 'promptResultCard.generateImageButtonLabel', description: 'Label for the Generate Image button', }, + reuseButtonLabel: { + defaultMessage: 'Reuse', + id: 'promptResultCard.reuseButtonLabel', + description: 'Label for the Reuse button', + }, sendFeedbackSuccessToast: { defaultMessage: 'Feedback sent!', id: 'promptResultCard.sendFeedbackSuccessToast', @@ -139,5 +144,10 @@ export const intlMessages = { id: 'promptResultCard.expressNoAccessContextualInfoContent', description: 'Content for no access to Adobe Express', }, + variationsHeading: { + defaultMessage: 'Variations', + id: 'promptResultCard.variationsHeading', + description: 'Heading for the Variations section', + }, }, }; diff --git a/web-src/src/components/PromptSessionSideView.js b/web-src/src/components/PromptSessionSideView.js index 968934f8..f4c2bd1a 100644 --- a/web-src/src/components/PromptSessionSideView.js +++ b/web-src/src/components/PromptSessionSideView.js @@ -21,7 +21,7 @@ import { intlMessages } from './PromptSessionSideView.l10n.js'; import { PromptInputView } from './PromptInputView.js'; import { GenerateButton } from './GenerateButton.js'; -import GenerateIcon from '../assets/generate.svg'; +import GenAIIcon from '../icons/GenAIIcon.js'; import PromptIcon from '../icons/PromptIcon.js'; import ChevronLeft from '../assets/chevron-left.svg'; import { SavePromptButton } from './SavePromptButton.js'; @@ -85,7 +85,7 @@ export function PromptSessionSideView({ isOpenPromptEditor, onTogglePrompt, ...p {currentSession ? - {''} + {currentSession.name ?? 'Empty'} {currentSession.description ?? 'Empty'} diff --git a/web-src/src/components/PromptSessionSideView.l10n.js b/web-src/src/components/PromptSessionSideView.l10n.js index db6211af..0818f596 100644 --- a/web-src/src/components/PromptSessionSideView.l10n.js +++ b/web-src/src/components/PromptSessionSideView.l10n.js @@ -142,5 +142,50 @@ export const intlMessages = { id: 'promptSessionSideView.audienceSelectorLoadTargetFailedToast', description: 'Toast message for failed Adobe Target loading', }, + variationsGeneration15SecondsWaitTimeToast: { + defaultMessage: 'Preparing your content', + id: 'promptSessionSideView.variationsGeneration15SecondsWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after 15 seconds of waiting.', + }, + variationsGeneration30SecondsWaitTimeToast: { + defaultMessage: 'Thanks for your patience, your content is on its way', + id: 'promptSessionSideView.variationsGeneration30SecondsWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after 30 seconds of waiting.', + }, + variationsGeneration45SecondsWaitTimeToast: { + defaultMessage: 'Generating your content', + id: 'promptSessionSideView.variationsGeneration45SecondsWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after 45 seconds of waiting.', + }, + variationsGeneration60SecondsWaitTimeToast: { + defaultMessage: 'Thanks for your patience, your content is on its way', + id: 'promptSessionSideView.variationsGeneration60SecondsWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after 60 seconds of waiting.', + }, + variationsGeneration75SecondsWaitTimeToast: { + defaultMessage: 'Getting your content ready', + id: 'promptSessionSideView.variationsGeneration75SecondsWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after 75 seconds of waiting.', + }, + variationsGeneration90SecondsWaitTimeToast: { + defaultMessage: 'Almost done with your content', + id: 'promptSessionSideView.variationsGeneration90SecondsWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after 90 seconds of waiting.', + }, + variationsGeneration105SecondsWaitTimeToast: { + defaultMessage: 'Thanks for your patience, your content is almost ready', + id: 'promptSessionSideView.variationsGeneration105SecondsWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after 105 seconds of waiting.', + }, + variationsGeneration120SecondsWaitTimeToast: { + defaultMessage: 'Almost done with your content', + id: 'promptSessionSideView.variationsGeneration120SecondsWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after 120 seconds of waiting.', + }, + variationsGenerationLongWaitTimeToast: { + defaultMessage: 'Sorry for the delay, your content is almost ready', + id: 'promptSessionSideView.variationsGenerationLongWaitTimeToast', + description: 'This toast message notifies customers that their request is still in progress after more than 2 minutes of waiting.', + }, }, }; diff --git a/web-src/src/components/PromptTemplateCard.js b/web-src/src/components/PromptTemplateCard.js index 2921dd6e..199aafe4 100644 --- a/web-src/src/components/PromptTemplateCard.js +++ b/web-src/src/components/PromptTemplateCard.js @@ -21,7 +21,7 @@ import DeleteIcon from '@spectrum-icons/workflow/Delete'; import { useIntl } from 'react-intl'; import { intlMessages } from './App.l10n.js'; -import GenerateIcon from '../assets/generate.svg'; +import GenAIIcon from '../icons/GenAIIcon.js'; import SmallLogo from '../assets/logo_small.svg'; import { NEW_PROMPT_TEMPLATE_ID } from '../state/PromptTemplatesState.js'; @@ -127,7 +127,7 @@ export function PromptTemplateCard({ ref={cardNodeRef} columns={['min-content', 'auto', 'min-content']} rows={['min-content', 'auto', 'min-content']}> - {''} + {template.label} {(template.isBundled) ? {''} : } {template.description} diff --git a/web-src/src/components/SavePromptButton.js b/web-src/src/components/SavePromptButton.js index d0d77768..eb986606 100644 --- a/web-src/src/components/SavePromptButton.js +++ b/web-src/src/components/SavePromptButton.js @@ -117,6 +117,7 @@ export function SavePromptButton(props) { template: prompt, modes: [runMode], isShared, + isBundled: false, created: new Date().getTime(), lastModified: new Date().getTime(), createdBy: name, diff --git a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/de_de.json b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/de_de.json index ff8166c4..814bacca 100644 --- a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/de_de.json +++ b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/de_de.json @@ -4,7 +4,7 @@ "contentFragmentExportButton.exportDialog.description": "Exportiert die ausgewählte Variante als neue Inhaltsfragmentvariante.", "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "Exportieren und öffnen", "contentFragmentExportButton.exportDialog.exportButtonLabel": "Exportieren", - "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "Export läuft...", + "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "Export läuft …", "contentFragmentExportButton.exportDialog.nameFieldLabel": "Name", "contentFragmentExportButton.exportDialog.title": "In Inhaltsfragment exportieren" } diff --git a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/es_es.json b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/es_es.json index 4c90cdbf..af755ac8 100644 --- a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/es_es.json +++ b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/es_es.json @@ -1,7 +1,7 @@ { "contentFragmentExportButton.buttonLabel": "Exportar variación", "contentFragmentExportButton.exportDialog.cancelButtonLabel": "Cancelar", - "contentFragmentExportButton.exportDialog.description": "Exporta la variación seleccionada como una nueva variación de fragmento de contenido.", + "contentFragmentExportButton.exportDialog.description": "Exportar la variación seleccionada como una nueva variación de fragmento de contenido.", "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "Exportar y abrir", "contentFragmentExportButton.exportDialog.exportButtonLabel": "Exportar", "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "Exportando...", diff --git a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/fr_fr.json b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/fr_fr.json index 9f152291..8a76d030 100644 --- a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/fr_fr.json +++ b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/fr_fr.json @@ -1,10 +1,10 @@ { "contentFragmentExportButton.buttonLabel": "Exporter la variation", "contentFragmentExportButton.exportDialog.cancelButtonLabel": "Annuler", - "contentFragmentExportButton.exportDialog.description": "Exportez la variation sélectionnée en tant que nouvelle variation de fragment de contenu.", + "contentFragmentExportButton.exportDialog.description": "Exporter la variation sélectionnée en tant que nouvelle variation de fragment de contenu.", "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "Exporter et ouvrir", "contentFragmentExportButton.exportDialog.exportButtonLabel": "Exporter", - "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "Exportation en cours...", + "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "Export en cours...", "contentFragmentExportButton.exportDialog.nameFieldLabel": "Nom", "contentFragmentExportButton.exportDialog.title": "Exporter vers un fragment de contenu" } diff --git a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/it_it.json b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/it_it.json index 5fef9a64..8b9b4268 100644 --- a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/it_it.json +++ b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/it_it.json @@ -4,7 +4,7 @@ "contentFragmentExportButton.exportDialog.description": "Esporta la variante selezionata come nuova variante di frammento di contenuto.", "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "Esporta e apri", "contentFragmentExportButton.exportDialog.exportButtonLabel": "Esporta", - "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "Esportazione...", + "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "Esportazione in corso...", "contentFragmentExportButton.exportDialog.nameFieldLabel": "Nome", "contentFragmentExportButton.exportDialog.title": "Esporta in frammento di contenuto" } diff --git a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/ja_jp.json b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/ja_jp.json index 2977ae1c..24f82b8e 100644 --- a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/ja_jp.json +++ b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/ja_jp.json @@ -1,10 +1,10 @@ { - "contentFragmentExportButton.buttonLabel": "エクスポートのバリエーション", + "contentFragmentExportButton.buttonLabel": "書き出しのバリエーション", "contentFragmentExportButton.exportDialog.cancelButtonLabel": "キャンセル", "contentFragmentExportButton.exportDialog.description": "選択したバリエーションを新しいコンテンツフラグメントバリエーションとして書き出します。", - "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "エクスポートして開く", - "contentFragmentExportButton.exportDialog.exportButtonLabel": "エクスポート", - "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "エクスポート中…", + "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "書き出して開く", + "contentFragmentExportButton.exportDialog.exportButtonLabel": "書き出し", + "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "書き出し中…", "contentFragmentExportButton.exportDialog.nameFieldLabel": "名前", "contentFragmentExportButton.exportDialog.title": "コンテンツフラグメントに書き出し" } diff --git a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/ko_kr.json b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/ko_kr.json index e917413d..e9edcfc0 100644 --- a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/ko_kr.json +++ b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/ko_kr.json @@ -1,10 +1,10 @@ { "contentFragmentExportButton.buttonLabel": "변형 내보내기", "contentFragmentExportButton.exportDialog.cancelButtonLabel": "취소", - "contentFragmentExportButton.exportDialog.description": "선택한 변형을 새 컨텐츠 조각 변형으로 내보냅니다.", + "contentFragmentExportButton.exportDialog.description": "선택한 변형을 새 콘텐츠 조각 변형으로 내보냅니다.", "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "내보내기 및 열기", "contentFragmentExportButton.exportDialog.exportButtonLabel": "내보내기", - "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "내보내기...", + "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "내보내는 중...", "contentFragmentExportButton.exportDialog.nameFieldLabel": "이름", - "contentFragmentExportButton.exportDialog.title": "컨텐츠 조각으로 내보내기" + "contentFragmentExportButton.exportDialog.title": "콘텐츠 조각으로 내보내기" } diff --git a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/zh_cn.json b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/zh_cn.json index d9771dd6..aa34c712 100644 --- a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/zh_cn.json +++ b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/zh_cn.json @@ -1,10 +1,10 @@ { - "contentFragmentExportButton.buttonLabel": "导出变量", + "contentFragmentExportButton.buttonLabel": "导出变体", "contentFragmentExportButton.exportDialog.cancelButtonLabel": "取消", - "contentFragmentExportButton.exportDialog.description": "将所选变量导出为新内容片段变量。", - "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "导出并打开", + "contentFragmentExportButton.exportDialog.description": "将选定的变体导出为新的内容片段变体。", + "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "导出和打开", "contentFragmentExportButton.exportDialog.exportButtonLabel": "导出", - "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "正在导出……", + "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "正在导出…", "contentFragmentExportButton.exportDialog.nameFieldLabel": "名称", "contentFragmentExportButton.exportDialog.title": "导出到内容片段" } diff --git a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/zh_tw.json b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/zh_tw.json index c679e9e2..8f376995 100644 --- a/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/zh_tw.json +++ b/web-src/src/components/__localization__/ContentFragmentExportButton.l10n/zh_tw.json @@ -1,10 +1,10 @@ { - "contentFragmentExportButton.buttonLabel": "匯出變數", + "contentFragmentExportButton.buttonLabel": "匯出變化版本", "contentFragmentExportButton.exportDialog.cancelButtonLabel": "取消", - "contentFragmentExportButton.exportDialog.description": "將選取的變數匯出為新內容片段變數。", + "contentFragmentExportButton.exportDialog.description": "將所選的變化版本匯出為新的內容片段變化版本。", "contentFragmentExportButton.exportDialog.exportAndOpenButtonLabel": "匯出並開啟", "contentFragmentExportButton.exportDialog.exportButtonLabel": "匯出", - "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "正在匯出……", + "contentFragmentExportButton.exportDialog.exportButtonProgressAreaLabel": "匯出中…", "contentFragmentExportButton.exportDialog.nameFieldLabel": "名稱", "contentFragmentExportButton.exportDialog.title": "匯出至內容片段" } diff --git a/web-src/src/components/__localization__/Favorites.l10n/de_de.json b/web-src/src/components/__localization__/Favorites.l10n/de_de.json index 00976a40..5d076df3 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/de_de.json +++ b/web-src/src/components/__localization__/Favorites.l10n/de_de.json @@ -1,10 +1,10 @@ { - "favoritesView.backButtonAltText": "Zurück zu allen Eingabeaufforderungen", + "favoritesView.backButtonAltText": "Zurück zu allen Prompts", "favoritesView.copyButtonTooltip": "Kopieren", "favoritesView.copyTextSuccessToast": "Text in die Zwischenablage kopiert!", "favoritesView.deselectAllButtonLabel": "Auswahl aufheben", - "favoritesView.exportToCSVButtonLabel": "Als CSV exportieren", - "favoritesView.exportToCSVButtonTooltip": "Exportieren Sie die ausgewählten Varianten (nur Textinhalte) in eine CSV-Datei.", + "favoritesView.exportToCSVButtonLabel": "In CSV exportieren", + "favoritesView.exportToCSVButtonTooltip": "Exportiert die ausgewählten Varianten (nur Textinhalte) in eine CSV-Datei.", "favoritesView.generateImageButtonLabel": "Bild generieren", "favoritesView.generateImageFailedToast": "Ein Problem ist aufgetreten. Versuchen sie es später erneut.", "favoritesView.navigationLabel": "Prompt-Vorlagen", @@ -12,7 +12,7 @@ "favoritesView.removeButtonTooltip": "Löschen", "favoritesView.removeFromFavoritesAlertCancelButtonLabel": "Abbrechen", "favoritesView.removeFromFavoritesAlertDeleteButtonLabel": "Löschen", - "favoritesView.removeFromFavoritesAlertMessage": "Möchten Sie die ausgewählten Elemente wirklich aus Ihren Favoriten löschen?", + "favoritesView.removeFromFavoritesAlertMessage": "Möchten Sie die ausgewählten Elemente wirklich aus den Favoriten löschen?", "favoritesView.removeFromFavoritesAlertTitle": "Ausgewählte Elemente löschen?", "favoritesView.removeFromFavoritesButtonLabel": "Löschen", "favoritesView.selectAllButtonLabel": "Alle auswählen" diff --git a/web-src/src/components/__localization__/Favorites.l10n/es_es.json b/web-src/src/components/__localization__/Favorites.l10n/es_es.json index 45592e6b..bb797c99 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/es_es.json +++ b/web-src/src/components/__localization__/Favorites.l10n/es_es.json @@ -12,7 +12,7 @@ "favoritesView.removeButtonTooltip": "Eliminar", "favoritesView.removeFromFavoritesAlertCancelButtonLabel": "Cancelar", "favoritesView.removeFromFavoritesAlertDeleteButtonLabel": "Eliminar", - "favoritesView.removeFromFavoritesAlertMessage": "¿Seguro que desea eliminar los elementos seleccionados de sus favoritos?", + "favoritesView.removeFromFavoritesAlertMessage": "¿Seguro que desea eliminar los elementos seleccionados de los favoritos?", "favoritesView.removeFromFavoritesAlertTitle": "¿Desea eliminar los elementos seleccionados?", "favoritesView.removeFromFavoritesButtonLabel": "Eliminar", "favoritesView.selectAllButtonLabel": "Seleccionar todo" diff --git a/web-src/src/components/__localization__/Favorites.l10n/fr_fr.json b/web-src/src/components/__localization__/Favorites.l10n/fr_fr.json index 1546ef85..1d8534be 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/fr_fr.json +++ b/web-src/src/components/__localization__/Favorites.l10n/fr_fr.json @@ -12,8 +12,8 @@ "favoritesView.removeButtonTooltip": "Supprimer", "favoritesView.removeFromFavoritesAlertCancelButtonLabel": "Annuler", "favoritesView.removeFromFavoritesAlertDeleteButtonLabel": "Supprimer", - "favoritesView.removeFromFavoritesAlertMessage": "Voulez-vous vraiment supprimer les éléments sélectionnés de vos favoris ?", - "favoritesView.removeFromFavoritesAlertTitle": "Supprimer les éléments sélectionnés ?", + "favoritesView.removeFromFavoritesAlertMessage": "Voulez-vous vraiment supprimer les éléments sélectionnés de vos favoris ?", + "favoritesView.removeFromFavoritesAlertTitle": "Supprimer les éléments sélectionnés ?", "favoritesView.removeFromFavoritesButtonLabel": "Supprimer", "favoritesView.selectAllButtonLabel": "Tout sélectionner" } diff --git a/web-src/src/components/__localization__/Favorites.l10n/it_it.json b/web-src/src/components/__localization__/Favorites.l10n/it_it.json index c706ec51..aeaac8de 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/it_it.json +++ b/web-src/src/components/__localization__/Favorites.l10n/it_it.json @@ -4,7 +4,7 @@ "favoritesView.copyTextSuccessToast": "Testo copiato negli Appunti.", "favoritesView.deselectAllButtonLabel": "Deseleziona tutto", "favoritesView.exportToCSVButtonLabel": "Esporta in CSV", - "favoritesView.exportToCSVButtonTooltip": "Esporta le varianti selezionate (solo testo) in un file CSV.", + "favoritesView.exportToCSVButtonTooltip": "Esporta le varianti selezionate (solo contenuto testo) in un file CSV.", "favoritesView.generateImageButtonLabel": "Genera immagine", "favoritesView.generateImageFailedToast": "Si è verificato un errore. Riprova.", "favoritesView.navigationLabel": "Modelli di prompt", @@ -13,7 +13,7 @@ "favoritesView.removeFromFavoritesAlertCancelButtonLabel": "Annulla", "favoritesView.removeFromFavoritesAlertDeleteButtonLabel": "Elimina", "favoritesView.removeFromFavoritesAlertMessage": "Eliminare gli elementi selezionati dai preferiti?", - "favoritesView.removeFromFavoritesAlertTitle": "Eliminare gli elementi selezionati?", + "favoritesView.removeFromFavoritesAlertTitle": "Eliminare elementi selezionati?", "favoritesView.removeFromFavoritesButtonLabel": "Elimina", "favoritesView.selectAllButtonLabel": "Seleziona tutto" } diff --git a/web-src/src/components/__localization__/Favorites.l10n/ja_jp.json b/web-src/src/components/__localization__/Favorites.l10n/ja_jp.json index a3d0568b..df73f3ea 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/ja_jp.json +++ b/web-src/src/components/__localization__/Favorites.l10n/ja_jp.json @@ -2,9 +2,9 @@ "favoritesView.backButtonAltText": "すべてのプロンプトに戻る", "favoritesView.copyButtonTooltip": "コピー", "favoritesView.copyTextSuccessToast": "テキストをクリップボードにコピーしました", - "favoritesView.deselectAllButtonLabel": "すべて選択解除", + "favoritesView.deselectAllButtonLabel": "すべてを選択解除", "favoritesView.exportToCSVButtonLabel": "CSV に書き出し", - "favoritesView.exportToCSVButtonTooltip": "選択したバリアント(テキストコンテンツのみ)を CSV ファイルに書き出します。", + "favoritesView.exportToCSVButtonTooltip": "選択したバリアント (テキストコンテンツのみ) を CSV ファイルに書き出します。", "favoritesView.generateImageButtonLabel": "画像を生成", "favoritesView.generateImageFailedToast": "エラーが発生しました。もう一度試してください。", "favoritesView.navigationLabel": "プロンプトテンプレート", @@ -13,7 +13,7 @@ "favoritesView.removeFromFavoritesAlertCancelButtonLabel": "キャンセル", "favoritesView.removeFromFavoritesAlertDeleteButtonLabel": "削除", "favoritesView.removeFromFavoritesAlertMessage": "選択した項目をお気に入りから削除してもよろしいですか?", - "favoritesView.removeFromFavoritesAlertTitle": "選択した項目を削除しますか。", + "favoritesView.removeFromFavoritesAlertTitle": "選択した項目を削除しますか?", "favoritesView.removeFromFavoritesButtonLabel": "削除", - "favoritesView.selectAllButtonLabel": "すべて選択" + "favoritesView.selectAllButtonLabel": "すべてを選択" } diff --git a/web-src/src/components/__localization__/Favorites.l10n/ko_kr.json b/web-src/src/components/__localization__/Favorites.l10n/ko_kr.json index 651451db..e688147a 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/ko_kr.json +++ b/web-src/src/components/__localization__/Favorites.l10n/ko_kr.json @@ -2,9 +2,9 @@ "favoritesView.backButtonAltText": "모든 프롬프트로 돌아가기", "favoritesView.copyButtonTooltip": "복사", "favoritesView.copyTextSuccessToast": "텍스트가 클립보드에 복사되었습니다.", - "favoritesView.deselectAllButtonLabel": "모두 선택 취소", + "favoritesView.deselectAllButtonLabel": "모두 선택 해제", "favoritesView.exportToCSVButtonLabel": "CSV로 내보내기", - "favoritesView.exportToCSVButtonTooltip": "선택한 변형(텍스트 컨텐츠만)을 CSV 파일로 내보냅니다.", + "favoritesView.exportToCSVButtonTooltip": "선택한 변형(텍스트 콘텐츠만)을 CSV 파일로 내보냅니다.", "favoritesView.generateImageButtonLabel": "이미지 생성", "favoritesView.generateImageFailedToast": "문제가 발생했습니다. 다시 시도해 주십시오.", "favoritesView.navigationLabel": "프롬프트 템플릿", diff --git a/web-src/src/components/__localization__/Favorites.l10n/pt_br.json b/web-src/src/components/__localization__/Favorites.l10n/pt_br.json index 58dcbf36..5a98c8e1 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/pt_br.json +++ b/web-src/src/components/__localization__/Favorites.l10n/pt_br.json @@ -4,7 +4,7 @@ "favoritesView.copyTextSuccessToast": "Copiado para a área de transferência.", "favoritesView.deselectAllButtonLabel": "Desmarcar tudo", "favoritesView.exportToCSVButtonLabel": "Exportar para CSV", - "favoritesView.exportToCSVButtonTooltip": "Exportar as variantes selecionadas (somente conteúdo de texto) para um arquivo CSV.", + "favoritesView.exportToCSVButtonTooltip": "Exporte as variantes selecionadas (somente conteúdo de texto) para um arquivo CSV.", "favoritesView.generateImageButtonLabel": "Gerar imagem", "favoritesView.generateImageFailedToast": "Algo deu errado. Tente novamente.", "favoritesView.navigationLabel": "Modelos de prompt", @@ -12,8 +12,8 @@ "favoritesView.removeButtonTooltip": "Excluir", "favoritesView.removeFromFavoritesAlertCancelButtonLabel": "Cancelar", "favoritesView.removeFromFavoritesAlertDeleteButtonLabel": "Excluir", - "favoritesView.removeFromFavoritesAlertMessage": "Tem certeza de que deseja excluir os itens selecionados dos seus favoritos?", - "favoritesView.removeFromFavoritesAlertTitle": "Excluir itens selecionados?", + "favoritesView.removeFromFavoritesAlertMessage": "Deseja excluir os itens selecionados dos seus favoritos?", + "favoritesView.removeFromFavoritesAlertTitle": "Excluir os itens selecionados?", "favoritesView.removeFromFavoritesButtonLabel": "Excluir", "favoritesView.selectAllButtonLabel": "Selecionar tudo" } diff --git a/web-src/src/components/__localization__/Favorites.l10n/zh_cn.json b/web-src/src/components/__localization__/Favorites.l10n/zh_cn.json index 7159a507..e498eb12 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/zh_cn.json +++ b/web-src/src/components/__localization__/Favorites.l10n/zh_cn.json @@ -1,10 +1,10 @@ { - "favoritesView.backButtonAltText": "返回到所有提示", + "favoritesView.backButtonAltText": "返回所有提示", "favoritesView.copyButtonTooltip": "复制", "favoritesView.copyTextSuccessToast": "已将文本复制到剪贴板!", - "favoritesView.deselectAllButtonLabel": "取消全选", - "favoritesView.exportToCSVButtonLabel": "导出到CSV", - "favoritesView.exportToCSVButtonTooltip": "将选定变体(仅限文本内容)导出到CSV文件。", + "favoritesView.deselectAllButtonLabel": "取消选择全部", + "favoritesView.exportToCSVButtonLabel": "导出到 CSV", + "favoritesView.exportToCSVButtonTooltip": "将所选变体(仅文本内容)导出到 CSV 文件。", "favoritesView.generateImageButtonLabel": "生成图像", "favoritesView.generateImageFailedToast": "出现错误。请重试!", "favoritesView.navigationLabel": "提示模板", @@ -12,7 +12,7 @@ "favoritesView.removeButtonTooltip": "删除", "favoritesView.removeFromFavoritesAlertCancelButtonLabel": "取消", "favoritesView.removeFromFavoritesAlertDeleteButtonLabel": "删除", - "favoritesView.removeFromFavoritesAlertMessage": "是否确实要从收藏夹中删除选定的项目?", + "favoritesView.removeFromFavoritesAlertMessage": "是否确实要从收藏夹中删除所选项目?", "favoritesView.removeFromFavoritesAlertTitle": "删除所选项目?", "favoritesView.removeFromFavoritesButtonLabel": "删除", "favoritesView.selectAllButtonLabel": "全选" diff --git a/web-src/src/components/__localization__/Favorites.l10n/zh_tw.json b/web-src/src/components/__localization__/Favorites.l10n/zh_tw.json index 29ab505d..63464c47 100644 --- a/web-src/src/components/__localization__/Favorites.l10n/zh_tw.json +++ b/web-src/src/components/__localization__/Favorites.l10n/zh_tw.json @@ -3,8 +3,8 @@ "favoritesView.copyButtonTooltip": "複製", "favoritesView.copyTextSuccessToast": "已將文字複製到剪貼簿!", "favoritesView.deselectAllButtonLabel": "取消全選", - "favoritesView.exportToCSVButtonLabel": "匯出至CSV", - "favoritesView.exportToCSVButtonTooltip": "將選取的變體(僅限文字內容)匯出至CSV檔案。", + "favoritesView.exportToCSVButtonLabel": "匯出至 CSV", + "favoritesView.exportToCSVButtonTooltip": "將所選的變體 (僅限文字內容) 匯出至 CSV 檔案。", "favoritesView.generateImageButtonLabel": "產生影像", "favoritesView.generateImageFailedToast": "發生錯誤。請再試一次!", "favoritesView.navigationLabel": "提示範本", @@ -12,8 +12,8 @@ "favoritesView.removeButtonTooltip": "刪除", "favoritesView.removeFromFavoritesAlertCancelButtonLabel": "取消", "favoritesView.removeFromFavoritesAlertDeleteButtonLabel": "刪除", - "favoritesView.removeFromFavoritesAlertMessage": "您確定要從我的最愛刪除選取的專案嗎?", - "favoritesView.removeFromFavoritesAlertTitle": "刪除選取的專案?", + "favoritesView.removeFromFavoritesAlertMessage": "您確定要從最愛項目中刪除所選項目嗎?", + "favoritesView.removeFromFavoritesAlertTitle": "是否要刪除所選項目?", "favoritesView.removeFromFavoritesButtonLabel": "刪除", "favoritesView.selectAllButtonLabel": "全選" } diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/de_de.json b/web-src/src/components/__localization__/MainSidePanel.l10n/de_de.json index a1182e12..ff8e6daa 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/de_de.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/de_de.json @@ -1,6 +1,6 @@ { "mainSidePanel.collapseMenuType": "Seitliches Bedienfeld schließen", - "mainSidePanel.contentFragmentHostNameLabel": "Verbunden mit AEM Instanz:", + "mainSidePanel.contentFragmentHostNameLabel": "Verbunden mit AEM-Instanz:", "mainSidePanel.contentFragmentTileLabel": "Inhaltsfragment:", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "Seitliches Bedienfeld erweitern", diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/es_es.json b/web-src/src/components/__localization__/MainSidePanel.l10n/es_es.json index f14a8ce3..343755a1 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/es_es.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/es_es.json @@ -1,6 +1,6 @@ { "mainSidePanel.collapseMenuType": "Contraer panel lateral", - "mainSidePanel.contentFragmentHostNameLabel": "Conectado a AEM instancia:", + "mainSidePanel.contentFragmentHostNameLabel": "Conectado a instancia de AEM:", "mainSidePanel.contentFragmentTileLabel": "Fragmento de contenido:", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "Expandir panel lateral", diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/fr_fr.json b/web-src/src/components/__localization__/MainSidePanel.l10n/fr_fr.json index 11e585f0..68ae78f7 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/fr_fr.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/fr_fr.json @@ -1,14 +1,14 @@ { "mainSidePanel.collapseMenuType": "Réduire le panneau latéral", - "mainSidePanel.contentFragmentHostNameLabel": "Connecté à l'instance AEM :", - "mainSidePanel.contentFragmentTileLabel": "Fragment de contenu :", + "mainSidePanel.contentFragmentHostNameLabel": "Connecté à l’instance AEM :", + "mainSidePanel.contentFragmentTileLabel": "Fragment de contenu :", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "Développer le panneau latéral", "mainSidePanel.favoritesMenuItem": "Favoris", "mainSidePanel.favoritesMenuItemAltText": "Favoris", "mainSidePanel.helpAndFaqsMenuItem": "Aide et FAQ", "mainSidePanel.promptTemplatesMenuItem": "Modèles de prompt", - "mainSidePanel.promptTemplatesMenuItemAltText": "Modèles de prompt", + "mainSidePanel.promptTemplatesMenuItemAltText": "Modèles d’invite", "mainSidePanel.recentsMenuItem": "Récents", "mainSidePanel.recentsMenuItemAltText": "Récents", "mainSidePanel.title": "Générer des variations", diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/it_it.json b/web-src/src/components/__localization__/MainSidePanel.l10n/it_it.json index 94423e0e..01829fc5 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/it_it.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/it_it.json @@ -1,6 +1,6 @@ { "mainSidePanel.collapseMenuType": "Comprimi pannello laterale", - "mainSidePanel.contentFragmentHostNameLabel": "AEM Collegato all'istanza di alimentazione:", + "mainSidePanel.contentFragmentHostNameLabel": "Collegato all’istanza AEM:", "mainSidePanel.contentFragmentTileLabel": "Frammento di contenuto:", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "Espandi pannello laterale", diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/ja_jp.json b/web-src/src/components/__localization__/MainSidePanel.l10n/ja_jp.json index 3e433743..d89ba96d 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/ja_jp.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/ja_jp.json @@ -1,7 +1,7 @@ { "mainSidePanel.collapseMenuType": "折りたたみ式サイドパネル", - "mainSidePanel.contentFragmentHostNameLabel": "接続したAEMインスタンス:", - "mainSidePanel.contentFragmentTileLabel": "コンテンツフラグメント:", + "mainSidePanel.contentFragmentHostNameLabel": "次の AEM インスタンスに接続しました :", + "mainSidePanel.contentFragmentTileLabel": "コンテンツフラグメント", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "サイドパネルを展開", "mainSidePanel.favoritesMenuItem": "お気に入り", diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/ko_kr.json b/web-src/src/components/__localization__/MainSidePanel.l10n/ko_kr.json index 0af7126e..3a99f3a0 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/ko_kr.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/ko_kr.json @@ -1,7 +1,7 @@ { "mainSidePanel.collapseMenuType": "사이드 패널 접기", "mainSidePanel.contentFragmentHostNameLabel": "AEM 인스턴스에 연결됨:", - "mainSidePanel.contentFragmentTileLabel": "컨텐츠 조각:", + "mainSidePanel.contentFragmentTileLabel": "콘텐츠 조각:", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "사이드 패널 펼치기", "mainSidePanel.favoritesMenuItem": "즐겨찾기", diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/pt_br.json b/web-src/src/components/__localization__/MainSidePanel.l10n/pt_br.json index 7cda7103..7463d276 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/pt_br.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/pt_br.json @@ -1,6 +1,6 @@ { "mainSidePanel.collapseMenuType": "Recolher painel lateral", - "mainSidePanel.contentFragmentHostNameLabel": "AEM Conectado a", + "mainSidePanel.contentFragmentHostNameLabel": "Conectado à instância do AEM:", "mainSidePanel.contentFragmentTileLabel": "Fragmento de conteúdo:", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "Expandir painel lateral", diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/zh_cn.json b/web-src/src/components/__localization__/MainSidePanel.l10n/zh_cn.json index b4fdfdb8..bdf06e34 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/zh_cn.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/zh_cn.json @@ -1,6 +1,6 @@ { "mainSidePanel.collapseMenuType": "折叠侧面板", - "mainSidePanel.contentFragmentHostNameLabel": "已连接到AEM实例:", + "mainSidePanel.contentFragmentHostNameLabel": "已连接到 AEM 实例:", "mainSidePanel.contentFragmentTileLabel": "内容片段:", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "展开侧面板", diff --git a/web-src/src/components/__localization__/MainSidePanel.l10n/zh_tw.json b/web-src/src/components/__localization__/MainSidePanel.l10n/zh_tw.json index fb381bbe..5f2ef17b 100644 --- a/web-src/src/components/__localization__/MainSidePanel.l10n/zh_tw.json +++ b/web-src/src/components/__localization__/MainSidePanel.l10n/zh_tw.json @@ -1,6 +1,6 @@ { "mainSidePanel.collapseMenuType": "收合側邊面板", - "mainSidePanel.contentFragmentHostNameLabel": "已連線至AEM例項:", + "mainSidePanel.contentFragmentHostNameLabel": "連接到 AEM 執行個體:", "mainSidePanel.contentFragmentTileLabel": "內容片段:", "mainSidePanel.copyrightLabel": "Copyright © 2024 Adobe. All rights reserved", "mainSidePanel.expandMenuType": "展開側邊面板", diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/de_de.json b/web-src/src/components/__localization__/PromptResultCard.l10n/de_de.json index 9491e806..a86274ad 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/de_de.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/de_de.json @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "Wenn Sie den generierten Inhalt weiter optimieren möchten, aktualisieren Sie das Prompt und/oder die Eingabefelder. Wenn Sie mit dem Inhalt zufrieden Sind, nutzen Sie ihn in Ihrer AEM-Authoring-Umgebung.", "promptResultCard.refineContentTitle": "Inhalte verfeinern und verwenden", "promptResultCard.removeButtonTooltip": "Entfernen", - "promptResultCard.reuseButtonTooltip": "Wiederverwenden", + "promptResultCard.reuseButtonLabel": "Wiederverwendung", + "promptResultCard.reuseButtonTooltip": "Laden Sie die Eingabewerte und die Eingabeaufforderung, die zum Generieren von Varianten verwendet werden.", "promptResultCard.savePromptDescription": "Wenn Sie das erstellte Prompt wiederverwenden möchten, wählen Sie „Speichern“. Auf diese Weise können Sie das Prompt für die zukünftige Verwendung speichern. Sie können sie auf Benutzer- oder Unternehmensebene speichern.", "promptResultCard.savePromptTitle": "Speichern", - "promptResultCard.sendFeedbackSuccessToast": "Feedback gesendet!" + "promptResultCard.sendFeedbackSuccessToast": "Feedback gesendet!", + "promptResultCard.variationsHeading": "Varianten" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/en_us.json b/web-src/src/components/__localization__/PromptResultCard.l10n/en_us.json index 50b6e219..b3a64575 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/en_us.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/en_us.json @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "After content is generated if you want to refine it further, update the prompt and / or input fields. Once you are happy with the content leverage in your AEM authoring experience.", "promptResultCard.refineContentTitle": "Refine and use Content", "promptResultCard.removeButtonTooltip": "Remove", - "promptResultCard.reuseButtonTooltip": "Re-use", + "promptResultCard.reuseButtonLabel": "Reuse", + "promptResultCard.reuseButtonTooltip": "Load the input values and prompt used to generate variations.", "promptResultCard.savePromptDescription": "If you want to reuse the prompt created select \"Save\". This allows you to store the prompt for future use. You can save it at the user or organization level.", "promptResultCard.savePromptTitle": "Save", - "promptResultCard.sendFeedbackSuccessToast": "Feedback sent!" + "promptResultCard.sendFeedbackSuccessToast": "Feedback sent!", + "promptResultCard.variationsHeading": "Variations" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/es_es.json b/web-src/src/components/__localization__/PromptResultCard.l10n/es_es.json index 49dab26b..fb2e4933 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/es_es.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/es_es.json @@ -1,5 +1,5 @@ { - "promptResultCard.contentFragmentExportDialogDescription": "Exporta la variación seleccionada como una nueva variación de fragmento de contenido.", + "promptResultCard.contentFragmentExportDialogDescription": "Exportar la variación seleccionada como una nueva variación de fragmento de contenido.", "promptResultCard.contentFragmentExportDialogExportButtonLabel": "Nombre de variación", "promptResultCard.contentFragmentExportDialogTitle": "Exportar a fragmento de contenido", "promptResultCard.copyButtonTooltip": "Copiar", @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "Si, una vez generado el contenido, desea perfeccionarlo, actualice los campos de indicación o entrada. Una vez conforme con el contenido, aprovéchelo en su experiencia de creación de AEM.", "promptResultCard.refineContentTitle": "Perfeccionar y utilizar contenido", "promptResultCard.removeButtonTooltip": "Quitar", - "promptResultCard.reuseButtonTooltip": "Reutilizar", + "promptResultCard.reuseButtonLabel": "Reutilizar", + "promptResultCard.reuseButtonTooltip": "Cargue los valores de entrada y el indicador utilizado para generar variaciones.", "promptResultCard.savePromptDescription": "Si desea volver a utilizar la indicación creada, seleccione \"Guardar\". Esto le permite almacenar la indicación para un uso futuro. Puede guardarla en el nivel de usuario u organización.", "promptResultCard.savePromptTitle": "Guardar", - "promptResultCard.sendFeedbackSuccessToast": "Comentarios enviados" + "promptResultCard.sendFeedbackSuccessToast": "Comentarios enviados", + "promptResultCard.variationsHeading": "Variaciones" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/fr_fr.json b/web-src/src/components/__localization__/PromptResultCard.l10n/fr_fr.json index 89169edc..b8b6f975 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/fr_fr.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/fr_fr.json @@ -1,6 +1,6 @@ { - "promptResultCard.contentFragmentExportDialogDescription": "Exportez la variation sélectionnée en tant que nouvelle variation de fragment de contenu.", - "promptResultCard.contentFragmentExportDialogExportButtonLabel": "Nom de variation", + "promptResultCard.contentFragmentExportDialogDescription": "Exporter la variation sélectionnée en tant que nouvelle variation de fragment de contenu.", + "promptResultCard.contentFragmentExportDialogExportButtonLabel": "Nom de la variation", "promptResultCard.contentFragmentExportDialogTitle": "Exporter vers un fragment de contenu", "promptResultCard.copyButtonTooltip": "Copier", "promptResultCard.copyTextSuccessToast": "Texte copié dans le presse-papiers !", @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "Une fois le contenu généré, si vous souhaitez l’affiner davantage, mettez à jour les champs de prompt et/ou de saisie. Une fois que le contenu vous convient, utilisez-le dans votre expérience de création AEM.", "promptResultCard.refineContentTitle": "Affiner et utiliser le contenu", "promptResultCard.removeButtonTooltip": "Supprimer", - "promptResultCard.reuseButtonTooltip": "Réutiliser", + "promptResultCard.reuseButtonLabel": "Réutiliser", + "promptResultCard.reuseButtonTooltip": "Chargez les valeurs d’entrée et l’invite utilisées pour générer les variations.", "promptResultCard.savePromptDescription": "Si vous souhaitez réutiliser le prompt créé, sélectionnez « Enregistrer ». Cela vous permet de stocker le prompt en vue d’une utilisation ultérieure. Vous pouvez l’enregistrer au niveau de l’utilisateur ou de l’utilisatrice, ou à l’échelle de l’organisation.", "promptResultCard.savePromptTitle": "Enregistrer", - "promptResultCard.sendFeedbackSuccessToast": "Commentaires envoyés !" + "promptResultCard.sendFeedbackSuccessToast": "Commentaires envoyés !", + "promptResultCard.variationsHeading": "Variations" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/it_it.json b/web-src/src/components/__localization__/PromptResultCard.l10n/it_it.json index 55c96b1b..33664b0d 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/it_it.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/it_it.json @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "Dopo aver generato il contenuto, puoi perfezionarlo ulteriormente aggiornando il prompt e/o i campi di input. Una volta ottenuto i contenuti desiderati, puoi utilizzarli nella tua esperienza di authoring AEM.", "promptResultCard.refineContentTitle": "Perfeziona e utilizza il contenuto", "promptResultCard.removeButtonTooltip": "Rimuovi", - "promptResultCard.reuseButtonTooltip": "Riutilizza", + "promptResultCard.reuseButtonLabel": "Riutilizza", + "promptResultCard.reuseButtonTooltip": "Carica i valori di input e il prompt utilizzato per generare le varianti.", "promptResultCard.savePromptDescription": "Se intendi riutilizzare il prompt creato, seleziona “Salva” per memorizzarlo e riutilizzarlo in futuro. Puoi salvarlo a livello di utente o di organizzazione.", "promptResultCard.savePromptTitle": "Salva", - "promptResultCard.sendFeedbackSuccessToast": "Feedback inviato." + "promptResultCard.sendFeedbackSuccessToast": "Feedback inviato.", + "promptResultCard.variationsHeading": "Varianti" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/ja_jp.json b/web-src/src/components/__localization__/PromptResultCard.l10n/ja_jp.json index 15fa263e..01c9db6c 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/ja_jp.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/ja_jp.json @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "コンテンツを生成した後、さらに調整する場合は、プロンプトや入力フィールドを更新します。コンテンツに満足したら、AEM オーサリングエクスペリエンスで活用します。", "promptResultCard.refineContentTitle": "コンテンツの調整と使用", "promptResultCard.removeButtonTooltip": "削除", - "promptResultCard.reuseButtonTooltip": "再利用", + "promptResultCard.reuseButtonLabel": "再利用", + "promptResultCard.reuseButtonTooltip": "入力値を読み込み、バリエーションの生成に使用するプロンプトを表示します。", "promptResultCard.savePromptDescription": "作成したプロンプトを再利用する場合は、「保存」を選択します。これにより、今後の使用のためにプロンプトを保存できます。ユーザーまたは組織レベルで保存できます。", "promptResultCard.savePromptTitle": "保存", - "promptResultCard.sendFeedbackSuccessToast": "フィードバックを送信しました。" + "promptResultCard.sendFeedbackSuccessToast": "フィードバックを送信しました。", + "promptResultCard.variationsHeading": "バリエーション" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/jl10n.json b/web-src/src/components/__localization__/PromptResultCard.l10n/jl10n.json index c8423726..aa94735c 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/jl10n.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/jl10n.json @@ -83,8 +83,12 @@ "__value__": "Remove", "__desc__": "Tooltip for Remove button" }, + "promptResultCard.reuseButtonLabel": { + "__value__": "Reuse", + "__desc__": "Label for the Reuse button" + }, "promptResultCard.reuseButtonTooltip": { - "__value__": "Re-use", + "__value__": "Load the input values and prompt used to generate variations.", "__desc__": "Tooltip for Reuse button" }, "promptResultCard.savePromptDescription": { @@ -98,5 +102,9 @@ "promptResultCard.sendFeedbackSuccessToast": { "__value__": "Feedback sent!", "__desc__": "Toast message for Feedback sent" + }, + "promptResultCard.variationsHeading": { + "__value__": "Variations", + "__desc__": "Heading for the Variations section" } } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/ko_kr.json b/web-src/src/components/__localization__/PromptResultCard.l10n/ko_kr.json index 968143f2..cf6f0f15 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/ko_kr.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/ko_kr.json @@ -1,7 +1,7 @@ { - "promptResultCard.contentFragmentExportDialogDescription": "선택한 변형을 새 컨텐츠 조각 변형으로 내보냅니다.", + "promptResultCard.contentFragmentExportDialogDescription": "선택한 변형을 새 콘텐츠 조각 변형으로 내보냅니다.", "promptResultCard.contentFragmentExportDialogExportButtonLabel": "변형 이름", - "promptResultCard.contentFragmentExportDialogTitle": "컨텐츠 조각으로 내보내기", + "promptResultCard.contentFragmentExportDialogTitle": "콘텐츠 조각으로 내보내기", "promptResultCard.copyButtonTooltip": "복사", "promptResultCard.copyTextSuccessToast": "텍스트가 클립보드에 복사되었습니다.", "promptResultCard.createPromptDescription": "“프롬프트 편집”을 열고 프롬프트를 작성하거나 다른 프롬프트의 섹션을 붙여넣습니다.", @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "AEM 작성 경험에서의 콘텐츠 활용에 만족한다면 콘텐츠를 더 구체화하기 위해 콘텐츠를 생성한 후 프롬프트 및/또는 입력 필드를 업데이트합니다.", "promptResultCard.refineContentTitle": "콘텐츠 조정 및 사용", "promptResultCard.removeButtonTooltip": "제거", - "promptResultCard.reuseButtonTooltip": "재사용", + "promptResultCard.reuseButtonLabel": "재사용", + "promptResultCard.reuseButtonTooltip": "변형을 생성하는 데 사용되는 입력 값과 프롬프트를 로드합니다.", "promptResultCard.savePromptDescription": "생성된 프롬프트를 재사용하려면 “저장”을 선택합니다. 이를 통해 나중에 사용할 수 있도록 프롬프트를 저장할 수 있습니다. 사용자 또는 조직 수준에서 저장할 수 있습니다.", "promptResultCard.savePromptTitle": "저장", - "promptResultCard.sendFeedbackSuccessToast": "피드백 전송됨" + "promptResultCard.sendFeedbackSuccessToast": "피드백 전송됨", + "promptResultCard.variationsHeading": "변형" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/pt_br.json b/web-src/src/components/__localization__/PromptResultCard.l10n/pt_br.json index 8591d536..87edcb1b 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/pt_br.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/pt_br.json @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "Depois que o conteúdo for gerado, se quiser refiná-lo ainda mais, atualize o prompt e/ou os campos de entrada até ficar satisfeito com o aproveitamento de conteúdo na experiência de criação no AEM.", "promptResultCard.refineContentTitle": "Refinar e usar conteúdo", "promptResultCard.removeButtonTooltip": "Remover", - "promptResultCard.reuseButtonTooltip": "Reutilizar", + "promptResultCard.reuseButtonLabel": "Reutilizar", + "promptResultCard.reuseButtonTooltip": "Carregue os valores de entrada e o prompt usado para gerar variações.", "promptResultCard.savePromptDescription": "Se quiser reutilizar o prompt criado, clique em “Salvar” para armazená-lo para uso futuro. Você pode salvá-lo no nível do usuário ou da organização.", "promptResultCard.savePromptTitle": "Salvar", - "promptResultCard.sendFeedbackSuccessToast": "Feedback enviado." + "promptResultCard.sendFeedbackSuccessToast": "Feedback enviado.", + "promptResultCard.variationsHeading": "Variações" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/zh_cn.json b/web-src/src/components/__localization__/PromptResultCard.l10n/zh_cn.json index 510057a8..da8313bb 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/zh_cn.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/zh_cn.json @@ -1,6 +1,6 @@ { - "promptResultCard.contentFragmentExportDialogDescription": "将所选变量导出为新内容片段变量。", - "promptResultCard.contentFragmentExportDialogExportButtonLabel": "变量名称", + "promptResultCard.contentFragmentExportDialogDescription": "将选定的变体导出为新的内容片段变体。", + "promptResultCard.contentFragmentExportDialogExportButtonLabel": "变体名称", "promptResultCard.contentFragmentExportDialogTitle": "导出到内容片段", "promptResultCard.copyButtonTooltip": "复制", "promptResultCard.copyTextSuccessToast": "已将文本复制到剪贴板!", @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "内容生成后,如果您想进一步优化内容,请更新提示和/或输入字段。当您对内容满意后,就可以在 AEM 创作体验中加以利用。", "promptResultCard.refineContentTitle": "完善和使用内容", "promptResultCard.removeButtonTooltip": "移除", - "promptResultCard.reuseButtonTooltip": "重复使用", + "promptResultCard.reuseButtonLabel": "重用", + "promptResultCard.reuseButtonTooltip": "加载用于生成变体的输入值和提示。", "promptResultCard.savePromptDescription": "如果您想重复使用所创建的提示,请选择“保存”,以便存储提示,供将来使用。您可以在用户或组织级别保存它。", "promptResultCard.savePromptTitle": "保存", - "promptResultCard.sendFeedbackSuccessToast": "已发送反馈!" + "promptResultCard.sendFeedbackSuccessToast": "已发送反馈!", + "promptResultCard.variationsHeading": "变量" } diff --git a/web-src/src/components/__localization__/PromptResultCard.l10n/zh_tw.json b/web-src/src/components/__localization__/PromptResultCard.l10n/zh_tw.json index 430fe958..b6bdbe5c 100644 --- a/web-src/src/components/__localization__/PromptResultCard.l10n/zh_tw.json +++ b/web-src/src/components/__localization__/PromptResultCard.l10n/zh_tw.json @@ -1,6 +1,6 @@ { - "promptResultCard.contentFragmentExportDialogDescription": "將選取的變數匯出為新內容片段變數。", - "promptResultCard.contentFragmentExportDialogExportButtonLabel": "變數名稱", + "promptResultCard.contentFragmentExportDialogDescription": "將所選的變化版本匯出為新的內容片段變化版本。", + "promptResultCard.contentFragmentExportDialogExportButtonLabel": "變化版本名稱", "promptResultCard.contentFragmentExportDialogTitle": "匯出至內容片段", "promptResultCard.copyButtonTooltip": "複製", "promptResultCard.copyTextSuccessToast": "已將文字複製到剪貼簿!", @@ -20,8 +20,10 @@ "promptResultCard.refineContentDescription": "產生內容後,如果您想要進一步微調,請更新提示和/或輸入欄位。在您對內容感到滿意後,請在您的 AEM 製作體驗中加以利用。", "promptResultCard.refineContentTitle": "微調和使用內容", "promptResultCard.removeButtonTooltip": "移除", - "promptResultCard.reuseButtonTooltip": "重複使用", + "promptResultCard.reuseButtonLabel": "重複使用", + "promptResultCard.reuseButtonTooltip": "載入用來產生變數的輸入值和提示。", "promptResultCard.savePromptDescription": "如果您想要重複使用已建立的提示,請選取「儲存」。這可讓您儲存該提示以供日後使用。您可以將其儲存在使用者或組織層級。", "promptResultCard.savePromptTitle": "儲存", - "promptResultCard.sendFeedbackSuccessToast": "回饋已傳送!" + "promptResultCard.sendFeedbackSuccessToast": "回饋已傳送!", + "promptResultCard.variationsHeading": "變數" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/de_de.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/de_de.json index d2381c75..f23f9bb3 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/de_de.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/de_de.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "Im Unternehmen freigegeben", "promptSessionSideView.savePromptSuccessToast": "Prompt-Vorlage gespeichert", "promptSessionSideView.temperatureDescription": "Eine höhere Temperatur führt zu einer Abweichung vom Prompt und zu mehr Zufälligkeit und Kreativität", - "promptSessionSideView.temperatureLabel": "Temperatur" + "promptSessionSideView.temperatureLabel": "Temperatur", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "Vielen Dank für Ihre Geduld. Ihre Inhalte sind fast fertig.", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "Beinahe fertig mit Ihrem Inhalt", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "Inhalte vorbereiten", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "Vielen Dank für Ihre Geduld, Ihre Inhalte sind auf dem Weg", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "Erstellen Ihres Inhalts", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "Vielen Dank für Ihre Geduld, Ihre Inhalte sind auf dem Weg", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "Bereiten Ihrer Inhalte vor", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "Beinahe fertig mit Ihrem Inhalt", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "Entschuldigung für die Verzögerung, Ihr Inhalt ist fast fertig" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/en_us.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/en_us.json index b25946cd..69300a88 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/en_us.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/en_us.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "Shared across organization", "promptSessionSideView.savePromptSuccessToast": "Prompt template saved", "promptSessionSideView.temperatureDescription": "A higher temperature strays from the prompt and leads to more randomness and creativity", - "promptSessionSideView.temperatureLabel": "Temperature" + "promptSessionSideView.temperatureLabel": "Temperature", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "Thanks for your patience, your content is almost ready", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "Almost done with your content", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "Preparing your content", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "Thanks for your patience, your content is on its way", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "Generating your content", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "Thanks for your patience, your content is on its way", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "Getting your content ready", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "Almost done with your content", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "Sorry for the delay, your content is almost ready" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/es_es.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/es_es.json index 69986687..0931f95d 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/es_es.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/es_es.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "Compartido entre organizaciones", "promptSessionSideView.savePromptSuccessToast": "Plantilla de indicación guardada", "promptSessionSideView.temperatureDescription": "Una temperatura más alta se desvía de la indicación y genera un resultado más aleatorio y creativo", - "promptSessionSideView.temperatureLabel": "Temperatura" + "promptSessionSideView.temperatureLabel": "Temperatura", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "Gracias por su paciencia, su contenido está casi listo", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "Casi terminamos con tu contenido", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "Preparación del contenido", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "Gracias por su paciencia, su contenido está en camino", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "Generación del contenido", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "Gracias por su paciencia, su contenido está en camino", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "Preparación del contenido", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "Casi terminamos con tu contenido", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "Disculpe el retraso, su contenido está casi listo" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/fr_fr.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/fr_fr.json index 9983c698..7550e066 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/fr_fr.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/fr_fr.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "Partagé à l’échelle de l’entreprise", "promptSessionSideView.savePromptSuccessToast": "Modèle de prompt enregistré", "promptSessionSideView.temperatureDescription": "Une température plus élevée s’écarte de l’invite, et laisse davantage de place au hasard et à la créativité.", - "promptSessionSideView.temperatureLabel": "Température" + "promptSessionSideView.temperatureLabel": "Température", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "Merci de votre patience, votre contenu est presque prêt", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "Presque terminé avec votre contenu", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "Préparation de votre contenu", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "Merci pour votre patience, votre contenu est en route", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "Générer votre contenu", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "Merci pour votre patience, votre contenu est en route", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "Préparation de votre contenu", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "Presque terminé avec votre contenu", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "Désolé pour le retard, votre contenu est presque prêt" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/it_it.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/it_it.json index bdc2eeea..9fa0e0ef 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/it_it.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/it_it.json @@ -9,7 +9,7 @@ "promptSessionSideView.generateButtonContextualHelpHeading": "Condizioni di utilizzo", "promptSessionSideView.generateButtonLabel": "Genera", "promptSessionSideView.inputsLabel": "Input", - "promptSessionSideView.legalTermsLinkName": "Adobe Experience Cloud Generative AI User Guidelines", + "promptSessionSideView.legalTermsLinkName": "Linee guida per l’utente dell’IA generativa di Adobe Experience Cloud", "promptSessionSideView.navigationLabel": "Modelli di prompt", "promptSessionSideView.previewButtonLabel": "Anteprima", "promptSessionSideView.promptEditorContextualInfoContent": "Quando modifichi direttamente il prompt, includi un contesto specifico, come materiale di branding, contenuto del sito web, schemi di dati per tali dati, modelli e altri documenti affidabili.", @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "Condiviso tra più organizzazioni", "promptSessionSideView.savePromptSuccessToast": "Modello di prompt salvato", "promptSessionSideView.temperatureDescription": "Una temperatura più elevata si allontana dal prompt per risultati più casuali e creativi", - "promptSessionSideView.temperatureLabel": "Temperatura" + "promptSessionSideView.temperatureLabel": "Temperatura", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "Grazie per la pazienza, il vostro contenuto è quasi pronto", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "Quasi completato con il tuo contenuto", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "Preparazione dei contenuti", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "Grazie per la pazienza, il vostro contenuto sta arrivando", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "Generazione dei contenuti", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "Grazie per la pazienza, il vostro contenuto sta arrivando", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "Preparazione dei contenuti", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "Quasi completato con il tuo contenuto", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "Spiacenti per il ritardo, il contenuto è quasi pronto" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/ja_jp.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/ja_jp.json index fdc74790..295095d8 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/ja_jp.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/ja_jp.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "組織全体で共有", "promptSessionSideView.savePromptSuccessToast": "保存されたプロンプトテンプレート", "promptSessionSideView.temperatureDescription": "温度が高いほどプロンプトから逸脱し、よりランダムで創造的になります", - "promptSessionSideView.temperatureLabel": "温度" + "promptSessionSideView.temperatureLabel": "温度", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "コンテンツの準備がほぼ完了しました。しばらくお待ちください", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "コンテンツの処理がほぼ完了しました", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "コンテンツを準備中", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "ご迷惑をおかけして申し訳ありません。コンテンツは処理されています", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "コンテンツの生成", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "ご迷惑をおかけして申し訳ありません。コンテンツは処理されています", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "コンテンツの準備をしています", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "コンテンツの処理がほぼ完了しました", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "コンテンツの準備がほぼ完了しており、遅延が発生しました" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/jl10n.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/jl10n.json index 4c1a348a..ea831180 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/jl10n.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/jl10n.json @@ -102,5 +102,41 @@ "promptSessionSideView.temperatureLabel": { "__value__": "Temperature", "__desc__": "Temperature label for Prompt Session side view" + }, + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": { + "__value__": "Thanks for your patience, your content is almost ready", + "__desc__": "This toast message notifies customers that their request is still in progress after seconds of waiting" + }, + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": { + "__value__": "Almost done with your content", + "__desc__": "This toast message notifies customers that their request is still in progress after seconds of waiting" + }, + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": { + "__value__": "Preparing your content", + "__desc__": "This toast message notifies customers that their request is still in progress after seconds of waiting" + }, + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": { + "__value__": "Thanks for your patience, your content is on its way", + "__desc__": "This toast message notifies customers that their request is still in progress after seconds of waiting" + }, + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": { + "__value__": "Generating your content", + "__desc__": "This toast message notifies customers that their request is still in progress after seconds of waiting" + }, + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": { + "__value__": "Thanks for your patience, your content is on its way", + "__desc__": "This toast message notifies customers that their request is still in progress after seconds of waiting" + }, + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": { + "__value__": "Getting your content ready", + "__desc__": "This toast message notifies customers that their request is still in progress after seconds of waiting" + }, + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": { + "__value__": "Almost done with your content", + "__desc__": "This toast message notifies customers that their request is still in progress after seconds of waiting" + }, + "promptSessionSideView.variationsGenerationLongWaitTimeToast": { + "__value__": "Sorry for the delay, your content is almost ready", + "__desc__": "This toast message notifies customers that their request is still in progress after more than minutes of waiting" } } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/ko_kr.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/ko_kr.json index b0da8b1b..a72359c6 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/ko_kr.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/ko_kr.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "조직 전체에서 공유됨", "promptSessionSideView.savePromptSuccessToast": "프롬프트 템플릿 저장됨", "promptSessionSideView.temperatureDescription": "온도가 높을수록 프롬프트에서 벗어나 더 많은 무작위성과 창의성을 얻을 수 있습니다.", - "promptSessionSideView.temperatureLabel": "온도" + "promptSessionSideView.temperatureLabel": "온도", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "기다려 주셔서 감사합니다. 컨텐츠가 거의 준비되었습니다.", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "콘텐츠로 거의 완료", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "컨텐츠 준비", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "기다려 주셔서 감사합니다. 컨텐츠가 곧 제공될 예정입니다.", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "컨텐츠 생성", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "기다려 주셔서 감사합니다. 컨텐츠가 곧 제공될 예정입니다.", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "컨텐츠 준비", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "콘텐츠로 거의 완료", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "지연되어 죄송합니다. 컨텐츠가 거의 준비되었습니다." } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/pt_br.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/pt_br.json index 11197b97..1f0e6e9e 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/pt_br.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/pt_br.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "Compartilhado na organização", "promptSessionSideView.savePromptSuccessToast": "Modelo de prompt salvo", "promptSessionSideView.temperatureDescription": "Uma temperatura mais alta se desvia do prompt e gera mais aleatoriedade e criatividade", - "promptSessionSideView.temperatureLabel": "Temperatura" + "promptSessionSideView.temperatureLabel": "Temperatura", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "Obrigado por sua paciência, seu conteúdo está quase pronto", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "Quase concluído com seu conteúdo", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "Preparação do conteúdo", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "Obrigado por sua paciência, seu conteúdo está a caminho", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "Gerar conteúdo", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "Obrigado por sua paciência, seu conteúdo está a caminho", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "Preparando seu conteúdo", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "Quase concluído com seu conteúdo", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "Desculpe o atraso, seu conteúdo está quase pronto" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/zh_cn.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/zh_cn.json index 612d1814..48668015 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/zh_cn.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/zh_cn.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "已跨组织共享", "promptSessionSideView.savePromptSuccessToast": "提示模板已保存", "promptSessionSideView.temperatureDescription": "温度升高会偏离提示,并会提高随机性和创造性", - "promptSessionSideView.temperatureLabel": "温度" + "promptSessionSideView.temperatureLabel": "温度", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "感谢您的耐心等待,您的内容已准备就绪", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "几乎已完成您的内容", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "准备内容", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "感谢耐心等候,您的内容即将完成", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "生成内容", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "感谢耐心等候,您的内容即将完成", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "正在准备您的内容", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "几乎已完成您的内容", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "对延迟感到抱歉,您的内容即将准备就绪" } diff --git a/web-src/src/components/__localization__/PromptSessionSideView.l10n/zh_tw.json b/web-src/src/components/__localization__/PromptSessionSideView.l10n/zh_tw.json index dd48c8e8..99a31074 100644 --- a/web-src/src/components/__localization__/PromptSessionSideView.l10n/zh_tw.json +++ b/web-src/src/components/__localization__/PromptSessionSideView.l10n/zh_tw.json @@ -24,5 +24,14 @@ "promptSessionSideView.savePromptSharedSwitchLabel": "已跨組織共用", "promptSessionSideView.savePromptSuccessToast": "提示範本已儲存", "promptSessionSideView.temperatureDescription": "較高的溫度會偏離提示,並導致較高的隨機性和創造力", - "promptSessionSideView.temperatureLabel": "溫度" + "promptSessionSideView.temperatureLabel": "溫度", + "promptSessionSideView.variationsGeneration105SecondsWaitTimeToast": "感謝您耐心等候,您的內容幾乎已就緒", + "promptSessionSideView.variationsGeneration120SecondsWaitTimeToast": "即將完成您的內容", + "promptSessionSideView.variationsGeneration15SecondsWaitTimeToast": "準備您的內容", + "promptSessionSideView.variationsGeneration30SecondsWaitTimeToast": "感謝您耐心等候,您的內容即將推出", + "promptSessionSideView.variationsGeneration45SecondsWaitTimeToast": "產生您的內容", + "promptSessionSideView.variationsGeneration60SecondsWaitTimeToast": "感謝您耐心等候,您的內容即將推出", + "promptSessionSideView.variationsGeneration75SecondsWaitTimeToast": "準備您的內容", + "promptSessionSideView.variationsGeneration90SecondsWaitTimeToast": "即將完成您的內容", + "promptSessionSideView.variationsGenerationLongWaitTimeToast": "很抱歉,您的內容即將就緒" } diff --git a/web-src/src/helpers/ImageHelper.js b/web-src/src/helpers/ImageHelper.js index 43722b78..01781281 100644 --- a/web-src/src/helpers/ImageHelper.js +++ b/web-src/src/helpers/ImageHelper.js @@ -10,6 +10,8 @@ * governing permissions and limitations under the License. */ +import { FIREFALL_ACTION_TYPES } from '../services/FirefallService.js'; + export async function generateImagePrompt(firefallService, selectedVariant) { const variantToImagePrompt = `I want to create images using a text-to-image model. For this, I need a concise, one-sentence image prompt created by following these steps: - Read and understand the subject or theme from the given JSON context below. @@ -27,7 +29,11 @@ export async function generateImagePrompt(firefallService, selectedVariant) { Generated Prompt: "A happy, confident person enjoying music in an urban park, using high-quality wireless headphones, with the city skyline in the background." Here is the JSON context: ${JSON.stringify(selectedVariant.content)}`; - const { queryId, response } = await firefallService.complete(variantToImagePrompt, 0); + const { response } = await firefallService.complete( + variantToImagePrompt, + 0, + FIREFALL_ACTION_TYPES.TEXT_TO_IMAGE_PROMPT_GENERATION, + ); return response; } diff --git a/web-src/src/helpers/NetworkHelper.js b/web-src/src/helpers/NetworkHelper.js index 4dfc1852..35cb3a95 100644 --- a/web-src/src/helpers/NetworkHelper.js +++ b/web-src/src/helpers/NetworkHelper.js @@ -11,6 +11,16 @@ */ import wretch from 'wretch'; +const getHeaders = () => { + const ENABLE_EXTRA_LOGGING_PARAM = 'extraLogging'; + const headers = {}; + const params = new URLSearchParams(window.location.search); + if (params.get(ENABLE_EXTRA_LOGGING_PARAM) === 'true') { + headers['X-OW-EXTRA-LOGGING'] = 'on'; + } + return headers; +}; + function unwrapError(error) { if (error.json?.error) { throw new Error(error.json.error); @@ -21,7 +31,7 @@ function unwrapError(error) { function wretchWithOptions(url) { return wretch(url) - .headers({ 'X-OW-EXTRA-LOGGING': 'on' }) + .headers(getHeaders()) .resolve((resolver) => { return resolver .badRequest((err) => unwrapError(err)) diff --git a/web-src/src/icons/GenAIIcon.js b/web-src/src/icons/GenAIIcon.js index 57ba1a42..cfed5975 100644 --- a/web-src/src/icons/GenAIIcon.js +++ b/web-src/src/icons/GenAIIcon.js @@ -14,15 +14,29 @@ import { Icon } from '@adobe/react-spectrum'; export default function GenAIIcon(props) { return ( - - - - - - - - - - + + + + + + + + + ); } diff --git a/web-src/src/icons/RefreshIcon.js b/web-src/src/icons/RefreshIcon.js index 34bb46a9..c8d921bf 100644 --- a/web-src/src/icons/RefreshIcon.js +++ b/web-src/src/icons/RefreshIcon.js @@ -11,16 +11,13 @@ */ import React from 'react'; import { Icon } from '@adobe/react-spectrum'; +import refreshIcon from '../assets/refresh.svg'; export default function RefreshIcon(props) { + // the svg with masks loose its transparency when used in the react-spectrum Icon component return ( - - - - - - - - + + refresh + ); } diff --git a/web-src/src/index.css b/web-src/src/index.css index c7cf74a6..3fd80260 100644 --- a/web-src/src/index.css +++ b/web-src/src/index.css @@ -133,4 +133,57 @@ body { .variant-image-button { opacity: 0; transition: opacity 0.3s ease-in-out 0.1s; -} \ No newline at end of file +} + +.slick-prev:before { + transform: rotate(180deg); +} + +.slick-prev:before, .slick-next:before { + opacity: 1; + content: ''; + width: 64px; + height: 64px; + display: block; + position: absolute; + top: 0; + background-size: contain; + background: url('./assets/variations-scroll-indicator.svg'); +} +.slick-arrow { + background: #fff; + z-index: 2; + border-radius: 50%; + width: auto; + height: auto; + opacity: 0; + transition: opacity 0.2s ease-in-out 0.1s; +} + +.slick-slider:hover .slick-arrow { + opacity: 1; +} + +.slick-next { + right: 64px; + top: calc(50% - 32px); +} +.slick-prev { + top: calc(50% - 40px); + left: -0.8rem; +} + +.slick-prev:hover, .slick-prev:focus, .slick-next:hover, .slick-next:focus { + background: #fff; + border-radius: 50%; +} + +.slick-disabled, .slick-disabled:before, .slick-disabled:hover, .slick-disabled:focus { + display: none; + background: none; +} +.slick-track { + margin-left: 0; +} + + diff --git a/web-src/src/services/FirefallService.js b/web-src/src/services/FirefallService.js index 7ea17f81..de7f71ec 100644 --- a/web-src/src/services/FirefallService.js +++ b/web-src/src/services/FirefallService.js @@ -9,9 +9,45 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ + import { wretch } from '../helpers/NetworkHelper.js'; import { replaceRuntimeDomainInUrl } from '../helpers/UrlHelper.js'; +export const FIREFALL_ACTION_TYPES = { + TEXT_TO_IMAGE_PROMPT_GENERATION: 'text-to-image', + VARIATIONS_GENERATION: 'variations', +}; + +// all the following constants are in seconds +const MAX_POLLING_TIME = 300; +const TEXT_TO_IMAGE_PROMPT_GENERATION_POLL_DELAY = 1; +const VARIATIONS_GENERATION_POLL_DELAY = 5; + +const poll = async (fn, pollDelay, initialPollDelay, maxPollingTime = MAX_POLLING_TIME) => { + const STATUS_RUNNING = 'running'; + const wait = async (timeout) => new Promise((resolve) => { setTimeout(resolve, timeout * 1000); }); + + if (initialPollDelay) { + await wait(initialPollDelay); + } + + let pollingTime = 0; + while (pollingTime <= maxPollingTime) { + // eslint-disable-next-line no-await-in-loop + const response = await fn(); + + if (response.status === STATUS_RUNNING) { + pollingTime += pollDelay; + // eslint-disable-next-line no-await-in-loop + await wait(pollDelay); + } else { + return response; + } + } + + throw new Error(`The call did not complete after ${pollingTime} seconds.`); +}; + export class FirefallService { constructor({ completeEndpoint, @@ -28,9 +64,13 @@ export class FirefallService { console.debug(`Feedback: ${this.feedbackEndpoint}`); } - async complete(prompt, temperature) { - /* eslint-disable-next-line camelcase */ - const { query_id, generations } = await wretch(this.completeEndpoint) + async complete(prompt, temperature, actionType) { + const pollDelay = (actionType === FIREFALL_ACTION_TYPES.VARIATIONS_GENERATION) + ? VARIATIONS_GENERATION_POLL_DELAY + : TEXT_TO_IMAGE_PROMPT_GENERATION_POLL_DELAY; + const initialPollDelay = pollDelay; + + const { jobId } = await wretch(this.completeEndpoint) .post({ prompt, temperature, @@ -38,11 +78,26 @@ export class FirefallService { accessToken: this.accessToken, }) .json(); - return { - /* eslint-disable-next-line camelcase */ - queryId: query_id, - response: generations[0][0].message.content, - }; + + return poll(async () => { + return wretch(`${this.completeEndpoint}?jobId=${jobId}`) + .headers({ + Authorization: `Bearer ${this.accessToken}`, + 'X-Org-Id': this.imsOrg, + }) + .get() + .json(); + }, pollDelay, initialPollDelay).then((data) => { + const { result } = data; + if (result.error) { + throw new Error(result.error); + } + const { query_id: queryId, generations } = result; + return { + queryId, + response: generations[0][0].message.content, + }; + }); } async feedback(queryId, sentiment) { diff --git a/web-src/src/state/ResultsState.js b/web-src/src/state/ResultsState.js index 11df328a..adc18825 100644 --- a/web-src/src/state/ResultsState.js +++ b/web-src/src/state/ResultsState.js @@ -18,9 +18,14 @@ export const resultsState = selector({ return get(sessionState).results; }, set: ({ set, get }, newValue) => { + const valueWithTimestamp = newValue.map((result) => ({ + ...result, + timestamp: result.timestamp ?? new Date().getTime(), + })); + set(sessionState, { ...get(sessionState), - results: newValue, + results: valueWithTimestamp, }); }, });