diff --git a/command-snapshot.json b/command-snapshot.json index f48911bf..ab354f76 100644 --- a/command-snapshot.json +++ b/command-snapshot.json @@ -184,7 +184,17 @@ "command": "agent:test:results", "flagAliases": [], "flagChars": ["d", "i", "o"], - "flags": ["api-version", "flags-dir", "job-id", "json", "output-dir", "result-format", "target-org", "verbose"], + "flags": [ + "api-version", + "flags-dir", + "job-id", + "json", + "output-dir", + "result-format", + "target-org", + "test-runner", + "verbose" + ], "plugin": "@salesforce/plugin-agent" }, { @@ -200,6 +210,7 @@ "output-dir", "result-format", "target-org", + "test-runner", "use-most-recent", "verbose", "wait" @@ -219,6 +230,7 @@ "output-dir", "result-format", "target-org", + "test-runner", "verbose", "wait" ], diff --git a/messages/agent.test.list.md b/messages/agent.test.list.md index 3df6961e..6166ee28 100644 --- a/messages/agent.test.list.md +++ b/messages/agent.test.list.md @@ -4,7 +4,7 @@ List the available agent tests in your org. # description -The command outputs a table with the name (API name) of each test along with its unique ID and the date it was created in the org. +The command outputs a table with the name (API name) of each test along with its unique ID, type ('agentforce-studio' or 'testing-center'), and the date it was created in the org. # examples diff --git a/messages/shared.md b/messages/shared.md index e007fadc..173e30cf 100644 --- a/messages/shared.md +++ b/messages/shared.md @@ -20,6 +20,14 @@ When enabled, includes detailed generated data (such as invoked actions) in the The generated data is in JSON format and includes the Apex classes or Flows that were invoked, the Salesforce objects that were touched, and so on. Use the JSON structure of this information to build the test case JSONPath expression when using custom evaluations. +# flags.test-runner.summary + +Explicitly specify which test runner to use (agentforce-studio or testing-center). + +# flags.test-runner.description + +By default, the command automatically detects which test runner to use based on the test definition metadata type in your org. Use this flag to explicitly specify the runner type. 'agentforce-studio' uses AiTestingDefinition metadata. 'testing-center' uses AiEvaluationDefinition metadata. + # error.invalidAgentType agentType must be either "customer" or "internal". Found: [%s] diff --git a/package.json b/package.json index ec3766b6..bf35251f 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,11 @@ "@inquirer/prompts": "^7.10.1", "@oclif/core": "^4", "@oclif/multi-stage-output": "^0.8.36", - "@salesforce/agents": "^1.4.0", + "@salesforce/agents": "^1.5.1", "@salesforce/core": "^8.28.3", "@salesforce/kit": "^3.2.6", "@salesforce/sf-plugins-core": "^12.2.6", - "@salesforce/source-deploy-retrieve": "^12.32.8", + "@salesforce/source-deploy-retrieve": "^12.35.3", "@salesforce/types": "^1.7.1", "ansis": "^3.3.2", "fast-xml-parser": "^5.7.1", diff --git a/schemas/agent-activate.json b/schemas/agent-activate.json index 5827721b..0422b6e7 100644 --- a/schemas/agent-activate.json +++ b/schemas/agent-activate.json @@ -12,8 +12,11 @@ "type": "number" } }, - "required": ["success", "version"], + "required": [ + "success", + "version" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-create.json b/schemas/agent-create.json index a6172a99..e9232db8 100644 --- a/schemas/agent-create.json +++ b/schemas/agent-create.json @@ -28,7 +28,11 @@ "type": "string" } }, - "required": ["botId", "botVersionId", "plannerId"], + "required": [ + "botId", + "botVersionId", + "plannerId" + ], "additionalProperties": false, "description": "If the agent was created with saveAgent=true, these are the IDs that make up an agent; Bot, BotVersion, and GenAiPlanner metadata." }, @@ -78,7 +82,11 @@ "type": "string" } }, - "required": ["inputName", "inputDataType", "inputDescription"], + "required": [ + "inputName", + "inputDataType", + "inputDescription" + ], "additionalProperties": false }, "minItems": 1, @@ -99,14 +107,24 @@ "type": "string" } }, - "required": ["outputName", "outputDataType", "outputDescription"], + "required": [ + "outputName", + "outputDataType", + "outputDescription" + ], "additionalProperties": false }, "minItems": 1, "maxItems": 1 } }, - "required": ["actionName", "exampleOutput", "actionDescription", "inputs", "outputs"], + "required": [ + "actionName", + "exampleOutput", + "actionDescription", + "inputs", + "outputs" + ], "additionalProperties": false }, "minItems": 1, @@ -122,7 +140,13 @@ "type": "string" } }, - "required": ["scope", "topic", "actions", "instructions", "classificationDescription"], + "required": [ + "scope", + "topic", + "actions", + "instructions", + "classificationDescription" + ], "additionalProperties": false }, "minItems": 1, @@ -135,11 +159,18 @@ } } }, - "required": ["agentDescription", "topics", "sampleUtterances"], + "required": [ + "agentDescription", + "topics", + "sampleUtterances" + ], "additionalProperties": false } }, - "required": ["agentDefinition", "isSuccess"] + "required": [ + "agentDefinition", + "isSuccess" + ] } } -} +} \ No newline at end of file diff --git a/schemas/agent-deactivate.json b/schemas/agent-deactivate.json index 5827721b..0422b6e7 100644 --- a/schemas/agent-deactivate.json +++ b/schemas/agent-deactivate.json @@ -12,8 +12,11 @@ "type": "number" } }, - "required": ["success", "version"], + "required": [ + "success", + "version" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-generate-agent__spec.json b/schemas/agent-generate-agent__spec.json index d18950f0..d389f667 100644 --- a/schemas/agent-generate-agent__spec.json +++ b/schemas/agent-generate-agent__spec.json @@ -47,7 +47,14 @@ "type": "string" } }, - "required": ["agentType", "companyDescription", "companyName", "isSuccess", "role", "topics"] + "required": [ + "agentType", + "companyDescription", + "companyName", + "isSuccess", + "role", + "topics" + ] }, "DraftAgentTopics": { "type": "array", @@ -61,7 +68,10 @@ "type": "string" } }, - "required": ["name", "description"], + "required": [ + "name", + "description" + ], "additionalProperties": false }, "minItems": 1, @@ -69,7 +79,11 @@ }, "AgentType": { "type": "string", - "enum": ["customer", "internal", "AGENT"] + "enum": [ + "customer", + "internal", + "AGENT" + ] } } -} +} \ No newline at end of file diff --git a/schemas/agent-generate-authoring__bundle.json b/schemas/agent-generate-authoring__bundle.json index 60ba9c5e..58c56df2 100644 --- a/schemas/agent-generate-authoring__bundle.json +++ b/schemas/agent-generate-authoring__bundle.json @@ -15,8 +15,12 @@ "type": "string" } }, - "required": ["agentPath", "metaXmlPath", "outputDir"], + "required": [ + "agentPath", + "metaXmlPath", + "outputDir" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-generate-template.json b/schemas/agent-generate-template.json index a7ea28da..a847bcad 100644 --- a/schemas/agent-generate-template.json +++ b/schemas/agent-generate-template.json @@ -12,8 +12,11 @@ "type": "string" } }, - "required": ["genAiPlannerBundlePath", "botTemplatePath"], + "required": [ + "genAiPlannerBundlePath", + "botTemplatePath" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-preview-end.json b/schemas/agent-preview-end.json index 9ce8737d..84c0bc25 100644 --- a/schemas/agent-preview-end.json +++ b/schemas/agent-preview-end.json @@ -12,8 +12,11 @@ "type": "string" } }, - "required": ["sessionId", "tracesPath"], + "required": [ + "sessionId", + "tracesPath" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-preview-send.json b/schemas/agent-preview-send.json index a731d993..df699672 100644 --- a/schemas/agent-preview-send.json +++ b/schemas/agent-preview-send.json @@ -27,8 +27,12 @@ "type": "string" } }, - "required": ["messages", "agentApiName", "sessionId"], + "required": [ + "messages", + "agentApiName", + "sessionId" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-preview-sessions.json b/schemas/agent-preview-sessions.json index 168f2e48..b4d0babb 100644 --- a/schemas/agent-preview-sessions.json +++ b/schemas/agent-preview-sessions.json @@ -23,13 +23,20 @@ "$ref": "#/definitions/SessionType" } }, - "required": ["agentId", "sessionId"], + "required": [ + "agentId", + "sessionId" + ], "additionalProperties": false } }, "SessionType": { "type": "string", - "enum": ["simulated", "live", "published"] + "enum": [ + "simulated", + "live", + "published" + ] } } -} +} \ No newline at end of file diff --git a/schemas/agent-preview-start.json b/schemas/agent-preview-start.json index b57d7a7d..a0d49890 100644 --- a/schemas/agent-preview-start.json +++ b/schemas/agent-preview-start.json @@ -12,8 +12,11 @@ "type": "string" } }, - "required": ["sessionId", "agentApiName"], + "required": [ + "sessionId", + "agentApiName" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-preview.json b/schemas/agent-preview.json index 617d82f7..feb4e009 100644 --- a/schemas/agent-preview.json +++ b/schemas/agent-preview.json @@ -6,4 +6,4 @@ "type": "null" } } -} +} \ No newline at end of file diff --git a/schemas/agent-test-create.json b/schemas/agent-test-create.json index e9d1333b..67f7dbeb 100644 --- a/schemas/agent-test-create.json +++ b/schemas/agent-test-create.json @@ -12,8 +12,11 @@ "type": "string" } }, - "required": ["path", "contents"], + "required": [ + "path", + "contents" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-test-list.json b/schemas/agent-test-list.json index 08d26e14..900974a3 100644 --- a/schemas/agent-test-list.json +++ b/schemas/agent-test-list.json @@ -57,4 +57,4 @@ "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-test-results.json b/schemas/agent-test-results.json index 50332090..522e3175 100644 --- a/schemas/agent-test-results.json +++ b/schemas/agent-test-results.json @@ -3,7 +3,14 @@ "$ref": "#/definitions/AgentTestResultsResult", "definitions": { "AgentTestResultsResult": { - "$ref": "#/definitions/AgentTestResultsResponse" + "anyOf": [ + { + "$ref": "#/definitions/AgentTestResultsResponse" + }, + { + "$ref": "#/definitions/AgentforceStudioTestResultsResponse" + } + ] }, "AgentTestResultsResponse": { "type": "object", @@ -30,12 +37,23 @@ } } }, - "required": ["status", "startTime", "subjectName", "testCases"], + "required": [ + "status", + "startTime", + "subjectName", + "testCases" + ], "additionalProperties": false }, "TestStatus": { "type": "string", - "enum": ["NEW", "IN_PROGRESS", "COMPLETED", "ERROR", "TERMINATED"] + "enum": [ + "NEW", + "IN_PROGRESS", + "COMPLETED", + "ERROR", + "TERMINATED" + ] }, "TestCaseResult": { "type": "object", @@ -56,7 +74,9 @@ "type": "string" } }, - "required": ["utterance"], + "required": [ + "utterance" + ], "additionalProperties": false }, "generatedData": { @@ -81,7 +101,13 @@ "type": "string" } }, - "required": ["actionsSequence", "invokedActions", "sessionId", "outcome", "topic"], + "required": [ + "actionsSequence", + "invokedActions", + "sessionId", + "outcome", + "topic" + ], "additionalProperties": false }, "testResults": { @@ -102,12 +128,22 @@ "type": "number" }, "result": { - "type": ["null", "string"], - "enum": [null, "PASS", "FAILURE"] + "type": [ + "null", + "string" + ], + "enum": [ + null, + "PASS", + "FAILURE" + ] }, "metricLabel": { "type": "string", - "enum": ["Accuracy", "Precision"] + "enum": [ + "Accuracy", + "Precision" + ] }, "metricExplainability": { "type": "string" @@ -146,8 +182,73 @@ "type": "number" } }, - "required": ["status", "startTime", "inputs", "generatedData", "testResults", "testNumber"], + "required": [ + "status", + "startTime", + "inputs", + "generatedData", + "testResults", + "testNumber" + ], + "additionalProperties": false + }, + "AgentforceStudioTestResultsResponse": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "testCases": { + "type": "array", + "items": { + "$ref": "#/definitions/AgentforceStudioTestCaseResult" + } + } + }, + "required": [ + "status", + "testCases" + ], + "additionalProperties": false + }, + "AgentforceStudioTestCaseResult": { + "type": "object", + "properties": { + "subjectResponse": { + "type": "string" + }, + "testNumber": { + "type": "number" + }, + "testScorerResults": { + "type": "array", + "items": { + "$ref": "#/definitions/TestScorerResult" + } + } + }, + "required": [ + "subjectResponse", + "testNumber", + "testScorerResults" + ], + "additionalProperties": false + }, + "TestScorerResult": { + "type": "object", + "properties": { + "scorerName": { + "type": "string" + }, + "scorerResponse": { + "type": "string" + } + }, + "required": [ + "scorerName", + "scorerResponse" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-test-resume.json b/schemas/agent-test-resume.json index 3b73ce7d..db4dd9d6 100644 --- a/schemas/agent-test-resume.json +++ b/schemas/agent-test-resume.json @@ -33,7 +33,10 @@ } } }, - "required": ["runId", "status"] + "required": [ + "runId", + "status" + ] }, { "type": "object", @@ -64,13 +67,49 @@ } } }, - "required": ["runId", "startTime", "status", "subjectName", "testCases"] + "required": [ + "runId", + "startTime", + "status", + "subjectName", + "testCases" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "status": { + "type": "string", + "const": "COMPLETED" + }, + "runId": { + "type": "string" + }, + "testCases": { + "type": "array", + "items": { + "$ref": "#/definitions/AgentforceStudioTestCaseResult" + } + } + }, + "required": [ + "runId", + "status", + "testCases" + ] } ] }, "TestStatus": { "type": "string", - "enum": ["NEW", "IN_PROGRESS", "COMPLETED", "ERROR", "TERMINATED"] + "enum": [ + "NEW", + "IN_PROGRESS", + "COMPLETED", + "ERROR", + "TERMINATED" + ] }, "TestCaseResult": { "type": "object", @@ -91,7 +130,9 @@ "type": "string" } }, - "required": ["utterance"], + "required": [ + "utterance" + ], "additionalProperties": false }, "generatedData": { @@ -116,7 +157,13 @@ "type": "string" } }, - "required": ["actionsSequence", "invokedActions", "sessionId", "outcome", "topic"], + "required": [ + "actionsSequence", + "invokedActions", + "sessionId", + "outcome", + "topic" + ], "additionalProperties": false }, "testResults": { @@ -137,12 +184,22 @@ "type": "number" }, "result": { - "type": ["null", "string"], - "enum": [null, "PASS", "FAILURE"] + "type": [ + "null", + "string" + ], + "enum": [ + null, + "PASS", + "FAILURE" + ] }, "metricLabel": { "type": "string", - "enum": ["Accuracy", "Precision"] + "enum": [ + "Accuracy", + "Precision" + ] }, "metricExplainability": { "type": "string" @@ -181,8 +238,54 @@ "type": "number" } }, - "required": ["status", "startTime", "inputs", "generatedData", "testResults", "testNumber"], + "required": [ + "status", + "startTime", + "inputs", + "generatedData", + "testResults", + "testNumber" + ], + "additionalProperties": false + }, + "AgentforceStudioTestCaseResult": { + "type": "object", + "properties": { + "subjectResponse": { + "type": "string" + }, + "testNumber": { + "type": "number" + }, + "testScorerResults": { + "type": "array", + "items": { + "$ref": "#/definitions/TestScorerResult" + } + } + }, + "required": [ + "subjectResponse", + "testNumber", + "testScorerResults" + ], + "additionalProperties": false + }, + "TestScorerResult": { + "type": "object", + "properties": { + "scorerName": { + "type": "string" + }, + "scorerResponse": { + "type": "string" + } + }, + "required": [ + "scorerName", + "scorerResponse" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-test-run.json b/schemas/agent-test-run.json index 3b73ce7d..db4dd9d6 100644 --- a/schemas/agent-test-run.json +++ b/schemas/agent-test-run.json @@ -33,7 +33,10 @@ } } }, - "required": ["runId", "status"] + "required": [ + "runId", + "status" + ] }, { "type": "object", @@ -64,13 +67,49 @@ } } }, - "required": ["runId", "startTime", "status", "subjectName", "testCases"] + "required": [ + "runId", + "startTime", + "status", + "subjectName", + "testCases" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "status": { + "type": "string", + "const": "COMPLETED" + }, + "runId": { + "type": "string" + }, + "testCases": { + "type": "array", + "items": { + "$ref": "#/definitions/AgentforceStudioTestCaseResult" + } + } + }, + "required": [ + "runId", + "status", + "testCases" + ] } ] }, "TestStatus": { "type": "string", - "enum": ["NEW", "IN_PROGRESS", "COMPLETED", "ERROR", "TERMINATED"] + "enum": [ + "NEW", + "IN_PROGRESS", + "COMPLETED", + "ERROR", + "TERMINATED" + ] }, "TestCaseResult": { "type": "object", @@ -91,7 +130,9 @@ "type": "string" } }, - "required": ["utterance"], + "required": [ + "utterance" + ], "additionalProperties": false }, "generatedData": { @@ -116,7 +157,13 @@ "type": "string" } }, - "required": ["actionsSequence", "invokedActions", "sessionId", "outcome", "topic"], + "required": [ + "actionsSequence", + "invokedActions", + "sessionId", + "outcome", + "topic" + ], "additionalProperties": false }, "testResults": { @@ -137,12 +184,22 @@ "type": "number" }, "result": { - "type": ["null", "string"], - "enum": [null, "PASS", "FAILURE"] + "type": [ + "null", + "string" + ], + "enum": [ + null, + "PASS", + "FAILURE" + ] }, "metricLabel": { "type": "string", - "enum": ["Accuracy", "Precision"] + "enum": [ + "Accuracy", + "Precision" + ] }, "metricExplainability": { "type": "string" @@ -181,8 +238,54 @@ "type": "number" } }, - "required": ["status", "startTime", "inputs", "generatedData", "testResults", "testNumber"], + "required": [ + "status", + "startTime", + "inputs", + "generatedData", + "testResults", + "testNumber" + ], + "additionalProperties": false + }, + "AgentforceStudioTestCaseResult": { + "type": "object", + "properties": { + "subjectResponse": { + "type": "string" + }, + "testNumber": { + "type": "number" + }, + "testScorerResults": { + "type": "array", + "items": { + "$ref": "#/definitions/TestScorerResult" + } + } + }, + "required": [ + "subjectResponse", + "testNumber", + "testScorerResults" + ], + "additionalProperties": false + }, + "TestScorerResult": { + "type": "object", + "properties": { + "scorerName": { + "type": "string" + }, + "scorerResponse": { + "type": "string" + } + }, + "required": [ + "scorerName", + "scorerResponse" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-test-run__eval.json b/schemas/agent-test-run__eval.json index f4094406..798f7f2c 100644 --- a/schemas/agent-test-run__eval.json +++ b/schemas/agent-test-run__eval.json @@ -25,7 +25,12 @@ "items": {} } }, - "required": ["id", "status", "evaluations", "outputs"], + "required": [ + "id", + "status", + "evaluations", + "outputs" + ], "additionalProperties": false } }, @@ -45,12 +50,20 @@ "type": "number" } }, - "required": ["passed", "failed", "scored", "errors"], + "required": [ + "passed", + "failed", + "scored", + "errors" + ], "additionalProperties": false } }, - "required": ["tests", "summary"], + "required": [ + "tests", + "summary" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/schemas/agent-validate-authoring__bundle.json b/schemas/agent-validate-authoring__bundle.json index 196ee052..57c40f53 100644 --- a/schemas/agent-validate-authoring__bundle.json +++ b/schemas/agent-validate-authoring__bundle.json @@ -15,8 +15,10 @@ } } }, - "required": ["success"], + "required": [ + "success" + ], "additionalProperties": false } } -} +} \ No newline at end of file diff --git a/src/agentTestCache.ts b/src/agentTestCache.ts index bdb17c1d..62d7ca28 100644 --- a/src/agentTestCache.ts +++ b/src/agentTestCache.ts @@ -16,6 +16,7 @@ import { Global, SfError, TTLConfig } from '@salesforce/core'; import { Duration } from '@salesforce/kit'; +import type { TestRunnerType } from '@salesforce/agents'; type ResultFormat = 'json' | 'human' | 'junit' | 'tap'; @@ -24,6 +25,7 @@ type CacheContents = { name: string; outputDir?: string; resultFormat?: ResultFormat; + runnerType?: TestRunnerType; }; export class AgentTestCache extends TTLConfig { @@ -45,11 +47,12 @@ export class AgentTestCache extends TTLConfig runId: string, name: string, outputDir?: string, - resultFormat?: ResultFormat + resultFormat?: ResultFormat, + runnerType?: TestRunnerType ): Promise { if (!runId) throw new SfError('runId is required to create a cache entry'); - this.set(runId, { runId, name, outputDir, resultFormat }); + this.set(runId, { runId, name, outputDir, resultFormat, runnerType }); await this.write(); } @@ -70,7 +73,7 @@ export class AgentTestCache extends TTLConfig public useIdOrMostRecent( runId: string | undefined, useMostRecent: boolean - ): { runId: string; name?: string; outputDir?: string; resultFormat?: ResultFormat } { + ): { runId: string; name?: string; outputDir?: string; resultFormat?: ResultFormat; runnerType?: TestRunnerType } { if (runId && useMostRecent) { throw new SfError('Cannot specify both a runId and use most recent flag'); } diff --git a/src/commands/agent/test/list.ts b/src/commands/agent/test/list.ts index b4382b7e..f52687f1 100644 --- a/src/commands/agent/test/list.ts +++ b/src/commands/agent/test/list.ts @@ -60,11 +60,17 @@ export default class AgentTestList extends SfCommand { ); } + const rows = results.map((r) => ({ + ...r, + type: r.type === 'AiEvaluationDefinition' ? 'testing-center' : 'agentforce-studio', + })); + this.table({ - data: results, + data: rows, columns: [ { key: 'fullName', name: 'API Name' }, { key: 'id', name: 'Id' }, + { key: 'type', name: 'Type' }, { key: 'createdDate', name: 'Created Date' }, ], sort: { fullName: 'asc' }, diff --git a/src/commands/agent/test/results.ts b/src/commands/agent/test/results.ts index 69cfe77e..0e74219f 100644 --- a/src/commands/agent/test/results.ts +++ b/src/commands/agent/test/results.ts @@ -16,14 +16,15 @@ import { SfCommand, Flags, toHelpSection } from '@salesforce/sf-plugins-core'; import { EnvironmentVariable, Messages, SfError } from '@salesforce/core'; -import { AgentTester, AgentTestResultsResponse } from '@salesforce/agents'; -import { resultFormatFlag, testOutputDirFlag, verboseFlag } from '../../../flags.js'; +import { AgentTestResultsResponse, AgentforceStudioTestResultsResponse } from '@salesforce/agents'; +import { resultFormatFlag, testOutputDirFlag, testRunnerFlag, verboseFlag } from '../../../flags.js'; import { handleTestResults } from '../../../handleTestResults.js'; +import { createTestRunner } from '../../../testRunnerFactory.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.test.results'); -export type AgentTestResultsResult = AgentTestResultsResponse; +export type AgentTestResultsResult = AgentTestResultsResponse | AgentforceStudioTestResultsResponse; export default class AgentTestResults extends SfCommand { public static readonly summary = messages.getMessage('summary'); @@ -51,13 +52,20 @@ export default class AgentTestResults extends SfCommand }), 'result-format': resultFormatFlag(), 'output-dir': testOutputDirFlag(), + 'test-runner': testRunnerFlag, verbose: verboseFlag, }; public async run(): Promise { const { flags } = await this.parse(AgentTestResults); - const agentTester = new AgentTester(flags['target-org'].getConnection(flags['api-version'])); + const connection = flags['target-org'].getConnection(flags['api-version']); + const { runner: agentTester } = await createTestRunner( + connection, + flags['test-runner'], + undefined, + flags['job-id'] + ); let response; try { diff --git a/src/commands/agent/test/resume.ts b/src/commands/agent/test/resume.ts index bca01e77..8cdce823 100644 --- a/src/commands/agent/test/resume.ts +++ b/src/commands/agent/test/resume.ts @@ -16,12 +16,18 @@ import { SfCommand, Flags, toHelpSection } from '@salesforce/sf-plugins-core'; import { EnvironmentVariable, Messages, SfError } from '@salesforce/core'; -import { AgentTester } from '@salesforce/agents'; import { CLIError } from '@oclif/core/errors'; import { AgentTestCache } from '../../../agentTestCache.js'; import { TestStages } from '../../../testStages.js'; -import { AgentTestRunResult, resultFormatFlag, testOutputDirFlag, verboseFlag } from '../../../flags.js'; +import { + AgentTestRunResult, + resultFormatFlag, + testOutputDirFlag, + testRunnerFlag, + verboseFlag, +} from '../../../flags.js'; import { handleTestResults } from '../../../handleTestResults.js'; +import { createTestRunner } from '../../../testRunnerFactory.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.test.resume'); @@ -65,6 +71,7 @@ export default class AgentTestResume extends SfCommand { }), 'result-format': resultFormatFlag(), 'output-dir': testOutputDirFlag(), + 'test-runner': testRunnerFlag, verbose: verboseFlag, }; @@ -78,6 +85,7 @@ export default class AgentTestResume extends SfCommand { let runId; let outputDir; let resultFormat; + let cachedRunnerType; try { const cacheEntry = agentTestCache.useIdOrMostRecent(flags['job-id'], flags['use-most-recent']); @@ -85,6 +93,7 @@ export default class AgentTestResume extends SfCommand { runId = cacheEntry.runId; outputDir = cacheEntry.outputDir; resultFormat = cacheEntry.resultFormat; + cachedRunnerType = cacheEntry.runnerType; } catch (e) { const wrapped = SfError.wrap(e); @@ -105,7 +114,15 @@ export default class AgentTestResume extends SfCommand { jsonEnabled: this.jsonEnabled(), }); this.mso.start({ id: runId }); - const agentTester = new AgentTester(flags['target-org'].getConnection(flags['api-version'])); + + // Use explicit flag > cached runner type > ID prefix detection > org metadata query + const connection = flags['target-org'].getConnection(flags['api-version']); + const { runner: agentTester } = await createTestRunner( + connection, + flags['test-runner'] ?? cachedRunnerType, + name, + runId + ); let completed; let response; @@ -139,12 +156,17 @@ export default class AgentTestResume extends SfCommand { // Set exit code to 1 only for execution errors (tests couldn't run properly) // Test assertion failures are business logic and should not affect exit code - if (response?.testCases.some((tc) => tc.status === 'ERROR')) { + // Only applicable to legacy responses (Agentforce Studio doesn't have test case status) + if ( + response && + 'subjectName' in response && + response.testCases.some((tc) => 'status' in tc && tc.status === 'ERROR') + ) { process.exitCode = 1; } // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion - return { ...response!, runId, status: 'COMPLETED' }; + return { ...response!, runId, status: 'COMPLETED' } as AgentTestRunResult; } protected catch(error: Error | SfError | CLIError): Promise { diff --git a/src/commands/agent/test/run.ts b/src/commands/agent/test/run.ts index 330223c6..75c90444 100644 --- a/src/commands/agent/test/run.ts +++ b/src/commands/agent/test/run.ts @@ -16,21 +16,24 @@ import { SfCommand, Flags, toHelpSection } from '@salesforce/sf-plugins-core'; import { EnvironmentVariable, Messages, SfError } from '@salesforce/core'; -import { AgentTester, AgentTestStartResponse } from '@salesforce/agents'; +import { AgentTestStartResponse, AgentforceStudioTestStartResponse } from '@salesforce/agents'; import { colorize } from '@oclif/core/ux'; import { CLIError } from '@oclif/core/errors'; import { AgentTestRunResult, FlaggablePrompt, makeFlags, - promptForAiEvaluationDefinitionApiName, + promptForTestDefinitionApiName, resultFormatFlag, testOutputDirFlag, + testRunnerFlag, verboseFlag, + type TestDefinitionSelection, } from '../../../flags.js'; import { AgentTestCache } from '../../../agentTestCache.js'; import { TestStages } from '../../../testStages.js'; import { handleTestResults } from '../../../handleTestResults.js'; +import { createTestRunner } from '../../../testRunnerFactory.js'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.test.run'); @@ -88,6 +91,7 @@ export default class AgentTestRun extends SfCommand { }), 'result-format': resultFormatFlag(), 'output-dir': testOutputDirFlag(), + 'test-runner': testRunnerFlag, verbose: verboseFlag, }; @@ -101,14 +105,26 @@ export default class AgentTestRun extends SfCommand { throw messages.createError('error.missingRequiredFlags', ['api-name']); } - const apiName = - flags['api-name'] ?? (await promptForAiEvaluationDefinitionApiName(FLAGGABLE_PROMPTS['api-name'], connection)); + let apiName: string; + let promptedTestRunner: TestDefinitionSelection['testRunner']; + if (flags['api-name']) { + apiName = flags['api-name']; + } else { + const selection = await promptForTestDefinitionApiName(FLAGGABLE_PROMPTS['api-name'], connection); + apiName = selection.apiName; + promptedTestRunner = selection.testRunner; + } this.mso = new TestStages({ title: `Agent Test Run: ${apiName}`, jsonEnabled: this.jsonEnabled() }); this.mso.start(); - const agentTester = new AgentTester(connection); - let response: AgentTestStartResponse; + const { runner: agentTester, type: runnerType } = await createTestRunner( + connection, + flags['test-runner'] ?? promptedTestRunner, + apiName + ); + + let response: AgentTestStartResponse | AgentforceStudioTestStartResponse; try { response = await agentTester.start(apiName); } catch (e) { @@ -117,7 +133,8 @@ export default class AgentTestRun extends SfCommand { // Check for test definition not found if ( wrapped.message.includes('Invalid AiEvalDefinitionVersion identifier') || - wrapped.message.toLowerCase().includes('not found') + wrapped.message.toLowerCase().includes('not found') || + wrapped.message.includes('Failed to run test suite') ) { throw new SfError( `Test definition '${apiName}' not found.`, @@ -135,7 +152,13 @@ export default class AgentTestRun extends SfCommand { this.mso.update({ id: response.runId }); const agentTestCache = await AgentTestCache.create(); - await agentTestCache.createCacheEntry(response.runId, apiName, flags['output-dir'], flags['result-format']); + await agentTestCache.createCacheEntry( + response.runId, + apiName, + flags['output-dir'], + flags['result-format'], + runnerType + ); if (flags.wait?.minutes) { let completed; @@ -170,12 +193,16 @@ export default class AgentTestRun extends SfCommand { // Set exit code to 1 only for execution errors (tests couldn't run properly) // Test assertion failures are business logic and should not affect exit code - if (detailsResponse?.testCases.some((tc) => tc.status === 'ERROR')) { + // Only applicable to legacy responses (Agentforce Studio doesn't have test case status) + if ( + detailsResponse && + 'subjectName' in detailsResponse && + detailsResponse.testCases.some((tc) => 'status' in tc && tc.status === 'ERROR') + ) { process.exitCode = 1; } - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion - return { ...detailsResponse!, status: 'COMPLETED', runId: response.runId }; + return { ...detailsResponse, status: 'COMPLETED', runId: response.runId } as AgentTestRunResult; } else { this.mso.stop(); this.log( diff --git a/src/flags.ts b/src/flags.ts index bc627118..1b6a337c 100644 --- a/src/flags.ts +++ b/src/flags.ts @@ -68,6 +68,12 @@ export const verboseFlag = Flags.boolean({ description: messages.getMessage('flags.verbose.description'), }); +export const testRunnerFlag = Flags.custom<'agentforce-studio' | 'testing-center'>({ + options: ['agentforce-studio', 'testing-center'], + summary: messages.getMessage('flags.test-runner.summary'), + description: messages.getMessage('flags.test-runner.description'), +})(); + function validateInput(input: string, validate: (input: string) => boolean | string): never | string { const result = validate(input); if (typeof result === 'string') throw new Error(result); @@ -128,12 +134,33 @@ export function traverseForFiles(dirOrDirs: string | string[], suffixes: string[ return results; } -export const promptForAiEvaluationDefinitionApiName = async ( +export type TestDefinitionSelection = { + apiName: string; + testRunner?: 'agentforce-studio' | 'testing-center'; +}; + +export const promptForTestDefinitionApiName = async ( flagDef: FlaggablePrompt, connection: Connection -): Promise => { +): Promise => { const aiDefFiles = await AgentTest.list(connection); + const duplicateNames = new Set( + aiDefFiles + .filter((o, i) => aiDefFiles.some((other, j) => i !== j && o.fullName === other.fullName)) + .map((o) => o.fullName) + ); + + // Map each entry to a value that encodes the runner type for duplicates + const choicesByValue = new Map( + aiDefFiles.map((o) => { + const runner: 'agentforce-studio' | 'testing-center' = + o.type === 'AiEvaluationDefinition' ? 'testing-center' : 'agentforce-studio'; + const valueKey = duplicateNames.has(o.fullName) ? `${o.fullName}::${runner}` : o.fullName; + return [valueKey, { apiName: o.fullName, testRunner: duplicateNames.has(o.fullName) ? runner : undefined }]; + }) + ); + let id: NodeJS.Timeout; const timeout = new Promise((_, reject) => { id = setTimeout(() => { @@ -146,16 +173,19 @@ export const promptForAiEvaluationDefinitionApiName = async ( 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 })); + const arr = [...choicesByValue.entries()].map(([valueKey, { apiName, testRunner }]) => ({ + name: testRunner ? `${apiName} (${testRunner})` : apiName, + value: valueKey, + })); if (!input) return arr; return arr.filter((o) => o.name.includes(input)); }, }), timeout, - ]).then((result) => { + ]).then((valueKey) => { clearTimeout(id); - return result as string; + return choicesByValue.get(valueKey as string) ?? { apiName: valueKey as string }; }); }; diff --git a/src/handleTestResults.ts b/src/handleTestResults.ts index e859037c..2055a174 100644 --- a/src/handleTestResults.ts +++ b/src/handleTestResults.ts @@ -16,11 +16,24 @@ import { join } from 'node:path'; import { stripVTControlCharacters } from 'node:util'; import { writeFile, mkdir } from 'node:fs/promises'; -import { AgentTestResultsResponse, convertTestResultsToFormat, humanFriendlyName, metric } from '@salesforce/agents'; +import { + AgentTestResultsResponse, + AgentforceStudioTestResultsResponse, + convertTestResultsToFormat, + humanFriendlyName, + metric, +} from '@salesforce/agents'; +import { XMLBuilder } from 'fast-xml-parser'; import { Ux } from '@salesforce/sf-plugins-core/Ux'; import { ux as ocux } from '@oclif/core'; import ansis from 'ansis'; +type TestResultsResponse = AgentTestResultsResponse | AgentforceStudioTestResultsResponse; + +function isLegacyResponse(response: TestResultsResponse): response is AgentTestResultsResponse { + return 'subjectName' in response; +} + async function writeFileToDir(outputDir: string, fileName: string, content: string): Promise { // if directory doesn't exist, create it await mkdir(outputDir, { recursive: true }); @@ -55,11 +68,6 @@ export function readableTime(time: number, decimalPlaces = 2): string { return '< 1s'; } - // if time < 1000ms, return time in ms - if (time < 1000) { - return `${time}ms`; - } - // if time < 60s, return time in seconds if (time < 60_000) { return `${truncate(time / 1000, decimalPlaces)}s`; @@ -78,6 +86,148 @@ export function readableTime(time: number, decimalPlaces = 2): string { return `${hours}h ${minutes}m`; } +type ParsedScorerResponse = { + status?: string; + score?: number; + reasoning?: string; + actualValue?: string; + expectedValue?: string; +}; + +function parseScorerResponse(raw: string): ParsedScorerResponse { + try { + return JSON.parse(raw) as ParsedScorerResponse; + } catch { + return {}; + } +} + +function humanFormatAgentforceStudio(results: AgentforceStudioTestResultsResponse): string { + const ux = new Ux(); + const tables: string[] = []; + + for (const testCase of results.testCases) { + let userInput = ''; + try { + const parsed = JSON.parse(testCase.subjectResponse) as { userInput?: string }; + userInput = parsed.userInput ?? ''; + } catch { + // ignore + } + + const scorerRows = testCase.testScorerResults.map((scorer) => { + const parsed = parseScorerResponse(scorer.scorerResponse); + return { + scorer: scorer.scorerName, + result: parsed.status === 'PASS' ? ansis.green('Pass') : ansis.red('Fail'), + expected: parsed.expectedValue ?? '', + actual: parsed.actualValue ?? '', + reasoning: parsed.reasoning ?? '', + }; + }); + + tables.push( + ux.makeTable({ + title: `${ansis.bold(`Test Case #${testCase.testNumber}`)}\n${ansis.dim('User Input')}: ${userInput}`, + overflow: 'wrap', + columns: [ + { key: 'scorer', name: 'Scorer' }, + { key: 'result', name: 'Result' }, + { key: 'expected', name: 'Expected', width: '25%' }, + { key: 'actual', name: 'Actual', width: '25%' }, + { key: 'reasoning', name: 'Reasoning', width: '35%' }, + ], + data: scorerRows, + width: '100%', + }) + ); + tables.push('\n'); + } + + const totalCases = results.testCases.length; + const passCases = results.testCases.filter((tc) => + tc.testScorerResults.every((s) => parseScorerResponse(s.scorerResponse).status === 'PASS') + ).length; + + const summary = makeSimpleTable( + { + Status: results.status, + 'Total Test Cases': String(totalCases), + 'Passing Test Cases': String(passCases), + 'Failing Test Cases': String(totalCases - passCases), + }, + ansis.bold.blue('Test Results') + ); + + return tables.join('') + `\n${summary}\n`; +} + +function junitFormatAgentforceStudio(results: AgentforceStudioTestResultsResponse): string { + const builder = new XMLBuilder({ format: true, attributeNamePrefix: '$', ignoreAttributes: false }); + const testCount = results.testCases.length; + const failureCount = results.testCases.filter((tc) => + tc.testScorerResults.some((s) => parseScorerResponse(s.scorerResponse).status !== 'PASS') + ).length; + + const suites = builder.build({ + testsuites: { + $name: 'AgentforceStudioTest', + $tests: testCount, + $failures: failureCount, + property: [{ $name: 'status', $value: results.status }], + testsuite: results.testCases.map((tc) => ({ + $name: tc.testNumber, + $assertions: tc.testScorerResults.length, + failure: tc.testScorerResults + .map((s) => { + const parsed = parseScorerResponse(s.scorerResponse); + if (parsed.status !== 'PASS') { + return { $message: parsed.reasoning ?? 'Unknown error', $name: s.scorerName }; + } + }) + .filter(Boolean), + })), + }, + }); + + return `\n${suites}`.trim(); +} + +function tapFormatAgentforceStudio(results: AgentforceStudioTestResultsResponse): string { + const lines: string[] = []; + let expectationCount = 0; + + for (const tc of results.testCases) { + for (const scorer of tc.testScorerResults) { + const parsed = parseScorerResponse(scorer.scorerResponse); + const pass = parsed.status === 'PASS'; + expectationCount++; + lines.push(`${pass ? 'ok' : 'not ok'} ${expectationCount} ${tc.testNumber}.${scorer.scorerName}`); + if (!pass) { + lines.push(' ---'); + lines.push(` message: ${parsed.reasoning ?? 'Unknown error'}`); + lines.push(` scorer: ${scorer.scorerName}`); + lines.push(` actual: ${parsed.actualValue ?? ''}`); + lines.push(` expected: ${parsed.expectedValue ?? ''}`); + lines.push(' ...'); + } + } + } + + return `TAP version 13\n1..${expectationCount}\n${lines.join('\n')}`; +} + +function convertAgentforceStudioTestResultsToFormat(results: AgentforceStudioTestResultsResponse, format: 'json' | 'junit' | 'tap'): string { + switch (format) { + case 'json': + return JSON.stringify(results, null, 2); + case 'junit': + return junitFormatAgentforceStudio(results); + case 'tap': + return tapFormatAgentforceStudio(results); + } +} + export function humanFormat(results: AgentTestResultsResponse, verbose = false): string { const ux = new Ux(); @@ -227,7 +377,7 @@ export async function handleTestResults({ }: { id: string; format: 'human' | 'json' | 'junit' | 'tap'; - results: AgentTestResultsResponse | undefined; + results: TestResultsResponse | undefined; jsonEnabled: boolean; outputDir?: string; verbose?: boolean; @@ -239,6 +389,26 @@ export async function handleTestResults({ const ux = new Ux({ jsonEnabled }); + if (!isLegacyResponse(results)) { + const ngtFormatConfig = { + human: { ext: 'txt', label: 'human-readable', get: () => humanFormatAgentforceStudio(results), strip: true }, + json: { ext: 'json', label: 'JSON', get: () => convertAgentforceStudioTestResultsToFormat(results, 'json'), strip: false }, + junit: { ext: 'xml', label: 'JUnit', get: () => convertAgentforceStudioTestResultsToFormat(results, 'junit'), strip: false }, + tap: { ext: 'txt', label: 'TAP', get: () => convertAgentforceStudioTestResultsToFormat(results, 'tap'), strip: false }, + } as const; + const cfg = ngtFormatConfig[format]; + const formatted = cfg.get(); + if (outputDir) { + const file = `test-result-${id}.${cfg.ext}`; + await writeFileToDir(outputDir, file, cfg.strip ? stripVTControlCharacters(formatted) : formatted); + ux.log(`Created ${cfg.label} file at ${join(outputDir, file)}`); + } else { + ux.log(formatted); + } + return; + } + + // Legacy response formatting if (format === 'human') { const formatted = humanFormat(results, verbose); if (outputDir) { diff --git a/src/testRunnerFactory.ts b/src/testRunnerFactory.ts new file mode 100644 index 00000000..28c5d127 --- /dev/null +++ b/src/testRunnerFactory.ts @@ -0,0 +1,43 @@ +/* + * Copyright 2026, 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, SfError } from '@salesforce/core'; +import { createAgentTester, AgentTester, AgentforceStudioTester, type TestRunnerType } from '@salesforce/agents'; + +export type TestRunnerInstance = AgentTester | AgentforceStudioTester; + +export async function createTestRunner( + connection: Connection, + explicitType?: TestRunnerType, + testDefinitionName?: string, + runId?: string +): Promise<{ runner: TestRunnerInstance; type: TestRunnerType }> { + try { + return await createAgentTester(connection, { explicitType, runId, testDefinitionName }); + } catch (e) { + const wrapped = SfError.wrap(e); + if (wrapped.name === 'AmbiguousTestDefinition') { + throw new SfError( + wrapped.message, + wrapped.name, + ['Use --test-runner to explicitly specify the runner type (agentforce-studio or testing-center)'], + undefined, + wrapped + ); + } + throw wrapped; + } +} diff --git a/src/testStages.ts b/src/testStages.ts index 5eff2def..958e37cb 100644 --- a/src/testStages.ts +++ b/src/testStages.ts @@ -16,10 +16,11 @@ import { colorize } from '@oclif/core/ux'; import { MultiStageOutput } from '@oclif/multi-stage-output'; -import { AgentTestResultsResponse, AgentTester } from '@salesforce/agents'; +import { AgentTestResultsResponse, AgentforceStudioTestResultsResponse } from '@salesforce/agents'; import { Lifecycle } from '@salesforce/core'; import { Duration } from '@salesforce/kit'; import { Ux } from '@salesforce/sf-plugins-core'; +import type { TestRunnerInstance } from './testRunnerFactory.js'; type Data = { id: string; @@ -86,10 +87,10 @@ export class TestStages { } public async poll( - agentTester: AgentTester, + agentTester: TestRunnerInstance, id: string, wait: Duration - ): Promise<{ completed: boolean; response?: AgentTestResultsResponse }> { + ): Promise<{ completed: boolean; response?: AgentTestResultsResponse | AgentforceStudioTestResultsResponse }> { this.mso.skipTo('Polling for Test Results'); const lifecycle = Lifecycle.getInstance(); lifecycle.on( diff --git a/test/common.test.ts b/test/common.test.ts new file mode 100644 index 00000000..25ec52bb --- /dev/null +++ b/test/common.test.ts @@ -0,0 +1,141 @@ +/* + * Copyright 2026, 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 { throwAgentCompilationError, COMPILATION_API_EXIT_CODES } from '../src/common.js'; + +describe('common', () => { + describe('COMPILATION_API_EXIT_CODES', () => { + it('should re-export COMPILATION_API_EXIT_CODES from @salesforce/agents', () => { + expect(COMPILATION_API_EXIT_CODES).to.be.an('object'); + }); + }); + + describe('throwAgentCompilationError', () => { + it('should throw SfError with unknown error message when given empty array', () => { + try { + throwAgentCompilationError([]); + expect.fail('Expected error to be thrown'); + } catch (e) { + expect(e).to.be.instanceOf(SfError); + expect((e as SfError).name).to.equal('CompileAgentScriptError'); + expect((e as SfError).message).to.equal('Unknown compilation error occurred'); + expect((e as SfError).exitCode).to.equal(1); + } + }); + + it('should throw SfError with formatted error message for single error', () => { + const errors: CompilationError[] = [ + { + errorType: 'SyntaxError', + description: 'Unexpected token', + lineStart: 5, + colStart: 10, + lineEnd: 5, + colEnd: 15, + }, + ]; + + try { + throwAgentCompilationError(errors); + expect.fail('Expected error to be thrown'); + } catch (e) { + expect(e).to.be.instanceOf(SfError); + expect((e as SfError).message).to.equal('SyntaxError: Unexpected token [Ln 5, Col 10]'); + expect((e as SfError).exitCode).to.equal(1); + } + }); + + it('should join multiple errors with EOL separator', () => { + const errors: CompilationError[] = [ + { + errorType: 'SyntaxError', + description: 'Unexpected token', + lineStart: 5, + colStart: 10, + lineEnd: 5, + colEnd: 15, + }, + { + errorType: 'TypeError', + description: 'Cannot read property', + lineStart: 12, + colStart: 3, + lineEnd: 12, + colEnd: 20, + }, + ]; + + try { + throwAgentCompilationError(errors); + expect.fail('Expected error to be thrown'); + } catch (e) { + expect(e).to.be.instanceOf(SfError); + const msg = (e as SfError).message; + expect(msg).to.include('SyntaxError: Unexpected token [Ln 5, Col 10]'); + expect(msg).to.include('TypeError: Cannot read property [Ln 12, Col 3]'); + } + }); + + it('should always set exitCode to 1', () => { + const errors: CompilationError[] = [ + { errorType: 'AnyError', description: 'Something failed', lineStart: 1, colStart: 1, lineEnd: 1, colEnd: 5 }, + ]; + + try { + throwAgentCompilationError(errors); + expect.fail('Expected error to be thrown'); + } catch (e) { + expect((e as SfError).exitCode).to.equal(1); + } + }); + + it('should always set error name to CompileAgentScriptError', () => { + try { + throwAgentCompilationError([]); + expect.fail('Expected error to be thrown'); + } catch (e) { + expect((e as SfError).name).to.equal('CompileAgentScriptError'); + } + }); + + it('should include errors array in data for non-empty input', () => { + const errors: CompilationError[] = [ + { errorType: 'SyntaxError', description: 'Bad token', lineStart: 1, colStart: 1, lineEnd: 1, colEnd: 5 }, + ]; + + try { + throwAgentCompilationError(errors); + expect.fail('Expected error to be thrown'); + } catch (e) { + const sfErr = e as SfError; + expect(sfErr.data).to.deep.equal({ errors }); + } + }); + + it('should include empty array in data for empty input', () => { + try { + throwAgentCompilationError([]); + expect.fail('Expected error to be thrown'); + } catch (e) { + const sfErr = e as SfError; + expect(sfErr.data).to.deep.equal([]); + } + }); + }); +}); diff --git a/test/nuts/z4.agent.test.AFS.nut.ts b/test/nuts/z4.agent.test.AFS.nut.ts new file mode 100644 index 00000000..186f2f1d --- /dev/null +++ b/test/nuts/z4.agent.test.AFS.nut.ts @@ -0,0 +1,256 @@ +/* + * Copyright 2026, 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 { writeFileSync, mkdirSync } from 'node:fs'; +import { join } from 'node:path'; +import { expect } from 'chai'; +import { execCmd, Duration, TestSession } from '@salesforce/cli-plugins-testkit'; +import { ComponentSetBuilder } from '@salesforce/source-deploy-retrieve'; +import { Agent } from '@salesforce/agents'; +import { Org } from '@salesforce/core'; +import { AgentTestCache } from '../../src/agentTestCache.js'; +import type { AgentTestListResult } from '../../src/commands/agent/test/list.js'; +import type { AgentTestResultsResult } from '../../src/commands/agent/test/results.js'; +import type { AgentTestRunResult } from '../../src/flags.js'; +import { getTestSession, getUsername } from './shared-setup.js'; + +/* eslint-disable no-console */ + +// Agentforce Studio (AiTestingDefinition) NUTs. +// Depends on z2 having published a Test_Agent_* agent. The before() hook discovers that +// agent, writes an AiTestingDefinition with the correct subjectName, and deploys it. +describe('agent test (agentforce-studio)', function () { + this.timeout(30 * 60 * 1000); + + let session: TestSession; + let afsTestName: string; + + before(async function () { + this.timeout(30 * 60 * 1000); + session = await getTestSession(); + + const org = await Org.create({ aliasOrUsername: getUsername() }); + const connection = org.getConnection(); + + // Find the agent published in z2 + const publishedAgent = (await Agent.listRemote(connection)).find((a) => a.DeveloperName?.startsWith('Test_Agent_')); + if (!publishedAgent?.DeveloperName) { + throw new Error('No published Test_Agent_* found — ensure z2.agent.publish.nut runs first'); + } + + const agentName = publishedAgent.DeveloperName; + afsTestName = `${agentName}_AFS_Test`; + console.log(`Using agent '${agentName}', test definition '${afsTestName}'`); + + // Write AiTestingDefinition metadata file + const metaDir = join(session.project.dir, 'force-app', 'main', 'default', 'aiTestingDefinitions'); + mkdirSync(metaDir, { recursive: true }); + + const metaXml = ` + + AFS NUT test for ${agentName} + ${afsTestName} + ${agentName} + AGENT + v1 + + + Hi, can you tell me what your return or refund policy is? Please include citations in the answer, and use this citations URL: https://help.example.com/citations. + + 1 + + GeneralFAQ + topic_sequence_match + + + ['AnswerQuestionsWithKnowledge'] + action_sequence_match + + + I can help with that. Here's what I found in our knowledge base about the return/refund policy. + bot_response_rating + + + conciseness + + + coherence + + + output_latency_milliseconds + + + completeness + + + + + Hey, I need help with something important—can you take care of it for me? + + 2 + + ambiguous_question + topic_sequence_match + + + conciseness + + + coherence + + + output_latency_milliseconds + + + completeness + + + +`; + writeFileSync(join(metaDir, `${afsTestName}.aiTestingDefinition-meta.xml`), metaXml, 'utf8'); + console.log(`Wrote AiTestingDefinition metadata to ${metaDir}`); + + // Deploy the definition + const cs = await ComponentSetBuilder.build({ + sourcepath: [metaDir], + }); + const deploy = await cs.deploy({ usernameOrConnection: getUsername() }); + const deployResult = await deploy.pollStatus({ frequency: Duration.seconds(10), timeout: Duration.minutes(10) }); + if (!deployResult.response.success) { + const failures = deployResult.response.details?.componentFailures; + const msgs = (Array.isArray(failures) ? failures : failures ? [failures] : []) + .map((f) => `${f.problemType}: ${f.problem}`) + .join('\n'); + throw new Error(`Deploy of AiTestingDefinition failed:\n${msgs}`); + } + console.log(`Deployed AiTestingDefinition '${afsTestName}'`); + }); + + // Set by the run test, consumed by the results tests (Mocha runs describes sequentially) + let completedRunId: string; + + describe('agent test list', () => { + it('should include the AFS test definition in list', async () => { + const result = execCmd(`agent test list --target-org ${getUsername()} --json`, { + ensureExitCode: 0, + }).jsonOutput?.result; + expect(result).to.be.ok; + const afsDefs = result?.filter((r) => r.type?.includes('AiTestingDefinition')); + expect(afsDefs?.length).to.be.greaterThanOrEqual(1); + expect(afsDefs?.some((r) => r.fullName === afsTestName)).to.be.true; + }); + }); + + describe('agent test run', () => { + it('should run with --wait, auto-detect agentforce-studio, and return AFS result shape', function () { + this.timeout(30 * 60 * 1000); + const output = execCmd( + `agent test run --api-name ${afsTestName} --target-org ${getUsername()} --wait 10 --json`, + { ensureExitCode: 0 } + ).jsonOutput; + + expect(output?.result.status).to.equal('COMPLETED'); + expect(output?.result.runId.startsWith('3A2')).to.be.true; + const result = output?.result as AgentTestRunResult & { testCases?: unknown[] }; + expect(result?.testCases).to.be.an('array'); + expect(result).to.not.have.property('subjectName'); + + completedRunId = output!.result.runId; + }); + }); + + describe('agent test results', () => { + it('should fetch AFS results by job ID (json)', async () => { + const output = execCmd( + `agent test results --job-id ${completedRunId} --target-org ${getUsername()} --json`, + { ensureExitCode: 0 } + ).jsonOutput; + + const result = output?.result as { status: string; testCases?: unknown[] }; + expect(result?.status).to.be.a('string'); + expect(result?.testCases).to.be.an('array'); + expect(output?.result).to.not.have.property('subjectName'); + }); + + it('should support human result format', () => { + const output = execCmd( + `agent test results --job-id ${completedRunId} --result-format human --target-org ${getUsername()}`, + { ensureExitCode: 0 } + ); + expect(output.shellOutput.stdout).to.be.a('string').with.length.greaterThan(0); + }); + + it('should support junit result format', () => { + const output = execCmd( + `agent test results --job-id ${completedRunId} --result-format junit --target-org ${getUsername()}`, + { ensureExitCode: 0 } + ); + expect(output.shellOutput.stdout).to.include(' { + const output = execCmd( + `agent test results --job-id ${completedRunId} --result-format tap --target-org ${getUsername()}`, + { ensureExitCode: 0 } + ); + expect(output.shellOutput.stdout).to.include('TAP version 13'); + }); + }); + + describe('agent test resume', () => { + it('should start async then resume by job ID, and support --use-most-recent', async () => { + // Clear any stale entries before the run + const cacheBefore = await AgentTestCache.create(); + cacheBefore.clear(); + await cacheBefore.write(); + + // One async start covers both resume paths + const runResult = execCmd( + `agent test run --api-name ${afsTestName} --target-org ${getUsername()} --json`, + { ensureExitCode: 0 } + ).jsonOutput; + + expect(runResult?.result.runId.startsWith('3A2')).to.be.true; + expect(runResult?.result.status).to.equal('NEW'); + + // Re-read from disk — the run command wrote the cache entry in a subprocess + const cache = await AgentTestCache.create(); + expect(cache.resolveFromCache().runnerType).to.equal('agentforce-studio'); + + const output = execCmd( + `agent test resume --job-id ${runResult?.result.runId} --target-org ${getUsername()} --json`, + { ensureExitCode: 0 } + ).jsonOutput; + + expect(output?.result.status).to.equal('COMPLETED'); + expect(output?.result.runId.startsWith('3A2')).to.be.true; + + // Re-read from disk — resume removes the entry in a subprocess + const cacheAfter = await AgentTestCache.create(); + expect(() => cacheAfter.resolveFromCache()).to.throw('Could not find a runId to resume'); + }); + }); + + describe('error handling', () => { + it('should return exit code 2 for a non-existent AFS test definition', () => { + execCmd( + `agent test run --api-name NonExistent_AFS_Test_XYZ --test-runner agentforce-studio --target-org ${getUsername()} --json`, + { ensureExitCode: 2 } + ); + }); + }); +}); diff --git a/test/testRunnerFactory.test.ts b/test/testRunnerFactory.test.ts new file mode 100644 index 00000000..1c1ebb96 --- /dev/null +++ b/test/testRunnerFactory.test.ts @@ -0,0 +1,128 @@ +/* + * Copyright 2026, 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 sinon from 'sinon'; +import esmock from 'esmock'; +import { SfError } from '@salesforce/core'; +import type { Connection } from '@salesforce/core'; +import type { TestRunnerType } from '@salesforce/agents'; +import type { createTestRunner as CreateTestRunnerFn } from '../src/testRunnerFactory.js'; + +type MockConnection = Pick; +const makeMockConnection = (): MockConnection => ({ instanceUrl: 'https://test.salesforce.com' }); + +describe('testRunnerFactory', () => { + let createAgentTesterStub: sinon.SinonStub; + let createTestRunner: typeof CreateTestRunnerFn; + + beforeEach(async () => { + createAgentTesterStub = sinon.stub(); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + const { createTestRunner: fn } = await esmock('../src/testRunnerFactory.js', { + '@salesforce/agents': { + createAgentTester: createAgentTesterStub, + }, + }); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + createTestRunner = fn as typeof CreateTestRunnerFn; + }); + + afterEach(() => { + sinon.restore(); + }); + + describe('argument passthrough', () => { + it('passes explicitType, runId, and testDefinitionName to createAgentTester', async () => { + const mockResult = { runner: {}, type: 'agentforce-studio' as TestRunnerType }; + createAgentTesterStub.resolves(mockResult); + const connection = makeMockConnection() as Connection; + + await createTestRunner(connection, 'agentforce-studio', 'myTest', '3A2xxx'); + + expect( + createAgentTesterStub.calledOnceWith(connection, { + explicitType: 'agentforce-studio', + runId: '3A2xxx', + testDefinitionName: 'myTest', + }) + ).to.be.true; + }); + + it('passes undefined fields when not provided', async () => { + createAgentTesterStub.resolves({ runner: {}, type: 'testing-center' as TestRunnerType }); + const connection = makeMockConnection() as Connection; + + await createTestRunner(connection); + + expect( + createAgentTesterStub.calledOnceWith(connection, { + explicitType: undefined, + runId: undefined, + testDefinitionName: undefined, + }) + ).to.be.true; + }); + + it('returns the result from createAgentTester', async () => { + const mockRunner = { poll: sinon.stub() }; + const mockResult = { runner: mockRunner, type: 'agentforce-studio' as TestRunnerType }; + createAgentTesterStub.resolves(mockResult); + const connection = makeMockConnection() as Connection; + + const result = await createTestRunner(connection, 'agentforce-studio'); + + expect(result.runner).to.equal(mockRunner); + expect(result.type).to.equal('agentforce-studio'); + }); + }); + + describe('AmbiguousTestDefinition error handling', () => { + it('re-throws with --test-runner action hint', async () => { + const original = new SfError('MySuite exists in both metadata types', 'AmbiguousTestDefinition'); + createAgentTesterStub.rejects(original); + const connection = makeMockConnection() as Connection; + + try { + await createTestRunner(connection, undefined, 'MySuite'); + expect.fail('Expected error was not thrown'); + } catch (err) { + expect(err).to.be.instanceOf(SfError); + const sfErr = err as SfError; + expect(sfErr.name).to.equal('AmbiguousTestDefinition'); + expect(sfErr.actions).to.include( + 'Use --test-runner to explicitly specify the runner type (agentforce-studio or testing-center)' + ); + expect(sfErr.cause).to.equal(original); + } + }); + + it('passes through non-AmbiguousTestDefinition errors unchanged', async () => { + const original = new SfError('Network error', 'NetworkError'); + createAgentTesterStub.rejects(original); + const connection = makeMockConnection() as Connection; + + try { + await createTestRunner(connection, undefined, 'MySuite'); + expect.fail('Expected error was not thrown'); + } catch (err) { + expect(err).to.equal(original); + } + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index ebe6fc51..e4568dd1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -186,13 +186,13 @@ "@smithy/util-waiter" "^4.2.13" tslib "^2.6.2" -"@aws-sdk/core@^3.973.20", "@aws-sdk/core@^3.973.23", "@aws-sdk/core@^3.974.6": - version "3.974.6" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.974.6.tgz#c945af325d56b122cd75e21d3d0d9c759f803843" - integrity sha512-8Vu7zGxu+39ChR/s5J7nXBw3a2kMHAi0OfKT8ohgTVjX0qYed/8mIfdBb638oBmKrWCwwKjYAM5J/4gMJ8nAJA== +"@aws-sdk/core@^3.973.20", "@aws-sdk/core@^3.973.23", "@aws-sdk/core@^3.974.8": + version "3.974.8" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.974.8.tgz#cdd51195a31322f1e429e66919eb18da8944c081" + integrity sha512-njR2qoG6ZuB0kvAS2FyICsFZJ6gmCcf2X/7JcD14sUvGDm26wiZ5BrA6LOiUxKFEF+IVe7kdroxyE00YlkiYsw== dependencies: "@aws-sdk/types" "^3.973.8" - "@aws-sdk/xml-builder" "^3.972.20" + "@aws-sdk/xml-builder" "^3.972.22" "@smithy/core" "^3.23.17" "@smithy/node-config-provider" "^4.3.14" "@smithy/property-provider" "^4.2.14" @@ -202,7 +202,7 @@ "@smithy/types" "^4.14.1" "@smithy/util-base64" "^4.3.2" "@smithy/util-middleware" "^4.2.14" - "@smithy/util-retry" "^4.3.5" + "@smithy/util-retry" "^4.3.6" "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" @@ -214,23 +214,23 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@^3.972.32": - version "3.972.32" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.32.tgz#bb6421c71de2f5dab2a996c48ad39a3b646b1b28" - integrity sha512-7vA4GHg8NSmQxquJHSBcSM3RgB4ZaaRi6u4+zGFKOmOH6aqlgr2Sda46clkZDYzlirgfY96w15Zj0jh6PT48ng== +"@aws-sdk/credential-provider-env@^3.972.34": + version "3.972.34" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.34.tgz#9d420adf02e7604094a641ae613a353aa86e1b83" + integrity sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ== dependencies: - "@aws-sdk/core" "^3.974.6" + "@aws-sdk/core" "^3.974.8" "@aws-sdk/types" "^3.973.8" "@smithy/property-provider" "^4.2.14" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@^3.972.34": - version "3.972.34" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.34.tgz#f0f9eecf93371e42217ad4382904f2d0dd2c22cd" - integrity sha512-vBrhWujFCLp1u8ptJRWYlipMutzPptb8pDQ00rKVH9q67T7rGd3VTWIj63aKrlLuY6qSsw1Rt5F/D/7wnNgryA== +"@aws-sdk/credential-provider-http@^3.972.36": + version "3.972.36" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.36.tgz#842268559da2ffc5855cde1e90e7302d53639c08" + integrity sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg== dependencies: - "@aws-sdk/core" "^3.974.6" + "@aws-sdk/core" "^3.974.8" "@aws-sdk/types" "^3.973.8" "@smithy/fetch-http-handler" "^5.3.17" "@smithy/node-http-handler" "^4.6.1" @@ -241,19 +241,19 @@ "@smithy/util-stream" "^4.5.25" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@^3.972.36": - version "3.972.36" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.36.tgz#d5ad2c627766990811967b82b996bfa29020fd2a" - integrity sha512-FBHyCmV8EB0gUvh1d+CZm87zt2PrdC7OyWexLRoH3I5zWSOUGa+9t58Y5jbxRfwUp3AWpHAFvKY6YzgR845sVA== - dependencies: - "@aws-sdk/core" "^3.974.6" - "@aws-sdk/credential-provider-env" "^3.972.32" - "@aws-sdk/credential-provider-http" "^3.972.34" - "@aws-sdk/credential-provider-login" "^3.972.36" - "@aws-sdk/credential-provider-process" "^3.972.32" - "@aws-sdk/credential-provider-sso" "^3.972.36" - "@aws-sdk/credential-provider-web-identity" "^3.972.36" - "@aws-sdk/nested-clients" "^3.997.4" +"@aws-sdk/credential-provider-ini@^3.972.38": + version "3.972.38" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.38.tgz#e20955fdfe4a88149b20dc7e25a517542e1dfd9f" + integrity sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ== + dependencies: + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/credential-provider-env" "^3.972.34" + "@aws-sdk/credential-provider-http" "^3.972.36" + "@aws-sdk/credential-provider-login" "^3.972.38" + "@aws-sdk/credential-provider-process" "^3.972.34" + "@aws-sdk/credential-provider-sso" "^3.972.38" + "@aws-sdk/credential-provider-web-identity" "^3.972.38" + "@aws-sdk/nested-clients" "^3.997.6" "@aws-sdk/types" "^3.973.8" "@smithy/credential-provider-imds" "^4.2.14" "@smithy/property-provider" "^4.2.14" @@ -261,13 +261,13 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-login@^3.972.36": - version "3.972.36" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.36.tgz#21dacb3ac08b3c0da5fbc8b0b3b69bd574765fad" - integrity sha512-IFap01lJKxQc0C/OHmZwZQr/cKq0DhrcmKedRrdnnl42D+P0SImnnnWQjv07uIPqpEdtqmkPXb9TiPYTU+prxQ== +"@aws-sdk/credential-provider-login@^3.972.38": + version "3.972.38" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.38.tgz#278437712c02a3ad1785f70c93b4f591cb3f6491" + integrity sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww== dependencies: - "@aws-sdk/core" "^3.974.6" - "@aws-sdk/nested-clients" "^3.997.4" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/nested-clients" "^3.997.6" "@aws-sdk/types" "^3.973.8" "@smithy/property-provider" "^4.2.14" "@smithy/protocol-http" "^5.3.14" @@ -276,16 +276,16 @@ tslib "^2.6.2" "@aws-sdk/credential-provider-node@^3.972.21", "@aws-sdk/credential-provider-node@^3.972.24": - version "3.972.37" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.37.tgz#5545396a3248c74568ab49d2397fc790b1f70241" - integrity sha512-/WFixFAAiw8WpmjZcI0l4t3DerXLmVinOIfuotmRZnu2qmsFPoqqmstASz0z8bi1pGdFXzeLzf6bwucM3mZcUQ== - dependencies: - "@aws-sdk/credential-provider-env" "^3.972.32" - "@aws-sdk/credential-provider-http" "^3.972.34" - "@aws-sdk/credential-provider-ini" "^3.972.36" - "@aws-sdk/credential-provider-process" "^3.972.32" - "@aws-sdk/credential-provider-sso" "^3.972.36" - "@aws-sdk/credential-provider-web-identity" "^3.972.36" + version "3.972.39" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.39.tgz#71f87848b7615dda4f31a57b113be9666e4bbd1a" + integrity sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg== + dependencies: + "@aws-sdk/credential-provider-env" "^3.972.34" + "@aws-sdk/credential-provider-http" "^3.972.36" + "@aws-sdk/credential-provider-ini" "^3.972.38" + "@aws-sdk/credential-provider-process" "^3.972.34" + "@aws-sdk/credential-provider-sso" "^3.972.38" + "@aws-sdk/credential-provider-web-identity" "^3.972.38" "@aws-sdk/types" "^3.973.8" "@smithy/credential-provider-imds" "^4.2.14" "@smithy/property-provider" "^4.2.14" @@ -293,39 +293,39 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@^3.972.32": - version "3.972.32" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.32.tgz#c2f5a401859637c64126826d595bb523ac1acb7d" - integrity sha512-uZp4tlGbpczV8QxmtIwOpSkcyGtBRR8/T4BAumRKfAt1nwCig3FSCZvrKl6ARDIDVRYn5p2oRcAsfFR01EgMGA== +"@aws-sdk/credential-provider-process@^3.972.34": + version "3.972.34" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.34.tgz#c964275be1a528ac73ade6d98c309fb6b7cdfb68" + integrity sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q== dependencies: - "@aws-sdk/core" "^3.974.6" + "@aws-sdk/core" "^3.974.8" "@aws-sdk/types" "^3.973.8" "@smithy/property-provider" "^4.2.14" "@smithy/shared-ini-file-loader" "^4.4.9" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@^3.972.36": - version "3.972.36" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.36.tgz#210e14d5e53f7398ae6ee0833f85dd5a0219372f" - integrity sha512-DsLr0UHMyKzRJKe2bjlwU8q1cfoXg8TIJKV/xwvnalAemiZLOZunFzj/whGnFDZIBVLdnbLiwv5SvRf1+CSwkg== +"@aws-sdk/credential-provider-sso@^3.972.38": + version "3.972.38" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.38.tgz#ec754bfecb2426a3307e19ef7e6c6b6438a327c6" + integrity sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA== dependencies: - "@aws-sdk/core" "^3.974.6" - "@aws-sdk/nested-clients" "^3.997.4" - "@aws-sdk/token-providers" "3.1038.0" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/nested-clients" "^3.997.6" + "@aws-sdk/token-providers" "3.1041.0" "@aws-sdk/types" "^3.973.8" "@smithy/property-provider" "^4.2.14" "@smithy/shared-ini-file-loader" "^4.4.9" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@^3.972.36": - version "3.972.36" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.36.tgz#40005a41380668bbbc4c9fe6d73dd13cac64e6e0" - integrity sha512-uzrURO7frJhHQVVNR5zBJcCYeMYflmXcWBK1+MiBym2Dfjh6nXATrMixrmGZi+97Q7ETZ+y/4lUwAy0Nfnznjw== +"@aws-sdk/credential-provider-web-identity@^3.972.38": + version "3.972.38" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.38.tgz#149951ef6e12db5292118e8ed5d95133c24ad719" + integrity sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw== dependencies: - "@aws-sdk/core" "^3.974.6" - "@aws-sdk/nested-clients" "^3.997.4" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/nested-clients" "^3.997.6" "@aws-sdk/types" "^3.973.8" "@smithy/property-provider" "^4.2.14" "@smithy/shared-ini-file-loader" "^4.4.9" @@ -356,14 +356,14 @@ tslib "^2.6.2" "@aws-sdk/middleware-flexible-checksums@^3.974.3": - version "3.974.14" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.14.tgz#b8bb019df5ade60293d1c20a905cca86dd999b28" - integrity sha512-mhTO3amGzYv/DQNbbqZo6UkHquBHlEEVRZwXmjeRqLmy1l9z3xCiFzglPL7n9JpVc2DZc9kjaraAn3JQrueZbw== + version "3.974.16" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.16.tgz#89b78cb0ad389aba7d12d060f46017e1fa3784a9" + integrity sha512-6ru8doI0/XzszqLIPXf0E/V7HhAw1Pu94010XCKYtBUfD0LxF0BuOzrUf8OQGR6j2o6wgKTHUniOmndQycHwCA== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" "@aws-crypto/util" "5.2.0" - "@aws-sdk/core" "^3.974.6" + "@aws-sdk/core" "^3.974.8" "@aws-sdk/crc64-nvme" "^3.972.7" "@aws-sdk/types" "^3.973.8" "@smithy/is-array-buffer" "^4.2.2" @@ -414,12 +414,12 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@^3.972.23", "@aws-sdk/middleware-sdk-s3@^3.972.35": - version "3.972.35" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.35.tgz#8cbf56d3c31a0ce31a09d1fd56a266b75cf1d28a" - integrity sha512-lLppaNTAz+wNgLdi4FtHzrlwrGF0ODTnBWHBaFg85SKs0eJ+M+tP5ifrA8f/0lNd+Ak3MC1NGC6RavV3ny4HTg== +"@aws-sdk/middleware-sdk-s3@^3.972.23", "@aws-sdk/middleware-sdk-s3@^3.972.37": + version "3.972.37" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.37.tgz#82ef4953cddd3373d2942d07a5d2baf443bbf3ea" + integrity sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA== dependencies: - "@aws-sdk/core" "^3.974.6" + "@aws-sdk/core" "^3.974.8" "@aws-sdk/types" "^3.973.8" "@aws-sdk/util-arn-parser" "^3.972.3" "@smithy/core" "^3.23.17" @@ -443,38 +443,38 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@^3.972.21", "@aws-sdk/middleware-user-agent@^3.972.24", "@aws-sdk/middleware-user-agent@^3.972.36": - version "3.972.36" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.36.tgz#76fd80d86940c5daf7bf91ebf95966a19c73d870" - integrity sha512-O2beToxguBvrZFFZ+fFgPbbae8MvyIBjQ6lImee4APHEXXNAD5ZJ2ayLF1mb7rsKw86TM81y5czg82bZncjSjg== +"@aws-sdk/middleware-user-agent@^3.972.21", "@aws-sdk/middleware-user-agent@^3.972.24", "@aws-sdk/middleware-user-agent@^3.972.38": + version "3.972.38" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.38.tgz#626d9a2499f5a6398a4db917abeeaac14b54c6cb" + integrity sha512-iz+B29TXcAZsJpwB+AwG/TTGA5l/VnmMZ2UxtiySOZjI6gCdmviXPwdgzcmuazMy16rXoPY4mYCGe7zdNKfx5A== dependencies: - "@aws-sdk/core" "^3.974.6" + "@aws-sdk/core" "^3.974.8" "@aws-sdk/types" "^3.973.8" "@aws-sdk/util-endpoints" "^3.996.8" "@smithy/core" "^3.23.17" "@smithy/protocol-http" "^5.3.14" "@smithy/types" "^4.14.1" - "@smithy/util-retry" "^4.3.5" + "@smithy/util-retry" "^4.3.6" tslib "^2.6.2" -"@aws-sdk/nested-clients@^3.997.4": - version "3.997.4" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.997.4.tgz#674c14256b870fab0a1c0a0567be8e1c9026fdee" - integrity sha512-4Sf+WY1lMJzXlw5MiyCMe/UzdILCwvuaHThbqMXS6dfh9gZy3No360I42RXquOI/ULUOhWy2HCyU0Fp20fQGPQ== +"@aws-sdk/nested-clients@^3.997.6": + version "3.997.6" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.997.6.tgz#17433cfac2160ec620a14cbff9d2b33675712cae" + integrity sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.974.6" + "@aws-sdk/core" "^3.974.8" "@aws-sdk/middleware-host-header" "^3.972.10" "@aws-sdk/middleware-logger" "^3.972.10" "@aws-sdk/middleware-recursion-detection" "^3.972.11" - "@aws-sdk/middleware-user-agent" "^3.972.36" + "@aws-sdk/middleware-user-agent" "^3.972.38" "@aws-sdk/region-config-resolver" "^3.972.13" - "@aws-sdk/signature-v4-multi-region" "^3.996.23" + "@aws-sdk/signature-v4-multi-region" "^3.996.25" "@aws-sdk/types" "^3.973.8" "@aws-sdk/util-endpoints" "^3.996.8" "@aws-sdk/util-user-agent-browser" "^3.972.10" - "@aws-sdk/util-user-agent-node" "^3.973.22" + "@aws-sdk/util-user-agent-node" "^3.973.24" "@smithy/config-resolver" "^4.4.17" "@smithy/core" "^3.23.17" "@smithy/fetch-http-handler" "^5.3.17" @@ -482,7 +482,7 @@ "@smithy/invalid-dependency" "^4.2.14" "@smithy/middleware-content-length" "^4.2.14" "@smithy/middleware-endpoint" "^4.4.32" - "@smithy/middleware-retry" "^4.5.6" + "@smithy/middleware-retry" "^4.5.7" "@smithy/middleware-serde" "^4.2.20" "@smithy/middleware-stack" "^4.2.14" "@smithy/node-config-provider" "^4.3.14" @@ -498,7 +498,7 @@ "@smithy/util-defaults-mode-node" "^4.2.54" "@smithy/util-endpoints" "^3.4.2" "@smithy/util-middleware" "^4.2.14" - "@smithy/util-retry" "^4.3.5" + "@smithy/util-retry" "^4.3.6" "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" @@ -513,25 +513,25 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@^3.996.11", "@aws-sdk/signature-v4-multi-region@^3.996.23": - version "3.996.23" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.23.tgz#a275afc0d1727c4fe9cd67c965071a27c5f0b87c" - integrity sha512-wBbys3Y53Ikly556vyADurKpYQHXS7Jjaskbz+Ga9PZCz7PB/9f3VdKbDlz7dqIzn+xwz7L/a6TR4iXcOi8IRw== +"@aws-sdk/signature-v4-multi-region@^3.996.11", "@aws-sdk/signature-v4-multi-region@^3.996.25": + version "3.996.25" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.25.tgz#b50651b7e4f9c82482416caa9953ad17645d4a2d" + integrity sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw== dependencies: - "@aws-sdk/middleware-sdk-s3" "^3.972.35" + "@aws-sdk/middleware-sdk-s3" "^3.972.37" "@aws-sdk/types" "^3.973.8" "@smithy/protocol-http" "^5.3.14" "@smithy/signature-v4" "^5.3.14" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/token-providers@3.1038.0": - version "3.1038.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1038.0.tgz#9f0583bb79bc798f8f33876ff6fce3072dfca760" - integrity sha512-Qniru+9oGGb/HNK/gGZWbV3jsD0k71ngE7qMQ/x6gYNYLd2EOwHCS6E2E6jfkaqO4i0d+nNKmfRy8bNcshKdGQ== +"@aws-sdk/token-providers@3.1041.0": + version "3.1041.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1041.0.tgz#f3f068010780fc85fc4a7faa6a080cfb8afd73a4" + integrity sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw== dependencies: - "@aws-sdk/core" "^3.974.6" - "@aws-sdk/nested-clients" "^3.997.4" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/nested-clients" "^3.997.6" "@aws-sdk/types" "^3.973.8" "@smithy/property-provider" "^4.2.14" "@smithy/shared-ini-file-loader" "^4.4.9" @@ -581,22 +581,22 @@ bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@^3.973.10", "@aws-sdk/util-user-agent-node@^3.973.22", "@aws-sdk/util-user-agent-node@^3.973.7": - version "3.973.22" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.22.tgz#efbbdb819cb58ac23e5e6787c437242f9931a565" - integrity sha512-YTYqTmOUrwbm1h99Ee4y/mVYpFRl0oSO/amtP5cc1BZZWdaAVWs9zj3TkyRHWvR9aI/ZS8m3mS6awXtYUlWyaw== +"@aws-sdk/util-user-agent-node@^3.973.10", "@aws-sdk/util-user-agent-node@^3.973.24", "@aws-sdk/util-user-agent-node@^3.973.7": + version "3.973.24" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.24.tgz#cf44a63b92adfecaeb8cb9f948b390456310566a" + integrity sha512-ZWwlkjcIp7cEL8ZfTpTAPNkwx25p7xol0xlKoWVVf22+nsjwmLcHYtTPjIV1cSpmB/b6DaK4cb1fSkvCXHgRdw== dependencies: - "@aws-sdk/middleware-user-agent" "^3.972.36" + "@aws-sdk/middleware-user-agent" "^3.972.38" "@aws-sdk/types" "^3.973.8" "@smithy/node-config-provider" "^4.3.14" "@smithy/types" "^4.14.1" "@smithy/util-config-provider" "^4.2.2" tslib "^2.6.2" -"@aws-sdk/xml-builder@^3.972.20": - version "3.972.20" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.20.tgz#d5f41188072ff6ae9e3e794a3ec62f3c82b9ff28" - integrity sha512-MDcUfroaMAnDAHn29vN781t0wudR8zjfgg+r3s5otx8TJXFWg01NZB7HvHkBbOf7UUmKEwIZf5kHxiaVUgwjlQ== +"@aws-sdk/xml-builder@^3.972.22": + version "3.972.22" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.22.tgz#1e44ca9fd9c3fdc3d9af9540ced024f34cfc60b2" + integrity sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA== dependencies: "@nodable/entities" "2.1.0" "@smithy/types" "^4.14.1" @@ -618,9 +618,9 @@ picocolors "^1.1.1" "@babel/compat-data@^7.28.6": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" - integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== + version "7.29.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.3.tgz#e3f5347f0589596c91d227ccb6a541d37fb1307b" + integrity sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg== "@babel/core@^7.23.9": version "7.29.0" @@ -711,9 +711,9 @@ "@babel/types" "^7.29.0" "@babel/parser@^7.23.9", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" - integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== + version "7.29.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.3.tgz#116f70a77958307fceac27747573032f8a62f88e" + integrity sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA== dependencies: "@babel/types" "^7.29.0" @@ -1042,6 +1042,11 @@ resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz#674a4c4d81ad460695cb2a1fc69d78cd187f337e" integrity sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== +"@inquirer/ansi@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-2.0.5.tgz#7b7e121f6a0c40128711daf20325e6ff2cdff8b7" + integrity sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw== + "@inquirer/checkbox@^4.3.2": version "4.3.2" resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.3.2.tgz#e1483e6519d6ffef97281a54d2a5baa0d81b3f3b" @@ -1053,7 +1058,7 @@ "@inquirer/type" "^3.0.10" yoctocolors-cjs "^2.1.3" -"@inquirer/confirm@^3.1.22", "@inquirer/confirm@^3.2.0": +"@inquirer/confirm@^3.1.22": version "3.2.0" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.2.0.tgz#6af1284670ea7c7d95e3f1253684cfbd7228ad6a" integrity sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw== @@ -1069,6 +1074,14 @@ "@inquirer/core" "^10.3.2" "@inquirer/type" "^3.0.10" +"@inquirer/confirm@^6.0.12": + version "6.0.12" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-6.0.12.tgz#7a317aec813214cec2f5339b9fa0926c20bf0dbe" + integrity sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og== + dependencies: + "@inquirer/core" "^11.1.9" + "@inquirer/type" "^4.0.5" + "@inquirer/core@^10.3.2": version "10.3.2" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz#535979ff3ff4fe1e7cc4f83e2320504c743b7e20" @@ -1083,6 +1096,19 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.3" +"@inquirer/core@^11.1.9": + version "11.1.9" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-11.1.9.tgz#97f099f5217f50f168c12db00ac07f51ab550fbb" + integrity sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg== + dependencies: + "@inquirer/ansi" "^2.0.5" + "@inquirer/figures" "^2.0.5" + "@inquirer/type" "^4.0.5" + cli-width "^4.1.0" + fast-wrap-ansi "^0.2.0" + mute-stream "^3.0.0" + signal-exit "^4.1.0" + "@inquirer/core@^3.1.1": version "3.1.2" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-3.1.2.tgz#d9691e6ffae85935685641550b8370ab7e599caa" @@ -1151,6 +1177,11 @@ resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz#dbb49ed80df11df74268023b496ac5d9acd22b3a" integrity sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== +"@inquirer/figures@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-2.0.5.tgz#d12f4889ac6ea7731ebc52bd9c066ca51d8fdee7" + integrity sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ== + "@inquirer/input@^2.2.4": version "2.3.0" resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.3.0.tgz#9b99022f53780fecc842908f3f319b52a5a16865" @@ -1193,6 +1224,15 @@ "@inquirer/core" "^10.3.2" "@inquirer/type" "^3.0.10" +"@inquirer/password@^5.0.12": + version "5.0.12" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-5.0.12.tgz#c1dcf197258a8cfba800325b78287fa55a5a3ef8" + integrity sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ== + dependencies: + "@inquirer/ansi" "^2.0.5" + "@inquirer/core" "^11.1.9" + "@inquirer/type" "^4.0.5" + "@inquirer/prompts@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.10.1.tgz#e1436c0484cf04c22548c74e2cd239e989d5f847" @@ -1269,6 +1309,11 @@ resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz#11ed564ec78432a200ea2601a212d24af8150d50" integrity sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== +"@inquirer/type@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-4.0.5.tgz#a02d90e5da8a36dce27ac8e7237a50c99a9003a3" + integrity sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -1455,10 +1500,10 @@ wordwrap "^1.0.0" wrap-ansi "^7.0.0" -"@oclif/core@^4", "@oclif/core@^4.0.27", "@oclif/core@^4.10.6", "@oclif/core@^4.5.2": - version "4.10.6" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.10.6.tgz#233d66284d8c7c8162c9d437754503734069dd85" - integrity sha512-ySCOYnPKZE3KACT1V9It99hWG9b8E5MpagbRdWxPNRO3beMqmbr4SLUQoFtZ9XRtW++kks1ZVwZOdpnR8rpb9A== +"@oclif/core@^4", "@oclif/core@^4.0.27", "@oclif/core@^4.11.0": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.11.1.tgz#f72284b4e14c4a3f47a9952ed2234f000fc23536" + integrity sha512-+N5yqeoOKPnT0p+ZJiNutMILsZukZrEpsVup24XERla594EkGSWS9tiCqRfvzr1xfvf/AhM9pb0yPaf8L3Y9Uw== dependencies: ansi-escapes "^4.3.2" ansis "^3.17.0" @@ -1480,9 +1525,9 @@ wrap-ansi "^7.0.0" "@oclif/multi-stage-output@^0.8.36": - version "0.8.37" - resolved "https://registry.yarnpkg.com/@oclif/multi-stage-output/-/multi-stage-output-0.8.37.tgz#f705a1af7f9201cc6ab1797ddd53ea9eff8a4ce8" - integrity sha512-szads7f+FV3i1JGifGOAKpTaTwy70+gBjjfmrHavPIeahQog1ehyIP0L7v4jZnj29EZtUbNmxUpKPJbrCAsJDQ== + version "0.8.38" + resolved "https://registry.yarnpkg.com/@oclif/multi-stage-output/-/multi-stage-output-0.8.38.tgz#7c5a55afc3126cd023e4001015287f4d51390a15" + integrity sha512-+1CV2VP+keL1NfcGJNPONEVEimq5JvaVUgSqU6YzW6FOZjh0zvkbVQr2krE0twwhYwI0J8SkQLwssR1pfpLKnw== dependencies: "@oclif/core" "^4" "@types/react" "^18.3.12" @@ -1493,9 +1538,9 @@ wrap-ansi "^9.0.2" "@oclif/plugin-command-snapshot@^5.3.13": - version "5.3.16" - resolved "https://registry.yarnpkg.com/@oclif/plugin-command-snapshot/-/plugin-command-snapshot-5.3.16.tgz#d4d45298a8be71c20ba8b6a850edc82b31000184" - integrity sha512-pwTKWQRDrK9eOz1VVUTKm9q3tKf9Kihunu3R53LfcPXPpEhIJ6N+2zmCYqeuifrvjBqLT1VhAKpVgTfHXxURHg== + version "5.3.17" + resolved "https://registry.yarnpkg.com/@oclif/plugin-command-snapshot/-/plugin-command-snapshot-5.3.17.tgz#441c6cdb0c236462405a4fb78fd44871d1a54160" + integrity sha512-lzjs9x6rxXo+EBFSvL96NytY1uXzPbmRn22GNYbtYhY1oSRmOedihcYboQwVPP+V2d6BfPdbxxWzz3Rc6hoHGg== dependencies: "@oclif/core" "^4" ansis "^3.17.0" @@ -1508,26 +1553,26 @@ ts-json-schema-generator "^1.5.1" "@oclif/plugin-help@^6.2.38": - version "6.2.45" - resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.2.45.tgz#26bdb2df07881e2147e735bbdd32b6d797ee9f52" - integrity sha512-avWOKYmjANtyu8ipju/kopIIrSrbS/scJjiZTpBp/HKEHNm46v5riOo5LQj6MZ4bYJVQEoyHPg/2Seig5Ilkjw== + version "6.2.46" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.2.46.tgz#2bd7a7ec4706b0e00f037f60d0fa08d60bb54161" + integrity sha512-KmuMFt/fURCVxor0rrRjEqs2nLN0Y3ixcixo/M5VjKcN920gbuw5T+AF23FBeyUDuW/Dg79YPcTWy/Rtz0Dg/A== dependencies: "@oclif/core" "^4" "@oclif/plugin-not-found@^3.2.76": - version "3.2.81" - resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.2.81.tgz#bd48e6103be81e612a1ec42f8dcdab22598f5f0b" - integrity sha512-M88tLONBH36hLAbkFbmCo1hoZPSdU5l8Px1xEIlIgSmGMam+CoAzx4kGqpLbokgfpaHeP8/Jx3QJ18u9ef/2Qw== + version "3.2.82" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.2.82.tgz#5ec97fceac671f8198e08acaec64961df2517cf6" + integrity sha512-6heNFE2gadcDYijWy4XJc6ZLzPd1qKe0i8sb8uyrR3mX0o5IFA+5KSAx/BFBkGS8j/tKOsCYvvmMKVdReeb1Gg== dependencies: "@inquirer/prompts" "^7.10.1" - "@oclif/core" "^4.10.6" + "@oclif/core" "^4.11.0" ansis "^3.17.0" fast-levenshtein "^3.0.0" "@oclif/plugin-warn-if-update-available@^3.1.57": - version "3.1.61" - resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.61.tgz#0a5588f4899c565a2b899fbe220f244b33e263ac" - integrity sha512-4XcrTxcCs+brR/eZ0BPeuiREiH3USlJiaHbUqPhnIBuyxhhUSYVd8ZO6s5MQN7AXJq4SMQ+B5zLaHq+ep/afIw== + version "3.1.62" + resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.62.tgz#29329c7f58285cc54290acf330b759c1bfc3a564" + integrity sha512-g1tOOf9tJ3RE4dqhUynw3TH8Gea78IkzG9hq2lcUJ5wIdOSzcp8+3SWVzzpKfHgwBGgFupmj8peCjypybJVIrg== dependencies: "@oclif/core" "^4" ansis "^3.17.0" @@ -1536,10 +1581,10 @@ lodash "^4.18.1" registry-auth-token "^5.1.1" -"@oclif/table@^0.5.0": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@oclif/table/-/table-0.5.4.tgz#a6b9845c50bcaeb15d7cfcb1dee36cc8078446e6" - integrity sha512-tIW7JTfO/t19cfOZofxEi16GAV12osvuSwdDHQ6ltIYtNeDyT8vJqdqo5NmyKNNwUy6V1DoGsVhJtPTFabR4hg== +"@oclif/table@^0.5.6": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@oclif/table/-/table-0.5.6.tgz#cc22cc3f620c9f23bdb734b0dd6f97cdda4a0f28" + integrity sha512-W0SlIIkcqYxRSbZVw+VnFPT6hStjm5OoMduli35569OXezBPS92yNsoIA9jAuAt3lVIGlnUIetnAUUjs+yLHKg== dependencies: "@types/react" "^18.3.12" change-case "^5.4.4" @@ -1548,6 +1593,7 @@ natural-orderby "^3.0.2" object-hash "^3.0.0" react "^18.3.1" + string-width "^8.2.1" strip-ansi "^7.1.2" wrap-ansi "^9.0.2" @@ -1595,25 +1641,25 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@salesforce/agents@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-1.4.0.tgz#69c3e3e9d29b9596aadf99f94774c9c8713e34ca" - integrity sha512-NaiGUSjcyK0Wsy0n5pFuouHqOYH1KJEpgm605NqCaiOMAA3zn0pWZDHE9I75ymGqpvOXSHGDFNrUhKYPain9ZA== +"@salesforce/agents@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-1.5.1.tgz#cdb8a1a814edc175d7dd51da50cdcb32b3d95bdb" + integrity sha512-Y5aaMmNP06ykuG84bfShExrrpKz0DEP8GE6CQFLGbfYvhPZApTdluG+OBIqwyj38dY9gb4V5oLXy8cKI+jxYYg== dependencies: - "@salesforce/core" "^8.28.3" + "@salesforce/core" "^8.29.0" "@salesforce/kit" "^3.2.6" - "@salesforce/source-deploy-retrieve" "^12.32.7" + "@salesforce/source-deploy-retrieve" "^12.35.1" "@salesforce/types" "^1.7.1" - fast-xml-parser "^5.6.0" + fast-xml-parser "^5.7.2" nock "^13.5.6" - yaml "^2.8.3" + yaml "^2.8.4" "@salesforce/cli-plugins-testkit@^5.3.41": - version "5.3.54" - resolved "https://registry.yarnpkg.com/@salesforce/cli-plugins-testkit/-/cli-plugins-testkit-5.3.54.tgz#636bed66cb28f94c3d415277d1796f5407a6313f" - integrity sha512-OT4S2Wstg2gqWWbhG4q+/AioIWpU1BEsC+KBIBtw1Wckktxv6B/SWlpgIrCz6nQAPwwDpY1sNeGLxpDsNUKVzw== + version "5.3.55" + resolved "https://registry.yarnpkg.com/@salesforce/cli-plugins-testkit/-/cli-plugins-testkit-5.3.55.tgz#9230cb131950c60334b250940826ad20fe029023" + integrity sha512-NzV5WWHJDoybEtHVeTOQt/P/VizWsYwhiyAMU98NG+xAdQVBYyTx/2NhRTgnatxqHyNkYKwPMIJJQ9FLvHpU1A== dependencies: - "@salesforce/core" "^8.28.4" + "@salesforce/core" "^8.29.0" "@salesforce/kit" "^3.2.6" "@salesforce/ts-types" "^2.0.11" "@types/shelljs" "^0.10.0" @@ -1624,10 +1670,10 @@ strip-ansi "6.0.1" ts-retry-promise "^0.8.1" -"@salesforce/core@^8.18.7", "@salesforce/core@^8.23.1", "@salesforce/core@^8.28.3", "@salesforce/core@^8.28.4", "@salesforce/core@^8.5.1": - version "8.28.4" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.28.4.tgz#98920d62c2b2a7fa025af38c74bdf6687d91b0a8" - integrity sha512-XQ0BBSetdW9cu36pu8ig5ZBX3oAbDSSH4djHkSU3iAzjLdTygEPIBVtKNeyj1++GmCy0rRiLr/yqoFYr21+GuQ== +"@salesforce/core@^8.23.1", "@salesforce/core@^8.28.3", "@salesforce/core@^8.28.4", "@salesforce/core@^8.29.0", "@salesforce/core@^8.5.1": + version "8.29.0" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.29.0.tgz#d75d1afe06962e10c466bdf670fa8512bd683882" + integrity sha512-q6xDNLPbbZW1n4X4YK1iM8jZvwvJRiwbJxdeF5iHuETxmMka16FoCVi+WziK/Rh5EP0yW08FYyiynwPlgz5RBw== dependencies: "@jsforce/jsforce-node" "^3.10.13" "@salesforce/kit" "^3.2.4" @@ -1694,9 +1740,9 @@ "@salesforce/ts-types" "^2.0.12" "@salesforce/plugin-command-reference@^3.1.81": - version "3.1.94" - resolved "https://registry.yarnpkg.com/@salesforce/plugin-command-reference/-/plugin-command-reference-3.1.94.tgz#909d363aba0224b189cf2ff6fd42b82cf9a62efe" - integrity sha512-4BWmOfpvqXYYRVet7f4AEsC0IxsY3gE6Dc/gHIv+FxqhOmgi9giZOXiTP2J7PtapGdGvCCnj8sQnnsLjd/mgEw== + version "3.1.95" + resolved "https://registry.yarnpkg.com/@salesforce/plugin-command-reference/-/plugin-command-reference-3.1.95.tgz#b194e9c08e582dd445de1b4aae7f0ba02c7f6a39" + integrity sha512-K0BQ6f/fPzPOHMf9mpKKxx6x9IbGmUNmKkVNql9zQwXmmfNZoDfozv2EREfijZwgECiIKuFkwB1PjoQkkWyIPQ== dependencies: "@oclif/core" "^4" "@salesforce/core" "^8.28.4" @@ -1731,27 +1777,27 @@ terminal-link "^3.0.0" "@salesforce/sf-plugins-core@^12.2.6": - version "12.2.6" - resolved "https://registry.yarnpkg.com/@salesforce/sf-plugins-core/-/sf-plugins-core-12.2.6.tgz#856303e786f5fac1c6aa6dcd42f282cb1ac703e8" - integrity sha512-EDKE72f/gGk9vL7KI9wsFO5wl/jFVvA2l5XBGR+6sJ1+FTMUbTGRMLObkkYJACk7bKvUFx00xdur2R6K8SWNvg== - dependencies: - "@inquirer/confirm" "^3.2.0" - "@inquirer/password" "^2.2.0" - "@oclif/core" "^4.5.2" - "@oclif/table" "^0.5.0" - "@salesforce/core" "^8.18.7" + version "12.2.13" + resolved "https://registry.yarnpkg.com/@salesforce/sf-plugins-core/-/sf-plugins-core-12.2.13.tgz#7dd7e9ad19c8279c97d020727d7acbcf17a5877b" + integrity sha512-Ug+CIQ7yLZVqdmSlgFPCnkzFXz5gzCR/l5hnMoVDrgNdI/PmCHAx2ZS0WsM3xkebkkOHtWFIZQ9ARip7wAbROw== + dependencies: + "@inquirer/confirm" "^6.0.12" + "@inquirer/password" "^5.0.12" + "@oclif/core" "^4.11.0" + "@oclif/table" "^0.5.6" + "@salesforce/core" "^8.29.0" "@salesforce/kit" "^3.2.3" "@salesforce/ts-types" "^2.0.12" ansis "^3.3.2" cli-progress "^3.12.0" terminal-link "^3.0.0" -"@salesforce/source-deploy-retrieve@^12.32.7", "@salesforce/source-deploy-retrieve@^12.32.8": - version "12.34.5" - resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.34.5.tgz#c02cd88f6c673c75b0d15bf06c8dafc85d06a004" - integrity sha512-iL+656HXNGFMv0DTPF4MKCaJ3de9qGyIzOrOyZ/CL1l0CYcgp2YHrLJuSaCKujul0ymceUGcAptSsZcSVWhjqw== +"@salesforce/source-deploy-retrieve@^12.35.1", "@salesforce/source-deploy-retrieve@^12.35.3": + version "12.35.3" + resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.35.3.tgz#d32453d746408435e9420c53f4948b7aa5ebdb8a" + integrity sha512-Mf5As7bQytwf+zdzHKEFUJrcbyOcMNHZX9cYrt5lLn59pciH814Nzq7kwmtIdXesbxsx95cLQD7OX0MImpe18g== dependencies: - "@salesforce/core" "^8.28.4" + "@salesforce/core" "^8.29.0" "@salesforce/kit" "^3.2.4" "@salesforce/ts-types" "^2.0.12" "@salesforce/types" "^1.6.0" @@ -2090,10 +2136,10 @@ "@smithy/util-middleware" "^4.2.14" tslib "^2.6.2" -"@smithy/middleware-retry@^4.4.42", "@smithy/middleware-retry@^4.4.44", "@smithy/middleware-retry@^4.5.6": - version "4.5.6" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.5.6.tgz#8f3857c2e654a03a8aaccf8b267aa4d9c2ad1046" - integrity sha512-5zhmo2AkstmM/RMKYP0NHfmuYWBR+/umlmSuALgajLxf0X0rLE6d17MfzTxpzkILWVhwvCJkCyPH0AfMlbaucQ== +"@smithy/middleware-retry@^4.4.42", "@smithy/middleware-retry@^4.4.44", "@smithy/middleware-retry@^4.5.7": + version "4.5.7" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.5.7.tgz#a2da0c472d631ee408ff566186c99571b3efb70b" + integrity sha512-bRt6ZImqVSeTk39Nm81K20ObIiAZ3WefY7G6+iz/0tZjs4dgRRjvRX2sgsH+zi6iDCRR/aQvQofLKxxz4rPBZg== dependencies: "@smithy/core" "^3.23.17" "@smithy/node-config-provider" "^4.3.14" @@ -2102,7 +2148,7 @@ "@smithy/smithy-client" "^4.12.13" "@smithy/types" "^4.14.1" "@smithy/util-middleware" "^4.2.14" - "@smithy/util-retry" "^4.3.5" + "@smithy/util-retry" "^4.3.6" "@smithy/uuid" "^1.1.2" tslib "^2.6.2" @@ -2328,10 +2374,10 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@smithy/util-retry@^4.2.12", "@smithy/util-retry@^4.3.5": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.3.5.tgz#7ca07446905188bbbe7f0bbd171cc7682f461103" - integrity sha512-h1IJsbgMDA+jaTjrco/JsyfWOgHRJBv8myB1y4AEI2fjIzD6ktZ7pFAyTw+gwN9GKIAygvC6db0mq0j8N2rFOg== +"@smithy/util-retry@^4.2.12", "@smithy/util-retry@^4.3.6": + version "4.3.8" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.3.8.tgz#7f904ed8e5bad2b5f2e6aa1e193db2b46b2c57df" + integrity sha512-LUIxbTBi+OpvXpg91poGA6BdyoleMDLnfXjVDqyi2RvZmTveY5loE/FgYUBCR5LU2BThW2SoZRh8dTIIy38IPw== dependencies: "@smithy/service-error-classification" "^4.3.1" "@smithy/types" "^4.14.1" @@ -2688,9 +2734,9 @@ integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== "@typescript-eslint/types@^8.56.0": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.1.tgz#c1d014d3f03a97e0113a8899fc9d4e45a7fb0ca9" - integrity sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A== + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.2.tgz#01caabcd7e4715c33ad5e11cab260829714d6b9c" + integrity sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q== "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" @@ -2760,9 +2806,9 @@ eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + version "1.3.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.1.tgz#0e8f34854df7966b09304a18e808b23997bb9fc1" + integrity sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ== JSONStream@^1.3.5: version "1.3.5" @@ -3119,14 +3165,14 @@ base64url@^3.0.1: integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== baseline-browser-mapping@^2.10.12: - version "2.10.23" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz#3a1a55d1a691a8c8d74688af7f1fd17eac23c184" - integrity sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g== + version "2.10.27" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz#fee941c2a0b42cdf83c6427e4c830b1d0bdab2c3" + integrity sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA== basic-ftp@^5.0.2: - version "5.3.0" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.3.0.tgz#88f057d1ba8442643c505c4c83bbaa4442b15cfd" - integrity sha512-5K9eNNn7ywHPsYnFwjKgYH8Hf8B5emh7JKcPaVjjrMJFQQwGpwowEnZNEtHs7DfR7hCZsmaK3VA4HUK0YarT+w== + version "5.3.1" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.3.1.tgz#3148ee9af43c0522514a4f973fecb1d3cbb6d71e" + integrity sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw== binary-extensions@^2.0.0: version "2.3.0" @@ -3318,9 +3364,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001782: - version "1.0.30001791" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz#dfb93d85c40ad380c57123e72e10f3c575786b51" - integrity sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ== + version "1.0.30001792" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz#ca8bb9be244835a335e2018272ce7223691873c5" + integrity sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw== capital-case@^1.0.4: version "1.0.4" @@ -3974,9 +4020,9 @@ ejs@^3.1.10: jake "^10.8.5" electron-to-chromium@^1.5.328: - version "1.5.344" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz#6437cc08a7d9b914a98120e182f37793c9eaffd4" - integrity sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg== + version "1.5.352" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz#0b57303cf654d7e4353edf01abe1ca55e5136063" + integrity sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg== emoji-regex-xs@^1.0.0: version "1.0.0" @@ -4428,9 +4474,9 @@ eslint@^8.56.0: text-table "^0.2.0" esmock@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esmock/-/esmock-2.7.3.tgz#25d8fd57b9608f9430185c501e7dab91fb1247bc" - integrity sha512-/M/YZOjgyLaVoY6K83pwCsGE1AJQnj4S4GyXLYgi/Y79KL8EeW6WU7Rmjc89UO7jv6ec8+j34rKeWOfiLeEu0A== + version "2.7.4" + resolved "https://registry.yarnpkg.com/esmock/-/esmock-2.7.4.tgz#3ed0bd041e8990c070ab20de06b6d2c3335a1c78" + integrity sha512-HznWDUaqlMU3N2Ef0RW9u649Nj6ydZhZVXXcN/IUY/CKRSl5X2K0jGXRWNeOw00ZasE9l6QYbvt1XE8+Tulgrw== espree@^10.4.0: version "10.4.0" @@ -4567,19 +4613,38 @@ fast-safe-stringify@^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-string-truncated-width@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz#23afe0da67d752ca0727538f1e6967759728ce49" + integrity sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g== + +fast-string-width@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-string-width/-/fast-string-width-3.0.2.tgz#16dbabb491ce5585b5ecb675b65c165d71688eeb" + integrity sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg== + dependencies: + fast-string-truncated-width "^3.0.2" + fast-uri@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" - integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" + integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== -fast-xml-builder@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz#50188e1452a5fa095f415d3e63dcac0a1dbcbf11" - integrity sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA== +fast-wrap-ansi@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/fast-wrap-ansi/-/fast-wrap-ansi-0.2.0.tgz#c0ae3f3982d061c3d657ec927196fbb47e22fe64" + integrity sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w== + dependencies: + fast-string-width "^3.0.2" + +fast-xml-builder@^1.1.5, fast-xml-builder@^1.1.7: + version "1.1.9" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.9.tgz#96bf8de1e3a5f560149b6092844db4e6fd0ee38f" + integrity sha512-jcyKVSEX13iseJqg7n/KWw+xnu/7fdrZ333Fac54KjHDIELVCfDDJXYIm6DTJ0Su4gSzrhqiK0DzY/wZbF40mw== dependencies: path-expression-matcher "^1.1.3" -fast-xml-parser@5.7.2, fast-xml-parser@^5.6.0, fast-xml-parser@^5.7.1, fast-xml-parser@^5.7.2: +fast-xml-parser@5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz#fecd0b054c6c132fc03dab994a413da781e0eb9f" integrity sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w== @@ -4589,6 +4654,16 @@ fast-xml-parser@5.7.2, fast-xml-parser@^5.6.0, fast-xml-parser@^5.7.1, fast-xml- path-expression-matcher "^1.5.0" strnum "^2.2.3" +fast-xml-parser@^5.7.1, fast-xml-parser@^5.7.2: + version "5.7.3" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz#309b04b08d835defc62ab657a0bb340c0e0fbe6a" + integrity sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg== + dependencies: + "@nodable/entities" "^2.1.0" + fast-xml-builder "^1.1.7" + path-expression-matcher "^1.5.0" + strnum "^2.2.3" + fastest-levenshtein@^1.0.7: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -4764,9 +4839,9 @@ fromentries@^1.2.0: integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-extra@^11.0.0: - version "11.3.4" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.4.tgz#ab6934eca8bcf6f7f6b82742e33591f86301d6fc" - integrity sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA== + version "11.3.5" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.5.tgz#07a44eff40bea53e719909a532f91a23bf0769ff" + integrity sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -4839,7 +4914,7 @@ 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, get-east-asian-width@^1.3.1: +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1, get-east-asian-width@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz#ce7008fe345edcf5497a6f557cfa54bc318a9ce7" integrity sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA== @@ -5015,9 +5090,9 @@ globals@^13.19.0: type-fest "^0.20.2" globals@^17.3.0: - version "17.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.5.0.tgz#a82c641d898f8dfbe0e81f66fdff7d0de43f88c6" - integrity sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g== + version "17.6.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-17.6.0.tgz#0f0be018d5cca8690e6375ead1f65c4bb96191fc" + integrity sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA== globalthis@^1.0.4: version "1.0.4" @@ -5166,7 +5241,7 @@ hasha@^5.0.0: is-stream "^2.0.0" type-fest "^0.8.0" -hasown@^2.0.2: +hasown@^2.0.2, hasown@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.3.tgz#5e5c2b15b60370a4c7930c383dfb76bf17bc403c" integrity sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg== @@ -5466,10 +5541,10 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -ip-address@^10.0.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.1.tgz#a7614252413e3751b841aaffba939090d2c4c37b" - integrity sha512-1FMu8/N15Ck1BL551Jf42NYIoin2unWjLQ2Fze/DXryJRl5twqtwNHlO39qERGbIOcKYWHdgRryhOC+NG4eaLw== +ip-address@^10.1.1: + version "10.2.0" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.2.0.tgz#805fc178b20c518bd4c8548b24fe30892d7f3206" + integrity sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA== is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" @@ -5531,11 +5606,11 @@ is-callable@^1.2.7: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 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== + version "2.16.2" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082" + integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== dependencies: - hasown "^2.0.2" + hasown "^2.0.3" is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" @@ -6304,9 +6379,9 @@ lru-cache@^10.0.1, lru-cache@^10.2.0: integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^11.0.0: - version "11.3.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.3.5.tgz#29047d348c0b2793e3112a01c739bb7c6d855637" - integrity sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw== + version "11.3.6" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.3.6.tgz#f0306ad6e9f0a5dc25b16aeba4e8f57b7ec2df55" + integrity sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A== lru-cache@^5.1.1: version "5.1.1" @@ -6647,6 +6722,11 @@ mute-stream@^2.0.0: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== +mute-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-3.0.0.tgz#cd8014dd2acb72e1e91bb67c74f0019e620ba2d1" + integrity sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -8032,11 +8112,11 @@ socks-proxy-agent@^8.0.5: socks "^2.8.3" socks@^2.8.3: - version "2.8.7" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" - integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== + version "2.8.8" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.8.tgz#23bef6d02748eac847ad75610deb6c472554c67a" + integrity sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog== dependencies: - ip-address "^10.0.1" + ip-address "^10.1.1" smart-buffer "^4.2.0" sonic-boom@^4.0.1: @@ -8207,6 +8287,14 @@ string-width@^7.0.0, string-width@^7.2.0: get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" +string-width@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-8.2.1.tgz#165089cfa527cc88fbc23dd73313f5e334af1ea1" + integrity sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA== + dependencies: + get-east-asian-width "^1.5.0" + strip-ansi "^7.1.2" + string.prototype.matchall@^4.0.12: version "4.0.12" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" @@ -8337,9 +8425,9 @@ strip-json-comments@^3.1.1: integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strnum@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.3.tgz#0119fce02749a11bb126a4d686ac5dbdf6e57586" - integrity sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.3.0.tgz#81bfbfef53db8c3217ea62a98c026886ec4a2761" + integrity sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q== supports-color@^7, supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" @@ -8432,17 +8520,17 @@ tinyglobby@^0.2.14, tinyglobby@^0.2.9: fdir "^6.5.0" picomatch "^4.0.4" -tldts-core@^7.0.28: - version "7.0.28" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.28.tgz#28c256edae2ed177b2a8338a51caf81d41580ecf" - integrity sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ== +tldts-core@^7.0.30: + version "7.0.30" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.30.tgz#c495dba27778f2220bea94f3f6399005c7aca61c" + integrity sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q== tldts@^7.0.5: - version "7.0.28" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.28.tgz#5a5bb26ef3f70008d88c6e53ff58cd59ed8d4c68" - integrity sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw== + version "7.0.30" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.30.tgz#497cea8d610953222f9dcb3ceb07c7207efcd816" + integrity sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw== dependencies: - tldts-core "^7.0.28" + tldts-core "^7.0.30" to-regex-range@^5.0.1: version "5.0.1" @@ -9170,9 +9258,9 @@ yoga-wasm-web@~0.3.3: integrity sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA== zod@^4.1.12: - version "4.3.6" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a" - integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg== + version "4.4.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" + integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== zwitch@^2.0.4: version "2.0.4"