diff --git a/package.json b/package.json index 4de27b2c..cc441783 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "@inquirer/prompts": "^7.10.1", "@oclif/core": "^4", "@oclif/multi-stage-output": "^0.8.36", - "@salesforce/agents": "^1.1.1", + "@salesforce/agents": "^1.1.2", "@salesforce/core": "^8.28.3", "@salesforce/kit": "^3.2.6", "@salesforce/sf-plugins-core": "^12.2.6", diff --git a/src/commands/agent/publish/authoring-bundle.ts b/src/commands/agent/publish/authoring-bundle.ts index 749eb8f8..b7e3cf5d 100644 --- a/src/commands/agent/publish/authoring-bundle.ts +++ b/src/commands/agent/publish/authoring-bundle.ts @@ -95,89 +95,73 @@ export default class AgentPublishAuthoringBundle extends SfCommand { - mso.skipTo('Retrieve Metadata'); - return Promise.resolve(); - }); - } - // Set up lifecycle listeners for deploy events - Lifecycle.getInstance().on('scopedPreDeploy', () => { - mso.skipTo('Deploy Metadata'); - return Promise.resolve(); - }); - Lifecycle.getInstance().on('scopedPostRetrieve', (result: ScopedPostRetrieve) => { - if (result.retrieveResult.response.status !== RequestStatus.Succeeded) { - const errorMessages = ensureArray( - // @ts-expect-error I saw errorMessages populated with useful information during testing - result?.retrieveResult.response?.messages ?? result?.retrieveResult?.response?.errorMessage - ); + mso.goto('Validate Bundle'); + const targetOrg = flags['target-org']; + const conn = targetOrg.getConnection(flags['api-version']); + const agent = await Agent.init({ + connection: conn, + project: this.project!, + aabName, + }); - const errorMessage = `Metadata retrieval failed: ${errorMessages.join(EOL)}`; - mso.error(); - throw SfError.create({ name: 'Retrieve Failed', message: errorMessage }); - } + // First compile the .agent file to get the Agent JSON + const compileResponse = await agent.compile(); + if (compileResponse.status === 'success') { + mso.skipTo('Publish Agent'); + } else { + throwAgentCompilationError(compileResponse.errors); + } + // Then publish the Agent JSON to create the agent + // Set up lifecycle listeners for retrieve events + if (!flags['skip-retrieve']) { + Lifecycle.getInstance().on('scopedPreRetrieve', () => { + mso.skipTo('Retrieve Metadata'); return Promise.resolve(); }); + } + // Set up lifecycle listeners for deploy events + Lifecycle.getInstance().on('scopedPreDeploy', () => { + mso.skipTo('Deploy Metadata'); + return Promise.resolve(); + }); - Lifecycle.getInstance().on('scopedPostDeploy', (result: ScopedPostDeploy) => { - if (result.deployResult.response.status === RequestStatus.Succeeded) { - mso.stop(); - } else { - const deployResponse = result.deployResult.response; - - // Check for component failures (most common source of detailed errors) - const failures = ensureArray(deployResponse.details.componentFailures); - throw SfError.create({ - name: 'Deployment Failed', - message: failures.map((f) => `${f.problemType!}: ${f.problem!}`).join('\n'), - }); - } - return Promise.resolve(); - }); + Lifecycle.getInstance().on('scopedPostRetrieve', (result: ScopedPostRetrieve) => { + if (result.retrieveResult.response.status !== RequestStatus.Succeeded) { + const errorMessages = ensureArray( + // @ts-expect-error I saw errorMessages populated with useful information during testing + result?.retrieveResult.response?.messages ?? result?.retrieveResult?.response?.errorMessage + ); - const result = await agent.publish(flags['skip-retrieve']); - mso.stop(); + const errorMessage = `Metadata retrieval failed: ${errorMessages.join(EOL)}`; + mso.error(); + throw SfError.create({ name: 'Retrieve Failed', message: errorMessage }); + } + return Promise.resolve(); + }); - return { - success: true, - botDeveloperName: result.developerName, - }; - } catch (error) { - // Handle validation errors - const err = SfError.wrap(error); - const message = err.message ? err.message : err.name; - const errorMessage = messages.getMessage('error.publishFailed', [message]); + Lifecycle.getInstance().on('scopedPostDeploy', (result: ScopedPostDeploy) => { + if (result.deployResult.response.status === RequestStatus.Succeeded) { + mso.stop(); + } else { + const deployResponse = result.deployResult.response; - // Stop the multi-stage output on error - mso.error(); + // Check for component failures (most common source of detailed errors) + const failures = ensureArray(deployResponse.details.componentFailures); + throw SfError.create({ + name: 'Deployment Failed', + message: failures.map((f) => `${f.problemType!}: ${f.problem!}`).join('\n'), + }); + } + return Promise.resolve(); + }); - this.error(errorMessage); + const result = await agent.publish(flags['skip-retrieve']); + mso.stop(); - return { - success: false, - errors: err.message.split('\n'), - }; - } + return { + success: true, + botDeveloperName: result.developerName, + }; } } diff --git a/yarn.lock b/yarn.lock index a49f4a27..a01fe617 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1593,10 +1593,10 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@salesforce/agents@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-1.1.1.tgz#72b8c319c141f39153e641d41e8d11eefc0f34ab" - integrity sha512-sHeyUGbBKtO8diQVjH+mb7wB4cfCZVN+WuqVD44GvaGpR1NBycWlSt/P5klekiO5lZoEyl8kGe3BgySShS4W4g== +"@salesforce/agents@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-1.1.2.tgz#aa2b93e0ba71eefcde05541d9add8da3975577ec" + integrity sha512-p7isCk2WoV0t1skRoTjYeead+GOoF2I7VPo+K6YYt+h6S+v8vJTdBc8NNhnmUJcz386FIK5jc0g7bSz8lCQ0tQ== dependencies: "@salesforce/core" "^8.28.3" "@salesforce/kit" "^3.2.6"