diff --git a/LICENSE.txt b/LICENSE.txt index fa1e65c7..ca35d0df 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,12 +1,206 @@ -Copyright (c) 2025, Salesforce.com, Inc. +Apache License Version 2.0 + +Copyright (c) 2025 Salesforce, Inc. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + Copyright {yyyy} {name of copyright owner} -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + Licensed 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 -* Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + http://www.apache.org/licenses/LICENSE-2.0 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file + 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 CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index d3bc030a..e694a44b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # plugin-agent -[![NPM](https://img.shields.io/npm/v/@salesforce/plugin-agent.svg?label=@salesforce/plugin-agent)](https://www.npmjs.com/package/@salesforce/plugin-agent) [![Downloads/week](https://img.shields.io/npm/dw/@salesforce/plugin-agent.svg)](https://npmjs.org/package/@salesforce/plugin-agent) [![License](https://img.shields.io/badge/License-BSD%203--Clause-brightgreen.svg)](https://raw.githubusercontent.com/salesforcecli/plugin-agent/main/LICENSE.txt) +[![NPM](https://img.shields.io/npm/v/@salesforce/plugin-agent.svg?label=@salesforce/plugin-agent)](https://www.npmjs.com/package/@salesforce/plugin-agent) [![Downloads/week](https://img.shields.io/npm/dw/@salesforce/plugin-agent.svg)](https://npmjs.org/package/@salesforce/plugin-agent) [![License](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](https://opensource.org/license/apache-2-0) ## Install @@ -63,14 +63,17 @@ sf plugins - [`sf agent create`](#sf-agent-create) - [`sf agent deactivate`](#sf-agent-deactivate) - [`sf agent generate agent-spec`](#sf-agent-generate-agent-spec) +- [`sf agent generate authoring-bundle`](#sf-agent-generate-authoring-bundle) - [`sf agent generate template`](#sf-agent-generate-template) - [`sf agent generate test-spec`](#sf-agent-generate-test-spec) - [`sf agent preview`](#sf-agent-preview) +- [`sf agent publish authoring-bundle`](#sf-agent-publish-authoring-bundle) - [`sf agent test create`](#sf-agent-test-create) - [`sf agent test list`](#sf-agent-test-list) - [`sf agent test results`](#sf-agent-test-results) - [`sf agent test resume`](#sf-agent-test-resume) - [`sf agent test run`](#sf-agent-test-run) +- [`sf agent validate authoring-bundle`](#sf-agent-validate-authoring-bundle) ## `sf agent activate` @@ -137,6 +140,11 @@ GLOBAL FLAGS DESCRIPTION Create an agent in your org using a local agent spec file. + NOTE: This command creates an agent that doesn't use Agent Script as its blueprint. We generally don't recommend you + use this workflow to create an agent. Rather, use the "agent generate|validate|publish authoring-bundle" commands to + author agents that use the Agent Script language. See "Author an Agent" + (https://developer.salesforce.com/docs/einstein/genai/guide/agent-dx-nga-author-agent.html) for details. + To run this command, you must have an agent spec file, which is a YAML file that define the agent properties and contains a list of AI-generated topics. Topics define the range of jobs the agent can handle. Use the "agent generate agent-spec" CLI command to generate an agent spec file. Then specify the file to this command using the --spec flag, @@ -262,10 +270,9 @@ GLOBAL FLAGS DESCRIPTION Generate an agent spec, which is a YAML file that captures what an agent can do. - The first step in creating an agent in your org with Salesforce CLI is to generate an agent spec using this command. - An agent spec is a YAML-formatted file that contains information about the agent, such as its role and company - description, and then an AI-generated list of topics based on this information. Topics define the range of jobs your - agent can handle. + An agent spec is a YAML-formatted file that contains basic information about the agent, such as its role, company + description, and an AI-generated list of topics based on this information. Topics define the range of jobs your agent + can handle. Use flags, such as --role and --company-description, to provide details about your company and the role that the agent plays in your company. If you prefer, you can also be prompted for the basic information; use --full-interview to be @@ -283,8 +290,11 @@ DESCRIPTION add context to the agent's prompts, the tone of the prompts, and the username of a user in the org to assign to the agent. - When your agent spec is ready, you then create the agent in your org by running the "agent create" CLI command and - specifying the spec with the --spec flag. + When your agent spec is ready, generate an authoring bundle from it by passing the spec file to the --spec flag of the + "agent generate authoring-bundle" CLI command. An authoring bundle is a metadata type that contains an Agent Script + file, which is the blueprint for an agent. (While not recommended, you can also use the agent spec file to immediately + create an agent with the "agent create" command. We don't recommend this workflow because these types of agents don't + use Agent Script, and are thus less flexible and more difficult to maintain.) EXAMPLES Generate an agent spec in the default location and use flags to specify the agent properties, such as its role and @@ -318,6 +328,65 @@ EXAMPLES _See code: [src/commands/agent/generate/agent-spec.ts](https://github.com/salesforcecli/plugin-agent/blob/1.24.35/src/commands/agent/generate/agent-spec.ts)_ +## `sf agent generate authoring-bundle` + +Generate an authoring bundle from an existing agent spec YAML file. + +``` +USAGE + $ sf agent generate authoring-bundle -o [--json] [--flags-dir ] [--api-name ] [--api-version ] [-f + ] [-d ] [-n ] + +FLAGS + -d, --output-dir= Directory where the authoring bundle files are generated. + -f, --spec= Path to the agent spec YAML file. + -n, --name= Name (label) of the authoring bundle. + -o, --target-org= (required) Username or alias of the target org. Not required if the `target-org` + configuration variable is already set. + --api-name= API name of the new authoring bundle; if not specified, the API name is derived from the + authoring bundle name (label); the API name can't exist in the org. + --api-version= Override the api version used for api requests made by this command + +GLOBAL FLAGS + --flags-dir= Import flag values from a directory. + --json Format output as json. + +DESCRIPTION + Generate an authoring bundle from an existing agent spec YAML file. + + Authoring bundles are metadata components that contain an agent's Agent Script file. The Agent Script file is the + agent's blueprint; it fully describes what the agent can do using the Agent Script language. + + Use this command to generate a new authoring bundle based on an agent spec YAML file, which you create with the "agent + generate agent-spec" command. The agent spec YAML file is a high-level description of the agent; it describes its + essence rather than exactly what it can do. + + The metadata type for authoring bundles is aiAuthoringBundle, which consist of a standard + ".bundle-meta.xml" metadata file and the Agent Script file (with extension ".agent"). When you run this + command, the new authoring bundle is generated in the force-app/main/default/aiAuthoringBundles/ + directory. Use the --output-dir flag to generate them elsewhere. + + After you generate the initial authoring bundle, vibe code (modify using natural language) the Agent Script file so + your agent behaves exactly as you want. The generated Agent Script file is just a first draft of your agent! Then + publish the agent to your org with the "agent publish authoring-bundle" command. + + This command requires an org because it uses it to access an LLM for generating the Agent Script file. + +EXAMPLES + Generate an authoring bundle from the "specs/agentSpec.yaml" agent spec YAML file and give it the label "My + Authoring Bundle"; use your default org: + + $ sf agent generate authoring-bundle --spec specs/agentSpec.yaml --name "My Authoring Bundle" + + Same as previous example, but generate the files in the "other-package-dir/main/default" package directory; use the + org with alias "my-dev-org": + + $ sf agent generate authoring-bundle --spec specs/agentSpec.yaml --name "My Authoring Bundle" --output-dir \ + other-package-dir/main/default --target-org my-dev-org +``` + +_See code: [src/commands/agent/generate/authoring-bundle.ts](https://github.com/salesforcecli/plugin-agent/blob/1.24.14-nga.4/src/commands/agent/generate/authoring-bundle.ts)_ + ## `sf agent generate template` Generate an agent template from an existing agent in your DX project so you can then package the template in a managed package. @@ -433,19 +502,20 @@ Interact with an active agent to preview how the agent responds to your statemen ``` USAGE - $ sf agent preview (-c -o ) [--flags-dir ] [--api-version ] [-n ] [-d - ] [-x] + $ sf agent preview [--flags-dir ] [--api-version ] (-c -o ) [-n ] + [--authoring-bundle ] [-d ] [-x] [--use-live-actions] FLAGS - -c, --client-app= (required) Name of the linked client app to use for the agent connection. You must have - previously created this link with "org login web --client-app". Run "org display" to see - the available linked client apps. - -d, --output-dir= Directory where conversation transcripts are saved. - -n, --api-name= API name of the agent you want to interact with. - -o, --target-org= (required) Username or alias of the target org. Not required if the `target-org` - configuration variable is already set. - -x, --apex-debug Enable Apex debug logging during the agent preview conversation. - --api-version= Override the api version used for api requests made by this command + -c, --client-app= Name of the linked client app to use for the agent connection. + -d, --output-dir= Directory where conversation transcripts are saved. + -n, --api-name= API name of the agent you want to interact with. + -o, --target-org= (required) Username or alias of the target org. Not required if the `target-org` + configuration variable is already set. + -x, --apex-debug Enable Apex debug logging during the agent preview conversation. + --api-version= Override the api version used for api requests made by this command + --authoring-bundle= Preview a next-gen agent by specifying the API name of the authoring bundle metadata + component that implements it. + --use-live-actions Use real actions in the org; if not specified, preview uses AI to mock actions. GLOBAL FLAGS --flags-dir= Import flag values from a directory. @@ -472,8 +542,9 @@ DESCRIPTION currently deactivated, use the "agent activate" CLI command to activate it. IMPORTANT: Before you use this command, you must complete a number of configuration steps in your org and your DX - project. The examples in this help assume you've completed the steps. See "Preview an Agent" in the "Agentforce - Developer Guide" for complete documentation: + project. For example, you must first create the link to a client connected app using the "org login web --client-app" + CLI command to then get the value of the --client-app flag of this command. The examples in this help assume you've + completed the steps. See "Preview an Agent" in the "Agentforce Developer Guide" for complete documentation: https://developer.salesforce.com/docs/einstein/genai/guide/agent-dx-preview.html. EXAMPLES @@ -491,6 +562,50 @@ EXAMPLES _See code: [src/commands/agent/preview.ts](https://github.com/salesforcecli/plugin-agent/blob/1.24.35/src/commands/agent/preview.ts)_ +## `sf agent publish authoring-bundle` + +Publish an authoring bundle to your org, which results in a new or updated agent. + +``` +USAGE + $ sf agent publish authoring-bundle -o [--json] [--flags-dir ] [--api-version ] [-n ] + +FLAGS + -n, --api-name= API name of the authoring bundle you want to publish. + -o, --target-org= (required) Username or alias of the target org. Not required if the `target-org` + configuration variable is already set. + --api-version= Override the api version used for api requests made by this command + +GLOBAL FLAGS + --flags-dir= Import flag values from a directory. + --json Format output as json. + +DESCRIPTION + Publish an authoring bundle to your org, which results in a new or updated agent. + + An authoring bundle is a metadata type (named aiAuthoringBundle) that provides the blueprint for an agent. The + metadata type contains two files: the standard metatada XML file and an Agent Script file (extension ".agent") that + fully describes the agent using the Agent Script language. + + When you publish an authoring bundle to your org, a number of things happen. First, this command validates that the + Agent Script file successfully compiles. If there are compilation errors, the command exits and you must fix the Agent + Script file to continue. Once the Agent Script file compiles, then the authoring bundle metadata component is deployed + to the org, and all associated agent metadata components, such as the Bot, BotVersion, and GenAiXXX components, are + either created or updated. The org then either creates a new agent based on the deployed authoring bundle, or creates + a new version of the agent if it already existed. Finally, all the new or changed metadata components associated with + the new agent are retrieved back to your local DX project. + + This command uses the API name of the authoring bundle. If you don't provide an API name with the --api-name flag, the + command searches the current DX project and outputs a list of authoring bundles that it found for you to choose from. + +EXAMPLES + Publish an authoring bundle with API name MyAuthoringBundle to the org with alias "my-org": + + $ sf agent publish authoring-bundle --api-name MyAuthoringbundle --target-org my-org +``` + +_See code: [src/commands/agent/publish/authoring-bundle.ts](https://github.com/salesforcecli/plugin-agent/blob/1.24.14-nga.4/src/commands/agent/publish/authoring-bundle.ts)_ + ## `sf agent test create` Create an agent test in your org using a local test spec YAML file. @@ -794,4 +909,46 @@ FLAG DESCRIPTIONS _See code: [src/commands/agent/test/run.ts](https://github.com/salesforcecli/plugin-agent/blob/1.24.35/src/commands/agent/test/run.ts)_ +## `sf agent validate authoring-bundle` + +Validate an authoring bundle to ensure its Agent Script file compiles successfully and can be used to publish an agent. + +``` +USAGE + $ sf agent validate authoring-bundle -o [--json] [--flags-dir ] [--api-version ] [-n ] + +FLAGS + -n, --api-name= API name of the authoring bundle you want to validate. + -o, --target-org= (required) Username or alias of the target org. Not required if the `target-org` + configuration variable is already set. + --api-version= Override the api version used for api requests made by this command + +GLOBAL FLAGS + --flags-dir= Import flag values from a directory. + --json Format output as json. + +DESCRIPTION + Validate an authoring bundle to ensure its Agent Script file compiles successfully and can be used to publish an + agent. + + An authoring bundle is a metadata type (named aiAuthoringBundle) that provides the blueprint for an agent. The + metadata type contains two files: the standard metatada XML file and an Agent Script file (extension ".agent") that + fully describes the agent using the Agent Script language. + + This command validates that the Agent Script file in the authoring bundle compiles without errors so that you can + later publish the bundle to your org. Use this command while you vibe code (modify with natural language) the Agent + Script file to ensure that it's always valid. If the validation fails, the command outputs the list of syntax errors, + a brief description of the error, and the location in the Agent Script file where the error occurred. + + This command uses the API name of the authoring bundle. If you don't provide an API name with the --api-name flag, the + command searches the current DX project and outputs a list of authoring bundles that it found for you to choose from. + +EXAMPLES + Validate an authoring bundle with API name MyAuthoringBundle: + + $ sf agent validate authoring-bundle --api-name MyAuthoringBundle +``` + +_See code: [src/commands/agent/validate/authoring-bundle.ts](https://github.com/salesforcecli/plugin-agent/blob/1.24.14-nga.4/src/commands/agent/validate/authoring-bundle.ts)_ + diff --git a/command-snapshot.json b/command-snapshot.json index 2da06e91..41a9fd23 100644 --- a/command-snapshot.json +++ b/command-snapshot.json @@ -51,6 +51,14 @@ ], "plugin": "@salesforce/plugin-agent" }, + { + "alias": [], + "command": "agent:generate:authoring-bundle", + "flagAliases": [], + "flagChars": ["d", "f", "n", "o"], + "flags": ["api-name", "api-version", "flags-dir", "json", "name", "output-dir", "spec", "target-org"], + "plugin": "@salesforce/plugin-agent" + }, { "alias": [], "command": "agent:generate:template", @@ -72,7 +80,25 @@ "command": "agent:preview", "flagAliases": [], "flagChars": ["c", "d", "n", "o", "x"], - "flags": ["apex-debug", "api-name", "api-version", "client-app", "flags-dir", "output-dir", "target-org"], + "flags": [ + "apex-debug", + "api-name", + "api-version", + "authoring-bundle", + "client-app", + "flags-dir", + "output-dir", + "target-org", + "use-live-actions" + ], + "plugin": "@salesforce/plugin-agent" + }, + { + "alias": [], + "command": "agent:publish:authoring-bundle", + "flagAliases": [], + "flagChars": ["n", "o"], + "flags": ["api-name", "api-version", "flags-dir", "json", "target-org"], "plugin": "@salesforce/plugin-agent" }, { @@ -135,5 +161,13 @@ "wait" ], "plugin": "@salesforce/plugin-agent" + }, + { + "alias": [], + "command": "agent:validate:authoring-bundle", + "flagAliases": [], + "flagChars": ["n", "o"], + "flags": ["api-name", "api-version", "flags-dir", "json", "target-org"], + "plugin": "@salesforce/plugin-agent" } ] diff --git a/messages/agent.create.md b/messages/agent.create.md index fa1fd756..965fec36 100644 --- a/messages/agent.create.md +++ b/messages/agent.create.md @@ -4,6 +4,8 @@ Create an agent in your org using a local agent spec file. # description +NOTE: This command creates an agent that doesn't use Agent Script as its blueprint. We generally don't recommend you use this workflow to create an agent. Rather, use the "agent generate|validate|publish authoring-bundle" commands to author agents that use the Agent Script language. See "Author an Agent" (https://developer.salesforce.com/docs/einstein/genai/guide/agent-dx-nga-author-agent.html) for details. + To run this command, you must have an agent spec file, which is a YAML file that define the agent properties and contains a list of AI-generated topics. Topics define the range of jobs the agent can handle. Use the "agent generate agent-spec" CLI command to generate an agent spec file. Then specify the file to this command using the --spec flag, along with the name (label) of the new agent with the --name flag. If you don't specify any of the required flags, the command prompts you. When this command completes, your org contains the new agent, which you can then edit and customize in the Agent Builder UI. The new agent's topics are the same as the ones listed in the agent spec file. The agent might also have some AI-generated actions, or you can add them. This command also retrieves all the metadata files associated with the new agent to your local Salesforce DX project. diff --git a/messages/agent.generate.agent-spec.md b/messages/agent.generate.agent-spec.md index e866ec33..88f61700 100644 --- a/messages/agent.generate.agent-spec.md +++ b/messages/agent.generate.agent-spec.md @@ -4,7 +4,7 @@ Generate an agent spec, which is a YAML file that captures what an agent can do. # description -The first step in creating an agent in your org with Salesforce CLI is to generate an agent spec using this command. An agent spec is a YAML-formatted file that contains information about the agent, such as its role and company description, and then an AI-generated list of topics based on this information. Topics define the range of jobs your agent can handle. +An agent spec is a YAML-formatted file that contains basic information about the agent, such as its role, company description, and an AI-generated list of topics based on this information. Topics define the range of jobs your agent can handle. Use flags, such as --role and --company-description, to provide details about your company and the role that the agent plays in your company. If you prefer, you can also be prompted for the basic information; use --full-interview to be prompted for all required and optional properties. Upon command execution, the large language model (LLM) associated with your org uses the provided information to generate a list of topics for the agent. Because the LLM uses the company and role information to generate the topics, we recommend that you provide accurate, complete, and specific details so the LLM generates the best and most relevant topics. Once generated, you can edit the spec file; for example, you can remove topics that don't apply or change a topic's description. @@ -12,7 +12,7 @@ You can also iterate the spec generation process by using the --spec flag to pas You can also specify other agent properties, such as a custom prompt template, how to ground the prompt template to add context to the agent's prompts, the tone of the prompts, and the username of a user in the org to assign to the agent. -When your agent spec is ready, you then create the agent in your org by running the "agent create" CLI command and specifying the spec with the --spec flag. +When your agent spec is ready, generate an authoring bundle from it by passing the spec file to the --spec flag of the "agent generate authoring-bundle" CLI command. An authoring bundle is a metadata type that contains an Agent Script file, which is the blueprint for an agent. (While not recommended, you can also use the agent spec file to immediately create an agent with the "agent create" command. We don't recommend this workflow because these types of agents don't use Agent Script, and are thus less flexible and more difficult to maintain.) # flags.type.summary diff --git a/messages/agent.generate.authoring-bundle.md b/messages/agent.generate.authoring-bundle.md new file mode 100644 index 00000000..694f53ff --- /dev/null +++ b/messages/agent.generate.authoring-bundle.md @@ -0,0 +1,69 @@ +# summary + +Generate an authoring bundle from an existing agent spec YAML file. + +# description + +Authoring bundles are metadata components that contain an agent's Agent Script file. The Agent Script file is the agent's blueprint; it fully describes what the agent can do using the Agent Script language. + +Use this command to generate a new authoring bundle based on an agent spec YAML file, which you create with the "agent generate agent-spec" command. The agent spec YAML file is a high-level description of the agent; it describes its essence rather than exactly what it can do. + +The metadata type for authoring bundles is aiAuthoringBundle, which consist of a standard ".bundle-meta.xml" metadata file and the Agent Script file (with extension ".agent"). When you run this command, the new authoring bundle is generated in the force-app/main/default/aiAuthoringBundles/ directory. Use the --output-dir flag to generate them elsewhere. + +After you generate the initial authoring bundle, code the Agent Script file so your agent behaves exactly as you want. The Agent Script file generated by this command is just a first draft of your agent! Interactively test the agent by conversing with it using the "agent preview" command. Then publish the agent to your org with the "agent publish authoring-bundle" command. + +This command requires an org because it uses it to access an LLM for generating the Agent Script file. + +# flags.spec.summary + +Path to the agent spec YAML file; if not specified, the command provides a list that you can choose from. + +# flags.spec.prompt + +Path to the agent spec YAML file + +# flags.output-dir.summary + +Directory where the authoring bundle files are generated. + +# flags.name.summary + +Name (label) of the authoring bundle; if not specified, you're prompted for the name. + +# flags.name.prompt + +Name (label) of the authoring bundle + +# flags.api-name.summary + +API name of the new authoring bundle; if not specified, the API name is derived from the authoring bundle name (label); the API name can't exist in the org. + +# flags.api-name.prompt + +API name of the new authoring bundle + +# examples + +- Generate an authoring bundle by being prompted for all required values, such as the agent spec YAML file, the bundle name, and the API name; use your default org: + + <%= config.bin %> <%= command.id %> + +- Generate an authoring bundle from the "specs/agentSpec.yaml" agent spec YAML file and give it the label "My Authoring Bundle"; use your default org: + + <%= config.bin %> <%= command.id %> --spec specs/agentSpec.yaml --name "My Authoring Bundle" + +- Similar to previous example, but generate the authoring bundle files in the "other-package-dir/main/default" package directory; use the org with alias "my-dev-org": + + <%= config.bin %> <%= command.id %> --spec specs/agentSpec.yaml --name "My Authoring Bundle" --output-dir other-package-dir/main/default --target-org my-dev-org + +# error.no-spec-file + +No agent spec YAML file found at the specified path. + +# error.invalid-spec-file + +The specified file is not a valid agent spec YAML file. + +# error.failed-to-create-agent + +Failed to create an authoring bundle from the agent spec YAML file. diff --git a/messages/agent.preview.md b/messages/agent.preview.md index 52f7ea5e..2e4556bf 100644 --- a/messages/agent.preview.md +++ b/messages/agent.preview.md @@ -1,41 +1,54 @@ # summary -Interact with an active agent to preview how the agent responds to your statements, questions, and commands (utterances). +Interact with an agent to preview how it responds to your statements, questions, and commands (utterances). # description -Use this command to have a natural language conversation with an active agent in your org, as if you were an actual user. The interface is simple: in the "Start typing..." prompt, enter a statement, question, or command; when you're done, enter Return. Your utterance is posted on the right along with a timestamp. The agent then responds on the left. To exit the conversation, hit ESC or Control+C. +Use this command to have a natural language conversation with an agent while you code its Agent Script file. Previewing an agent works like an initial test to make sure it responds to your utterances as you expect. For example, you can test that the agent uses a particular topic when asked a question, and then whether it invokes the correct action associated with that topic. This command is the CLI-equivalent of the Preview panel in your org's Agentforce Builder UI. -This command is useful to test if the agent responds to your utterances as you expect. For example, you can test that the agent uses a particular topic when asked a question, and then whether it invokes the correct action associated with that topic. This command is the CLI-equivalent of the Conversation Preview panel in your org's Agent Builder UI. +This command uses the agent's local authoring bundle, which contains its Agent Script file. You can let the command provide a list of authoring bundles (labeled "(Agent Script)") to choose from or use the --authoring-bundle flag to specify a bundle's API name. -When the session concludes, the command asks if you want to save the API responses and chat transcripts. By default, the files are saved to the "./temp/agent-preview" directory. Specify a new default directory by setting the environment variable "SF_AGENT_PREVIEW_OUTPUT_DIR" to the directory. Or you can pass the directory to the --output-dir flag. +You can use these two modes when previewing an agent from its Agent Script file: -Find the agent's API name in its Agent Details page of your org's Agentforce Studio UI in Setup. If your agent is currently deactivated, use the "agent activate" CLI command to activate it. +- Simulated mode (Default): Uses only the Agent Script file to converse, and it simulates (mocks) all the actions. Use this mode if none of the Apex classes, flows, and prompt templates that implement your actions are available yet. The LLM uses the information about topics in the Agent Script file to simulate what the action does or how it responds. +- Live mode: Uses the actual Apex classes, flows, and prompt templates in your development org in the agent preview. If you've changed the Apex classe, flows, or prompt templates in your local DX project, then you must deploy them to your development org if you want to use them in your live preview. You can use the Apex Replay Debugger to debug your Apex classes when using live mode. -IMPORTANT: Before you use this command, you must complete a number of configuration steps in your org and your DX project. The examples in this help assume you've completed the steps. See "Preview an Agent" in the "Agentforce Developer Guide" for complete documentation: https://developer.salesforce.com/docs/einstein/genai/guide/agent-dx-preview.html. +The interface is simple: in the "Start typing..." prompt, enter a statement, question, or command; when you're done, enter Return. Your utterance is posted on the right along with a timestamp. The agent then responds on the left. To exit the conversation, hit ESC or Control+C. + +When the session concludes, the command asks if you want to save the API responses and chat transcripts. By default, the files are saved to the "./temp/agent-preview" directory. Specify a new default directory with the --output-dir flag. + +NOTE: You can also use this command to connect to a published and active agent, which are labeled "(Published)" if you let this command provide the list of agents to preview. That use case, however, requires additional security and configuration in both your org and your DX project. The examples in this help are for previewing an agent from its Agent Script file in your DX project and require only simple authorization of your org, such as with the "org login web" command. The --client-app and --api-name flags are used only for previewing published and active agents, they don't apply to Agent Script agents. See "Connect to a Published Agent" in the "Agentforce Developer Guide" for complete documentation: https://developer.salesforce.com/docs/einstein/genai/guide/agent-dx-preview.html. # flags.api-name.summary -API name of the agent you want to interact with. +API name of the published and active agent you want to interact with. + +# flags.authoring-bundle.summary + +API name of the authoring bundle metadata component that contains the agent's Agent Script file. # flags.client-app.summary -Name of the linked client app to use for the agent connection. You must have previously created this link with "org login web --client-app". Run "org display" to see the available linked client apps. +Name of the linked client app to use for the connection to the published and active agent. # flags.output-dir.summary Directory where conversation transcripts are saved. +# flags.use-live-actions.summary + +Use real actions in the org; if not specified, preview uses AI to simulate (mock) actions. + # flags.apex-debug.summary Enable Apex debug logging during the agent preview conversation. # examples -- Interact with an agent with API name Resort_Manager in the org with alias "my-org" and the linked "agent-app" connected app: +- Preview an agent in simulated mode by choosing from a list of authoring bundles provided by the command; use the org with alias "my-dev-org": - <%= config.bin %> <%= command.id %> --api-name Resort_Manager --target-org my-org --client-app agent-app + <%= config.bin %> <%= command.id %> --target-org my-dev-org -- Same as the preceding example, but this time save the conversation transcripts to the "./transcripts/my-preview" directory rather than the default "./temp/agent-preview": +- Preview an agent in live mode by choosing from a list of authoring bundles. Save the conversation transcripts to the "./transcripts/my-preview" directory, enable the Apex debug logs, and use your default org: - <%= config.bin %> <%= command.id %> --api-name Resort_Manager --target-org my-org --client-app agent-app --output-dir transcripts/my-preview + <%= config.bin %> <%= command.id %> --use-live-actions --apex-debug --output-dir transcripts/my-preview diff --git a/messages/agent.publish.authoring-bundle.md b/messages/agent.publish.authoring-bundle.md new file mode 100644 index 00000000..f455445f --- /dev/null +++ b/messages/agent.publish.authoring-bundle.md @@ -0,0 +1,50 @@ +# summary + +Publish an authoring bundle to your org, which results in a new agent or a new version of an existing agent. + +# description + +An authoring bundle is a metadata type (named aiAuthoringBundle) that provides the blueprint for an agent. The metadata type contains two files: the standard metatada XML file and an Agent Script file (extension ".agent") that fully describes the agent using the Agent Script language. + +When you publish an authoring bundle to your org, a number of things happen. First, this command validates that the Agent Script file successfully compiles. If there are compilation errors, the command exits and you must fix the Agent Script file to continue. Once the Agent Script file compiles, then it's published to the org, which in turn creates new associated metadata (Bot, BotVersion, GenAiX), or new versions of the metadata if the agent already exists. The new or updated metadata is retrieved back to your DX project, and then the authoring bundle metadata (AiAuthoringBundle) is deployed to your org. + +This command uses the API name of the authoring bundle. + +# examples + +- Publish an authoring bundle by being prompted for its API name; use your default org: + + <%= config.bin %> <%= command.id %> + +- Publish an authoring bundle with API name MyAuthoringBundle to the org with alias "my-dev-org": + + <%= config.bin %> <%= command.id %> --api-name MyAuthoringbundle --target-org my-dev-org + +# flags.api-name.summary + +API name of the authoring bundle you want to publish; if not specified, the command provides a list that you can choose from. + +# flags.api-name.prompt + +API name of the authoring bundle to publish + +# error.missingRequiredFlags + +Required flag(s) missing: %s. + +# error.invalidBundlePath + +Invalid authoring bundle path. Provide a valid directory path to an authoring bundle. + +# error.publishFailed + +Failed to publish agent with the following errors: +%s + +# error.agentNotFound + +Couldn't find a ".bundle-meta.xml" file with API name '%s' in the DX project. + +# error.agentNotFoundAction + +Check that the API name is correct and that the ".agent" file exists in your DX project directory. diff --git a/messages/agent.test.run.md b/messages/agent.test.run.md index d20eb54e..65ed2f42 100644 --- a/messages/agent.test.run.md +++ b/messages/agent.test.run.md @@ -14,6 +14,10 @@ By default, this command outputs test results in human-readable tables for each API name of the agent test to run; corresponds to the name of the AiEvaluationDefinition metadata component that implements the agent test. +# flags.api-name.prompt + +API name of the agent test to run + # flags.wait.summary Number of minutes to wait for the command to complete and display results to the terminal window. diff --git a/messages/agent.validate.authoring-bundle.md b/messages/agent.validate.authoring-bundle.md new file mode 100644 index 00000000..0a1ac99c --- /dev/null +++ b/messages/agent.validate.authoring-bundle.md @@ -0,0 +1,50 @@ +# summary + +Validate an authoring bundle to ensure its Agent Script file compiles successfully and can be used to publish an agent. + +# description + +An authoring bundle is a metadata type (named aiAuthoringBundle) that provides the blueprint for an agent. The metadata type contains two files: the standard metatada XML file and an Agent Script file (extension ".agent") that fully describes the agent using the Agent Script language. + +This command validates that the Agent Script file in the authoring bundle compiles without errors so that you can later publish the bundle to your org. Use this command while you code the Agent Script file to ensure that it's valid. If the validation fails, the command outputs the list of syntax errors, a brief description of the error, and the location in the Agent Script file where the error occurred. + +This command uses the API name of the authoring bundle. If you don't provide an API name with the --api-name flag, the command searches the current DX project and outputs a list of authoring bundles that it found for you to choose from. + +# examples + +- Validate an authoring bundle by being prompted for its API name; use your default org: + + <%= config.bin %> <%= command.id %> + +- Validate an authoring bundle with API name MyAuthoringBundle; use the org with alias "my-dev-org": + + <%= config.bin %> <%= command.id %> --api-name MyAuthoringBundle --target-org my-dev-org + +# flags.api-name.summary + +API name of the authoring bundle you want to validate; if not specified, the command provides a list that you can choose from. + +# flags.api-name.prompt + +API name of the authoring bundle to validate + +# error.missingRequiredFlags + +Required flag(s) missing: %s. + +# error.invalidBundlePath + +Invalid authoring bundle path. Provide a valid directory path to the authoring bundle you want to validate. + +# error.compilationFailed + +Compilation of the Agent Script file failed with the following errors: +%s + +# error.agentNotFound + +Couldn't find a ".bundle-meta.xml" file with API name '%s' in the DX project. + +# error.agentNotFoundAction + +Check that the API name is correct and that the ".agent" file exists in your DX project directory. diff --git a/package.json b/package.json index 97749fb6..b0b08722 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,15 @@ "@inquirer/prompts": "^7.10.1", "@oclif/core": "^4", "@oclif/multi-stage-output": "^0.8.29", - "@salesforce/agents": "^0.18.2", - "@salesforce/core": "^8.23.2", + "@salesforce/agents": "^0.19.4", + "@salesforce/core": "^8.23.7", "@salesforce/kit": "^3.2.3", "@salesforce/sf-plugins-core": "^12.2.6", "@salesforce/source-deploy-retrieve": "^12.30.0", "@salesforce/types": "^1.5.0", "ansis": "^3.3.2", "fast-xml-parser": "^4.5.1", + "glob": "^11.0.3", "ink": "5.0.1", "ink-text-input": "^6.0.0", "inquirer-autocomplete-standalone": "^0.8.1", @@ -27,7 +28,7 @@ "@oclif/plugin-command-snapshot": "^5.3.8", "@oclif/test": "^4.1.15", "@salesforce/cli-plugins-testkit": "^5.3.41", - "@salesforce/dev-scripts": "^10.2.12", + "@salesforce/dev-scripts": "^11.0.4", "@salesforce/plugin-command-reference": "^3.1.78", "@types/inquirer": "^9.0.9", "@types/react": "^18.3.3", @@ -47,8 +48,6 @@ "files": [ "/lib", "/messages", - "/npm-shrinkwrap.json", - "/oclif.lock", "/oclif.manifest.json", "/schemas" ], @@ -62,7 +61,7 @@ "sfdx", "sfdx-plugin" ], - "license": "BSD-3-Clause", + "license": "Apache-2.0", "oclif": { "commands": "./lib/commands", "bin": "sf", @@ -78,12 +77,19 @@ "external": true, "subtopics": { "test": { + "description": "Commands to test agents.", + "external": true + }, + "publish": { + "description": "Command to publish agents to an org.", "external": true }, "generate": { + "description": "Commands to generate agent artifacts, such as the agent spec YAML file, authoring bundle, and test spec file.", "external": true }, - "create": { + "validate": { + "description": "Command to validate an Agent Script file.", "external": true } } @@ -98,6 +104,7 @@ "clean-all": "sf-clean all", "compile": "wireit", "docs": "sf-docs", + "fix-license": "eslint src test --fix --rule \"header/header: [2]\"", "format": "wireit", "link-check": "wireit", "lint": "wireit", diff --git a/schemas/agent-generate-agent__spec.json b/schemas/agent-generate-agent__spec.json index 2a6953af..d18950f0 100644 --- a/schemas/agent-generate-agent__spec.json +++ b/schemas/agent-generate-agent__spec.json @@ -69,7 +69,7 @@ }, "AgentType": { "type": "string", - "enum": ["customer", "internal"] + "enum": ["customer", "internal", "AGENT"] } } } diff --git a/schemas/agent-generate-authoring__bundle.json b/schemas/agent-generate-authoring__bundle.json new file mode 100644 index 00000000..60ba9c5e --- /dev/null +++ b/schemas/agent-generate-authoring__bundle.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AgentGenerateAuthoringBundleResult", + "definitions": { + "AgentGenerateAuthoringBundleResult": { + "type": "object", + "properties": { + "agentPath": { + "type": "string" + }, + "metaXmlPath": { + "type": "string" + }, + "outputDir": { + "type": "string" + } + }, + "required": ["agentPath", "metaXmlPath", "outputDir"], + "additionalProperties": false + } + } +} diff --git a/schemas/agent-publish-authoring__bundle.json b/schemas/agent-publish-authoring__bundle.json new file mode 100644 index 00000000..33b3777b --- /dev/null +++ b/schemas/agent-publish-authoring__bundle.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AgentPublishAuthoringBundleResult", + "definitions": { + "AgentPublishAuthoringBundleResult": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "botDeveloperName": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["success"], + "additionalProperties": false + } + } +} diff --git a/schemas/agent-validate-authoring__bundle.json b/schemas/agent-validate-authoring__bundle.json new file mode 100644 index 00000000..196ee052 --- /dev/null +++ b/schemas/agent-validate-authoring__bundle.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AgentValidateAuthoringBundleResult", + "definitions": { + "AgentValidateAuthoringBundleResult": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "errors": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["success"], + "additionalProperties": false + } + } +} diff --git a/src/agentActivation.ts b/src/agentActivation.ts index e2620bf9..45817b6d 100644 --- a/src/agentActivation.ts +++ b/src/agentActivation.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { Connection, Messages, Org, SfError } from '@salesforce/core'; diff --git a/src/agentTestCache.ts b/src/agentTestCache.ts index 16b23eb3..e88c51d8 100644 --- a/src/agentTestCache.ts +++ b/src/agentTestCache.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { Global, SfError, TTLConfig } from '@salesforce/core'; diff --git a/src/commands/agent/activate.ts b/src/commands/agent/activate.ts index 318adb24..50a4fbf2 100644 --- a/src/commands/agent/activate.ts +++ b/src/commands/agent/activate.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; import { Messages } from '@salesforce/core'; diff --git a/src/commands/agent/create.ts b/src/commands/agent/create.ts index 280e3e57..bc16a184 100644 --- a/src/commands/agent/create.ts +++ b/src/commands/agent/create.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { resolve } from 'node:path'; import { existsSync, readFileSync, writeFileSync } from 'node:fs'; diff --git a/src/commands/agent/deactivate.ts b/src/commands/agent/deactivate.ts index ae1ddea2..fb997904 100644 --- a/src/commands/agent/deactivate.ts +++ b/src/commands/agent/deactivate.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; import { Messages } from '@salesforce/core'; diff --git a/src/commands/agent/generate/agent-spec.ts b/src/commands/agent/generate/agent-spec.ts index 4ca7fb78..b2be2498 100644 --- a/src/commands/agent/generate/agent-spec.ts +++ b/src/commands/agent/generate/agent-spec.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { join, resolve, dirname } from 'node:path'; import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs'; diff --git a/src/commands/agent/generate/authoring-bundle.ts b/src/commands/agent/generate/authoring-bundle.ts new file mode 100644 index 00000000..bde317af --- /dev/null +++ b/src/commands/agent/generate/authoring-bundle.ts @@ -0,0 +1,159 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { join, resolve } from 'node:path'; +import { readFileSync, existsSync } from 'node:fs'; +import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; +import { generateApiName, Messages, SfError } from '@salesforce/core'; +import { Agent, AgentJobSpec } from '@salesforce/agents'; +import YAML from 'yaml'; +import { input as inquirerInput } from '@inquirer/prompts'; +import { theme } from '../../../inquirer-theme.js'; +import { FlaggablePrompt, promptForFlag, promptForYamlFile } from '../../../flags.js'; + +Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); +const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.generate.authoring-bundle'); + +export type AgentGenerateAuthoringBundleResult = { + agentPath: string; + metaXmlPath: string; + outputDir: string; +}; + +export default class AgentGenerateAuthoringBundle extends SfCommand { + public static readonly summary = messages.getMessage('summary'); + public static readonly description = messages.getMessage('description'); + public static readonly examples = messages.getMessages('examples'); + public static readonly requiresProject = true; + public static state = 'beta'; + + public static readonly flags = { + 'target-org': Flags.requiredOrg(), + 'api-name': Flags.string({ + summary: messages.getMessage('flags.api-name.summary'), + }), + 'api-version': Flags.orgApiVersion(), + spec: Flags.file({ + summary: messages.getMessage('flags.spec.summary'), + char: 'f', + exists: true, + }), + 'output-dir': Flags.directory({ + summary: messages.getMessage('flags.output-dir.summary'), + char: 'd', + }), + name: Flags.string({ + summary: messages.getMessage('flags.name.summary'), + char: 'n', + }), + }; + + private static readonly FLAGGABLE_PROMPTS = { + name: { + message: messages.getMessage('flags.name.summary'), + promptMessage: messages.getMessage('flags.name.prompt'), + validate: (d: string): boolean | string => + d.trim().length > 0 || 'Name cannot be empty or contain only whitespace', + required: true, + }, + 'api-name': { + message: messages.getMessage('flags.api-name.summary'), + promptMessage: messages.getMessage('flags.api-name.prompt'), + validate: (d: string): boolean | string => { + if (d.length === 0) { + return true; + } + if (d.length > 80) { + return 'API name cannot be over 80 characters.'; + } + const regex = /^[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]+$/; + if (!regex.test(d)) { + return 'Invalid API name.'; + } + return true; + }, + }, + spec: { + message: messages.getMessage('flags.spec.summary'), + promptMessage: messages.getMessage('flags.spec.prompt'), + validate: (d: string): boolean | string => { + const specPath = resolve(d); + if (!existsSync(specPath)) { + return 'Please enter an existing agent spec (yaml) file'; + } + return true; + }, + required: true, + }, + } satisfies Record; + + public async run(): Promise { + const { flags } = await this.parse(AgentGenerateAuthoringBundle); + const { 'output-dir': outputDir, 'target-org': targetOrg } = flags; + + // If we don't have a spec yet, prompt for it + const spec = flags.spec ?? (await promptForYamlFile(AgentGenerateAuthoringBundle.FLAGGABLE_PROMPTS['spec'])); + + // If we don't have a name yet, prompt for it + const name = flags['name'] ?? (await promptForFlag(AgentGenerateAuthoringBundle.FLAGGABLE_PROMPTS['name'])); + + // If we don't have an api name yet, prompt for it + let bundleApiName = flags['api-name']; + if (!bundleApiName) { + bundleApiName = generateApiName(name); + const promptedValue = await inquirerInput({ + message: messages.getMessage('flags.api-name.prompt'), + validate: AgentGenerateAuthoringBundle.FLAGGABLE_PROMPTS['api-name'].validate, + default: bundleApiName, + theme, + }); + if (promptedValue?.length) { + bundleApiName = promptedValue; + } + } + + try { + // Get default output directory if not specified + const defaultOutputDir = join(this.project!.getDefaultPackage().fullPath, 'main', 'default'); + const targetOutputDir = join(outputDir ?? defaultOutputDir, 'aiAuthoringBundles', bundleApiName); + + // Generate file paths + const agentPath = join(targetOutputDir, `${bundleApiName}.agent`); + const metaXmlPath = join(targetOutputDir, `${bundleApiName}.bundle-meta.xml`); + + // Write Agent file + const conn = targetOrg.getConnection(flags['api-version']); + const specContents = YAML.parse(readFileSync(spec, 'utf8')) as AgentJobSpec; + await Agent.createAuthoringBundle({ + connection: conn, + agentSpec: { ...specContents, ...{ name, developerName: bundleApiName } }, + project: this.project!, + bundleApiName, + }); + + this.logSuccess(`Successfully generated ${bundleApiName} Authoring Bundle`); + + return { + agentPath, + metaXmlPath, + outputDir: targetOutputDir, + }; + } catch (error) { + const err = SfError.wrap(error); + throw new SfError(messages.getMessage('error.failed-to-create-agent'), 'AgentGenerationError', [err.message]); + } + } +} diff --git a/src/commands/agent/generate/template.ts b/src/commands/agent/generate/template.ts index ffc8ad66..326565b8 100644 --- a/src/commands/agent/generate/template.ts +++ b/src/commands/agent/generate/template.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { join, dirname, basename, resolve } from 'node:path'; diff --git a/src/commands/agent/generate/test-spec.ts b/src/commands/agent/generate/test-spec.ts index 95e77c72..ec7dac6a 100644 --- a/src/commands/agent/generate/test-spec.ts +++ b/src/commands/agent/generate/test-spec.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import * as fs from 'node:fs'; import { join, parse } from 'node:path'; diff --git a/src/commands/agent/preview.ts b/src/commands/agent/preview.ts index c260d1c3..a85f6d11 100644 --- a/src/commands/agent/preview.ts +++ b/src/commands/agent/preview.ts @@ -1,18 +1,35 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ -import { resolve, join } from 'node:path'; -import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; -import { AuthInfo, Connection, Messages, SfError } from '@salesforce/core'; +import * as path from 'node:path'; +import { join, resolve } from 'node:path'; +import { globSync } from 'glob'; +import { Flags, SfCommand } from '@salesforce/sf-plugins-core'; +import { AuthInfo, Connection, Lifecycle, Messages, SfError } from '@salesforce/core'; import React from 'react'; import { render } from 'ink'; -import { env } from '@salesforce/kit'; -import { AgentPreview as Preview } from '@salesforce/agents'; -import { select, confirm, input } from '@inquirer/prompts'; +import { + AgentPreview as Preview, + AgentSimulate, + AgentSource, + findAuthoringBundle, + PublishedAgent, + ScriptAgent, +} from '@salesforce/agents'; +import { select } from '@inquirer/prompts'; import { AgentPreviewReact } from '../../components/agent-preview-react.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); @@ -34,11 +51,6 @@ type Choice = { disabled?: boolean | string; }; -type AgentValue = { - Id: string; - DeveloperName: string; -}; - // https://developer.salesforce.com/docs/einstein/genai/guide/agent-api-get-started.html#prerequisites export const UNSUPPORTED_AGENTS = ['Copilot_for_Salesforce']; @@ -57,13 +69,15 @@ export default class AgentPreview extends SfCommand { 'client-app': Flags.string({ char: 'c', summary: messages.getMessage('flags.client-app.summary'), - required: true, dependsOn: ['target-org'], }), 'api-name': Flags.string({ summary: messages.getMessage('flags.api-name.summary'), char: 'n', }), + 'authoring-bundle': Flags.string({ + summary: messages.getMessage('flags.authoring-bundle.summary'), + }), 'output-dir': Flags.directory({ summary: messages.getMessage('flags.output-dir.summary'), char: 'd', @@ -72,47 +86,106 @@ export default class AgentPreview extends SfCommand { summary: messages.getMessage('flags.apex-debug.summary'), char: 'x', }), + 'use-live-actions': Flags.boolean({ + summary: messages.getMessage('flags.use-live-actions.summary'), + default: false, + }), }; public async run(): Promise { + // STAGES OF PREVIEW + // get user's agent selection either from flags, or interaction + // if .agent selected, use the AgentSimulate class to preview + // if published agent, use AgentPreview for preview + // based on agent, differing auth mechanisms required const { flags } = await this.parse(AgentPreview); - const { 'api-name': apiNameFlag } = flags; + const { 'api-name': apiNameFlag, 'use-live-actions': useLiveActions } = flags; const conn = flags['target-org'].getConnection(flags['api-version']); + const agentsInOrg = ( + await conn.query( + 'SELECT Id, DeveloperName, (SELECT Status FROM BotVersions) FROM BotDefinition WHERE IsDeleted = false' + ) + ).records; + + let selectedAgent: ScriptAgent | PublishedAgent; + + if (flags['authoring-bundle']) { + // user specified --authoring-bundle, we'll find the script and use it + const bundlePath = findAuthoringBundle(this.project!.getPath(), flags['authoring-bundle']); + if (!bundlePath) { + throw new SfError(`Could not find authoring bundle for ${flags['authoring-bundle']}`); + } + selectedAgent = { + DeveloperName: flags['authoring-bundle'], + source: AgentSource.SCRIPT, + path: join(bundlePath, `${flags['authoring-bundle']}.agent`), + }; + } else if (apiNameFlag) { + // user specified --api-name, it should be in the list of agents from the org + const agent = agentsInOrg.find((a) => a.DeveloperName === apiNameFlag); + if (!agent) throw new Error(`No valid Agents were found with the Api Name ${apiNameFlag}.`); + validateAgent(agent); + selectedAgent = { + Id: agent.Id, + DeveloperName: agent.DeveloperName, + source: AgentSource.PUBLISHED, + }; + if (!selectedAgent) throw new Error(`No valid Agents were found with the Api Name ${apiNameFlag}.`); + } else { + selectedAgent = await select({ + message: 'Select an agent', + choices: this.getAgentChoices(agentsInOrg), + }); + } + + // we have the selected agent, create the appropriate connection const authInfo = await AuthInfo.create({ username: flags['target-org'].getUsername(), }); + // Get client app - check flag first, then auth file, then env var + let clientApp = flags['client-app']; - const jwtConn = await Connection.create({ - authInfo, - clientApp: flags['client-app'], - }); - - const agentsQuery = await conn.query( - 'SELECT Id, DeveloperName, (SELECT Status FROM BotVersions) FROM BotDefinition WHERE IsDeleted = false' - ); + if (!clientApp && selectedAgent?.source === AgentSource.PUBLISHED) { + const clientApps = getClientAppsFromAuth(authInfo); - if (agentsQuery.totalSize === 0) throw new SfError('No Agents found in the org'); + if (clientApps.length === 1) { + clientApp = clientApps[0]; + } else if (clientApps.length > 1) { + clientApp = await select({ + message: 'Select a client app', + choices: clientApps.map((app) => ({ value: app, name: app })), + }); + } else { + throw new SfError('No client app found.'); + } + } - const agentsInOrg = agentsQuery.records; + if (useLiveActions && selectedAgent.source === AgentSource.PUBLISHED) { + void Lifecycle.getInstance().emitWarning( + 'Published agents will always use real actions in your org, specifying --use-live-actions and selecting a published agent has no effect' + ); + } - let selectedAgent; + const jwtConn = + selectedAgent?.source === AgentSource.PUBLISHED + ? await Connection.create({ + authInfo, + clientApp, + }) + : await Connection.create({ authInfo }); - if (apiNameFlag) { - selectedAgent = agentsInOrg.find((agent) => agent.DeveloperName === apiNameFlag); - if (!selectedAgent) throw new Error(`No valid Agents were found with the Api Name ${apiNameFlag}.`); - validateAgent(selectedAgent); - } else { - selectedAgent = await select({ - message: 'Select an agent', - choices: getAgentChoices(agentsInOrg), - }); - } + // Only resolve outputDir if explicitly provided via flag + // Otherwise, let user decide when exiting + const outputDir = flags['output-dir'] ? resolve(flags['output-dir']) : undefined; + // Both classes share the same interface for the methods we need + const agentPreview = + selectedAgent.source === AgentSource.PUBLISHED + ? new Preview(jwtConn, selectedAgent.Id) + : new AgentSimulate(jwtConn, selectedAgent.path, !useLiveActions); - const outputDir = await resolveOutputDir(flags['output-dir'], flags['apex-debug']); - const agentPreview = new Preview(jwtConn, selectedAgent.Id); - agentPreview.toggleApexDebugMode(flags['apex-debug']); + agentPreview.setApexDebugMode(flags['apex-debug']); const instance = render( React.createElement(AgentPreviewReact, { @@ -120,11 +193,49 @@ export default class AgentPreview extends SfCommand { agent: agentPreview, name: selectedAgent.DeveloperName, outputDir, + isLocalAgent: selectedAgent.source === AgentSource.SCRIPT, + apexDebug: flags['apex-debug'], }), { exitOnCtrlC: false } ); await instance.waitUntilExit(); } + + private getAgentChoices(agents: AgentData[]): Array> { + const choices: Array> = []; + + // Add org agents + for (const agent of agents) { + if (agentIsInactive(agent) || agentIsUnsupported(agent.DeveloperName)) { + continue; + } + + choices.push({ + name: `${agent.DeveloperName} (Published)`, + value: { + Id: agent.Id, + DeveloperName: agent.DeveloperName, + source: AgentSource.PUBLISHED, + }, + }); + } + + // Add local agents from .agent files + const localAgentPaths = globSync('**/*.agent', { cwd: this.project!.getPath() }); + for (const agentPath of localAgentPaths) { + const agentName = path.basename(agentPath, '.agent'); + choices.push({ + name: `${agentName} (Agent Script)`, + value: { + DeveloperName: agentName, + source: AgentSource.SCRIPT, + path: path.join(this.project!.getPath(), agentPath), + }, + }); + } + + return choices; + } } export const agentIsUnsupported = (devName: string): boolean => UNSUPPORTED_AGENTS.includes(devName); @@ -148,46 +259,5 @@ export const validateAgent = (agent: AgentData): boolean => { return true; }; -export const getAgentChoices = (agents: AgentData[]): Array> => - agents.map((agent) => { - let disabled: string | boolean = false; - - if (agentIsInactive(agent)) disabled = '(Inactive)'; - if (agentIsUnsupported(agent.DeveloperName)) disabled = '(Not Supported)'; - - return { - name: agent.DeveloperName, - value: { - Id: agent.Id, - DeveloperName: agent.DeveloperName, - }, - disabled, - }; - }); - -export const resolveOutputDir = async ( - outputDir: string | undefined, - apexDebug: boolean | undefined -): Promise => { - if (!outputDir) { - const response = apexDebug - ? true - : await confirm({ - message: 'Save transcripts to an output directory?', - default: true, - }); - - const outputTypes = apexDebug ? 'debug logs and transcripts' : 'transcripts'; - if (response) { - const getDir = await input({ - message: `Enter the output directory for ${outputTypes}`, - default: env.getString('SF_AGENT_PREVIEW_OUTPUT_DIR', join('temp', 'agent-preview')), - required: true, - }); - - return resolve(getDir); - } - } else { - return resolve(outputDir); - } -}; +export const getClientAppsFromAuth = (authInfo: AuthInfo): string[] => + Object.keys(authInfo.getFields().clientApps ?? {}); diff --git a/src/commands/agent/publish/authoring-bundle.ts b/src/commands/agent/publish/authoring-bundle.ts new file mode 100644 index 00000000..5cf739e1 --- /dev/null +++ b/src/commands/agent/publish/authoring-bundle.ts @@ -0,0 +1,179 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { EOL } from 'node:os'; +import { join } from 'node:path'; +import { readFileSync } from 'node:fs'; +import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; +import { MultiStageOutput } from '@oclif/multi-stage-output'; +import { Messages, Lifecycle, SfError } from '@salesforce/core'; +import { Agent, findAuthoringBundle } from '@salesforce/agents'; +import { RequestStatus, ScopedPostDeploy, type ScopedPostRetrieve } from '@salesforce/source-deploy-retrieve'; +import { ensureArray } from '@salesforce/kit'; +import { FlaggablePrompt, promptForAgentFiles } from '../../../flags.js'; +import { throwAgentCompilationError } from '../../../common.js'; + +Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); +const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.publish.authoring-bundle'); + +export type AgentPublishAuthoringBundleResult = { + success: boolean; + botDeveloperName?: string; + errors?: string[]; +}; + +export default class AgentPublishAuthoringBundle extends SfCommand { + public static readonly summary = messages.getMessage('summary'); + public static readonly description = messages.getMessage('description'); + public static readonly examples = messages.getMessages('examples'); + public static readonly requiresProject = true; + public static state = 'beta'; + + public static readonly flags = { + 'target-org': Flags.requiredOrg(), + 'api-version': Flags.orgApiVersion(), + 'api-name': Flags.string({ + char: 'n', + summary: messages.getMessage('flags.api-name.summary'), + }), + }; + + private static readonly FLAGGABLE_PROMPTS = { + 'api-name': { + message: messages.getMessage('flags.api-name.summary'), + promptMessage: messages.getMessage('flags.api-name.prompt'), + validate: (d: string): boolean | string => { + if (d.length > 80) { + return 'API name cannot be over 80 characters.'; + } + const regex = /^[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]+$/; + if (d.length === 0 || !regex.test(d)) { + return 'Invalid API name.'; + } + return true; + }, + }, + } satisfies Record; + + public async run(): Promise { + const { flags } = await this.parse(AgentPublishAuthoringBundle); + // If api-name is not provided, prompt user to select an .agent file from the project and extract the API name from it + const apiName = + flags['api-name'] ?? + (await promptForAgentFiles(this.project!, AgentPublishAuthoringBundle.FLAGGABLE_PROMPTS['api-name'])); + const authoringBundleDir = findAuthoringBundle( + this.project!.getPackageDirectories().map((dir) => dir.fullPath), + apiName + ); + + if (!authoringBundleDir) { + throw new SfError(messages.getMessage('error.agentNotFound', [apiName]), 'AgentNotFoundError', [ + messages.getMessage('error.agentNotFoundAction'), + ]); + } + // Create multi-stage output + const mso = new MultiStageOutput<{ agentName: string }>({ + stages: ['Validate Bundle', 'Publish Agent', 'Retrieve Metadata', 'Deploy Metadata'], + title: 'Publishing Agent', + data: { agentName: apiName }, + jsonEnabled: this.jsonEnabled(), + postStagesBlock: [ + { + label: 'Agent Name', + type: 'static-key-value', + get: (data) => data?.agentName, + bold: true, + color: 'cyan', + }, + ], + }); + try { + mso.goto('Validate Bundle'); + const targetOrg = flags['target-org']; + const conn = targetOrg.getConnection(flags['api-version']); + + // First compile the .agent file to get the Agent JSON + const compileResponse = await Agent.compileAgentScript( + conn, + readFileSync(join(authoringBundleDir, `${apiName}.agent`), 'utf8') + ); + if (compileResponse.status === 'success') { + mso.skipTo('Publish Agent'); + } else { + throwAgentCompilationError(compileResponse.errors); + } + // Then publish the Agent JSON to create the agent + // Set up lifecycle listeners for retrieve events + Lifecycle.getInstance().on('scopedPreRetrieve', () => { + mso.skipTo('Retrieve Metadata'); + return Promise.resolve(); + }); + // Set up lifecycle listeners for deploy events + Lifecycle.getInstance().on('scopedPreDeploy', () => { + mso.skipTo('Deploy Metadata'); + return Promise.resolve(); + }); + + Lifecycle.getInstance().on('scopedPostRetrieve', (result: ScopedPostRetrieve) => { + if (result.retrieveResult.response.status !== RequestStatus.Succeeded) { + const errorMessage = `Metadata retrieval failed: ${ensureArray( + // @ts-expect-error I saw errorMessages populated with useful information during testing + result?.retrieveResult.response?.messages ?? result?.retrieveResult?.response?.errorMessage + ).join(EOL)}`; + mso.error(); + throw new SfError(errorMessage); + } + return Promise.resolve(); + }); + + Lifecycle.getInstance().on('scopedPostDeploy', (result: ScopedPostDeploy) => { + if (result.deployResult.response.status === RequestStatus.Succeeded) { + mso.stop(); + } else { + const errorMessage = `Metadata deployment failed: ${ensureArray( + // @ts-expect-error I saw errorMessages populated with useful information during testing + result?.deployResult.response?.messages ?? result?.deployResult?.response?.errorMessage + ).join(EOL)}`; + mso.error(); + throw new SfError(errorMessage); + } + return Promise.resolve(); + }); + + const result = await Agent.publishAgentJson(conn, this.project!, compileResponse.compiledArtifact); + mso.stop(); + + return { + success: true, + botDeveloperName: result.developerName, + }; + } catch (error) { + // Handle validation errors + const err = SfError.wrap(error); + const message = err.message ? err.message : err.name; + const errorMessage = messages.getMessage('error.publishFailed', [message]); + + // Stop the multi-stage output on error + mso.error(); + + this.error(errorMessage); + + return { + success: false, + errors: err.message.split('\n'), + }; + } + } +} diff --git a/src/commands/agent/test/create.ts b/src/commands/agent/test/create.ts index 976c3451..fd927e86 100644 --- a/src/commands/agent/test/create.ts +++ b/src/commands/agent/test/create.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { join, resolve } from 'node:path'; import { existsSync } from 'node:fs'; diff --git a/src/commands/agent/test/list.ts b/src/commands/agent/test/list.ts index 4b4d2cb0..cda3a303 100644 --- a/src/commands/agent/test/list.ts +++ b/src/commands/agent/test/list.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { AgentTest, type AvailableDefinition } from '@salesforce/agents'; diff --git a/src/commands/agent/test/results.ts b/src/commands/agent/test/results.ts index 73f6ab82..24ea509c 100644 --- a/src/commands/agent/test/results.ts +++ b/src/commands/agent/test/results.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; diff --git a/src/commands/agent/test/resume.ts b/src/commands/agent/test/resume.ts index b2c3be2a..d53f1280 100644 --- a/src/commands/agent/test/resume.ts +++ b/src/commands/agent/test/resume.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2023, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; diff --git a/src/commands/agent/test/run.ts b/src/commands/agent/test/run.ts index b73d4a62..2e04a042 100644 --- a/src/commands/agent/test/run.ts +++ b/src/commands/agent/test/run.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; @@ -31,6 +40,7 @@ const FLAGGABLE_PROMPTS = { char: 'n', required: true, message: messages.getMessage('flags.api-name.summary'), + promptMessage: messages.getMessage('flags.api-name.prompt'), validate: (d: string): boolean | string => { if (d.length === 0) { return true; diff --git a/src/commands/agent/validate/authoring-bundle.ts b/src/commands/agent/validate/authoring-bundle.ts new file mode 100644 index 00000000..8fa78758 --- /dev/null +++ b/src/commands/agent/validate/authoring-bundle.ts @@ -0,0 +1,145 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; +import { Messages, SfError } from '@salesforce/core'; +import { MultiStageOutput } from '@oclif/multi-stage-output'; +import { Agent, findAuthoringBundle } from '@salesforce/agents'; +import { colorize } from '@oclif/core/ux'; +import { throwAgentCompilationError } from '../../../common.js'; +import { FlaggablePrompt, promptForAgentFiles } from '../../../flags.js'; + +Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); +const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.validate.authoring-bundle'); + +export type AgentValidateAuthoringBundleResult = { + success: boolean; + errors?: string[]; +}; + +export default class AgentValidateAuthoringBundle extends SfCommand { + public static readonly summary = messages.getMessage('summary'); + public static readonly description = messages.getMessage('description'); + public static readonly examples = messages.getMessages('examples'); + public static readonly requiresProject = true; + public static state = 'beta'; + + public static readonly flags = { + 'target-org': Flags.requiredOrg(), + 'api-version': Flags.orgApiVersion(), + 'api-name': Flags.string({ + char: 'n', + summary: messages.getMessage('flags.api-name.summary'), + }), + }; + + private static readonly FLAGGABLE_PROMPTS = { + 'api-name': { + message: messages.getMessage('flags.api-name.summary'), + promptMessage: messages.getMessage('flags.api-name.prompt'), + validate: (d: string): boolean | string => { + if (d.length > 80) { + return 'API name cannot be over 80 characters.'; + } + const regex = /^[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]+$/; + if (d.length === 0 || !regex.test(d)) { + return 'Invalid API name.'; + } + return true; + }, + }, + } satisfies Record; + + public async run(): Promise { + const { flags } = await this.parse(AgentValidateAuthoringBundle); + // If api-name is not provided, prompt user to select an .agent file from the project and extract the API name from it + const apiName = + flags['api-name'] ?? + (await promptForAgentFiles(this.project!, AgentValidateAuthoringBundle.FLAGGABLE_PROMPTS['api-name'])); + const authoringBundleDir = findAuthoringBundle( + this.project!.getPackageDirectories().map((dir) => dir.fullPath), + apiName + ); + if (!authoringBundleDir) { + throw new SfError(messages.getMessage('error.agentNotFound', [apiName]), 'AgentNotFoundError', [ + messages.getMessage('error.agentNotFoundAction'), + ]); + } + const mso = new MultiStageOutput<{ status: string; errors: string }>({ + jsonEnabled: this.jsonEnabled(), + title: `Validating ${apiName} Authoring Bundle`, + showTitle: true, + stages: ['Validating Authoring Bundle'], + stageSpecificBlock: [ + { + stage: 'Validating Authoring Bundle', + label: 'Status', + type: 'dynamic-key-value', + get: (data): string => data?.status ?? 'IN PROGRESS', + }, + { + stage: 'Validating Authoring Bundle', + label: 'Errors', + type: 'dynamic-key-value', + get: (data): string => data?.errors ?? '0', + }, + ], + }); + + try { + mso.skipTo('Validating Authoring Bundle'); + const targetOrg = flags['target-org']; + const conn = targetOrg.getConnection(flags['api-version']); + const result = await Agent.compileAgentScript( + conn, + readFileSync(join(authoringBundleDir, `${apiName}.agent`), 'utf8') + ); + if (result.status === 'success') { + mso.updateData({ status: 'COMPLETED' }); + mso.stop('completed'); + return { + success: true, + }; + } else { + throwAgentCompilationError(result.errors); + } + } catch (error) { + // Handle validation errors + const err = SfError.wrap(error); + let count = 0; + const rawError = err.message ? err.message : err.name; + const formattedError = rawError + .split('\n') + .map((line) => { + count += 1; + const type = line.split(':')[0]; + const rest = line.includes(':') ? line.substring(line.indexOf(':')).trim() : ''; + return `- ${colorize('red', type)}${rest}`; + }) + .join('\n'); + + mso.updateData({ errors: count.toString(), status: 'ERROR' }); + mso.error(); + + this.error(messages.getMessage('error.compilationFailed', [formattedError])); + return { + success: false, + errors: err.message.split('\n'), + }; + } + } +} diff --git a/src/common.ts b/src/common.ts new file mode 100644 index 00000000..048edf97 --- /dev/null +++ b/src/common.ts @@ -0,0 +1,42 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { EOL } from 'node:os'; +import { SfError } from '@salesforce/core'; +import { CompilationError } from '@salesforce/agents'; + +/** + * Utility function to generate SfError when there are agent compilation errors. + * + * @param compilationErrors - The compilation errors as strings, CompilationError objects, or array of either + * @throws SfError - Always throws a Salesforce CLI error + */ +export function throwAgentCompilationError(compilationErrors: CompilationError[]): never { + if (compilationErrors.length === 0) { + throw SfError.create({ + name: 'CompileAgentScriptError', + message: 'Unknown compilation error occurred', + data: compilationErrors, + }); + } + + const errors = compilationErrors; + + throw SfError.create({ + name: 'CompileAgentScriptError', + message: errors.map((e) => `${e.errorType}: ${e.description} [Ln ${e.lineStart}, Col ${e.colStart}]`).join(EOL), + data: errors, + }); +} diff --git a/src/components/agent-preview-react.tsx b/src/components/agent-preview-react.tsx index e4089e37..ddc0454f 100644 --- a/src/components/agent-preview-react.tsx +++ b/src/components/agent-preview-react.tsx @@ -1,18 +1,29 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import path from 'node:path'; import fs from 'node:fs'; +import * as process from 'node:process'; +import { resolve } from 'node:path'; import React from 'react'; import { Box, Text, useInput } from 'ink'; import TextInput from 'ink-text-input'; -import { Connection } from '@salesforce/core'; -import { AgentPreview, AgentPreviewSendResponse, writeDebugLog } from '@salesforce/agents'; -import { sleep } from '@salesforce/kit'; +import { Connection, SfError, Lifecycle } from '@salesforce/core'; +import { AgentPreviewBase, AgentPreviewSendResponse, writeDebugLog } from '@salesforce/agents'; +import { sleep, env } from '@salesforce/kit'; // Component to show a simple typing animation function Typing(): React.ReactNode { @@ -38,11 +49,7 @@ function Typing(): React.ReactNode { ); } -// Split the content on newlines, then find the longest array element -const calculateWidth = (content: string): number => - content.split('\n').reduce((acc, line) => Math.max(acc, line.length), 0) + 4; - -const saveTranscriptsToFile = ( +export const saveTranscriptsToFile = ( outputDir: string, messages: Array<{ timestamp: Date; role: string; content: string }>, responses: AgentPreviewSendResponse[] @@ -66,9 +73,11 @@ const saveTranscriptsToFile = ( */ export function AgentPreviewReact(props: { readonly connection: Connection; - readonly agent: AgentPreview; + readonly agent: AgentPreviewBase; readonly name: string; readonly outputDir: string | undefined; + readonly isLocalAgent: boolean; + readonly apexDebug: boolean | undefined; }): React.ReactNode { const [messages, setMessages] = React.useState>([]); const [header, setHeader] = React.useState('Starting session...'); @@ -76,6 +85,11 @@ export function AgentPreviewReact(props: { const [query, setQuery] = React.useState(''); const [isTyping, setIsTyping] = React.useState(true); const [sessionEnded, setSessionEnded] = React.useState(false); + const [exitRequested, setExitRequested] = React.useState(false); + const [showSavePrompt, setShowSavePrompt] = React.useState(false); + const [showDirInput, setShowDirInput] = React.useState(false); + const [saveDir, setSaveDir] = React.useState(''); + const [saveConfirmed, setSaveConfirmed] = React.useState(false); // @ts-expect-error: Complains if this is not defined but it's not used // eslint-disable-next-line @typescript-eslint/no-unused-vars const [timestamp, setTimestamp] = React.useState(new Date().getTime()); @@ -83,49 +97,152 @@ export function AgentPreviewReact(props: { const [responses, setResponses] = React.useState([]); const [apexDebugLogs, setApexDebugLogs] = React.useState([]); - const { connection, agent, name, outputDir } = props; + const { connection, agent, name, outputDir, isLocalAgent, apexDebug } = props; useInput((input, key) => { - if (key.escape) { + // If user is in directory input and presses ESC, cancel and exit without saving + if (showDirInput && (key.escape || (key.ctrl && input === 'c'))) { setSessionEnded(true); + return; } - if (key.ctrl && input === 'c') { - setSessionEnded(true); + + // Only handle exit if we're not already in save prompt flow + if (!exitRequested && !showSavePrompt && !showDirInput) { + if (key.escape || (key.ctrl && input === 'c')) { + setExitRequested(true); + setShowSavePrompt(true); + } + return; + } + + // Handle save prompt navigation + if (showSavePrompt && !showDirInput) { + if (input.toLowerCase() === 'y' || input.toLowerCase() === 'n') { + if (input.toLowerCase() === 'y') { + // If outputDir was provided via flag, use it directly + if (outputDir) { + setSaveDir(outputDir); + setSaveConfirmed(true); + setShowSavePrompt(false); + } else { + // Otherwise, prompt for directory + setShowSavePrompt(false); + setShowDirInput(true); + const defaultDir = env.getString('SF_AGENT_PREVIEW_OUTPUT_DIR', path.join('temp', 'agent-preview')); + setSaveDir(defaultDir); + } + } else { + // User said no, exit without saving + setSessionEnded(true); + } + } } }); React.useEffect(() => { const endSession = async (): Promise => { if (sessionEnded) { - // TODO: Support other end types (such as Escalate) - await agent.end(sessionId, 'UserRequest'); - process.exit(0); + try { + // TODO: Support other end types (such as Escalate) + await agent.end(sessionId, 'UserRequest'); + process.exit(0); + } catch (e) { + // in case the agent session never started, calling agent.end will throw an error, but we've already shown the error to the user + process.exit(0); + } } }; void endSession(); - }, [sessionEnded]); + }, [sessionEnded, sessionId, agent]); React.useEffect(() => { + // Set up event listeners for agent compilation and simulation events + const lifecycle = Lifecycle.getInstance(); + + const handleCompilingEvent = (): Promise => { + setHeader('Compiling agent...'); + return Promise.resolve(); + }; + + const handleSimulationStartingEvent = (): Promise => { + setHeader('Starting session...'); + return Promise.resolve(); + }; + + const handleSessionStartedEvent = (): Promise => { + setHeader(`New session started with "${props.name}"`); + return Promise.resolve(); + }; + + // Listen for the events + lifecycle.on('agents:compiling', handleCompilingEvent); + lifecycle.on('agents:simulation-starting', handleSimulationStartingEvent); + lifecycle.on('agents:session-started', handleSessionStartedEvent); + const startSession = async (): Promise => { - const session = await agent.start(); - setSessionId(session.sessionId); - setHeader(`New session started with "${props.name}" (${session.sessionId})`); - await sleep(500); // Add a short delay to make it feel more natural - setIsTyping(false); - if (outputDir) { - const dateForDir = new Date().toISOString().replace(/:/g, '-').split('.')[0]; - setTempDir(path.join(outputDir, `${dateForDir}--${session.sessionId}`)); + try { + const session = await agent.start(); + setSessionId(session.sessionId); + setHeader(`New session started with "${props.name}" (${session.sessionId})`); + await sleep(500); // Add a short delay to make it feel more natural + setIsTyping(false); + } catch (e) { + const sfError = SfError.wrap(e); + setIsTyping(false); + setHeader('Error starting session'); + setMessages([{ role: name, content: `${sfError.name} - ${sfError.message}`, timestamp: new Date() }]); + setSessionEnded(true); } - setMessages([{ role: name, content: session.messages[0].message, timestamp: new Date() }]); }; void startSession(); - }, []); + }, [agent, name, outputDir, props.name, isLocalAgent]); React.useEffect(() => { - saveTranscriptsToFile(tempDir, messages, responses); + // Save to tempDir if it was set (during session) + if (tempDir) { + saveTranscriptsToFile(tempDir, messages, responses); + } }, [tempDir, messages, responses]); + // Handle saving when user confirms save on exit + React.useEffect(() => { + const saveAndExit = async (): Promise => { + if (saveConfirmed && saveDir) { + const finalDir = resolve(saveDir); + fs.mkdirSync(finalDir, { recursive: true }); + + // Create a timestamped subdirectory for this session + const dateForDir = new Date().toISOString().replace(/:/g, '-').split('.')[0]; + const sessionDir = path.join(finalDir, `${dateForDir}--${sessionId || 'session'}`); + fs.mkdirSync(sessionDir, { recursive: true }); + + saveTranscriptsToFile(sessionDir, messages, responses); + + // Write apex debug logs if any + if (apexDebug) { + for (const response of responses) { + if (response.apexDebugLog) { + // eslint-disable-next-line no-await-in-loop + await writeDebugLog(connection, response.apexDebugLog, sessionDir); + const logId = response.apexDebugLog.Id; + if (logId) { + setApexDebugLogs((prev) => [...prev, path.join(sessionDir, `${logId}.log`)]); + } + } + } + } + + // Update tempDir so the save message shows the correct path + setTempDir(sessionDir); + + // Mark session as ended to trigger exit + setSessionEnded(true); + } + }; + void saveAndExit(); + }, [saveConfirmed, saveDir, messages, responses, sessionId, apexDebug, connection]); + return ( - - {role === 'user' ? 'You' : role} - {ts.toLocaleString()} - - - {content} - + {role === 'system' ? ( + + {content} + + ) : ( + <> + + {role === 'user' ? 'You' : role} + {ts.toLocaleString()} + + + {content} + + + )} ))} @@ -185,47 +311,100 @@ export function AgentPreviewReact(props: { {'─'.repeat(process.stdout.columns - 2)} - - > - { - if (!content) return; - setQuery(''); - - // Add the most recent user message to the chat window - setMessages((prev) => [...prev, { role: 'user', content, timestamp: new Date() }]); - setIsTyping(true); - const response = await agent.send(sessionId, content); - setResponses((prev) => [...prev, response]); - const message = response.messages[0].message; - - if (!message) { - throw new Error('Failed to send message'); - } - setIsTyping(false); + {showSavePrompt && !showDirInput ? ( + + Save chat history before exiting? (y/n) + {outputDir ? ( + Will save to: {outputDir} + ) : ( + Press 'y' to save, 'n' to exit without saving + )} + + ) : null} - // Add the agent's response to the chat - setMessages((prev) => [...prev, { role: name, content: message, timestamp: new Date() }]); + {showDirInput ? ( + + Enter output directory for {apexDebug ? 'debug logs and transcripts' : 'transcripts'}: + + > + { + if (dir) { + setSaveDir(dir); + setSaveConfirmed(true); + setShowDirInput(false); + } + }} + /> + + + ) : null} - // If there is an apex debug log entry, get the log and write it to the output dir - if (response.apexDebugLog && tempDir) { - // Write the apex debug to the output dir - await writeDebugLog(connection, response.apexDebugLog, tempDir); - const logId = response.apexDebugLog.Id; - if (logId) { - setApexDebugLogs((prev) => [...prev, path.join(tempDir, `${logId}.log`)]); + {!sessionEnded && !exitRequested && !showSavePrompt && !showDirInput ? ( + + > + { + if (!content) return; + setQuery(''); + + try { + // Add the most recent user message to the chat window + setMessages((prev) => [...prev, { role: 'user', content, timestamp: new Date() }]); + setIsTyping(true); + const response = await agent.send(sessionId, content); + setResponses((prev) => [...prev, response]); + const message = response.messages[0].message; + + if (!message) { + throw new Error('Failed to send message'); + } + setIsTyping(false); + + // Add the agent's response to the chat + setMessages((prev) => [...prev, { role: name, content: message, timestamp: new Date() }]); + + // Apex debug logs will be saved when user exits and chooses to save + } catch (e) { + const sfError = SfError.wrap(e); + setIsTyping(false); + setHeader(`Error: ${sfError.name}`); + setMessages([{ role: name, content: `${sfError.name} - ${sfError.message}`, timestamp: new Date() }]); + setSessionEnded(true); } - } - }} - /> - + }} + /> + + ) : null} - {sessionEnded ? ( + {sessionEnded && !showSavePrompt && !showDirInput ? ( Session Ended - {outputDir ? Conversation log: {tempDir}/transcript.json : null} - {outputDir ? API transactions: {tempDir}/responses.json : null} - {apexDebugLogs.length > 0 && Apex Debug Logs: {'\n' + apexDebugLogs.join('\n')}} + {tempDir ? Conversation log: {tempDir}/transcript.json : null} + {tempDir ? API transactions: {tempDir}/responses.json : null} + {apexDebugLogs.length > 0 && tempDir && Apex Debug Logs saved to: {tempDir}} ) : null} diff --git a/src/flags.ts b/src/flags.ts index 8f2336e1..9f91caa5 100644 --- a/src/flags.ts +++ b/src/flags.ts @@ -1,15 +1,25 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { readdir } from 'node:fs/promises'; -import { join, relative } from 'node:path'; +import { readdirSync } from 'node:fs'; +import { basename, join, relative } from 'node:path'; import { Interfaces } from '@oclif/core'; import { Flags } from '@salesforce/sf-plugins-core'; -import { Connection, Messages, SfError } from '@salesforce/core'; +import { Connection, Messages, SfError, SfProject } from '@salesforce/core'; import { camelCaseToTitleCase } from '@salesforce/kit'; import { select, input as inquirerInput } from '@inquirer/prompts'; import autocomplete from 'inquirer-autocomplete-standalone'; @@ -82,18 +92,36 @@ export function makeFlags>(flaggablePr ) as FlagsOfPrompts; } -export async function traverseForFiles(dir: string, suffixes: string[], excludeDirs?: string[]): Promise { - const files = await readdir(dir, { withFileTypes: true }); +export async function getHiddenDirs(projectRoot?: string): Promise { + const rootDir = projectRoot ?? process.cwd(); + + try { + const files = await readdir(rootDir, { withFileTypes: true }); + return files.filter((file) => file.isDirectory() && file.name.startsWith('.')).map((file) => file.name); + } catch (error) { + return []; + } +} + +export function traverseForFiles(dir: string, suffixes: string[], excludeDirs?: string[]): string[]; +// eslint-disable-next-line @typescript-eslint/unified-signatures +export function traverseForFiles(dirs: string[], suffixes: string[], excludeDirs?: string[]): string[]; + +export function traverseForFiles(dirOrDirs: string | string[], suffixes: string[], excludeDirs?: string[]): string[] { + const dirs = Array.isArray(dirOrDirs) ? dirOrDirs : [dirOrDirs]; const results: string[] = []; - for (const file of files) { - const fullPath = join(dir, file.name); + for (const dir of dirs) { + const files = readdirSync(dir, { withFileTypes: true }); + + for (const file of files) { + const fullPath = join(dir, file.name); - if (file.isDirectory() && !excludeDirs?.includes(file.name)) { - // eslint-disable-next-line no-await-in-loop - results.push(...(await traverseForFiles(fullPath, suffixes, excludeDirs))); - } else if (suffixes.some((suffix) => file.name.endsWith(suffix))) { - results.push(fullPath); + if (file.isDirectory() && !excludeDirs?.includes(file.name)) { + results.push(...traverseForFiles(fullPath, suffixes, excludeDirs)); + } else if (suffixes.some((suffix) => file.name.endsWith(suffix))) { + results.push(fullPath); + } } } @@ -115,7 +143,7 @@ export const promptForAiEvaluationDefinitionApiName = async ( return Promise.race([ autocomplete({ - message: flagDef.message, + message: flagDef.promptMessage ?? flagDef.message, // eslint-disable-next-line @typescript-eslint/require-await source: async (input) => { const arr = aiDefFiles.map((o) => ({ name: o.fullName, value: o.fullName })); @@ -131,20 +159,34 @@ export const promptForAiEvaluationDefinitionApiName = async ( }); }; -export const promptForYamlFile = async (flagDef: FlaggablePrompt): Promise => { - const yamlFiles = await traverseForFiles(process.cwd(), ['.yml', '.yaml'], ['node_modules']); +export const promptForFileByExtensions = async ( + flagDef: FlaggablePrompt, + extensions: string[], + fileNameOnly = false, + dirs?: string[] +): Promise => { + const hiddenDirs = await getHiddenDirs(); + const dirsToTraverse = dirs ?? [process.cwd()]; + const files = traverseForFiles(dirsToTraverse, extensions, ['node_modules', ...hiddenDirs]); return autocomplete({ - message: flagDef.message, + message: flagDef.promptMessage ?? flagDef.message.replace(/\.$/, ''), // eslint-disable-next-line @typescript-eslint/require-await source: async (input) => { - const arr = yamlFiles.map((o) => ({ name: relative(process.cwd(), o), value: o })); - + let arr; + if (fileNameOnly) { + arr = files.map((o) => ({ name: basename(o).split('.')[0], value: basename(o).split('.')[0] })); + } else { + arr = files.map((o) => ({ name: relative(process.cwd(), o), value: o })); + } if (!input) return arr; return arr.filter((o) => o.name.includes(input)); }, }); }; +export const promptForYamlFile = async (flagDef: FlaggablePrompt): Promise => + promptForFileByExtensions(flagDef, ['.yml', '.yaml']); + export const promptForFlag = async (flagDef: FlaggablePrompt): Promise => { const message = flagDef.promptMessage ?? flagDef.message.replace(/\.$/, ''); if (flagDef.options) { @@ -162,6 +204,11 @@ export const promptForFlag = async (flagDef: FlaggablePrompt): Promise = }); }; +export const promptForAgentFiles = (project: SfProject, flagDef: FlaggablePrompt): Promise => { + const dirs = project.getPackageDirectories().map((dir) => dir.fullPath); + return promptForFileByExtensions(flagDef, ['.bundle-meta.xml'], true, dirs); +}; + export const validateAgentType = (agentType?: string, required = false): string | undefined => { if (required && !agentType) { throw messages.createError('error.invalidAgentType', [agentType]); diff --git a/src/handleTestResults.ts b/src/handleTestResults.ts index 98c15cb6..f55269cd 100644 --- a/src/handleTestResults.ts +++ b/src/handleTestResults.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { join } from 'node:path'; import { stripVTControlCharacters } from 'node:util'; diff --git a/src/index.ts b/src/index.ts index 2434da0f..711be5d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2021, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ export default {}; diff --git a/src/inquirer-theme.ts b/src/inquirer-theme.ts index ad29000e..6b242569 100644 --- a/src/inquirer-theme.ts +++ b/src/inquirer-theme.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import ansis from 'ansis'; diff --git a/src/testStages.ts b/src/testStages.ts index d7533609..a590870d 100644 --- a/src/testStages.ts +++ b/src/testStages.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { colorize } from '@oclif/core/ux'; diff --git a/src/yes-no-cancel.ts b/src/yes-no-cancel.ts index 958331db..b1ccfdf3 100644 --- a/src/yes-no-cancel.ts +++ b/src/yes-no-cancel.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { createPrompt, diff --git a/test/agentTestCache.test.ts b/test/agentTestCache.test.ts index 45a1bb2a..f2830284 100644 --- a/test/agentTestCache.test.ts +++ b/test/agentTestCache.test.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2024, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { expect } from 'chai'; import { SfError } from '@salesforce/core'; diff --git a/test/commands/agent/generate/template.nut.ts b/test/commands/agent/generate/template.nut.ts index e5025bb5..cf96615f 100644 --- a/test/commands/agent/generate/template.nut.ts +++ b/test/commands/agent/generate/template.nut.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { join, resolve } from 'node:path'; import { readFileSync } from 'node:fs'; diff --git a/test/commands/agent/generate/test-spec.test.ts b/test/commands/agent/generate/test-spec.test.ts index 5c230597..4b03cb15 100644 --- a/test/commands/agent/generate/test-spec.test.ts +++ b/test/commands/agent/generate/test-spec.test.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import * as fs from 'node:fs'; diff --git a/test/commands/agent/preview/index.test.ts b/test/commands/agent/preview/index.test.ts index ffb07dd1..87a38252 100644 --- a/test/commands/agent/preview/index.test.ts +++ b/test/commands/agent/preview/index.test.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2020, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { expect } from 'chai'; @@ -14,7 +23,6 @@ import { agentIsUnsupported, agentIsInactive, validateAgent, - getAgentChoices, } from '../../../../src/commands/agent/preview.js'; // TODO - pull in error messages @@ -131,55 +139,23 @@ describe('Agent Preview', () => { }); }); - describe('gets agent choices', () => { - it('returns agent choices', () => { - const agents: AgentData[] = [ - { - Id: 'OXx1234567890', - DeveloperName: 'some_agent', - BotVersions: { - records: [{ Status: 'Active' }], - }, - }, - { - Id: 'OXx1234567891', - DeveloperName: UNSUPPORTED_AGENTS[0], - BotVersions: { - records: [{ Status: 'Active' }], - }, - }, - { - Id: 'OXx1234567892', - DeveloperName: 'inactive_agent', - BotVersions: { - records: [{ Status: 'Inactive' }], - }, - }, - ]; - - const choices = getAgentChoices(agents); - expect(choices).to.have.lengthOf(3); + describe('agent source types', () => { + it('should support script agent source type', () => { + const scriptAgent = { + DeveloperName: 'test-agent', + source: 'script' as const, + path: '/path/to/agent.agent', + }; + expect(scriptAgent.source).to.equal('script'); + }); - expect(choices[0].name).to.equal('some_agent'); - expect(choices[0].value).to.deep.equal({ + it('should support published agent source type', () => { + const publishedAgent = { Id: 'OXx1234567890', - DeveloperName: 'some_agent', - }); - expect(choices[0].disabled).to.equal(false); - - expect(choices[1].name).to.equal(UNSUPPORTED_AGENTS[0]); - expect(choices[1].value).to.deep.equal({ - Id: 'OXx1234567891', - DeveloperName: UNSUPPORTED_AGENTS[0], - }); - expect(choices[1].disabled).to.equal('(Not Supported)'); - - expect(choices[2].name).to.equal('inactive_agent'); - expect(choices[2].value).to.deep.equal({ - Id: 'OXx1234567892', - DeveloperName: 'inactive_agent', - }); - expect(choices[2].disabled).to.equal('(Inactive)'); + DeveloperName: 'test-agent', + source: 'published' as const, + }; + expect(publishedAgent.source).to.equal('published'); }); }); }); diff --git a/test/commands/agent/validate/authoring-bundle.test.ts b/test/commands/agent/validate/authoring-bundle.test.ts new file mode 100644 index 00000000..b1f9984c --- /dev/null +++ b/test/commands/agent/validate/authoring-bundle.test.ts @@ -0,0 +1,92 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { expect } from 'chai'; +import { SfError } from '@salesforce/core'; +import { type CompilationError } from '@salesforce/agents'; +import AgentValidateAuthoringBundle, { + type AgentValidateAuthoringBundleResult, +} from '../../../../src/commands/agent/validate/authoring-bundle.js'; +import { throwAgentCompilationError } from '../../../../src/common.js'; + +describe('Agent Validate Authoring Bundle', () => { + describe('prompt configuration', () => { + it('should have correct prompt messages', () => { + const prompts = AgentValidateAuthoringBundle['FLAGGABLE_PROMPTS']; + + expect(prompts['api-name'].message).to.equal( + 'API name of the authoring bundle you want to validate; if not specified, the command provides a list that you can choose from.' + ); + expect(prompts['api-name'].promptMessage).to.equal('API name of the authoring bundle to validate'); + }); + }); + + describe('command result type', () => { + it('should export correct result type', () => { + const result: AgentValidateAuthoringBundleResult = { + success: true, + }; + expect(result.success).to.be.true; + expect(result.errors).to.be.undefined; + }); + + it('should support error result type', () => { + const result: AgentValidateAuthoringBundleResult = { + success: false, + errors: ['Compilation failed', 'Invalid syntax'], + }; + expect(result.success).to.be.false; + expect(result.errors).to.deep.equal(['Compilation failed', 'Invalid syntax']); + }); + }); + + describe('throwAgentCompilationError utility', () => { + it('should throw SfError with compilation errors', () => { + const errors: CompilationError[] = [ + { + errorType: 'SyntaxError', + description: 'Invalid syntax', + lineStart: 10, + colStart: 5, + lineEnd: 10, + colEnd: 10, + }, + { errorType: 'SyntaxError', description: 'Unknown error', lineStart: 15, colStart: 1, lineEnd: 15, colEnd: 5 }, + ]; + + try { + throwAgentCompilationError(errors); + expect.fail('Expected function to throw an error'); + } catch (error) { + expect(error).to.be.instanceOf(SfError); + expect((error as SfError).name).to.equal('CompileAgentScriptError'); + expect((error as SfError).message).to.include('SyntaxError: Invalid syntax [Ln 10, Col 5]'); + expect((error as SfError).message).to.include('SyntaxError: Unknown error [Ln 15, Col 1]'); + } + }); + + it('should handle empty error array', () => { + try { + throwAgentCompilationError([]); + expect.fail('Expected function to throw an error'); + } catch (error) { + expect(error).to.be.instanceOf(SfError); + expect((error as SfError).name).to.equal('CompileAgentScriptError'); + expect((error as SfError).message).to.equal('Unknown compilation error occurred'); + } + }); + }); +}); diff --git a/test/components/agent-preview-react.test.ts b/test/components/agent-preview-react.test.ts new file mode 100644 index 00000000..d3926066 --- /dev/null +++ b/test/components/agent-preview-react.test.ts @@ -0,0 +1,142 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import { describe, it, beforeEach, afterEach } from 'mocha'; +import { expect } from 'chai'; +import type { AgentPreviewSendResponse } from '@salesforce/agents'; +import { saveTranscriptsToFile } from '../../src/components/agent-preview-react.js'; + +describe('AgentPreviewReact saveTranscriptsToFile', () => { + let testDir: string; + + beforeEach(() => { + testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-preview-test-')); + }); + + afterEach(() => { + if (fs.existsSync(testDir)) { + fs.rmSync(testDir, { recursive: true, force: true }); + } + }); + + it('should create output directory if it does not exist', () => { + const outputDir = path.join(testDir, 'nested', 'directory'); + const messages: Array<{ timestamp: Date; role: string; content: string }> = []; + const responses: AgentPreviewSendResponse[] = []; + + saveTranscriptsToFile(outputDir, messages, responses); + + expect(fs.existsSync(outputDir)).to.be.true; + }); + + it('should write transcript.json with messages', () => { + const outputDir = path.join(testDir, 'output'); + const messages: Array<{ timestamp: Date; role: string; content: string }> = [ + { timestamp: new Date('2025-01-01T00:00:00Z'), role: 'user', content: 'Hello' }, + { timestamp: new Date('2025-01-01T00:00:01Z'), role: 'agent', content: 'Hi there' }, + ]; + const responses: AgentPreviewSendResponse[] = []; + + saveTranscriptsToFile(outputDir, messages, responses); + + const transcriptPath = path.join(outputDir, 'transcript.json'); + expect(fs.existsSync(transcriptPath)).to.be.true; + + const content = JSON.parse(fs.readFileSync(transcriptPath, 'utf8')) as Array<{ + role: string; + content: string; + }>; + expect(content).to.have.lengthOf(2); + expect(content[0]?.role).to.equal('user'); + expect(content[0]?.content).to.equal('Hello'); + expect(content[1]?.role).to.equal('agent'); + expect(content[1]?.content).to.equal('Hi there'); + }); + + it('should write responses.json with responses', () => { + const outputDir = path.join(testDir, 'output'); + const messages: Array<{ timestamp: Date; role: string; content: string }> = []; + const responses: AgentPreviewSendResponse[] = [ + { + messages: [{ message: 'Response 1' }], + }, + { + messages: [{ message: 'Response 2' }], + }, + ] as unknown as AgentPreviewSendResponse[]; + + saveTranscriptsToFile(outputDir, messages, responses); + + const responsesPath = path.join(outputDir, 'responses.json'); + expect(fs.existsSync(responsesPath)).to.be.true; + + const content = JSON.parse(fs.readFileSync(responsesPath, 'utf8')) as Array<{ + messages: Array<{ message: string }>; + }>; + expect(content).to.have.lengthOf(2); + expect(content[0]?.messages[0]?.message).to.equal('Response 1'); + expect(content[1]?.messages[0]?.message).to.equal('Response 2'); + }); + + it('should write both transcript.json and responses.json', () => { + const outputDir = path.join(testDir, 'output'); + const messages: Array<{ timestamp: Date; role: string; content: string }> = [ + { timestamp: new Date(), role: 'user', content: 'Test' }, + ]; + const responses: AgentPreviewSendResponse[] = [ + { + messages: [{ message: 'Test response' }], + }, + ] as unknown as AgentPreviewSendResponse[]; + + saveTranscriptsToFile(outputDir, messages, responses); + + expect(fs.existsSync(path.join(outputDir, 'transcript.json'))).to.be.true; + expect(fs.existsSync(path.join(outputDir, 'responses.json'))).to.be.true; + }); + + it('should not create files if outputDir is empty string', () => { + const outputDir = ''; + const messages: Array<{ timestamp: Date; role: string; content: string }> = [ + { timestamp: new Date(), role: 'user', content: 'Test' }, + ]; + const responses: AgentPreviewSendResponse[] = []; + + // Should not throw + expect(() => saveTranscriptsToFile(outputDir, messages, responses)).to.not.throw(); + }); + + it('should format JSON with proper indentation', () => { + const outputDir = path.join(testDir, 'output'); + const messages: Array<{ timestamp: Date; role: string; content: string }> = [ + { timestamp: new Date('2025-01-01T00:00:00Z'), role: 'user', content: 'Test' }, + ]; + const responses: AgentPreviewSendResponse[] = []; + + saveTranscriptsToFile(outputDir, messages, responses); + + const transcriptPath = path.join(outputDir, 'transcript.json'); + const content = fs.readFileSync(transcriptPath, 'utf8'); + + // Should have newlines (pretty-printed JSON) + expect(content).to.include('\n'); + // Should parse as valid JSON + expect(() => JSON.parse(content) as unknown).to.not.throw(); + }); +}); diff --git a/test/flags.test.ts b/test/flags.test.ts index 7d390331..8c5f619c 100644 --- a/test/flags.test.ts +++ b/test/flags.test.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { join } from 'node:path'; @@ -38,7 +47,7 @@ describe('traverseForFiles', () => { }); it('should find all yaml files when no excludeDirs is provided', async () => { - const results = await traverseForFiles(testDir, ['.yml', '.yaml']); + const results = traverseForFiles(testDir, ['.yml', '.yaml']); expect(results).to.have.lengthOf(6); expect(results).to.include(join(testDir, 'file1.yml')); expect(results).to.include(join(testDir, 'file2.yaml')); @@ -49,7 +58,7 @@ describe('traverseForFiles', () => { }); it('should exclude specified directories', async () => { - const results = await traverseForFiles(testDir, ['.yml', '.yaml'], ['node_modules', 'excluded']); + const results = traverseForFiles(testDir, ['.yml', '.yaml'], ['node_modules', 'excluded']); expect(results).to.have.lengthOf(4); expect(results).to.include(join(testDir, 'file1.yml')); expect(results).to.include(join(testDir, 'file2.yaml')); @@ -60,7 +69,7 @@ describe('traverseForFiles', () => { }); it('should handle empty excludeDirs array', async () => { - const results = await traverseForFiles(testDir, ['.yml', '.yaml'], []); + const results = traverseForFiles(testDir, ['.yml', '.yaml'], []); expect(results).to.have.lengthOf(6); }); }); diff --git a/test/handleTestResults.test.ts b/test/handleTestResults.test.ts index a1dfe15a..a355ef03 100644 --- a/test/handleTestResults.test.ts +++ b/test/handleTestResults.test.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { readFile } from 'node:fs/promises'; import { expect, config } from 'chai'; diff --git a/test/nuts/agent.generate.authoring-bundle.nut.ts b/test/nuts/agent.generate.authoring-bundle.nut.ts new file mode 100644 index 00000000..7675a738 --- /dev/null +++ b/test/nuts/agent.generate.authoring-bundle.nut.ts @@ -0,0 +1,91 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { join } from 'node:path'; +import { existsSync, readFileSync } from 'node:fs'; +import { expect } from 'chai'; +import { genUniqueString, TestSession } from '@salesforce/cli-plugins-testkit'; +import { execCmd } from '@salesforce/cli-plugins-testkit'; +import type { AgentGenerateAuthoringBundleResult } from '../../src/commands/agent/generate/authoring-bundle.js'; + +let session: TestSession; + +describe.skip('agent generate authoring-bundle NUTs', () => { + before(async () => { + session = await TestSession.create({ + project: { + sourceDir: join('test', 'mock-projects', 'agent-generate-template'), + }, + devhubAuthStrategy: 'AUTO', + scratchOrgs: [ + { + setDefault: true, + config: join('config', 'project-scratch-def.json'), + }, + ], + }); + }); + + after(async () => { + await session?.clean(); + }); + + describe('agent generate authoring-bundle', () => { + const specFileName = genUniqueString('agentSpec_%s.yaml'); + const bundleName = 'Test_Bundle'; + + it('should generate authoring bundle from spec file', async () => { + const username = session.orgs.get('default')!.username as string; + const specPath = join(session.project.dir, 'specs', specFileName); + + // First generate a spec file + const specCommand = `agent generate agent-spec --target-org ${username} --type customer --role "test agent role" --company-name "Test Company" --company-description "Test Description" --output-file ${specPath} --json`; + execCmd(specCommand, { ensureExitCode: 0 }); + + // Now generate the authoring bundle + const command = `agent generate authoring-bundle --spec ${specPath} --name ${bundleName} --api-name ${bundleName} --target-org ${username} --json`; + const result = execCmd(command, { ensureExitCode: 0 }).jsonOutput?.result; + + expect(result).to.be.ok; + expect(result?.agentPath).to.be.ok; + expect(result?.metaXmlPath).to.be.ok; + expect(result?.outputDir).to.be.ok; + + // Verify files exist + expect(existsSync(result!.agentPath)).to.be.true; + expect(existsSync(result!.metaXmlPath)).to.be.true; + + // Verify file contents + const agent = readFileSync(result!.agentPath, 'utf8'); + const metaXml = readFileSync(result!.metaXmlPath, 'utf8'); + expect(agent).to.be.ok; + expect(metaXml).to.include(''); + expect(metaXml).to.include(bundleName); + }); + + it('should use default output directory when not specified', async () => { + const username = session.orgs.get('default')!.username as string; + const specPath = join(session.project.dir, 'specs', specFileName); + const defaultPath = join('force-app', 'main', 'default', 'aiAuthoringBundles'); + + const command = `agent generate authoring-bundle --spec ${specPath} --name ${bundleName} --target-org ${username} --json`; + const result = execCmd(command, { ensureExitCode: 0 }).jsonOutput?.result; + + expect(result).to.be.ok; + expect(result?.outputDir).to.include(defaultPath); + }); + }); +}); diff --git a/test/nuts/agent.nut.ts b/test/nuts/agent.nut.ts index ecfac53f..ccf5a099 100644 --- a/test/nuts/agent.nut.ts +++ b/test/nuts/agent.nut.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { join } from 'node:path'; diff --git a/test/nuts/agent.publish.nut.ts b/test/nuts/agent.publish.nut.ts new file mode 100644 index 00000000..93bf7b3b --- /dev/null +++ b/test/nuts/agent.publish.nut.ts @@ -0,0 +1,71 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { join } from 'node:path'; +import { expect } from 'chai'; +import { TestSession } from '@salesforce/cli-plugins-testkit'; +import { execCmd } from '@salesforce/cli-plugins-testkit'; +import type { AgentPublishAuthoringBundleResult } from '../../src/commands/agent/publish/authoring-bundle.js'; + +describe.skip('agent publish authoring-bundle NUTs', () => { + let session: TestSession; + + before(async () => { + session = await TestSession.create({ + project: { + sourceDir: join('test', 'mock-projects', 'agent-generate-template'), + }, + devhubAuthStrategy: 'AUTO', + scratchOrgs: [ + { + setDefault: true, + config: join('config', 'project-scratch-def.json'), + }, + ], + }); + }); + + after(async () => { + await session?.clean(); + }); + + it('should publish a valid authoring bundle', () => { + const bundlePath = join(session.project.dir, 'force-app', 'main', 'default', 'aiAuthoringBundles'); + + const result = execCmd( + `agent publish authoring-bundle --api-name ${bundlePath} --json`, + { ensureExitCode: 0 } + ).jsonOutput?.result; + + expect(result).to.be.ok; + expect(result?.success).to.be.true; + expect(result?.botDeveloperName).to.be.a('string'); + expect(result?.errors).to.be.undefined; + }); + + it('should fail for invalid bundle path', () => { + const username = session.orgs.get('default')!.username as string; + const bundlePath = join(session.project.dir, 'invalid', 'path'); + const agentName = 'Test Agent'; + + const result = execCmd( + `agent publish authoring-bundle --api-name ${bundlePath} --agent-name "${agentName}" --target-org ${username} --json`, + { ensureExitCode: 1 } + ).jsonOutput; + + expect(result!.exitCode).to.equal(1); + expect(JSON.stringify(result)).to.include('Invalid bundle path'); + }); +}); diff --git a/test/nuts/agent.validate.nut.ts b/test/nuts/agent.validate.nut.ts new file mode 100644 index 00000000..fbf059f7 --- /dev/null +++ b/test/nuts/agent.validate.nut.ts @@ -0,0 +1,67 @@ +/* + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { join } from 'node:path'; +import { expect } from 'chai'; +import { TestSession } from '@salesforce/cli-plugins-testkit'; +import { execCmd } from '@salesforce/cli-plugins-testkit'; +import type { AgentValidateAuthoringBundleResult } from '../../src/commands/agent/validate/authoring-bundle.js'; + +describe.skip('agent validate authoring-bundle NUTs', () => { + let session: TestSession; + + before(async () => { + session = await TestSession.create({ + project: { + sourceDir: join('test', 'mock-projects', 'agent-generate-template'), + }, + devhubAuthStrategy: 'AUTO', + scratchOrgs: [ + { + setDefault: true, + config: join('config', 'project-scratch-def.json'), + }, + ], + }); + }); + + after(async () => { + await session?.clean(); + }); + + it('should validate a valid authoring bundle', () => { + const username = session.orgs.get('default')!.username as string; + const bundlePath = join(session.project.dir, 'force-app', 'main', 'default', 'aiAuthoringBundles'); + + const result = execCmd( + `agent validate authoring-bundle --api-name ${bundlePath} --target-org ${username} --json`, + { ensureExitCode: 0 } + ).jsonOutput?.result; + + expect(result).to.be.ok; + expect(result?.success).to.be.true; + expect(result?.errors).to.be.undefined; + }); + + it('should fail validation for invalid bundle path', () => { + const username = session.orgs.get('default')!.username as string; + const bundlePath = join(session.project.dir, 'invalid', 'path'); + + execCmd( + `agent validate authoring-bundle --api-name ${bundlePath} --target-org ${username} --json`, + { ensureExitCode: 1 } + ); + }); +}); diff --git a/test/utils/assignAgentforcePermset.ts b/test/utils/assignAgentforcePermset.ts index 27027af8..2b6066bd 100644 --- a/test/utils/assignAgentforcePermset.ts +++ b/test/utils/assignAgentforcePermset.ts @@ -1,8 +1,17 @@ /* - * Copyright (c) 2025, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + * Copyright 2025, Salesforce, Inc. + * + * Licensed 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 CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import { Org, User } from '@salesforce/core'; diff --git a/yarn.lock b/yarn.lock index 136c4c35..5190a81d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,14 +10,6 @@ ansi-styles "^6.2.1" is-fullwidth-code-point "^4.0.0" -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - "@aws-crypto/crc32@5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" @@ -87,23 +79,23 @@ tslib "^2.6.2" "@aws-sdk/client-cloudfront@^3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.940.0.tgz#009539b357ff8e25644cb1004c36251af30c81c5" - integrity sha512-9n5kvQ4A72Fm5+yEIAPEOLSXQdmHOV8lh88ZIjMw5NRRvcTBNUc1616QdX8M+kbLGyYGoygeuBNN7yktafexSQ== + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.943.0.tgz#3f5fc47382999c38472dd175c6b6830ec5db2e01" + integrity sha512-mhxMPYn4XMG3RNEuR6OQPI2OBBwucXzHPeHSEQ0G/nhqBAQgmQWJtbqQkfkBrKStD7OXi1fNorz8+B2IWDcN5w== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.940.0" - "@aws-sdk/credential-provider-node" "3.940.0" + "@aws-sdk/core" "3.943.0" + "@aws-sdk/credential-provider-node" "3.943.0" "@aws-sdk/middleware-host-header" "3.936.0" "@aws-sdk/middleware-logger" "3.936.0" "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.940.0" + "@aws-sdk/middleware-user-agent" "3.943.0" "@aws-sdk/region-config-resolver" "3.936.0" "@aws-sdk/types" "3.936.0" "@aws-sdk/util-endpoints" "3.936.0" "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.940.0" + "@aws-sdk/util-user-agent-node" "3.943.0" "@smithy/config-resolver" "^4.4.3" "@smithy/core" "^3.18.5" "@smithy/fetch-http-handler" "^5.3.6" @@ -133,32 +125,32 @@ "@smithy/util-waiter" "^4.2.5" tslib "^2.6.2" -"@aws-sdk/client-s3@^3.937.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz#23446a4bb8f9b6efa5d19cf6e051587996a1ac7b" - integrity sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w== +"@aws-sdk/client-s3@^3.940.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.943.0.tgz#8681e5eddc4b3f229718c898a5d22207d53ff94c" + integrity sha512-UOX8/1mmNaRmEkxoIVP2+gxd5joPJqz+fygRqlIXON1cETLGoctinMwQs7qU8g8hghm76TU2G6ZV6sLH8cySMw== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.940.0" - "@aws-sdk/credential-provider-node" "3.940.0" + "@aws-sdk/core" "3.943.0" + "@aws-sdk/credential-provider-node" "3.943.0" "@aws-sdk/middleware-bucket-endpoint" "3.936.0" "@aws-sdk/middleware-expect-continue" "3.936.0" - "@aws-sdk/middleware-flexible-checksums" "3.940.0" + "@aws-sdk/middleware-flexible-checksums" "3.943.0" "@aws-sdk/middleware-host-header" "3.936.0" "@aws-sdk/middleware-location-constraint" "3.936.0" "@aws-sdk/middleware-logger" "3.936.0" "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-sdk-s3" "3.940.0" + "@aws-sdk/middleware-sdk-s3" "3.943.0" "@aws-sdk/middleware-ssec" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.940.0" + "@aws-sdk/middleware-user-agent" "3.943.0" "@aws-sdk/region-config-resolver" "3.936.0" - "@aws-sdk/signature-v4-multi-region" "3.940.0" + "@aws-sdk/signature-v4-multi-region" "3.943.0" "@aws-sdk/types" "3.936.0" "@aws-sdk/util-endpoints" "3.936.0" "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.940.0" + "@aws-sdk/util-user-agent-node" "3.943.0" "@smithy/config-resolver" "^4.4.3" "@smithy/core" "^3.18.5" "@smithy/eventstream-serde-browser" "^4.2.5" @@ -194,23 +186,23 @@ "@smithy/util-waiter" "^4.2.5" tslib "^2.6.2" -"@aws-sdk/client-sso@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.940.0.tgz#23a6b156d9ba0144c01eb1d0c1654600b35fc708" - integrity sha512-SdqJGWVhmIURvCSgkDditHRO+ozubwZk9aCX9MK8qxyOndhobCndW1ozl3hX9psvMAo9Q4bppjuqy/GHWpjB+A== +"@aws-sdk/client-sso@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.943.0.tgz#0ed7c0d6c1df537ed21ec882b2db162405541c9f" + integrity sha512-kOTO2B8Ks2qX73CyKY8PAajtf5n39aMe2spoiOF5EkgSzGV7hZ/HONRDyADlyxwfsX39Q2F2SpPUaXzon32IGw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.940.0" + "@aws-sdk/core" "3.943.0" "@aws-sdk/middleware-host-header" "3.936.0" "@aws-sdk/middleware-logger" "3.936.0" "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.940.0" + "@aws-sdk/middleware-user-agent" "3.943.0" "@aws-sdk/region-config-resolver" "3.936.0" "@aws-sdk/types" "3.936.0" "@aws-sdk/util-endpoints" "3.936.0" "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.940.0" + "@aws-sdk/util-user-agent-node" "3.943.0" "@smithy/config-resolver" "^4.4.3" "@smithy/core" "^3.18.5" "@smithy/fetch-http-handler" "^5.3.6" @@ -238,10 +230,10 @@ "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/core@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.940.0.tgz#73bd257745df0d069e455f22d4526f4f6d800d76" - integrity sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA== +"@aws-sdk/core@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.943.0.tgz#a0c3c20d5c3bbcfd3dd32f74f9620097b9734573" + integrity sha512-8CBy2hI9ABF7RBVQuY1bgf/ue+WPmM/hl0adrXFlhnhkaQP0tFY5zhiy1Y+n7V+5f3/ORoHBmCCQmcHDDYJqJQ== dependencies: "@aws-sdk/types" "3.936.0" "@aws-sdk/xml-builder" "3.930.0" @@ -257,23 +249,23 @@ "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.940.0.tgz#e04dc17300de228d572d5783c825a55d18851ecf" - integrity sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw== +"@aws-sdk/credential-provider-env@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.943.0.tgz#eb2bf3a50df3f25ca125a953c450319a8b23aa45" + integrity sha512-WnS5w9fK9CTuoZRVSIHLOMcI63oODg9qd1vXMYb7QGLGlfwUm4aG3hdu7i9XvYrpkQfE3dzwWLtXF4ZBuL1Tew== dependencies: - "@aws-sdk/core" "3.940.0" + "@aws-sdk/core" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/property-provider" "^4.2.5" "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz#0888b39befaef297d67dcecd35d9237dbb5ab1c0" - integrity sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ== +"@aws-sdk/credential-provider-http@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.943.0.tgz#7d5b549a93145785b0d8f78c40fd5198e2e19e5b" + integrity sha512-SA8bUcYDEACdhnhLpZNnWusBpdmj4Vl67Vxp3Zke7SvoWSYbuxa+tiDiC+c92Z4Yq6xNOuLPW912ZPb9/NsSkA== dependencies: - "@aws-sdk/core" "3.940.0" + "@aws-sdk/core" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/fetch-http-handler" "^5.3.6" "@smithy/node-http-handler" "^4.4.5" @@ -284,19 +276,19 @@ "@smithy/util-stream" "^4.5.6" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz#b7a46fae4902f545e4f2cbcbd4f71dfae783de30" - integrity sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw== - dependencies: - "@aws-sdk/core" "3.940.0" - "@aws-sdk/credential-provider-env" "3.940.0" - "@aws-sdk/credential-provider-http" "3.940.0" - "@aws-sdk/credential-provider-login" "3.940.0" - "@aws-sdk/credential-provider-process" "3.940.0" - "@aws-sdk/credential-provider-sso" "3.940.0" - "@aws-sdk/credential-provider-web-identity" "3.940.0" - "@aws-sdk/nested-clients" "3.940.0" +"@aws-sdk/credential-provider-ini@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.943.0.tgz#e03a5cfca5b822b6cc2ec36168801969c25b3b41" + integrity sha512-BcLDb8l4oVW+NkuqXMlO7TnM6lBOWW318ylf4FRED/ply5eaGxkQYqdGvHSqGSN5Rb3vr5Ek0xpzSjeYD7C8Kw== + dependencies: + "@aws-sdk/core" "3.943.0" + "@aws-sdk/credential-provider-env" "3.943.0" + "@aws-sdk/credential-provider-http" "3.943.0" + "@aws-sdk/credential-provider-login" "3.943.0" + "@aws-sdk/credential-provider-process" "3.943.0" + "@aws-sdk/credential-provider-sso" "3.943.0" + "@aws-sdk/credential-provider-web-identity" "3.943.0" + "@aws-sdk/nested-clients" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/credential-provider-imds" "^4.2.5" "@smithy/property-provider" "^4.2.5" @@ -304,13 +296,13 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-login@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.940.0.tgz#d235cad516fd4a58fb261bc1291b7077efcbf58d" - integrity sha512-fOKC3VZkwa9T2l2VFKWRtfHQPQuISqqNl35ZhcXjWKVwRwl/o7THPMkqI4XwgT2noGa7LLYVbWMwnsgSsBqglg== +"@aws-sdk/credential-provider-login@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.943.0.tgz#4813bebb468bc762f73501026edd4bb37c999d5f" + integrity sha512-9iCOVkiRW+evxiJE94RqosCwRrzptAVPhRhGWv4osfYDhjNAvUMyrnZl3T1bjqCoKNcETRKEZIU3dqYHnUkcwQ== dependencies: - "@aws-sdk/core" "3.940.0" - "@aws-sdk/nested-clients" "3.940.0" + "@aws-sdk/core" "3.943.0" + "@aws-sdk/nested-clients" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/property-provider" "^4.2.5" "@smithy/protocol-http" "^5.3.5" @@ -318,17 +310,17 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz#5c4b3d13532f51528f769f8a87b4c7e7709ca0ad" - integrity sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g== - dependencies: - "@aws-sdk/credential-provider-env" "3.940.0" - "@aws-sdk/credential-provider-http" "3.940.0" - "@aws-sdk/credential-provider-ini" "3.940.0" - "@aws-sdk/credential-provider-process" "3.940.0" - "@aws-sdk/credential-provider-sso" "3.940.0" - "@aws-sdk/credential-provider-web-identity" "3.940.0" +"@aws-sdk/credential-provider-node@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.943.0.tgz#3d67bc92153efbc210d66acc63de7ac25b7632c3" + integrity sha512-14eddaH/gjCWoLSAELVrFOQNyswUYwWphIt+PdsJ/FqVfP4ay2HsiZVEIYbQtmrKHaoLJhiZKwBQRjcqJDZG0w== + dependencies: + "@aws-sdk/credential-provider-env" "3.943.0" + "@aws-sdk/credential-provider-http" "3.943.0" + "@aws-sdk/credential-provider-ini" "3.943.0" + "@aws-sdk/credential-provider-process" "3.943.0" + "@aws-sdk/credential-provider-sso" "3.943.0" + "@aws-sdk/credential-provider-web-identity" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/credential-provider-imds" "^4.2.5" "@smithy/property-provider" "^4.2.5" @@ -336,39 +328,39 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.940.0.tgz#47a11224c1a9d179f67cbd0873c9e99fe0cd0e85" - integrity sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ== +"@aws-sdk/credential-provider-process@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.943.0.tgz#d289d73ee31471a5a0b5ca2c908983b3a1866be1" + integrity sha512-GIY/vUkthL33AdjOJ8r9vOosKf/3X+X7LIiACzGxvZZrtoOiRq0LADppdiKIB48vTL63VvW+eRIOFAxE6UDekw== dependencies: - "@aws-sdk/core" "3.940.0" + "@aws-sdk/core" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/property-provider" "^4.2.5" "@smithy/shared-ini-file-loader" "^4.4.0" "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz#fabadb014fd5c7b043b8b7ccb4e1bda66a2e88cc" - integrity sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw== +"@aws-sdk/credential-provider-sso@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.943.0.tgz#39ca467b492e731a81e52c43462bb4a00df72861" + integrity sha512-1c5G11syUrru3D9OO6Uk+ul5e2lX1adb+7zQNyluNaLPXP6Dina6Sy6DFGRLu7tM8+M7luYmbS3w63rpYpaL+A== dependencies: - "@aws-sdk/client-sso" "3.940.0" - "@aws-sdk/core" "3.940.0" - "@aws-sdk/token-providers" "3.940.0" + "@aws-sdk/client-sso" "3.943.0" + "@aws-sdk/core" "3.943.0" + "@aws-sdk/token-providers" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/property-provider" "^4.2.5" "@smithy/shared-ini-file-loader" "^4.4.0" "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.940.0.tgz#25e83aa96c414608795e5d3c7be0e6d94bab6630" - integrity sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w== +"@aws-sdk/credential-provider-web-identity@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.943.0.tgz#2b4ec3a6580bb34c55707f567c63b2e1477569e4" + integrity sha512-VtyGKHxICSb4kKGuaqotxso8JVM8RjCS3UYdIMOxUt9TaFE/CZIfZKtjTr+IJ7M0P7t36wuSUb/jRLyNmGzUUA== dependencies: - "@aws-sdk/core" "3.940.0" - "@aws-sdk/nested-clients" "3.940.0" + "@aws-sdk/core" "3.943.0" + "@aws-sdk/nested-clients" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/property-provider" "^4.2.5" "@smithy/shared-ini-file-loader" "^4.4.0" @@ -398,15 +390,15 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz#e2e1e1615f7651beb5756272b92fde5ee39524cd" - integrity sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ== +"@aws-sdk/middleware-flexible-checksums@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.943.0.tgz#b89a71bb7c3442eb40984a05137d70f775255257" + integrity sha512-J2oYbAQXTFEezs5m2Vij6H3w71K1hZfCtb85AsR/2Ovp/FjABMnK+Es1g1edRx6KuMTc9HkL/iGU4e+ek+qCZw== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" "@aws-crypto/util" "5.2.0" - "@aws-sdk/core" "3.940.0" + "@aws-sdk/core" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/is-array-buffer" "^4.2.0" "@smithy/node-config-provider" "^4.3.5" @@ -456,12 +448,12 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz#ccf3c1844a3188185248eb126892d6274fec537e" - integrity sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ== +"@aws-sdk/middleware-sdk-s3@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.943.0.tgz#d0a422ca358bfa72572ca6acd307b3d2a1863b58" + integrity sha512-kd2mALfthU+RS9NsPS+qvznFcPnVgVx9mgmStWCPn5Qc5BTnx4UAtm+HPA+XZs+zxOopp+zmAfE4qxDHRVONBA== dependencies: - "@aws-sdk/core" "3.940.0" + "@aws-sdk/core" "3.943.0" "@aws-sdk/types" "3.936.0" "@aws-sdk/util-arn-parser" "3.893.0" "@smithy/core" "^3.18.5" @@ -485,12 +477,12 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz#e31c59b058b397855cd87fee34d2387d63b35c27" - integrity sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA== +"@aws-sdk/middleware-user-agent@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.943.0.tgz#df81ae94cf928929e14f9e4ceb8176c82e32bfdb" + integrity sha512-956n4kVEwFNXndXfhSAN5wO+KRgqiWEEY+ECwLvxmmO8uQ0NWOa8l6l65nTtyuiWzMX81c9BvlyNR5EgUeeUvA== dependencies: - "@aws-sdk/core" "3.940.0" + "@aws-sdk/core" "3.943.0" "@aws-sdk/types" "3.936.0" "@aws-sdk/util-endpoints" "3.936.0" "@smithy/core" "^3.18.5" @@ -498,23 +490,23 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/nested-clients@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz#9b1574a0a56bd3eb5d62bbba85961f9e734c3569" - integrity sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw== +"@aws-sdk/nested-clients@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.943.0.tgz#90fd20adb210926c204f6c0896d0531570e1213d" + integrity sha512-anFtB0p2FPuyUnbOULwGmKYqYKSq1M73c9uZ08jR/NCq6Trjq9cuF5TFTeHwjJyPRb4wMf2Qk859oiVfFqnQiw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.940.0" + "@aws-sdk/core" "3.943.0" "@aws-sdk/middleware-host-header" "3.936.0" "@aws-sdk/middleware-logger" "3.936.0" "@aws-sdk/middleware-recursion-detection" "3.936.0" - "@aws-sdk/middleware-user-agent" "3.940.0" + "@aws-sdk/middleware-user-agent" "3.943.0" "@aws-sdk/region-config-resolver" "3.936.0" "@aws-sdk/types" "3.936.0" "@aws-sdk/util-endpoints" "3.936.0" "@aws-sdk/util-user-agent-browser" "3.936.0" - "@aws-sdk/util-user-agent-node" "3.940.0" + "@aws-sdk/util-user-agent-node" "3.943.0" "@smithy/config-resolver" "^4.4.3" "@smithy/core" "^3.18.5" "@smithy/fetch-http-handler" "^5.3.6" @@ -553,32 +545,32 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz#4633dd3db078cce620d36077ce41f7f38b60c6e0" - integrity sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw== +"@aws-sdk/signature-v4-multi-region@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.943.0.tgz#3fbb5b6a6cdcc425c4a6733133089149f106a0f5" + integrity sha512-KKvmxNQ/FZbM6ml6nKd8ltDulsUojsXnMJNgf1VHTcJEbADC/6mVWOq0+e9D0WP1qixUBEuMjlS2HqD5KoqwEg== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.940.0" + "@aws-sdk/middleware-sdk-s3" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/protocol-http" "^5.3.5" "@smithy/signature-v4" "^5.3.5" "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.940.0.tgz#b89893d7cd0a5ed22ca180e33b6eaf7ca644c7f1" - integrity sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg== +"@aws-sdk/token-providers@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.943.0.tgz#f3dbc0764f9372e47b1312c13d3070217c1767ed" + integrity sha512-cRKyIzwfkS+XztXIFPoWORuaxlIswP+a83BJzelX4S1gUZ7FcXB4+lj9Jxjn8SbQhR4TPU3Owbpu+S7pd6IRbQ== dependencies: - "@aws-sdk/core" "3.940.0" - "@aws-sdk/nested-clients" "3.940.0" + "@aws-sdk/core" "3.943.0" + "@aws-sdk/nested-clients" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/property-provider" "^4.2.5" "@smithy/shared-ini-file-loader" "^4.4.0" "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/types@3.936.0": +"@aws-sdk/types@3.936.0", "@aws-sdk/types@^3.222.0": version "3.936.0" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.936.0.tgz#ecd3a4bec1a1bd4df834ab21fe52a76e332dc27a" integrity sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg== @@ -586,14 +578,6 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@aws-sdk/types@^3.222.0": - version "3.840.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.840.0.tgz#aadc6843d5c1f24b3d1d228059e702a355bf07c3" - integrity sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA== - dependencies: - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/util-arn-parser@3.893.0": version "3.893.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz#fcc9b792744b9da597662891c2422dda83881d8d" @@ -613,9 +597,9 @@ tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": - version "3.804.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz#a2ee8dc5d9c98276986e8e1ba03c0c84d9afb0f5" - integrity sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A== + version "3.893.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz#5df15f24e1edbe12ff1fe8906f823b51cd53bae8" + integrity sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg== dependencies: tslib "^2.6.2" @@ -629,12 +613,12 @@ bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.940.0": - version "3.940.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz#d9de3178a0567671b8cef3ea520f3416d2cecd1e" - integrity sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A== +"@aws-sdk/util-user-agent-node@3.943.0": + version "3.943.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.943.0.tgz#c584caf251b06a6e46f0ad2417215e6d22bd1077" + integrity sha512-gn+ILprVRrgAgTIBk2TDsJLRClzIOdStQFeFTcN0qpL8Z4GBCqMFhw7O7X+MM55Stt5s4jAauQ/VvoqmCADnQg== dependencies: - "@aws-sdk/middleware-user-agent" "3.940.0" + "@aws-sdk/middleware-user-agent" "3.943.0" "@aws-sdk/types" "3.936.0" "@smithy/node-config-provider" "^4.3.5" "@smithy/types" "^4.9.0" @@ -650,9 +634,9 @@ tslib "^2.6.2" "@aws/lambda-invoke-store@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.1.tgz#ceecff9ebe1f6199369e6911f38633fac3322811" - integrity sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww== + version "0.2.2" + resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz#b00f7d6aedfe832ef6c84488f3a422cce6a47efa" + integrity sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": version "7.27.1" @@ -664,38 +648,38 @@ picocolors "^1.1.1" "@babel/compat-data@^7.27.2": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" - integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" + integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== "@babel/core@^7.23.9": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" - integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" + integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== dependencies: - "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" + "@babel/generator" "^7.28.5" "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.27.3" - "@babel/helpers" "^7.27.6" - "@babel/parser" "^7.28.0" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.5" "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.0" - "@babel/types" "^7.28.0" + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" + "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2" - integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== +"@babel/generator@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" + integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== dependencies: - "@babel/parser" "^7.28.0" - "@babel/types" "^7.28.0" + "@babel/parser" "^7.28.5" + "@babel/types" "^7.28.5" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" @@ -724,44 +708,44 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helper-module-transforms@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" - integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== +"@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== dependencies: "@babel/helper-module-imports" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.3" + "@babel/traverse" "^7.28.3" "@babel/helper-string-parser@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== "@babel/helper-validator-option@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helpers@^7.27.6": - version "7.28.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.2.tgz#80f0918fecbfebea9af856c419763230040ee850" - integrity sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw== +"@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== dependencies: "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.4" -"@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" - integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== +"@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== dependencies: - "@babel/types" "^7.28.0" + "@babel/types" "^7.28.5" "@babel/template@^7.27.2": version "7.27.2" @@ -772,26 +756,26 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" - integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" + integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== dependencies: "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" + "@babel/generator" "^7.28.5" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.0" + "@babel/parser" "^7.28.5" "@babel/template" "^7.27.2" - "@babel/types" "^7.28.0" + "@babel/types" "^7.28.5" debug "^4.3.1" -"@babel/types@^7.27.1", "@babel/types@^7.28.0", "@babel/types@^7.28.2": - version "7.28.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" - integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== +"@babel/types@^7.27.1", "@babel/types@^7.28.4", "@babel/types@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== dependencies: "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" "@commitlint/cli@^17.1.2": version "17.8.1" @@ -970,17 +954,17 @@ esquery "^1.5.0" jsdoc-type-pratt-parser "~4.0.0" -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.7.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" + integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== "@eslint/core@^0.14.0": version "0.14.0" @@ -997,9 +981,9 @@ "@types/json-schema" "^7.0.15" "@eslint/css-tree@^3.6.1": - version "3.6.5" - resolved "https://registry.yarnpkg.com/@eslint/css-tree/-/css-tree-3.6.5.tgz#e51b69206117135557352982ba65d18f9d9b5a60" - integrity sha512-bJgnXu0D0K1BbfPfHTmCaJe2ucBOjeg/tG37H2CSqYCw51VMmBtPfWrH8LKPLAVCOp0h94e1n8PfR3v9iRbtyA== + version "3.6.8" + resolved "https://registry.yarnpkg.com/@eslint/css-tree/-/css-tree-3.6.8.tgz#8449d80a6e061bde514bd302a278a533d9716aba" + integrity sha512-s0f40zY7dlMp8i0Jf0u6l/aSswS0WRAgkhgETgiCJRcxIWb4S/Sp9uScKHWbkM3BnoFLbJbmOYk5AZUDFVxaLA== dependencies: mdn-data "2.23.0" source-map-js "^1.0.1" @@ -1066,9 +1050,9 @@ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/momoa@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-3.3.9.tgz#513ff7fb5e3ce08fb5ddbd3a5730e195cab2dd36" - integrity sha512-LHw6Op4bJb3/3KZgOgwflJx5zY9XOy0NU1NuyUFKGdTwHYmP+PbnQGCYQJ8NVNlulLfQish34b0VuUlLYP3AXA== + version "3.3.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-3.3.10.tgz#8ffe034b31e1d43e480846695869c45a06539c73" + integrity sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ== "@humanwhocodes/object-schema@^2.0.3": version "2.0.3" @@ -1348,22 +1332,30 @@ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.12" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" - integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" "@jridgewell/trace-mapping" "^0.3.24" +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" - integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -1374,17 +1366,17 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.29" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc" - integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jsforce/jsforce-node@^3.10.8": - version "3.10.8" - resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.10.8.tgz#f13903a0885fa3501a513512984cf9a717aebb9a" - integrity sha512-XGD/ivZz+htN5SgctFyEZ+JNG6C8FXzaEwvPbRSdsIy/hpWlexY38XtTpdT5xX3KnYSnOE4zA1M/oIbTm7RD/Q== +"@jsforce/jsforce-node@^3.10.10": + version "3.10.10" + resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.10.10.tgz#2d7bb77d1d739712733a30de7e9c941d2127bc4a" + integrity sha512-/zUOX9kapwk8lyjmTYgXlBF+GbqcEpb0zrkDfX9i94xu5cvzERZxRHqSSaS/IImoDmvoSbatFSVfB7Y4lmANOw== dependencies: "@sindresorhus/is" "^4" base64url "^3.0.1" @@ -1397,40 +1389,44 @@ node-fetch "^2.6.1" xml2js "^0.6.2" -"@jsonjoy.com/base64@^1.1.1": +"@jsonjoy.com/base64@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== -"@jsonjoy.com/buffers@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz#ade6895b7d3883d70f87b5743efaa12c71dfef7a" - integrity sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q== +"@jsonjoy.com/buffers@^1.0.0", "@jsonjoy.com/buffers@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz#8d99c7f67eaf724d3428dfd9826c6455266a5c83" + integrity sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA== "@jsonjoy.com/codegen@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== -"@jsonjoy.com/json-pack@^1.0.3": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.8.0.tgz#08dbac656f14fbc7a53861242c2a553075fa310a" - integrity sha512-paJGjyBTRzfgkqhIyer992g21aSKuu9h//zGS7aqm795roD6VYFf6iU9NYua1Bndmh/NRPkjtm9+hEPkK0yZSw== +"@jsonjoy.com/json-pack@^1.11.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz#93f8dd57fe3a3a92132b33d1eb182dcd9e7629fa" + integrity sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg== dependencies: - "@jsonjoy.com/base64" "^1.1.1" - "@jsonjoy.com/json-pointer" "^1.0.1" - "@jsonjoy.com/util" "^1.1.2" + "@jsonjoy.com/base64" "^1.1.2" + "@jsonjoy.com/buffers" "^1.2.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/json-pointer" "^1.0.2" + "@jsonjoy.com/util" "^1.9.0" hyperdyperid "^1.2.0" - thingies "^1.20.0" + thingies "^2.5.0" + tree-dump "^1.1.0" -"@jsonjoy.com/json-pointer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.1.tgz#3b710158e8a212708a2886ea5e38d92e2ea4f4a0" - integrity sha512-tJpwQfuBuxqZlyoJOSZcqf7OUmiYQ6MiPNmOv4KbZdXE/DdvBSSAwhos0zIlJU/AXxC8XpuO8p08bh2fIl+RKA== +"@jsonjoy.com/json-pointer@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408" + integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== dependencies: - "@jsonjoy.com/util" "^1.3.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/util" "^1.9.0" -"@jsonjoy.com/util@^1.1.2", "@jsonjoy.com/util@^1.3.0": +"@jsonjoy.com/util@^1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46" integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== @@ -1541,9 +1537,9 @@ registry-auth-token "^5.1.0" "@oclif/table@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@oclif/table/-/table-0.5.0.tgz#d84f6ba1ab38092cebf7c4712671ab0348ea74ee" - integrity sha512-qXVucBYc/81SNZRDpKgZLr3WNX6qPUN9Ukqr5wWPMmUSzzOnusln3KuTzzWoB1IIafmqrq27QCozkLyvY7ymmw== + version "0.5.1" + resolved "https://registry.yarnpkg.com/@oclif/table/-/table-0.5.1.tgz#4219c1b4f964dab051dbdeab83fe8d859625acb2" + integrity sha512-k/68jl8SqJEGh+SgUYS93GK+G+EIWENuQQfJgdQBP+DP7G3evGRbe9ajdSVaL5ldMOfgZ4se4mfrEkiEVIiVvQ== dependencies: "@types/react" "^18.3.12" change-case "^5.4.4" @@ -1563,6 +1559,11 @@ ansis "^3.17.0" debug "^4.4.3" +"@pinojs/redact@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@pinojs/redact/-/redact-0.4.0.tgz#c3de060dd12640dcc838516aa2a6803cc7b2e9d6" + integrity sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -1594,18 +1595,18 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@salesforce/agents@^0.18.2": - version "0.18.2" - resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-0.18.2.tgz#c061e31449501a0fcbd48cc3c35f3f613ac1a06c" - integrity sha512-JarlWF9WUp3/qKm73E5dK6BERnqz/fmy+x9r6zeO4YDmLvc1oZV6ufNcXOEN9pmPHh6D0qBWOBJ1IlBHQPIUig== +"@salesforce/agents@^0.19.4": + version "0.19.4" + resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-0.19.4.tgz#d101e589bd26576d2dd91c906efdb36c73a73511" + integrity sha512-gaBzCc84LkzD1ACcwsiLYw2g7/byEaG2DAlIzVfpGuBBmcvJC4pnaZxSEPMtAzhEdDHhItb0jJjyWTGZueUFnQ== dependencies: - "@salesforce/core" "^8.19.1" - "@salesforce/kit" "^3.2.3" - "@salesforce/source-deploy-retrieve" "^12.22.2" - "@salesforce/types" "^1.4.0" - fast-xml-parser "^5.2.5" + "@salesforce/core" "^8.23.5" + "@salesforce/kit" "^3.2.4" + "@salesforce/source-deploy-retrieve" "^12.30.0" + "@salesforce/types" "^1.5.0" + fast-xml-parser "^5.3.2" nock "^13.5.6" - yaml "^2.8.1" + yaml "^2.8.2" "@salesforce/cli-plugins-testkit@^5.3.41": version "5.3.41" @@ -1623,12 +1624,12 @@ strip-ansi "6.0.1" ts-retry-promise "^0.8.1" -"@salesforce/core@^8.18.7", "@salesforce/core@^8.19.1", "@salesforce/core@^8.23.1", "@salesforce/core@^8.23.2", "@salesforce/core@^8.23.3", "@salesforce/core@^8.23.4", "@salesforce/core@^8.5.1", "@salesforce/core@^8.8.0": - version "8.23.4" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.23.4.tgz#f1fa18eace08f685e72975a09d96e7f6958ca3b4" - integrity sha512-+JZMFD76P7X8fLSrHJRi9+ygjTehqZqJRXxmNq51miqIHY1Xlb0qH/yr9u5QEGsFIOZ8H8oStl/Zj+ZbrFs0vw== +"@salesforce/core@^8.18.7", "@salesforce/core@^8.23.1", "@salesforce/core@^8.23.3", "@salesforce/core@^8.23.4", "@salesforce/core@^8.23.5", "@salesforce/core@^8.23.7", "@salesforce/core@^8.5.1", "@salesforce/core@^8.8.0": + version "8.23.7" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.23.7.tgz#f921da950ef2c2448bac07f3f77da0b6096ec121" + integrity sha512-2drAVHK1A2yqioOMornMNxGaUnstGc/moyCQxJ9lSJrsZ/EICD12A9hLNx3dq791GCRMPnaZmAXmJZFllX56tQ== dependencies: - "@jsforce/jsforce-node" "^3.10.8" + "@jsforce/jsforce-node" "^3.10.10" "@salesforce/kit" "^3.2.4" "@salesforce/schemas" "^1.10.3" "@salesforce/ts-types" "^2.0.12" @@ -1638,7 +1639,7 @@ faye "^1.4.1" form-data "^4.0.4" js2xmlparser "^4.0.1" - jsonwebtoken "9.0.2" + jsonwebtoken "9.0.3" jszip "3.10.1" memfs "^4.30.1" pino "^9.7.0" @@ -1649,14 +1650,14 @@ ts-retry-promise "^0.8.1" "@salesforce/dev-config@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@salesforce/dev-config/-/dev-config-4.3.1.tgz#4dac8245df79d675258b50e1d24e8c636eaa5e10" - integrity sha512-rO6axodoRF2SA1kknGttIWuL7HhIwSmweGlBzM8y2m5TH8DeIv4xsqYc8Cu+SrR3JT1FN4nh6XgrogI83AJfKg== + version "4.3.2" + resolved "https://registry.yarnpkg.com/@salesforce/dev-config/-/dev-config-4.3.2.tgz#10047e2b8d289c93f157ab4243a1b1de57f2d6a2" + integrity sha512-mxhsWV1rzHfhGMVSFQRLOHZTGfB1R2FtqbuIb3hrgDFsW1NLjEDS2U+eZWBJiCYod1JeGpJxnETNq587lem1Gg== -"@salesforce/dev-scripts@^10.2.12": - version "10.2.12" - resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-10.2.12.tgz#05cb48e60cf1a204ec8402aa803093c924b02bf7" - integrity sha512-sQFrUm16PLefZ3U4scEP0+jCKrUvaVjvyMADoM7KK2sXCu9TkvwAD5XtPeBoUsf9SdWhdFf2isv1X8DKM5q/6w== +"@salesforce/dev-scripts@^11.0.4": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@salesforce/dev-scripts/-/dev-scripts-11.0.4.tgz#9e9fa6d425308b638508e701956dfd4c97eb403c" + integrity sha512-8RebBJpcgoO0AVmrb3pFwSUD8vCqdWbUmv3JwoDy2lWofAT0vYM3NywCCdKj26XnSASkRgKvsY6AQpkxLs+vVg== dependencies: "@commitlint/cli" "^17.1.2" "@commitlint/config-conventional" "^17.8.1" @@ -1664,12 +1665,12 @@ "@salesforce/prettier-config" "^0.0.3" "@types/chai" "^4.3.14" "@types/mocha" "^10.0.7" - "@types/node" "^18.19.41" + "@types/node" "^18" "@types/sinon" "^10.0.20" chai "^4.3.10" chalk "^4.0.0" cosmiconfig "^8.3.6" - eslint-config-salesforce-typescript "^3.4.0" + eslint-config-salesforce-typescript "4.0.1" husky "^7.0.4" linkinator "^6.1.1" mocha "^10.7.0" @@ -1683,7 +1684,7 @@ typedoc "^0.26.5" typedoc-plugin-missing-exports "^3.0.0" typescript "^5.5.4" - wireit "^0.14.5" + wireit "^0.14.12" "@salesforce/kit@^3.2.3", "@salesforce/kit@^3.2.4": version "3.2.4" @@ -1750,7 +1751,7 @@ cli-progress "^3.12.0" terminal-link "^3.0.0" -"@salesforce/source-deploy-retrieve@^12.22.2", "@salesforce/source-deploy-retrieve@^12.30.0": +"@salesforce/source-deploy-retrieve@^12.30.0": version "12.30.0" resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.30.0.tgz#cae4e00b5f9f301f28d9224997f63bfa5a7ede1b" integrity sha512-elfNE4NRw2JNRsYoS/e9Gi2KdaFg7c2JVdRY6ZT20vpxV3z81SvvbYhauiKOYkVvsP3Y+FBEzWiG6AwdF0fSWA== @@ -1775,7 +1776,7 @@ resolved "https://registry.yarnpkg.com/@salesforce/ts-types/-/ts-types-2.0.12.tgz#60420622812a7ec7e46d220667bc29b42dc247ff" integrity sha512-BIJyduJC18Kc8z+arUm5AZ9VkPRyw1KKAm+Tk+9LT99eOzhNilyfKzhZ4t+tG2lIGgnJpmytZfVDZ0e2kFul8g== -"@salesforce/types@^1.4.0", "@salesforce/types@^1.5.0": +"@salesforce/types@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@salesforce/types/-/types-1.5.0.tgz#dd1db8651ae9729c133ee5224ec7fbf50b1087ad" integrity sha512-zBihdJ6WwE0JP6BVCXhm7guMQlj4/7nCYqtrkozgxgeKLJq+zKrTRwILeRQbbeqVP4nKjUz/AJr0zCDjrA2IVg== @@ -1936,10 +1937,10 @@ "@smithy/util-middleware" "^4.2.5" tslib "^2.6.2" -"@smithy/core@^3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.18.5.tgz#c304d185e2335cbef9b39431a53a67c84972c27f" - integrity sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw== +"@smithy/core@^3.18.5", "@smithy/core@^3.18.7": + version "3.18.7" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.18.7.tgz#88c67b9474eadf51a632e2956c8756d36c7072c8" + integrity sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw== dependencies: "@smithy/middleware-serde" "^4.2.6" "@smithy/protocol-http" "^5.3.5" @@ -2088,12 +2089,12 @@ "@smithy/types" "^4.9.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^4.3.12": - version "4.3.12" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz#97c432eec17398277f626b8d2abff9278b89d2ac" - integrity sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A== +"@smithy/middleware-endpoint@^4.3.12", "@smithy/middleware-endpoint@^4.3.14": + version "4.3.14" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.14.tgz#da145b02f6a5d073595111bf73fa31da16e73773" + integrity sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg== dependencies: - "@smithy/core" "^3.18.5" + "@smithy/core" "^3.18.7" "@smithy/middleware-serde" "^4.2.6" "@smithy/node-config-provider" "^4.3.5" "@smithy/shared-ini-file-loader" "^4.4.0" @@ -2103,14 +2104,14 @@ tslib "^2.6.2" "@smithy/middleware-retry@^4.4.12": - version "4.4.12" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz#a53f301ce10df29a3c65a0bc4f84a866adf2fe97" - integrity sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ== + version "4.4.14" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz#92e503946314278614f608537d77a04db6d7b810" + integrity sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q== dependencies: "@smithy/node-config-provider" "^4.3.5" "@smithy/protocol-http" "^5.3.5" "@smithy/service-error-classification" "^4.2.5" - "@smithy/smithy-client" "^4.9.8" + "@smithy/smithy-client" "^4.9.10" "@smithy/types" "^4.9.0" "@smithy/util-middleware" "^4.2.5" "@smithy/util-retry" "^4.2.5" @@ -2217,26 +2218,19 @@ "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@smithy/smithy-client@^4.9.8": - version "4.9.8" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.9.8.tgz#a6845215c982cd6331f485c5d7f23bc0b4f498f3" - integrity sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA== +"@smithy/smithy-client@^4.9.10", "@smithy/smithy-client@^4.9.8": + version "4.9.10" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.9.10.tgz#a395bbc6ccf35cdbae44ce024909b6c5aec06283" + integrity sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ== dependencies: - "@smithy/core" "^3.18.5" - "@smithy/middleware-endpoint" "^4.3.12" + "@smithy/core" "^3.18.7" + "@smithy/middleware-endpoint" "^4.3.14" "@smithy/middleware-stack" "^4.2.5" "@smithy/protocol-http" "^5.3.5" "@smithy/types" "^4.9.0" "@smithy/util-stream" "^4.5.6" tslib "^2.6.2" -"@smithy/types@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.3.1.tgz#c11276ea16235d798f47a68aef9f44d3dbb70dd4" - integrity sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA== - dependencies: - tslib "^2.6.2" - "@smithy/types@^4.9.0": version "4.9.0" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.9.0.tgz#c6636ddfa142e1ddcb6e4cf5f3e1a628d420486f" @@ -2300,25 +2294,25 @@ tslib "^2.6.2" "@smithy/util-defaults-mode-browser@^4.3.11": - version "4.3.11" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz#d44b9ee59cf1850e7cf5fb75741840241de33e76" - integrity sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw== + version "4.3.13" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz#51e3cadfe772882f941f1dff07d2f8b7acb9c21e" + integrity sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA== dependencies: "@smithy/property-provider" "^4.2.5" - "@smithy/smithy-client" "^4.9.8" + "@smithy/smithy-client" "^4.9.10" "@smithy/types" "^4.9.0" tslib "^2.6.2" "@smithy/util-defaults-mode-node@^4.2.14": - version "4.2.14" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz#e9e7c8bd2705535445e811d78e37575b26b7e5ba" - integrity sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA== + version "4.2.16" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz#ab4abdebae65e8628473d1493b1de5f82aa0eec9" + integrity sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg== dependencies: "@smithy/config-resolver" "^4.4.3" "@smithy/credential-provider-imds" "^4.2.5" "@smithy/node-config-provider" "^4.3.5" "@smithy/property-provider" "^4.2.5" - "@smithy/smithy-client" "^4.9.8" + "@smithy/smithy-client" "^4.9.10" "@smithy/types" "^4.9.0" tslib "^2.6.2" @@ -2409,12 +2403,12 @@ tslib "^2.6.2" "@stylistic/eslint-plugin@^5.2.3": - version "5.2.3" - resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.2.3.tgz#f2be5d25e768f5ef4bb72d339bb71c500accef61" - integrity sha512-oY7GVkJGVMI5benlBDCaRrSC1qPasafyv5dOBLLv5MTilMGnErKhO6ziEfodDDIZbo5QxPUNW360VudJOFODMw== + version "5.6.1" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.6.1.tgz#98e1371757881eecce69b1ec497ef6fc7d6470c9" + integrity sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw== dependencies: - "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/types" "^8.38.0" + "@eslint-community/eslint-utils" "^4.9.0" + "@typescript-eslint/types" "^8.47.0" eslint-visitor-keys "^4.2.1" espree "^10.4.0" estraverse "^5.3.0" @@ -2440,9 +2434,9 @@ integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== "@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + version "1.0.12" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" + integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -2543,35 +2537,35 @@ "@types/node" "*" "@types/node@*": - version "24.2.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.2.0.tgz#cde712f88c5190006d6b069232582ecd1f94a760" - integrity sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw== + version "24.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.1.tgz#91e92182c93db8bd6224fca031e2370cef9a8f01" + integrity sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ== dependencies: - undici-types "~7.10.0" + undici-types "~7.16.0" "@types/node@20.5.1": version "20.5.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== -"@types/node@^18.19.41": - version "18.19.121" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.121.tgz#c50d353ea2d1fb1261a8bbd0bf2850306f5af2b3" - integrity sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ== +"@types/node@^18": + version "18.19.130" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.130.tgz#da4c6324793a79defb7a62cba3947ec5add00d59" + integrity sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg== dependencies: undici-types "~5.26.4" "@types/node@^20.4.8": - version "20.19.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.9.tgz#ca9a58193fec361cc6e859d88b52261853f1f0d3" - integrity sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw== + version "20.19.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.25.tgz#467da94a2fd966b57cc39c357247d68047611190" + integrity sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ== dependencies: undici-types "~6.21.0" "@types/node@^22.5.5": - version "22.17.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.17.0.tgz#e8c9090e957bd4d9860efb323eb92d297347eac7" - integrity sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ== + version "22.19.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.19.1.tgz#1188f1ddc9f46b4cc3aec76749050b4e1f459b7b" + integrity sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ== dependencies: undici-types "~6.21.0" @@ -2586,12 +2580,12 @@ integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== "@types/react@^18.3.12", "@types/react@^18.3.3": - version "18.3.23" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.23.tgz#86ae6f6b95a48c418fecdaccc8069e0fbb63696a" - integrity sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w== + version "18.3.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.27.tgz#74a3b590ea183983dc65a474dc17553ae1415c34" + integrity sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w== dependencies: "@types/prop-types" "*" - csstype "^3.0.2" + csstype "^3.2.2" "@types/responselike@^1.0.0": version "1.0.3" @@ -2601,9 +2595,9 @@ "@types/node" "*" "@types/semver@^7.5.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" - integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== + version "7.7.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.1.tgz#3ce3af1a5524ef327d2da9e4fd8b6d95c8d70528" + integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA== "@types/shelljs@^0.8.15": version "0.8.17" @@ -2621,9 +2615,9 @@ "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": - version "8.1.5" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" - integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== + version "15.0.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-15.0.1.tgz#49f731d9453f52d64dd79f5a5626c1cf1b81bea4" + integrity sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w== "@types/through@*": version "0.0.33" @@ -2706,10 +2700,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/types@^8.38.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.41.0.tgz#9935afeaae65e535abcbcee95383fa649c64d16d" - integrity sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag== +"@typescript-eslint/types@^8.47.0": + version "8.48.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.48.1.tgz#a9ff808f5f798f28767d5c0b015a88fa7ce46bd7" + integrity sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q== "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" @@ -2875,9 +2869,9 @@ ansi-escapes@^5.0.0: type-fest "^1.0.2" ansi-escapes@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" - integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== + version "7.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.2.0.tgz#31b25afa3edd3efc09d98c2fee831d460ff06b49" + integrity sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw== dependencies: environment "^1.0.0" @@ -2887,9 +2881,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" @@ -2899,9 +2893,9 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: color-convert "^2.0.1" ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== ansis@^3.16.0, ansis@^3.17.0, ansis@^3.3.2: version "3.17.0" @@ -3132,6 +3126,11 @@ base64url@^3.0.1: resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== +baseline-browser-mapping@^2.9.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.2.tgz#0ae89ec3e10e07c368b77def89db8044409461d1" + integrity sha512-PxSsosKQjI38iXkmb3d0Y32efqyA0uW4s41u4IVBsLlWLhCiYNpH/AfNOVWRqCQBlD8TFJTz6OUWNd4DFJCnmw== + basic-ftp@^5.0.2: version "5.0.5" resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" @@ -3143,9 +3142,9 @@ binary-extensions@^2.0.0: integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bowser@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" - integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + version "2.13.1" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.13.1.tgz#5a4c652de1d002f847dd011819f5fc729f308a7e" + integrity sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw== brace-expansion@^1.1.7: version "1.1.12" @@ -3181,15 +3180,16 @@ browser-stdout@^1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.24.0, browserslist@^4.25.1: - version "4.25.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" - integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== +browserslist@^4.24.0, browserslist@^4.28.0: + version "4.28.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== dependencies: - caniuse-lite "^1.0.30001726" - electron-to-chromium "^1.5.173" - node-releases "^2.0.19" - update-browserslist-db "^1.1.3" + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" buffer-equal-constant-time@^1.0.1: version "1.0.1" @@ -3318,10 +3318,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001726: - version "1.0.30001731" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz#277c07416ea4613ec564e5b0ffb47e7b60f32e2f" - integrity sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg== +caniuse-lite@^1.0.30001759: + version "1.0.30001759" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz#d569e7b010372c6b0ca3946e30dada0a2e9d5006" + integrity sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw== capital-case@^1.0.4: version "1.0.4" @@ -3424,9 +3424,9 @@ chokidar@^3.5.3: fsevents "~2.3.2" ci-info@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.0.tgz#c39b1013f8fdbd28cd78e62318357d02da160cd7" - integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.1.tgz#355ad571920810b5623e11d40232f443f16f1daa" + integrity sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA== clean-regexp@^1.0.0: version "1.0.0" @@ -3649,11 +3649,11 @@ convert-to-spaces@^2.0.1: integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== core-js-compat@^3.34.0: - version "3.44.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.44.0.tgz#62b9165b97e4cbdb8bca16b14818e67428b4a0f8" - integrity sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA== + version "3.47.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.47.0.tgz#698224bbdbb6f2e3f39decdda4147b161e3772a3" + integrity sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ== dependencies: - browserslist "^4.25.1" + browserslist "^4.28.0" core-util-is@~1.0.0: version "1.0.3" @@ -3696,10 +3696,10 @@ csprng@*: dependencies: sequin "*" -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +csstype@^3.2.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== csv-parse@^5.5.2: version "5.6.0" @@ -3854,9 +3854,9 @@ dequal@^2.0.0: integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detect-indent@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25" - integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g== + version "7.0.2" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.2.tgz#16c516bf75d4b2f759f68214554996d467c8d648" + integrity sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A== detect-newline@^4.0.0: version "4.0.1" @@ -3974,10 +3974,10 @@ ejs@^3.1.10: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.173: - version "1.5.194" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz#05e541c3373ba8d967a65c92bc14d60608908236" - integrity sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA== +electron-to-chromium@^1.5.263: + version "1.5.265" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.265.tgz#ccea47940ee09d864f22fc7aadb2e992056ea0a5" + integrity sha512-B7IkLR1/AE+9jR2LtVF/1/6PFhY5TlnEHnlrKmGk7PvkJibg5jr+mLXLLzq3QYl6PA1T/vLDthQPqIPAlS/PPA== emoji-regex-xs@^1.0.0: version "1.0.0" @@ -3985,9 +3985,9 @@ emoji-regex-xs@^1.0.0: integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== emoji-regex@^10.3.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" - integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== emoji-regex@^8.0.0: version "8.0.0" @@ -4022,9 +4022,9 @@ environment@^1.0.0: integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + version "1.3.4" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== dependencies: is-arrayish "^0.2.1" @@ -4204,31 +4204,31 @@ eslint-config-prettier@^9.1.0: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz#90deb4fa0259592df774b600dbd1d2249a78ce91" integrity sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ== -eslint-config-salesforce-license@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-salesforce-license/-/eslint-config-salesforce-license-0.2.0.tgz#323193f1aa15dd33fbf108d25fc1210afc11065e" - integrity sha512-DJdBvgj82Erum82YMe+YvG/o6ukna3UA++lRl0HSTldj0VlBl3Q8hzCp97nRXZHra6JH1I912yievZzklXDw6w== +eslint-config-salesforce-license@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-salesforce-license/-/eslint-config-salesforce-license-1.0.2.tgz#0bc7f482677f44105a6a28644f5ccbd4c9abfa01" + integrity sha512-l/1uz9RJHQHnVEEexHpHsQt3+aP/Ys2HGfZcLuUg/FZ6NGhL15ey33OJfYCYtSUKMLGiEKdUhdWVp34WD4rIdQ== -eslint-config-salesforce-typescript@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-config-salesforce-typescript/-/eslint-config-salesforce-typescript-3.4.0.tgz#3542e96aa6054b3df3b7c636b3b7f5bf4238bfb3" - integrity sha512-pT+kJsmLrXIsVw1f24gWB+a2Iefan9qp02iSdx5mk4Jb/Jv68LhS+V/dfJxN5vvKhzvc86UwUPEIQBX9OCSbpQ== +eslint-config-salesforce-typescript@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-salesforce-typescript/-/eslint-config-salesforce-typescript-4.0.1.tgz#d310a40ab117bb77c19d9f5d2377f278d2da97a4" + integrity sha512-aYRFIjVXA8b0fJt7JImcqRBb++lhFjLSeZhboMZZWMNGQyWeQ8pGX7ZW2/71TQiM0b4P8Nrpapi1w4VuM0kc/A== dependencies: "@typescript-eslint/eslint-plugin" "^6.21.0" "@typescript-eslint/parser" "^6.21.0" eslint "^8.56.0" eslint-config-prettier "^9.1.0" eslint-config-salesforce "^2.2.0" - eslint-config-salesforce-license "^0.2.0" + eslint-config-salesforce-license "^1.0.2" eslint-plugin-header "^3.1.1" eslint-plugin-import "^2.29.1" eslint-plugin-jsdoc "^46.10.1" eslint-plugin-unicorn "^50.0.1" eslint-config-salesforce@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-salesforce/-/eslint-config-salesforce-2.2.0.tgz#04b6cf07dcbaabc32fc9edb0915860497db55c30" - integrity sha512-0zUEFJ2nNpMvVO3MgKEDUTGtaFZjL3xEIErr5h+BOft+OhGoIvZBNPnBBu12lvv29ylqIAQz5SwoVCCUzBhyPQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-salesforce/-/eslint-config-salesforce-2.2.1.tgz#e99bcc820d5fe43652b9f5a4f8e51993fdbedee5" + integrity sha512-o/hsimyxzgJihvfwi05P+OeIE2ZpTDfyRAYN/gs0uvoEqb1J6R+uHR0mhw0cXR3GtQocD0bmcMCePHi/+FOCoA== eslint-config-xo-react@^0.27.0: version "0.27.0" @@ -4563,22 +4563,17 @@ fast-levenshtein@^3.0.0: dependencies: fastest-levenshtein "^1.0.7" -fast-redact@^3.1.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" - integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== - fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== -fast-xml-parser@5.2.5, fast-xml-parser@^5.2.5: +fast-xml-parser@5.2.5: version "5.2.5" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz#4809fdfb1310494e341098c25cb1341a01a9144a" integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ== @@ -4592,6 +4587,13 @@ fast-xml-parser@^4.5.1, fast-xml-parser@^4.5.3: dependencies: strnum "^1.1.1" +fast-xml-parser@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.3.2.tgz#78a51945fbf7312e1ff6726cb173f515b4ea11d8" + integrity sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA== + dependencies: + strnum "^2.1.0" + fastest-levenshtein@^1.0.7: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -4623,10 +4625,10 @@ faye@^1.4.0, faye@^1.4.1: tough-cookie "*" tunnel-agent "*" -fdir@^6.4.4: - version "6.4.6" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" - integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== figures@^3.2.0: version "3.2.0" @@ -4751,9 +4753,9 @@ form-data-encoder@^2.1.2: integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== form-data@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" - integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -4767,9 +4769,9 @@ fromentries@^1.2.0: integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-extra@^11.0.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" - integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + version "11.3.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.2.tgz#c838aeddc6f4a8c74dd15f85e11fe5511bfe02a4" + integrity sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -4827,6 +4829,11 @@ gaxios@^6.0.0: node-fetch "^2.6.9" uuid "^9.0.1" +generator-function@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -4837,10 +4844,10 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-east-asian-width@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" - integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz#9bc4caa131702b4b61729cb7e42735bc550c9ee6" + integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" @@ -4946,10 +4953,15 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-to-regex.js@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz#2b323728271d133830850e32311f40766c5f6413" + integrity sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== + glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + version "10.5.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" + integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" @@ -4959,13 +4971,13 @@ glob@^10.3.10: path-scurry "^1.11.1" glob@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.3.tgz#9d8087e6d72ddb3c4707b1d2778f80ea3eaefcd6" - integrity sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA== + version "11.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.1.0.tgz#4f826576e4eb99c7dad383793d2f9f08f67e50a6" + integrity sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw== dependencies: foreground-child "^3.3.1" jackspeak "^4.1.1" - minimatch "^10.0.3" + minimatch "^10.1.1" minipass "^7.1.2" package-json-from-dist "^1.0.0" path-scurry "^2.0.0" @@ -5008,9 +5020,9 @@ globals@^13.19.0: type-fest "^0.20.2" globals@^16.3.0: - version "16.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667" - integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ== + version "16.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" + integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== globalthis@^1.0.4: version "1.0.4" @@ -5459,13 +5471,10 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" +ip-address@^10.0.1: + version "10.1.0" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.0.tgz#d8dcffb34d0e02eb241427444a6e23f5b0595aa4" + integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" @@ -5526,7 +5535,7 @@ is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.16.1, is-core-module@^2.5.0: +is-core-module@^2.13.0, is-core-module@^2.16.1, is-core-module@^2.5.0: version "2.16.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== @@ -5578,19 +5587,20 @@ is-fullwidth-code-point@^4.0.0: integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-fullwidth-code-point@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" - integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + version "5.1.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" + integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== dependencies: - get-east-asian-width "^1.0.0" + get-east-asian-width "^1.3.1" is-generator-function@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" - integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== dependencies: - call-bound "^1.0.3" - get-proto "^1.0.0" + call-bound "^1.0.4" + generator-function "^2.0.0" + get-proto "^1.0.1" has-tostringtag "^1.0.2" safe-regex-test "^1.1.0" @@ -5843,9 +5853,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" + integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -5898,17 +5908,17 @@ joycon@^3.1.1: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + version "3.14.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== dependencies: argparse "^1.0.7" esprima "^4.0.0" js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== dependencies: argparse "^2.0.1" @@ -5919,11 +5929,6 @@ js2xmlparser@^4.0.1: dependencies: xmlcreate "^2.0.4" -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114" @@ -5999,9 +6004,9 @@ jsonfile@^4.0.0: graceful-fs "^4.1.6" jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== dependencies: universalify "^2.0.0" optionalDependencies: @@ -6012,12 +6017,12 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsonwebtoken@9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" - integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== +jsonwebtoken@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2" + integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== dependencies: - jws "^3.2.2" + jws "^4.0.1" lodash.includes "^4.3.0" lodash.isboolean "^3.0.3" lodash.isinteger "^4.0.4" @@ -6063,21 +6068,21 @@ just-extend@^6.2.0: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== -jwa@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" - integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== +jwa@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" + integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== dependencies: buffer-equal-constant-time "^1.0.1" ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== +jws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690" + integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== dependencies: - jwa "^1.4.1" + jwa "^2.0.1" safe-buffer "^5.0.1" keyv@^4.0.0, keyv@^4.5.3: @@ -6125,9 +6130,9 @@ linkify-it@^5.0.0: uc.micro "^2.0.0" linkinator@^6.1.1: - version "6.1.4" - resolved "https://registry.yarnpkg.com/linkinator/-/linkinator-6.1.4.tgz#9a2fb961ad38c7041d907ecd72d34d32a5b06e8e" - integrity sha512-7DXjwFiJ6rqye8OawwWi/CyDdKdIb69HLCbPhRI6tGSNnGruWFw8qucNsoWFXybel/I960UujFHefjvprhhvYA== + version "6.3.0" + resolved "https://registry.yarnpkg.com/linkinator/-/linkinator-6.3.0.tgz#15a0d9c9096cbce2af1cbe786a2c2711ec077a96" + integrity sha512-MRKxkkIK5XlK+IKzIhJydJBF72TpygT7atR9CCUZrKl9hpEPVkm3Kcu66M38HJUvUBg4iskzCQENwas7HIiJeg== dependencies: chalk "^5.0.0" escape-html "^1.0.3" @@ -6304,9 +6309,9 @@ lru-cache@^10.0.1, lru-cache@^10.2.0: integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" - integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A== + version "11.2.4" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.4.tgz#ecb523ebb0e6f4d837c807ad1abaea8e0619770d" + integrity sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg== lru-cache@^5.1.1: version "5.1.1" @@ -6409,13 +6414,15 @@ mdurl@^2.0.0: integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== memfs@^4.30.1: - version "4.36.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.36.0.tgz#b9fa8d97ddda3cb8c06908bceec956560c33d979" - integrity sha512-mfBfzGUdoEw5AZwG8E965ej3BbvW2F9LxEWj4uLxF6BEh1dO2N9eS3AGu9S6vfenuQYrVjsbUOOZK7y3vz4vyQ== - dependencies: - "@jsonjoy.com/json-pack" "^1.0.3" - "@jsonjoy.com/util" "^1.3.0" - tree-dump "^1.0.1" + version "4.51.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.51.1.tgz#25945de4a90d1573945105e187daa9385e1bca73" + integrity sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ== + dependencies: + "@jsonjoy.com/json-pack" "^1.11.0" + "@jsonjoy.com/util" "^1.9.0" + glob-to-regex.js "^1.0.1" + thingies "^2.5.0" + tree-dump "^1.0.3" tslib "^2.0.0" meow@^13.0.0: @@ -6508,9 +6515,9 @@ mime@2.6.0: integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mime@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.7.tgz#0b7a98b08c63bd3c10251e797d67840c9bde9f13" - integrity sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-4.1.0.tgz#ec55df7aa21832a36d44f0bbee5c04639b27802f" + integrity sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw== mimic-fn@^2.1.0: version "2.1.0" @@ -6544,10 +6551,10 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa" - integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== +minimatch@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" + integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== dependencies: "@isaacs/brace-expansion" "^5.0.0" @@ -6718,10 +6725,10 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== +node-releases@^2.0.27: + version "2.0.27" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== normalize-package-data@^2.5.0: version "2.5.0" @@ -6763,9 +6770,9 @@ normalize-url@^6.0.1: integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== normalize-url@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.2.tgz#3b343a42f837e4dae2b01917c04e8de3782e9170" - integrity sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.0.tgz#d33504f67970decf612946fd4880bc8c0983486d" + integrity sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w== npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" @@ -6879,12 +6886,12 @@ object.values@^1.1.6, object.values@^1.2.1: es-object-atoms "^1.0.0" oclif@^4.22.51: - version "4.22.51" - resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.22.51.tgz#54ac0768145897f795dabea0a87f441d4e435f36" - integrity sha512-5Nbj9lMf323BhXnd4HevCG9xIh+6DesHZGY2KtXJk/+gvTW3POrlma7mVIZ0T2a/YFdnlH2QGbjZ4yLPRTbIng== + version "4.22.52" + resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.22.52.tgz#9a5d30706516c8b015b6bbc95c016aa4fe74165b" + integrity sha512-Rl7UX1q9m7mAdCLyRWA1VY6O3AeDLmCTRe2wzbQU/teDK+gvERGdvZfb9est96MM+mBjRVoX5EesoBFOVVee+w== dependencies: "@aws-sdk/client-cloudfront" "^3.940.0" - "@aws-sdk/client-s3" "^3.937.0" + "@aws-sdk/client-s3" "^3.940.0" "@inquirer/confirm" "^3.1.22" "@inquirer/input" "^2.2.4" "@inquirer/select" "^2.5.0" @@ -7132,9 +7139,9 @@ path-scurry@^1.11.1: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" - integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.1.tgz#4b6572376cfd8b811fca9cd1f5c24b3cbac0fe10" + integrity sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== dependencies: lru-cache "^11.0.0" minipass "^7.1.2" @@ -7181,7 +7188,7 @@ picomatch@^3.0.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== -picomatch@^4.0.2, picomatch@^4.0.3: +picomatch@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== @@ -7227,12 +7234,12 @@ pino-std-serializers@^7.0.0: integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== pino@^9.7.0: - version "9.7.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-9.7.0.tgz#ff7cd86eb3103ee620204dbd5ca6ffda8b53f645" - integrity sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg== + version "9.14.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.14.0.tgz#673d9711c2d1e64d18670c1ec05ef7ba14562556" + integrity sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w== dependencies: + "@pinojs/redact" "^0.4.0" atomic-sleep "^1.0.0" - fast-redact "^3.1.1" on-exit-leak-free "^2.1.0" pino-abstract-transport "^2.0.0" pino-std-serializers "^7.0.0" @@ -7611,11 +7618,11 @@ resolve-global@1.0.0, resolve-global@^1.0.0: global-dirs "^0.1.1" resolve@^1.1.6, resolve@^1.10.0, resolve@^1.22.4: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + version "1.22.11" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== dependencies: - is-core-module "^2.16.0" + is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -7740,9 +7747,9 @@ safe-stable-stringify@^2.3.1, safe-stable-stringify@^2.4.3: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@>=0.6.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + version "1.4.3" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.3.tgz#fcebae3b756cdc8428321805f4b70f16ec0ab5db" + integrity sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ== scheduler@^0.23.0, scheduler@^0.23.2: version "0.23.2" @@ -7973,9 +7980,9 @@ slice-ansi@^5.0.0: is-fullwidth-code-point "^4.0.0" slice-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" - integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + version "7.1.2" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" + integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== dependencies: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" @@ -8003,11 +8010,11 @@ socks-proxy-agent@^8.0.5: socks "^2.8.3" socks@^2.8.3: - version "2.8.6" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.6.tgz#e335486a2552f34f932f0c27d8dbb93f2be867aa" - integrity sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA== + version "2.8.7" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" + integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== dependencies: - ip-address "^9.0.5" + ip-address "^10.0.1" smart-buffer "^4.2.0" sonic-boom@^4.0.1: @@ -8101,9 +8108,9 @@ spdx-expression-parse@^4.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.21" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" - integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== + version "3.0.22" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz#abf5a08a6f5d7279559b669f47f0a43e8f3464ef" + integrity sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ== split2@^3.0.0, split2@^3.2.2: version "3.2.2" @@ -8117,20 +8124,15 @@ split2@^4.0.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== srcset@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/srcset/-/srcset-5.0.1.tgz#e660a728f195419e4afa95121099bc9efb7a1e36" - integrity sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw== + version "5.0.2" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-5.0.2.tgz#153f05c66b818f787ac51a30ea63c1062f29081a" + integrity sha512-pucR5KmXL7uWI59sXE2nuodomLsfnIQDa5Fck0TooiyxsIx+JYGiFm+wFO7aaDvvl/43ipjUjAb5je7dcAwlzQ== stack-utils@^2.0.6: version "2.0.6" @@ -8376,10 +8378,10 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -thingies@^1.20.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1" - integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g== +thingies@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f" + integrity sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw== thread-stream@^3.0.0: version "3.1.0" @@ -8406,24 +8408,24 @@ tiny-jsonc@^1.0.2: integrity sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw== tinyglobby@^0.2.14, tinyglobby@^0.2.9: - version "0.2.14" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" - integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" + fdir "^6.5.0" + picomatch "^4.0.3" -tldts-core@^6.1.86: - version "6.1.86" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.86.tgz#a93e6ed9d505cb54c542ce43feb14c73913265d8" - integrity sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA== +tldts-core@^7.0.19: + version "7.0.19" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.19.tgz#9dd8a457a09b4e65c8266c029f1847fa78dead20" + integrity sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A== -tldts@^6.1.32: - version "6.1.86" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.86.tgz#087e0555b31b9725ee48ca7e77edc56115cd82f7" - integrity sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ== +tldts@^7.0.5: + version "7.0.19" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.19.tgz#84cd7a7f04e68ec93b93b106fac038c527b99368" + integrity sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA== dependencies: - tldts-core "^6.1.86" + tldts-core "^7.0.19" to-regex-range@^5.0.1: version "5.0.1" @@ -8433,21 +8435,21 @@ to-regex-range@^5.0.1: is-number "^7.0.0" tough-cookie@*: - version "5.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.2.tgz#66d774b4a1d9e12dc75089725af3ac75ec31bed7" - integrity sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A== + version "6.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-6.0.0.tgz#11e418b7864a2c0d874702bc8ce0f011261940e5" + integrity sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w== dependencies: - tldts "^6.1.32" + tldts "^7.0.5" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tree-dump@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.0.3.tgz#2f0e42e77354714418ed7ab44291e435ccdb0f80" - integrity sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg== +tree-dump@^1.0.3, tree-dump@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" + integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== trim-lines@^3.0.0: version "3.0.1" @@ -8683,10 +8685,10 @@ undici-types@~6.21.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== -undici-types@~7.10.0: - version "7.10.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350" - integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag== +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== unicorn-magic@^0.3.0: version "0.3.0" @@ -8694,9 +8696,9 @@ unicorn-magic@^0.3.0: integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== unist-util-is@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" - integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" + integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== dependencies: "@types/unist" "^3.0.0" @@ -8715,9 +8717,9 @@ unist-util-stringify-position@^4.0.0: "@types/unist" "^3.0.0" unist-util-visit-parents@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" - integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + version "6.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz#777df7fb98652ce16b4b7cd999d0a1a40efa3a02" + integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== dependencies: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" @@ -8741,10 +8743,10 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== +update-browserslist-db@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz#cfb4358afa08b3d5731a2ecd95eebf4ddef8033e" + integrity sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA== dependencies: escalade "^3.2.0" picocolors "^1.1.1" @@ -8925,7 +8927,7 @@ widest-line@^5.0.0: dependencies: string-width "^7.0.0" -wireit@^0.14.5: +wireit@^0.14.12: version "0.14.12" resolved "https://registry.yarnpkg.com/wireit/-/wireit-0.14.12.tgz#c35788b4be4a796a8d05d204ec7d3f5c4b355d71" integrity sha512-gNSd+nZmMo6cuICezYXRIayu6TSOeCSCDzjSF0q6g8FKDsRbdqrONrSZYzdk/uBISmRcv4vZtsno6GyGvdXwGA== @@ -9054,10 +9056,10 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.5.1, yaml@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" - integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== +yaml@^2.5.1, yaml@^2.8.1, yaml@^2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" + integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== yargs-parser@^18.1.2: version "18.1.3"